home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume17 / pps / lind.c < prev    next >
C/C++ Source or Header  |  1989-02-06  |  3KB  |  171 lines

  1. #ifndef lint
  2. static char rcsid[] = "$Header: lind.c,v 0.0 88/06/22 05:22:17 on Rel $";
  3. #endif
  4. #include <stdio.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7.  
  8. /*
  9.  * Language-independent PostScript Interface.
  10.  *
  11.  * Use language dependent yylex() to output Postscript Macros:
  12.  * (string) fname - take string to be the current filename.
  13.  * (string) funct - take string to be the current function name.
  14.  * (string) Font s - put string at current location, using Font.
  15.  * n t - put n tabs
  16.  * n n - put n newlines
  17.  * n f - put n newpages
  18.  */
  19. extern char *keywords[];    /* must be defined in lexer */
  20. FILE *yyin;
  21. FILE *yyout;
  22. #define yyoutput(C)    putc((C), yyout)
  23.  
  24. char *font = "INITIAL";
  25. int bdone;    /* a string is being output */
  26.  
  27. /*
  28.  * Print yytext[], escaping postscript 'dirty' characters.
  29.  * Start a postscript string output sequence, if necessary.
  30.  */
  31. echo(cp)
  32. register char *cp;
  33. {
  34.     if (!*cp)
  35.         return;
  36.  
  37.     if (bdone++ == 0)
  38.         yyoutput('(');
  39.     for (; *cp; cp++)
  40.         switch (*cp) {
  41.             case '(':
  42.             case ')':
  43.             case '\\':
  44.                 yyoutput('\\');
  45.             default:
  46.                 yyoutput(*cp);
  47.         }
  48. }
  49.  
  50. /*
  51.  * Terminate a string output sequence.
  52.  */
  53. sput()
  54. {
  55.     if (bdone == 0)
  56.         return;
  57.     fprintf(yyout, ") %c s ", *font);
  58.     bdone = 0;
  59. }
  60.  
  61. /*
  62.  * Output a string of tabs, newlines or formfeeds.
  63.  */
  64. space(s)
  65. register char *s;
  66. {
  67.     register n, prev;
  68.     char *fmt;
  69.  
  70.     while (*s) {
  71.         for (prev = *s, n = 0; prev == *s; s++, n++)
  72.             ;
  73.         switch (prev) {
  74.             case '\t':
  75.                 fmt = "%d t\t";
  76.                 break;
  77.             case '\n':
  78.                 fmt = "%d n\n";
  79.                 break;
  80.             case '\f':
  81.                 fmt = "%d f\n";
  82.                 break;
  83.         }
  84.         sput();
  85.         fprintf(yyout, fmt, n);
  86.     }
  87. }
  88.  
  89. /*
  90.  * Print a subtitle.
  91.  */
  92. funct(s)
  93. register char *s;
  94. {
  95.     if (!*s)
  96.         return;
  97.     sput();
  98.     echo(s);
  99.     fprintf(yyout, ") funct\n", s);
  100.     bdone = 0;
  101. }
  102. /*
  103.  * Is s a keyword?
  104.  */
  105. iskw(s)
  106. register char *s;
  107. {
  108.     register char **kw;
  109.  
  110.     for (kw = &keywords[1]; *kw; kw++) {
  111.         register char *kp = *kw;
  112.         register char *sp = s;
  113.  
  114.         while (*kp == *sp++)
  115.             if (*kp++ == '\0')
  116.                 return(kw - keywords);
  117.     }
  118.     return(0);
  119. }
  120.  
  121. /*
  122.  * Given a file descriptor, print its modification date.
  123.  */
  124. void
  125. fdate(fd)
  126. int fd;
  127. {
  128.     struct stat st;
  129.     register char *cp;
  130.     extern char *ctime();
  131.  
  132.     if (fstat(fd, &st) < 0 || (st.st_mode & S_IFMT) != S_IFREG)
  133.         time(&st.st_mtime);
  134.     cp = ctime(&st.st_mtime);
  135.     strcpy(&cp[16], &cp[19]);
  136.     fprintf(yyout, "(%.17s) fdate\n", &cp[4]);
  137. }
  138.  
  139. /*
  140.  * yyelx() each input file.
  141.  */
  142. main(argc, argv)
  143. char **argv;
  144. {
  145.     int i;
  146.  
  147.     if (argc == 1) {
  148.         fdate(fileno(yyin = stdin));
  149.         fprintf(yyout, "() fname\n");
  150.         yylex();
  151.         sput();
  152.     }
  153.     for (i = 1; i < argc; i++) {
  154.         if (*argv[i] == '-') {
  155.             yyin = stdin;
  156.             *argv[i] = '\0';
  157.         } else if ((yyin = fopen(argv[i], "r")) == NULL) {
  158.             perror(argv[i]);
  159.             continue;
  160.         }
  161.  
  162.         fdate(fileno(yyin));
  163.         fprintf(yyout, "(%s) fname\n", argv[i]);
  164.         yylex();
  165.         sput();
  166.         if (yyin != stdin)
  167.             fclose(yyin);
  168.     }
  169.     exit(0);
  170. }
  171.