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

📄 uudeview.c

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