📄 uudeview.c
字号:
} if (strlen (ptr1) > 1) { if (ptr1[strlen(ptr1)-1] == '\n') ptr1[strlen(ptr1)-1] = '\0'; UURenameFile (iter, ptr1); } continue; } else if (tmp == 'p') { if (strlen(ptr1) <= 1) { printf ("Enter new path: "); fflush (stdout); if (_FP_fgets (line, 250, stdin) == NULL) { printf ("\nERROR: Could not get path: %s\n", strerror (errno)); line[0] = '\0'; } ptr1 = line; } if (strlen (ptr1) > 1) { if (ptr1[strlen(ptr1)-1] == '\n') ptr1[strlen(ptr1)-1] = '\0'; /* check that path exists */ if (access(ptr1, W_OK|X_OK) == 0) { struct stat finfo; if (stat (ptr1, &finfo) != 0) { printf ("\nERROR: Could not get path: %s\n", strerror (errno)); break; } if (!S_ISDIR(finfo.st_mode)) { printf("\nERROR: `%s' is not a directory\n", ptr1); break; } } strcpy (savepath, ptr1); if (strlen (savepath)) { if (savepath[strlen(savepath)-1]!=DIRSEPARATOR[0]) strcat (savepath, DIRSEPARATOR); } } continue; } else if (tmp == 'i') { printf ("\nFile info ...\n\n"); printf ("-------------------------------------------------------------------------------\n"); more (iter, SHOW_INFO); printf ("\n-------------------------------------------------------------------------------\n\n"); continue; } /* * for the following menu items, we need the file decoded */ if ((res = UUDecodeToTemp (iter)) != UURET_OK) { fprintf (stderr, "ERROR: while decoding %s (%s): %s\n", (iter->filename) ? iter->filename : "", (iter->subfname) ? iter->subfname : "", UUstrerror(res)); decodedfailed++; break; } if (!quiet && UUISATTY(stderr) && !nobar) { fprintf (stderr, "%70s\r", ""); /* clear progress information */ fflush (stderr); } if (iter->binfile == NULL) { fprintf (stderr, "ERROR: Ooops. Decoded %s but no binfile??\n", (iter->filename) ? iter->filename : ""); decodedfailed++; break; } if (tmp=='d' || tmp=='y' || tmp=='x' || tmp=='\0' || tmp=='\n') { /* * Set Target directory */ make_target: sprintf (targetname, "%s%s%s", savepath, (strlen(savepath) && savepath[strlen(savepath)-1]==DIRSEPARATOR[0]) ? "":DIRSEPARATOR, name); /* * check whether this file exists */ retryexcheck: if (exists (targetname) && overwrite!=1 && autoren && findAlternateName (targetname, renamedname, autoren)) { printf ("*** Target File %s exists - autorenamed to %s\n", targetname, renamedname); strcpy (targetname, renamedname); } if (exists (targetname) && overwrite == -1) { printf ("*** Target File %s exists! (file not decoded)\n", targetname); return 1; } if (exists (targetname) && !overwrite) { printf ("*** Target File %s exists! Options:\n", targetname); res = ' '; printf ("\*** (O)verwrite, Overwrite (A)ll, Overwrite Non(e),\n\*** (R)ename, Au(t)o-Rename, (N)ext, (P)ath [o] "); fflush (stdout); /* * Ask the user for her/his choice. If 'r' or 'p', and there * is more data on the line, use it as reply */ res = getyn (line, stdinput ? 'n' : 'o'); for (ptr1=line; *ptr1 && tolower(*ptr1) != res; ptr1++); if (*ptr1++==res) { while (isspace(*ptr1)) ptr1++; } switch (res) { case 'n': return 1; case 'a': overwrite=1; goto retryexcheck; case 'o': goto noexcheck; case 'e': overwrite=-1; return 1; case 't': autoren=1; goto retryexcheck; case '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; } if (strlen (ptr1) > 1) { if (ptr1[strlen(ptr1)-1] == '\n') ptr1[strlen(ptr1)-1] = '\0'; UURenameFile (iter, ptr1); } 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)"); return 1; } goto make_target; case 'p': if (strlen(ptr1) <= 1) { printf ("Enter new path: "); fflush (stdout); if (_FP_fgets (line, 250, stdin) == NULL) { printf ("\nERROR: Could not get path: %s\n", strerror (errno)); line[0] = '\0'; } ptr1 = line; } if (strlen (ptr1) > 1) { if (ptr1[strlen(ptr1)-1] == '\n') ptr1[strlen(ptr1)-1] = '\0'; strcpy (savepath, ptr1); if (strlen(savepath)) { if (savepath[strlen(savepath)-1]!=DIRSEPARATOR[0]) strcat (savepath, DIRSEPARATOR); } } goto make_target; default: goto retryexcheck; } } noexcheck: if ((res = UUDecodeFile (iter, targetname)) != UURET_OK) { if (UUISATTY(stderr) && !nobar) fprintf (stderr, "%70s\r", ""); /* clear progress information */ fprintf (stderr, "ERROR: while writing %s (%s): %s\n", targetname, (iter->subfname) ? iter->subfname : "", UUstrerror(res)); decodedfailed++; break; } if (!quiet) { if (UUISATTY(stderr) && !nobar) fprintf (stderr, "%70s\r", ""); /* clear progress information */ printf (" File successfully written to %s\n", targetname); } decodedok++; break; } else if (tmp == 'l') { printf ("\nContents of file ...\n\n"); printf ("------------------------------------------------------------------------------\n"); more (iter, SHOW_FILE); printf ("\n------------------------------------------------------------------------------\n\n"); } /* * Can't do that in QuickWin, since we'd need system() */#ifndef SYSTEM_QUICKWIN else if (tmp == 'e') { printf ("Enter command line ($) for file: "); fflush (stdout); if (_FP_fgets (line, 256, stdin) == NULL) printf ("\nERROR: Could not get Command line: %s\n", strerror (errno)); else if (strlen (line) > 1) { ptr1 = line; ptr2 = command; escflag = 0; while (*ptr1 && *ptr1 != '\012' && *ptr1 != '\015') { if (!escflag && *ptr1 != '\\') { if (*ptr1 == '$') { strcpy (ptr2, iter->binfile); ptr2 += strlen (iter->binfile); ptr1++; } else *ptr2++ = *ptr1++; } else if (escflag) { *ptr2++ = *ptr1++; escflag = 0; } else escflag = 1; } *ptr2 = '\0'; printf ("------------------------------------------------------------------------------\n"); system (command); printf ("------------------------------------------------------------------------------\n\n"); } }#endif else { printf ("ERROR: unknown action '%c'. Enter ? for list of options.\n", tmp); } } return 1;} static int process_files (void){ int res, index=0, desp; uulist *iter; char *ptr; while ((iter=UUGetFileListItem(index))) { if (iter->filename == NULL) { index++; continue; } if (!(work_file (iter->filename))) { if (interact && !quiet) printf (" %s %s ignored.\n", filemode((int)iter->mode), (iter->filename)?iter->filename:""); index++; continue; } if (iter->state & UUFILE_OK) ptr = "State is OK"; else if (iter->state & UUFILE_NODATA) ptr = NULL; else if (iter->state & UUFILE_NOBEGIN) ptr = "No Begin found"; else if (iter->state & UUFILE_MISPART) ptr = "Missing Part(s)"; else if (iter->state & UUFILE_NOEND) ptr = "No End found"; else ptr = "Unknown State"; if (iter->state & UUFILE_NODATA) { index++; continue; } UUGetOption (UUOPT_DESPERATE, &desp, NULL, 0); if (iter->state & UUFILE_OK || desp) { res = process_one (iter); } else { if (ptr && iter->filename) printf ("ERROR: File %s (%s): %s (%d)\n", (iter->filename) ? iter->filename : "", (iter->subfname) ? iter->subfname : "", ptr, iter->state); decodedmisp++; res = 1; } if (res == 0) break; else if (res == -1) { if (index==0) printf ("*** Already at beginning of list\n"); else { index--; while ((!(iter->state & UUFILE_OK || desp) || iter->state == UUFILE_NODATA) && index) index--; } } else { index++; } } return 0;}static voidsighandler (int signo){ printf ("\nReceived Signal (%d), cleaning up temp files.\n", signo); UUCleanUp (); exit (99);}/* * usage */static void usage (char *argv0){ printf ("\n\ UUDEVIEW %s%s%s - the nice and friendly decoder - (w) 1994 Frank Pilhofer\n", VERSION, (PATCH[0]>'0')?"pl":"", (PATCH[0]>'0')?PATCH:""); printf (" usage:\n"); printf (" uudeview [options] [file ...]\n\n"); printf (" Options:\n"); printf ("\t-i Disable interactivity (do not ask, decode everything)\n"); printf ("\t-a Autorename (rename file if it exists on disk)\n"); printf ("\t-m Ignore the file mode of uuencoded files\n"); printf ("\t+e/-e Include or exclude extensions exclusively\n"); printf ("\t-d Sets 'desperate' mode (process incomplete files)\n"); printf ("\t-f Fast mode. Only if each file holds no more than one part\n"); printf ("\t-o/+o -o OK to overwrite files, +o never overwrite files\n"); printf ("\t-b1 Select alternate bracket policy\n"); printf ("\t-p path Sets path where to save decoded binaries to\n"); printf ("\t-c Autoclear files that were successfully decoded.\n"); printf ("\t-s Be more strict on MIME adherance.\n"); printf ("\t-q Quiet. Do not emit progress messages.\n\n");#if defined(SYSTEM_DOS) || defined(SYSTEM_QUICKWIN) printf (" See Manual for more details\n\n");#else printf (" See uudeview(1) for more details.\n\n");#endif printf (" Example:\n"); printf (" uudeview +e .jpg.gif -i newsfile\n"); printf ("\tThis decodes all .jpg or .gif files encountered in <newsfile>\n"); printf ("\twithout asking.\n\n");}/* * uudeview main function */intmain (int argc, char *argv[]){ int res;#ifdef SYSTEM_QUICKWIN struct _wsizeinfo ws;#endif /* * No Signal handler in QuickWin */#ifndef SYSTEM_QUICKWIN signal (SIGINT, sighandler);#endif /* * In QuickWin, set the about() Box, and give more space to scroll */#ifdef SYSTEM_QUICKWIN ws._version = _QWINVER; ws._type = _WINSIZEMAX; (void) _wabout ("UUdeview for Windows\n(c) 1995 Frank Pilhofer\nfp@fpx.de"); (void) _wsetscreenbuf (fileno(stdout), 16384); (void) _wsetscreenbuf (fileno(stderr), 16384); (void) _wsetsize (fileno(stdout), &ws);#endif /* * Check where we are and set the save directory */#ifdef HAVE_GETCWD if (getcwd (savepath, 255) == NULL)#endif strcpy (savepath, "./"); /* * in DOS, set the DOS Filename Filter */#if defined(SYSTEM_DOS) || defined(SYSTEM_QUICKWIN) UUSetFNameFilter (NULL, UUFNameFilterDOS);#else UUSetFNameFilter (NULL, UUFNameFilterUnix);#endif UUSetBusyCallback (NULL, BusyCallback, 100); /* * If we were called as uudecode, be quiet and don't interact */ if (_FP_stristr (argv[0], "uudecode") != NULL) { interact = 0; decoall = 1; quiet = 1; overwrite = 1; } else if (argc < 2) { usage (argv[0]); return 99; } /* * Setup Callback */ UUSetMsgCallback (NULL, MessageCallback); if (UUInitialize () != UURET_OK) { fprintf (stderr, "oops: could not initialize decoding library\n"); return 99; } /* * use options from UUDEVIEW environment variable */ if ((getenv ("UUDEVIEW")) != NULL) { makeparams (getenv ("UUDEVIEW")); } if (argc < 2) { /* * can only be in uudecode compatibility mode */ proc_stdin (); } else { work_comline (argc, argv); } if (strlen(savepath)) { if (savepath[strlen(savepath)-1] != DIRSEPARATOR[0]) strcat (savepath, DIRSEPARATOR); } if (!stdinput && !quiet && UUGetOption (UUOPT_VERBOSE, NULL, NULL, 0)) { DumpFileList (); } /* * try merging thrice with increased tolerance */ UUSmerge (0); UUSmerge (1); UUSmerge (99); res = process_files (); /* * clear info */ if (UUISATTY(stderr) && !nobar) { fprintf (stderr, "\r%70s\r", ""); fflush (stderr); }#ifndef SYSTEM_QUICKWIN signal (SIGINT, SIG_DFL);#endif UUCleanUp(); killext (extensions); /* * Without user interaction, or if the user has quit * the proggy, kill myself in QuickWin */#ifdef SYSTEM_QUICKWIN if (!interact || res==1) _wsetexit (_WINEXITNOPERSIST); else { printf ("\n\No more Programs to decode.\n\Select File-Exit to close window\n\\n"); }#endif if (UUGetOption (UUOPT_VERBOSE, NULL, NULL, 0) && !quiet && inputfiles && (decodedok || decodedfailed || decodedmisp)) { printf ("%d file%s decoded from %d input file%s, %d failed\n", decodedok, (decodedok==1)?"":"s", inputfiles, (inputfiles==1)?"":"s", decodedfailed+decodedmisp); } /* * determine return value */ if (decodedfailed || decodedmisp) { return ((decodedok?1:0) | ((decodedmisp||decodedfailed)?2:0)); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -