home *** CD-ROM | disk | FTP | other *** search
/ Carousel Volume 2 #1 / carousel.iso / mactosh / hc / hypersou.sit / refer2hc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-09-07  |  3.0 KB  |  189 lines  |  [TEXT/KAHL]

  1. #ifndef lint
  2. static char sccsid[] = "@(#)refer2hc.c 1.2 (Stanford CSLI) 9/87";
  3. #endif 
  4.  
  5. /*
  6.  * Convert refer format into hypercard input.
  7.  * Bill Croft and Bill Palmer
  8.  */
  9.  
  10. #include <stdio.h>
  11.  
  12. /* refer lettered fields. */
  13. char    fa[200];
  14. char    fb[200];
  15. char    fc[200];
  16. char    fd[200];
  17. char    fe[200];
  18. char    fi[200];
  19. char    fj[200];
  20. char    fk[200];
  21. char    fn[200];
  22. char    fp[200];
  23. char    fr[200];
  24. char    ft[200];
  25. char    fv[200];
  26. char    Line[512];
  27. char    buf[2048];
  28. char    revbuf[200];
  29.  
  30. int    wasj, wasb, wasr;
  31.  
  32.  
  33. _main()
  34. {
  35.     int c;
  36.     char *revauth();
  37.     
  38.     resetcard();
  39.     for (;;) {
  40.         if (gets(Line) == NULL) {
  41.             printcard();
  42.             exit(0);
  43.         }
  44.         if (strlen(Line) == 0) {
  45.             printcard();
  46.             resetcard();
  47.             continue;
  48.         }
  49.         if (Line[0] == '%') {
  50.             strcpy(buf, Line);
  51.         } else {
  52.             strcat(buf, " ");
  53.             strcat(buf, Line);
  54.         }
  55.         c = getchar();
  56.         ungetc(c, stdin);
  57.         if (c != EOF && c != '%' && c != '\n')
  58.             continue;
  59.         
  60.         switch (buf[1]) {
  61.         case 'A':
  62.             if (fa[0] != 0) {
  63.                 strcat(fa, ", ");
  64.                 strcat(fa, revauth(&buf[3],revbuf));
  65.             } else {
  66.                 strcpy(fa, revauth(&buf[3],revbuf));
  67.             }
  68.             break;
  69.  
  70.         case 'B':
  71.             wasb++;
  72.             field(fb);
  73.             break;
  74.  
  75.         case 'C': field(fc); break;
  76.         case 'D': field(fd); break;
  77.         case 'E': field(fe); break;
  78.         case 'I': field(fi); break;
  79.  
  80.         case 'J':
  81.             wasj++;
  82.             field(fj);
  83.             break;
  84.  
  85.         case 'K': field(fk); break;
  86.         case 'N': field(fn); break;
  87.         case 'P': field(fp); break;
  88.  
  89.         case 'R':
  90.             wasr++;
  91.             field(fr);
  92.             break;
  93.  
  94.         case 'T': field(ft); break;
  95.         case 'V': field(fv); break;
  96.         }
  97.     }
  98. }
  99.  
  100. resetcard()
  101. {
  102.     fa[0] = fc[0] = fd[0] = fe[0] = fi[0] = fk[0] = 0;
  103.     fn[0] = fp[0] = fv[0] = 0;
  104.     fj[0] = ft[0] = fr[0] = fb[0] = 0;
  105.     wasj = wasr = wasb = 0;
  106. }
  107.  
  108. field(s)
  109.     char *s;
  110. {
  111.     strcpy(s, &buf[3]);
  112. }
  113.  
  114. printcard()
  115. {
  116.     if (ft[0] == 0 && fr[0] == 0 && fb[0] == 0)
  117.         return;
  118.     printf("%s (%s).\t%s\t", fa, fd, ft);
  119.     if (wasj) {
  120.         printf("%s", fj);
  121.         if (fv[0])
  122.             printf(" V%s", fv);
  123.         if (fn[0])
  124.             printf(" N%s", fn);
  125.         if (fp[0])
  126.             printf(" pg %s", fp);
  127.         printf("\t");
  128.     } else {    /* must be book or report */
  129.         if (fb[0]) {    /* this is a book containing an article*/
  130.             if (fe[0])    {/* if there is an editor */
  131.                 printf("In %s (ed.), %s, ",fe,fb);
  132.             } else {    /* no editor */
  133.                 printf("In %s, ",ft);
  134.             }
  135.             printf("pages %s. ",fp);
  136.         } /* this is a report or book (with no article), no extra stuff */
  137.         if (fc[0]) {    /* is there a city? */
  138.             printf("%s: %s.\t",fc,fi);
  139.         } else {
  140.             printf("%s.\t",fi);
  141.         }
  142.     }
  143. #if 0
  144.         if (fr[0])
  145.             strcpy(fb, fr);
  146.         if (fb[0] == 0)
  147.             strcpy(fb, ft);
  148.         if (fe[0])
  149.             printf("In %s (Ed.), ", fe);
  150.         printf("%s. %s:%s\t", fb, fc, fi);
  151.     }
  152. #endif
  153.     printf("\t%s\t", fk);
  154. }
  155.  
  156. char *revauth(s,b)
  157. char *s,*b;
  158. {
  159.     char *init, *name, *jr, *p, *bcop;
  160.     
  161.     bcop = b;
  162.     init = name = s;
  163.     while (*name)
  164.         name++;
  165.     jr = name;
  166.     while (name > init && *name!= ' ')
  167.         name--;
  168.     if (name[-1] == ',' || name[-1]== '(' ) {
  169.         jr = --name;
  170.         while (name>init && *name != ' ')
  171.             name--;
  172.     }
  173.     if (*name = ' ') name++;  /* added */
  174.     p = name;
  175.     while (p < jr)
  176.         *b++ = *p++;
  177.     *b++ = ','; 
  178.     *b++ = ' ';        /* added */
  179.     while (init < name)
  180.         *b++ = *init++;
  181.     if (*jr)
  182.         jr++;
  183.     while(*jr)
  184.         *b++ = *jr++;
  185.     *b++ = 0;
  186.     return(bcop);
  187. }
  188.  
  189.