⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uudeview.c

📁 UUDeview是一个编码解码器
💻 C
📖 第 1 页 / 共 3 页
字号:
      }      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 + -