home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / txtutl / undigest.c < prev    next >
C/C++ Source or Header  |  1990-11-27  |  5KB  |  206 lines

  1.  
  2. /*
  3.     Modified 11/16/90 to fix use of an uninitialized variable
  4.     (could cause a run time error on some machines)
  5.     and a variable set but not used to eliminate the warnings
  6.     from the Apollo c compiler.  jdb
  7.  
  8.     Modified 1/27/88 to handle more types of digests and
  9.     a compile-time option added (LONGNAME) which will cause
  10.     the default output file name to be <digest-name>.VOL.NUM
  11.     rather than the VOL.NUM form described below.
  12.  
  13.     This has been tested with the Info-IBM, Info-Kermit, and
  14.     Info-CPM Digest formats.
  15.  
  16.     This program should be called 'UNDIGEST' rather than 'DIGEST'
  17.     as it is below since there is a companion program in the
  18.     Simtel20 PD2:<UNIX.MAIL> directory (digest.c) that
  19.     creates a Digest file from individual messages.
  20.  
  21.     The original documentation below has NOT been modified to
  22.     reflect these changes.
  23.  
  24.                     David Brown
  25.                     jdb@email.ncsc.navy.mil
  26. */
  27. /*
  28. DIGEST:  (version 3) November, 1984
  29.  
  30. NAME: 
  31.     Digest  - reformats the ailist digest for use with "mail -f"
  32.  
  33. SYNOPSIS:
  34.     digest file [file] 
  35.  
  36. DESCRIPTION:
  37.  
  38. digest takes the file name  given  in  first  argument  and  places  the
  39. reformatted  file  in  the  second argument, if given. If no output file
  40. (2nd argument) is given, the output will be placed into a  default  file
  41. whose  name  is of the form VOL.NUM where VOL and NUM are the volume and
  42. number of the ailist digest fed in (e.g. 2.144,etc.).
  43.  
  44. A few notes:
  45.     (1) if only one argument is given, it is assumed to be the
  46.         input file.  If no args are given, you get prompted for
  47.         for the input file, and the output is sent to the default
  48.         file construction.
  49.  
  50.     (2) This has been tested only for use with the specific ailist/human-
  51.         nets format now in use.  I will soon get around to adding
  52.         code to this program to handle other formats.  When I do,
  53.         I will send it along.
  54.  
  55.     (3) The input to this program must be A SINGLE AILIST 
  56.         OR HUMAN-NETS DIGEST.  If you have been stuffing all 
  57.         your ailist digests into a single file, running this pgm 
  58.         on that file will yield  incorrect and unpredictable results.  
  59.         The pgm is best  used to manage the incoming stuff.
  60.  
  61.     (4) the input file is left untouched (i.e. is not removed)
  62.  
  63.     (5) digest does not work with piped input (a bug, sorry).
  64.         This has meant for me that I stick the day's ailist digest
  65.         into a temp file when I receive it over "mail", and then
  66.         later "digest" this temp file to get it into a suitable
  67.         form for "mail -f".
  68.  
  69. BUGS:
  70.     If there are ailist sub-entries which do not have a DATE:
  71.     field in the header, they will be appended to the entry
  72.     prior.  
  73.  
  74. Any questions, suggestions or problems, etc. should be sent to 
  75.  
  76. douglas stumberger
  77. department of computer science
  78. 111 Cumington Street
  79. boston, ma. 02215
  80.  
  81. csnet: des@bostonu
  82. bitnet: csc10304@bostonu
  83.  
  84. */
  85.  
  86. #include <stdio.h>
  87.  
  88. main(argc,argv)
  89.     int argc; char *argv[] ;
  90. {
  91.     FILE *fpr, *fpw ;
  92.     char *lead, *fromline, temp[81], fname[81] ,
  93.         digest[81],vol[50],num[5] ;
  94.     register int done=0, gl ;
  95.     
  96.     if (argc > 3) {
  97.         printf("Usage: %s file [file]\n",argv[0]) ;
  98.         exit(0);
  99.     }
  100.     if (argc == 1) { 
  101.         printf("What file is the digest in? > ") ;
  102.         scanf("%s",fname) ;
  103.     }
  104.     else 
  105.         strcpy(fname,argv[1]) ;
  106.     
  107.     if ((fpr = fopen(fname,"r")) == NULL) {
  108.         printf("%s: No such file\n",fname) ;
  109.         exit(0) ;
  110.     }
  111.  
  112. #ifdef DEBUG
  113.     printf(" input file name is <%s>\n",fname) ;
  114. #endif
  115.  
  116.     lead = (char *) calloc(90,sizeof(char)) ;  
  117.  
  118.     get_line(fpr,lead) ;        /* get the first line of file */
  119.  
  120.     fromline = (char *) malloc(strlen(lead)+1) ;
  121.     strcpy(fromline,lead) ;
  122.  
  123.     if (argc != 3) {   /* no output file given - 
  124.                 find out vol/num for filename */
  125.  
  126.         while ((lead[0] != '-') && (!done)) {
  127. #ifdef DEBUG
  128. printf("Scanning:%s",lead);
  129. #endif
  130.             sscanf(lead,"%s %s",digest,temp) ;
  131.             if (!strcmp(temp,"Digest")) {
  132. #ifdef DEBUG
  133. printf("\nFound a match\n");
  134. #endif
  135.                    sscanf(lead,"%*s %*s %*s %*s %*s %*s %*s %s %*c %*s %s",
  136.                    vol,num) ;
  137.                done++ ;
  138.             }
  139.             get_line(fpr,lead) ;
  140.         }
  141.  
  142.         strcat(digest,".") ;        
  143. #ifndef LONGNAME
  144.         digest[0]='\0';
  145. #endif
  146.         strcat(digest,vol) ;
  147.         strcat(digest,".") ;
  148.         strcat(digest,num) ;
  149.     }
  150.     else 
  151.         strcpy(digest,argv[2]) ;    /* output filename is third argument */
  152.  
  153.  
  154. #ifdef DEBUG
  155.         printf("output file is <%s>",digest) ;
  156. #endif
  157.  
  158.     fclose(fpr) ;            
  159.  
  160. #ifdef DEBUG
  161.         printf(" input file is <%s>\n",fname) ;
  162. #endif
  163.  
  164.     if ((fpr = fopen(fname,"r")) == NULL) {
  165.         printf("\nERROR: File will not rewind\n") ;
  166.         exit(0) ;
  167.     }
  168.  
  169.     if ((fpw = fopen(digest,"w")) == NULL) {
  170.         printf("\nERROR: Output File will not open\n") ;
  171.         exit(0) ;
  172.     }
  173.  
  174.     get_line(fpr,lead) ;        /* copy the ailist header */
  175.  
  176.     while (lead[0] != '-') {    /* i.e.  Law's message of the topics */
  177.         fprintf(fpw,"%s",lead) ;
  178.         get_line(fpr,lead) ;
  179.     }
  180.  
  181.     gl = get_line(fpr,lead) ;    /* do the body of the digest */
  182.     while (gl != EOF) {
  183.         sscanf(lead,"%s",temp) ;
  184.         if (!strcmp (temp,"Date:"))
  185.             fprintf(fpw,"%s",fromline) ;
  186.         fprintf(fpw,"%s",lead) ;
  187.         gl = get_line(fpr,lead) ;
  188.     }
  189.  
  190.     printf("Re-formatted digest now in file <%s>\n",digest) ;
  191.     }    
  192.  
  193.  
  194. get_line (fp,s)
  195.     FILE *fp;    char *s;
  196. {
  197.     register int c=0,i=0 ;
  198.  
  199.     while ((c != '\n') && (c != EOF)) {
  200.         c = getc(fp) ;
  201.         *(s+i++) = c ;
  202.     }
  203.     *(s+i) = '\0' ;
  204.     return(c) ;
  205. }
  206.