home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / unix_c / macintsh / combinhx.c < prev    next >
C/C++ Source or Header  |  1989-03-21  |  7KB  |  230 lines

  1. 22-Dec-86 00:50:17-MST,7048;000000000000
  2. Return-Path: <INFO-MAC-REQUEST@SUMEX-AIM.STANFORD.EDU>
  3. Received: from SUMEX-AIM.STANFORD.EDU by SIMTEL20.ARPA with TCP; Mon 22 Dec 86 00:49:59-MST
  4. Date: Sun 21 Dec 86 23:49:13-PST
  5. From: David Gelphman... <INFO-MAC-REQUEST@SUMEX-AIM.STANFORD.EDU>
  6. Subject: UNIX-COMB.C
  7. To: info-mac-redist: ;
  8. Message-ID: <12264754603.20.INFO-MAC-REQUEST@SUMEX-AIM.STANFORD.EDU>
  9.  
  10. /*
  11.     comb - combine split binhex files
  12.     usage:
  13.     comb file1 .. fileN > result ; xbin result
  14.     comb -m file > result ; xbin result
  15.     compile: cc -o comb comb.c
  16.  
  17.     binhex files often come across the net split into multiple parts.  I
  18. got sick of re-combining them by hand.  comb is a quick hack that takes 
  19. as its arguments a set of files which are the parts
  20. of a binhex file.  It splits out the binhex file to standard output.
  21. If the parts have been combined into a single file already, with mail
  22. headers and such in between, the "-m" flag can be used.  The text that
  23. doesn't look like binhex goes to standard output, unless the "-q" (for
  24. quiet) flag is specified.
  25.     It's real ugly (even has gotos!), but hey, it works.
  26.     Author: Greg Dudek
  27.     Usenet:    {linus, ihnp4, allegra, decvax, floyd}!utcsri!dudek
  28. */
  29.  
  30. #include <stdio.h>
  31. #define min(a,b)    (a<b?a:b)
  32.  
  33. #ifdef DEBUG
  34. #define EBUG
  35. #endif
  36.  
  37. #ifdef EBUG
  38. #define debug(x)    x
  39. #else
  40. #define debug(x)    /**/
  41. #endif
  42.  
  43. int verbose=1;
  44. int mailfile = 0;    /* file contains multiple parts */
  45. int gotend = 0;        /* found apparent end of binhex data */
  46. int eof = 0;        /* found at least 1 eof (only used if mailfile) */
  47.  
  48. main(argc,argv)
  49. char **argv;
  50. {
  51.     int l,i,fnum, curline;
  52.     char inline[256];
  53.     char inline2[256];
  54.     FILE *fd;
  55.  
  56.     if (argc <= 1) {
  57.     fprintf(stderr,"Usage: %s [-q] [-m] file1 [..fileN]\n",argv[0]);
  58.     exit(2);
  59.     }
  60.  
  61.     fnum=1;
  62.     /* get flags */
  63.     while (argv[fnum][0]=='-') {
  64.         switch (argv[fnum][1]) {
  65.         case 'm':
  66.             mailfile=1;
  67.             break;
  68.         case 'q':
  69.             verbose=0;
  70.             break;
  71.         case 'v':
  72.             verbose=1;
  73.             break;
  74.         default:
  75.             fprintf(stderr,"Unknown option -%c ignored\n",argv[fnum][1]);
  76.             break;
  77.             }
  78.         fnum++;
  79.         }
  80.  
  81.     fd = fopen(argv[fnum],"r"); 
  82.     if (fd==0) {
  83.     perror(argv[fnum]);
  84.     exit(3);
  85.     }
  86.     argc--;
  87.     fnum++;
  88.     for ( ;; ) {
  89.         if (fgets(inline,80,fd)<=0) break;
  90.         if (strncmp(inline,"(This file",10)==0) {
  91.             printf("%s",inline);
  92.  
  93.             fgets(inline,80,fd);
  94.             printf("%s",inline);
  95.  
  96.             fgets(inline,80,fd);
  97.             printf("%s",inline);
  98.             l = strlen(inline);
  99.             for ( ; (fgets(inline,80,fd)>0) && (strlen(inline)==l); ) 
  100.                 printf("%s",inline);
  101.             break;
  102.             }
  103.         else {
  104.             if (verbose) fprintf(stderr,"%s",inline);
  105.             }
  106.         }
  107.     if (!mailfile) {
  108.         /* throw away rest of file */
  109.         while (verbose && (fgets(inline,80,fd)>0)) {
  110.             fprintf(stderr,"%s",inline);
  111.             }
  112.         }
  113.  
  114.     for ( ; (mailfile && !eof) || (argc-->1);  ) {
  115.         if (!mailfile) fd = freopen(argv[fnum++],"r",fd);
  116.  
  117.     /* hack, hack.  jump here when in mailfile mode */
  118.     /* instead of opening a new file        */
  119. fakenew:
  120.         /* only consider first 500 lines of each file for data start */
  121.         for (curline=1;curline<500;curline++) {
  122.             if (fgets(inline,90,fd)<=0) {
  123.                 debug(printf("eof (argc=%d)\n",argc));
  124.                 eof = 1;
  125.                 break;
  126.                 }
  127.  
  128.     /* jump here if we already read 2 lines thinking the first was
  129.        the start of the binhex data, but that hypothesis failed.
  130.        We make the extra line look like we just read it, & jump here.
  131.     */
  132. got1:
  133.  
  134.         /* is the line the right length? */
  135.             if (strlen(inline)!=l) {
  136.                 if (verbose) fprintf(stderr,"%s",inline);
  137.                 debug(printf("Bad length %d != %d\n",strlen(inline),l));
  138.                 continue;
  139.                 }
  140.  
  141.         /* we don't expect binhex to contain these lines, just in case
  142.         we fluked out on line length 
  143.         */
  144.             if ((substr(inline,"here"))  ||
  145.                 (substr(inline,"From")) ||
  146.                 (substr(inline,"CUT")) ||
  147.                 (substr(inline,"end")) ||
  148.                 (substr(inline,"Path")) ||
  149.                 (substr(inline,"cut")) ) {
  150.                 if (verbose) fprintf(stderr,"%s",inline);
  151.                 debug(printf("Has English\n"));
  152.                 continue;
  153.                 }
  154.  
  155.             /* get another line, see if lengths match */
  156.             if (fgets(inline2,80,fd)<=0) {
  157.                 eof = 1;
  158.                 break;
  159.                 }
  160.         /* check it for the keywords too */
  161.             if ((strlen(inline)==strlen(inline2)) &&
  162.                 ( ! ((substr(inline2,"here"))  ||
  163.                 (substr(inline2,"From")) ||
  164.                 (substr(inline2,"CUT")) ||
  165.                 (substr(inline2,"end")) ||
  166.                 (substr(inline2,"Path")) ||
  167.                 (substr(inline2,"cut")) ))) {
  168.  
  169.                 /* Okay, we're convinced     */
  170.         /* spit the 2 lines        */
  171.                 printf("%s",inline);
  172.                 printf("%s",inline2);
  173.         /* Take any more lines of the right length */
  174.                 for ( ; ; ) {
  175.                     if (fgets(inline,80,fd)<=0) {
  176.                         eof = 1;
  177.                         break;
  178.                         }
  179.                     if (strlen(inline)!=l) {
  180.                         i = strlen(inline);
  181.                         while (inline[i-1]=='\n') i--;
  182.                         if (inline[i-1]==':') {
  183.                             /* end of stuff */
  184.                             gotend = 1;
  185.                             printf("%s",inline);
  186.                             }
  187.                         break;
  188.                         }
  189.                     printf("%s",inline);
  190.                     }
  191.                 }
  192.             else {
  193.                 debug(printf("Second line is bad\n"));
  194.                 strcpy(inline,inline2);
  195.                 goto got1;
  196.                 }
  197.             break;
  198.             }
  199.         if (mailfile && !eof) goto fakenew;
  200.         while (verbose & (fgets(inline,80,fd)>0)) {
  201.             fprintf(stderr,"%s",inline);
  202.             }
  203.         }
  204.     if (!gotend) {
  205.     fprintf(stderr,"File didn't seem to end properly\n");
  206.     exit(1);
  207.     }
  208.     exit(0);
  209.     }
  210.  
  211. substr(s,t)
  212. char *s, *t;
  213. {
  214.     extern char *index();
  215.     while ((s=index(s,*t))!=0) {
  216.         if (strncmp(s,t,(min(strlen(s),strlen(t))))==0) return(1);
  217.         s++;
  218.         }
  219.     return(0);
  220.     }
  221. -- 
  222.         Dept. of Computer Science (vision group)    University of Toronto
  223.         Usenet:    {linus, ihnp4, allegra, decvax, floyd}!utcsri!dudek
  224.         CSNET:    dudek@ai.toronto.edu
  225.         ARPA:    dudek%ai.toronto.edu@csnet-relay
  226.         DELPHI:     GDUDEK
  227.         Paper mail: 10 King's College Circle, Toronto, Canada 
  228.  
  229. -------
  230.