📄 pshar.c
字号:
if (!(out = fopen(optarg, "w"))) { fprintf(stderr, "shar: can't open archive %s\n", optarg); exit(0); } break; default: errflg++; } } if (UnShar) exit(0); C = local_getarg(argc, argv); if (errflg || EOF == C) { if (EOF == C) fprintf(stderr, "shar: No input files\n"); fprintf(stderr, "%s%s%s%s", Usage1, Usage2, Usage3, Usage4); exit(1); } savind = 0; do { if (getpat(optarg)) exit(2); } while (EOF != (C = local_getarg(argc, argv))); sav[savind] = 0; header(sav); for (ppchList = sav; *ppchList; ++ppchList) {#if defined (CPM) || defined(MSDOS) strlower(*ppchList);#endif shar(*ppchList); } fputs("#\tEnd of shell archive\n", out); fputs("exit 0\n", out); fclose(out);#ifdef VMS exit(0);#else return(0);#endif}int getpat(pattern) char *pattern;{ register char *ptr; extern void * malloc(size_t size);#if defined (AMIGA) while (ptr = scdir(pattern)) {#else ptr = pattern; {#endif sav[savind] = (char *)malloc(strlen(ptr) + 1); strcpy(sav[savind++], ptr);#if defined (CPM) temp = open(ptr, O_RDONLY); if (temp == -1) {#else if (access(ptr, 4)) {#endif fprintf(stderr, "No read access for file: %s\n", ptr); return (-1); }#if defined (CPM) close(temp);#endif } return (0);}/* * get option letter from argument vector */int getopt(nargc, nargv, ostr) int nargc; char **nargv, *ostr;{ register char *oli; /* option letter list index */ static char *place = EMSG; /* option letter processing */ if (!*place) { /* update scanning pointer */ if (optind >= nargc || *(place = nargv[optind]) != '-' || !*++place) return (EOF); if (*place == '-') { /* found "--" */ ++optind; return EOF; } } /* option letter okay? */ if ((optopt = (int) *place++) == (int) ':' || !(oli = index(ostr, optopt))) { if (!*place) ++optind; tell(": illegal option -- "); } if (*++oli != ':') { /* don't need argument */ optarg = NULL; if (!*place) ++optind; } else { /* need an argument */ if (*place) { /* no white space */ optarg = place; } else { if (nargc <= ++optind) { /* no arg */ place = EMSG; tell(": option requires an argument -- "); } else { optarg = nargv[optind]; /* white space */ } } place = EMSG; ++optind; } return (optopt); /* dump back option letter */}int local_getarg(nargc, nargv) int nargc; char **nargv;{ if (nargc <= optind) { optarg = (char *) 0; return EOF; } else { optarg = nargv[optind++]; return 0; }}int dounshar(ArcNam) char *ArcNam;{ register int i; register FILE *inptr, *outptr; auto char line[BUFSIZ]; int DirNum = -1; int Prefix = 0; char Dirs[5][40], FilNam[128], Delim[40], ScrStr[128]; char *ptr; if (!(inptr = fopen(ArcNam, "r"))) { fprintf(stderr, "shar: Can't open archive '%s'\n", ArcNam); return(1); } while (fgets(line, BUFSIZ, inptr)) { if (strncmp(line, "sed ", 4) == 0) { Prefix = 0; if (!(ptr = index(line, '/'))) goto getfil; if (*++ptr == '^') ++ptr; while (*ptr++ != '/') Prefix++; goto getfil; } else if (strncmp(line, "cat ", 4) == 0) { Prefix = 0; ; getfil:#if defined (VMS) strcpy(FilNam, "[");#else FilNam[0] = 0;#endif for (i = 0; i <= DirNum; i++) {#if defined (VMS) strcat(FilNam, "."); strcat(FilNam, Dirs[i]);#else strcat(FilNam, Dirs[i]); strcat(FilNam, "/");#endif }#if defined (VMS) strcat(FilNam, "]");#endif getshpar(line, ">", ScrStr); strcat(FilNam, ScrStr);#if defined (CPM) tocpmformat(FilNam); /* tweek format as needed */#endif getshpar(line, "<<", Delim); fprintf(stderr, "Creating %s ...", FilNam); outptr = fopen(FilNam, "w"); while (fgets(line, BUFSIZ, inptr)) { if (strncmp(line, Delim, strlen(Delim)) == 0) break; if (outptr) fputs(&line[Prefix], outptr); } if (outptr) { fclose(outptr); fprintf(stderr, "...done\n"); } else fprintf(stderr, "...error in creating file\n"); } else if (strncmp(line, "mkdir ", 6) == 0) { fprintf(stderr, "Need to make directory: %s\n", &line[6]); } else if (strncmp(line, "chdir ", 6) == 0) { if (line[6] == '.' && line[7] == '.') DirNum--; else strcpy(Dirs[++DirNum], &line[6]); if (DirNum < -1) DirNum = -1; } else if (strncmp(line, "cd ", 3) == 0) { if (line[3] == '.' && line[4] == '.') DirNum--; else strcpy(Dirs[++DirNum], &line[3]); if (DirNum < -1) DirNum = -1; } } fclose(inptr); return(0);}void getshpar(line, sea, par) char *line, *sea, *par;{ register char *scr1, *scr2; while (*line) { scr1 = line; scr2 = sea; while (*scr1 && *scr2 && *scr1 == *scr2) { scr1++; scr2++; } if (*scr2 == 0) { if (*scr1 == 0) { *par = 0; return; } while (*scr1 == ' ' || *scr1 == '\t' || *scr1 == '\\' || *scr1 == '\'' || *scr1 == '"') scr1++; while (*scr1 != 0 && *scr1 != ' ' && *scr1 != '\t' && *scr1 != '\\' && *scr1 != '\'' && *scr1 != '"' && *scr1 != '\n' && *scr1 != '\r') *par++ = *scr1++; *par = 0; return; } line++; } *par = 0;}#if defined (CPM)tocpmformat(filename) char *filename;{ char buffer[100]; char extension[100]; register char *temp; int mod = 0; strcpy(buffer, filename); /* Make sure we get rid of any pathnames */ if ((temp = rindex(buffer, '/')) != 0) { strcpy(buffer, (char *) ((temp - buffer) + filename + 1)); mod = 1; } if (strlen(filename) <= 8) { if (mod != 0) { strcpy(filename, buffer); } return (0); } /* If it already is in "CPM" format we'll check if we need to truncate the * front filename part. */ if ((temp = index(buffer, '.')) != 0) { if ((temp - buffer) < 8) { if (mod != 0) { strcpy(filename, buffer); } return (0); } else { strcpy(extension, temp); strcpy(&buffer[8], extension); buffer[12] = '\0'; strcpy(filename, buffer); return (1); } } /* OK, filename is longer than can be handled, and it doesnt have a * filetype "." marker already. We will put one in to minimize truncation. */ strcpy(extension, &buffer[8]); buffer[8] = '.'; strcpy(&buffer[9], extension); buffer[12] = '\0'; strcpy(filename, buffer); return (2);}#endif#if defined (CPM) || defined (MSDOS)void strlower(string) char *string;{ register char *pointer; char c; for (pointer = string; (c = *pointer) != '\0'; pointer++) { if (isupper(c)) *pointer = tolower(c); }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -