📄 uudeview.c
字号:
while (*p1 == ' ' || *p1 == '\t') { p1++; } argv[1] = p1; while (*p1 && argc < 31) { switch (*p1) { case ' ': case '\t': if (!quote) { if ((*argv[argc-1] == '"' || *argv[argc-1] == '\'') && p1-1 != argv[argc-1] && *(p1-1) == *argv[argc-1]) { *(p1-1) = '\0'; argv[argc-1] += 1; } *p1++ = '\0'; while (*p1 == ' ' || *p1 == '\t') p1++; argv[argc++] = p1; } else { p1++; } break; case '"': case '\'': if (!quote) { quote = *p1++; } else if (quote == *p1++) { quote = 0; } break; default: p1++; } } if (!quote) { if ((*argv[argc-1] == '"' || *argv[argc-1] == '\'') && p1-1 != argv[argc-1] && *(p1-1) == *argv[argc-1]) { *(p1-1) = '\0'; argv[argc-1] += 1; } } work_comline (argc, argv);}/* * Load a file with command-line parameters (given with @) */static void loadparfile (char *filename){ char line[256], c; FILE *pfile; if ((pfile = fopen (filename+1, "r")) == NULL) { fprintf (stderr, "Couldn't load parameter file %s: %s (ignored)\n", filename+1, strerror (errno)); return; } while (!feof (pfile)) { if (_FP_fgets (line, 256, pfile) == NULL) break; if (ferror (pfile)) break; line[strlen(line)-1] = '\0'; if (strlen (line) == 0) continue; if (line[strlen(line)-1] == 0x0a || line[strlen(line)-1] == 0x0d) line[strlen(line)-1] = '\0'; if (line[0] == '\0' || line[0] == '#') continue; makeparams (line); c = fgetc (pfile); if (feof (pfile)) break; else ungetc (c, pfile); } fclose (pfile); /* * command line files are always removed */ unlink (filename+1);}/* * process command line parameters */static int work_comline (int argc, char *argv[]){ int number, res; for (number=1; number<argc; number++) { if (*argv[number] == '@') loadparfile (argv[number]); else if (*argv[number] != '-' && *argv[number] != '+') { inputfiles++; if ((res = UULoadFile ((*argv[number]=='|')?argv[number]+1:argv[number], NULL, (*argv[number]=='|')?1:0)) != UURET_OK) { fprintf (stderr, "ERROR: while reading from %s: %s %s\n", (*argv[number]=='|')?argv[number]+1:argv[number], UUstrerror (res), (res==UURET_IOERR)? strerror (UUGetOption (UUOPT_ERRNO, NULL, NULL, 0)) : ""); inputerrors++; } } else switch (*(argv[number] + 1)) { case '\0': interact = 0; if (overwrite == 0) { overwrite = 1; } proc_stdin (); break; case 'a': autoren = (*argv[number] == '+') ? -1 : 1; break; case 'b': if (argv[number][2] == '0' || argv[number][2] == '(') UUSetOption (UUOPT_BRACKPOL, 0, NULL); else if (argv[number][2] == '1' || argv[number][2] == '[') UUSetOption (UUOPT_BRACKPOL, 1, NULL); else if (argv[number][2] == '\0') UUSetOption (UUOPT_BRACKPOL, 1, NULL); /* '])' Emacs feels happier if I close these brackets */ break; case 'c': UUSetOption (UUOPT_REMOVE, 1, NULL); break; case 'd': UUSetOption (UUOPT_DESPERATE, 1, NULL); UUSetOption (UUOPT_TINYB64, 1, NULL); break; case 'e': if (number+1 < argc && *argv[number+1] == '.') { incext = (*argv[number] == '+') ? 1 : 0; addexts (argv[++number]); } break; case 'f': UUSetOption (UUOPT_FAST, 1, NULL); break; case 'h': usage (argv[0]); exit (99); break; case 'i': if (*argv[number] == '+' && stdinput) { fprintf (stderr, "WARNING: cannot interact when reading from stdin\n"); } else { interact = (*argv[number] == '+') ? 1 : 0; if (overwrite == 0 && *argv[number] == '-') { overwrite = 1; } } break; case 'm': UUSetOption (UUOPT_IGNMODE, 1, NULL); break; case 'n': nobar = 1; break; case 'o': if (*argv[number] == '-') { overwrite = 1; } else { overwrite = -1; } break; case 'p': if (number+1 < argc) { strcpy (savepath, argv[++number]); if (strlen (savepath)) { if (savepath[strlen(savepath)-1]!=DIRSEPARATOR[0]) strcat (savepath, DIRSEPARATOR); } } break; case 'q': UUSetOption (UUOPT_VERBOSE, 0, NULL); quiet = 1; nobar = 1; break; case 'r': UUSetOption (UUOPT_IGNREPLY, 1, NULL); break; case 's': if (argv[number][2] == '\0') UUSetOption (UUOPT_DUMBNESS, UUGetOption (UUOPT_DUMBNESS, NULL, NULL, 0) + 1, NULL); else UUSetOption (UUOPT_DUMBNESS, 42, NULL); break; case 't': UUSetOption (UUOPT_USETEXT, 1, NULL); break; case 'v': UUSetOption (UUOPT_VERBOSE, 0, NULL); break; case 'V': fprintf (stdout, "uudeview %spl%s compiled on %s\n", VERSION, PATCH, __DATE__); exit (0); break; case 'z': if (argv[number][2] >= '0' && argv[number][2] <= '9') { UUSetOption (UUOPT_MOREMIME, argv[number][2]-'0', NULL); } else if (argv[number][2] == 'z') { UUSetOption (UUOPT_MOREMIME, 2, NULL); } else { res = UUGetOption (UUOPT_MOREMIME, NULL, NULL, 0); UUSetOption (UUOPT_MOREMIME, res+1, NULL); } break; default: usage (argv[0]); exit (99); break; } } return 1;}/* * list a file callback */struct mCBparm { int aline, lines; int quitit, cols;};static intmoreCB (void *param, char *string){ struct mCBparm *data = (struct mCBparm *) param; if (IsHeaderLine (string)) return 0; if (data->aline+2 >= data->lines) { data->aline = 0; if (interact) { fprintf (stdout, "<<MORE -- (q) to quit>>"); if (getyn (NULL, 'y') == 'q') { data->quitit = 1; return 1; } } } while (strlen(string) && (string[strlen(string)-1] == '\012' || string[strlen(string)-1] == '\015')) string[strlen(string)-1] = '\0'; if (data->cols > 0) string[data->cols-1] = '\0'; fprintf (stdout, "%s\n", string); data->aline += 1; return 0;}static voidmore (uulist *uin, int type){ struct mCBparm data; FILE *inpfile = NULL; char text[256], *p; int res; data.aline = 0; data.quitit = 0; if ((p = getenv ("LINES")) != NULL) { if ((data.lines = atoi(p)) < 5) data.lines = 24; } else data.lines = 24; if ((p = getenv ("COLUMNS")) != NULL) { if ((data.cols = atoi(p)) < 30) data.cols = 80; } else data.cols = 80; if (uin == NULL || uin->thisfile == NULL) { printf ("\tError -- (?)\n"); return; } if (type == SHOW_INFO) { UUInfoFile (uin, &data, moreCB); } else { if ((res = UUDecodeToTemp (uin)) != UURET_OK) { fprintf (stderr, "ERROR: while decoding %s (%s): %s\n", uin->filename, (uin->subfname) ? uin->subfname : "", UUstrerror(res)); return; } if (UUISATTY(stderr) && !nobar) { fprintf (stderr, "%70s\r", ""); /* clear progress information */ fflush (stderr); } if ((inpfile = fopen (uin->binfile, "r")) == NULL) { fprintf (stderr, "ERROR: could not open %s: %s\n", uin->binfile, strerror (errno)); return; } while (!feof (inpfile)) { if (_FP_fgets (text, data.cols, inpfile) == NULL) break; if (ferror (inpfile)) { fprintf (stderr, "ERROR: while reading from %s: %s\n", uin->binfile, strerror (errno)); break; } if (moreCB (&data, text)) break; } fclose (inpfile); } if (interact && data.aline+2 >= data.lines) { fprintf (stdout, "<<END -- hit return>>"); getyn (NULL, '?'); } else fprintf (stdout, "<<END>>");}static voidDumpFileList (void){ int count, printed=0, index=0; uulist *iter; while ((iter=UUGetFileListItem(index))) { if (iter->state & UUFILE_NODATA) { index++; continue; } if (UUISATTY(stderr) && !nobar) { fprintf (stderr, "\r%70s\r", ""); fflush (stderr); } if (!printed++) printf ("\n"); printf ("Found '%s' State %d %s Parts ", (iter->filename) ? iter->filename : (iter->subfname) ? iter->subfname : "???", iter->state, (iter->uudet == UU_ENCODED) ? "UUdata" : (iter->uudet == B64ENCODED) ? "Base64" : (iter->uudet == XX_ENCODED) ? "XXdata" : (iter->uudet == BH_ENCODED) ? "Binhex" : (iter->uudet == YENC_ENCODED) ? "yEnc" : "Text"); if (iter->haveparts) { printf ("%s%d%s ", (iter->begin && iter->begin==iter->haveparts[0]) ? "begin " : "", iter->haveparts[0], (iter->end && iter->end == iter->haveparts[0]) ? " end" : ""); for (count=1; iter->haveparts[count]; count++) { printf ("%s%d%s ", (iter->begin==iter->haveparts[count]) ? "begin " : "", iter->haveparts[count], (iter->end == iter->haveparts[count]) ? " end" : ""); } } if (iter->state & UUFILE_OK) { printf ("OK"); } printf ("\n"); index++; } if (printed) printf ("\n");}/* * Returning 1 skips to next file * -1 skips to prev file * 0 quits program */static int process_one (uulist *iter){ char targetname[1024], renamedname[1024]; char line[1024], command[256], tmp, *ptr1, *ptr2; int res, escflag; char *name; while (42) { if ((name = UUFNameFilter (iter->filename)) == NULL) { fprintf (stderr, "ERROR: couldn't get filename of %s (%s)\n", (iter->filename)?iter->filename:"(null)", (iter->subfname)?iter->subfname:"(null)"); break; } if (interact && !decoall) { printf (" %s %-15s is %s [d] (?=help) ", filemode((int)iter->mode), (iter->filename) ? (iter->filename) : "", (iter->state&UUFILE_OK) ? "OK" : "in error (DESPERATE MODE)"); tmp = getyn (line, 'd'); } else { line[0] = '\0'; tmp = 'd'; } for (ptr1=line; *ptr1 && *ptr1 != tmp; ptr1++); if (*ptr1++==tmp) { while (isspace(*ptr1)) ptr1++; } if (tmp == 'n') return 1; if (tmp == 'b') { if (iter->PREV == NULL) printf ("*** Already at the beginning of the list\n"); else return -1; continue; } else if (tmp == 'a') { decoall = 1; continue; } else if (tmp == 'c') { printf ("\n\n-------------------------------------------------------------------------------\n\n"); printf ("\tYou are now using UUDEVIEW, the uudecoder by Frank Pilhofer\n\n"); printf ("\tThe program is distributed under the terms of the GNU\n"); printf ("\tGeneral Public License. You should have received a copy of\n"); printf ("\tthe GPL with the uudeview program. In particular this means\n"); printf ("\tthat the program is distributed without any warranty.\n\n"); printf ("\tIf you like uudeview, you are encouraged to send the author\n"); printf ("\ta postcard (find the address in the README file), or at\n"); printf ("\tleast an email.\n\n"); printf ("\tCheck out uudeview's home page:\n"); printf ("\t\thttp://www.fpx.de/fp/Software/UUDeview/\n\n"); printf ("\t Frank Pilhofer (fp@fpx.de)\n\n"); printf ("-------------------------------------------------------------------------------\n\n"); continue; } else if (tmp == 'q') { return 0; } else if (tmp == '?') { printf ("\n\tYou can ...\n"); printf ("\t - (d)ecode the file\n"); printf ("\t - (y)es - same as (d)\n"); printf ("\t - e(x)tract - same as (d)\n"); printf ("\t - decode (a)ll files\n"); printf ("\t - go to (n)ext file\n"); printf ("\t - show file (i)nfo\n"); /* * Can't execute anything in QuickWin */#ifndef SYSTEM_QUICKWIN printf ("\t - (e)xecute a command\n");#endif printf ("\t - (l)ist textfile\n"); printf ("\t - (r)ename file\n"); printf ("\t - decode (a)ll files\n"); printf ("\t - go (b)ack to the previous file\n"); printf ("\t - set decode (p)ath: %s\n", savepath); printf ("\t - (q)uit program\n"); printf ("\t - display (c)opyright\n\n"); continue; } else if (tmp == 'r') { if (strlen(ptr1) <= 1) { printf ("Enter new filename: "); fflush (stdout); if (_FP_fgets (line, 250, stdin) == NULL) { printf ("\nERROR: Could not get filename: %s\n", strerror (errno)); line[0] = '\0'; } ptr1 = line;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -