home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2279 / getscan.c next >
Encoding:
C/C++ Source or Header  |  1990-12-28  |  7.0 KB  |  304 lines

  1. /* Copyright (c) 1986, Greg McGary */
  2. static char sccsid[] = "@(#)getscan.c    1.1 86/10/09";
  3.  
  4. #include    <stdio.h>
  5. #include    <string.h>
  6. #include    <id.h>
  7. #include    <ctype.h>
  8. #include    <extern.h>
  9.  
  10. char *getLanguage();
  11. char *(*getScanner())();
  12. void setScanArgs();
  13.  
  14. static struct sufftab *suffSlot();
  15. static struct langtab *langSlot();
  16. static void sorryNoScan();
  17.  
  18. void setAdaArgs(lang) { sorryNoScan(lang); }
  19. char *getAdaId() { setAdaArgs("ada"); return NULL; }
  20.  
  21. void setPascalArgs(lang) { sorryNoScan(lang); }
  22. char *getPascalId() { setPascalArgs("pascal"); return NULL; }
  23.  
  24. void setLispArgs(lang) { sorryNoScan(lang); }
  25. char *getLispId() { setLispArgs("lisp"); return NULL; }
  26.  
  27. struct langtab {
  28.     struct langtab    *lt_next;
  29.     char    *lt_name;
  30.     char    *(*lt_getid)();
  31.     void    (*lt_setargs)();
  32.     char    *lt_filter;
  33. };
  34.  
  35. struct sufftab {
  36.     struct sufftab    *st_next;
  37.     char    *st_suffix;
  38.     struct langtab *st_lang;
  39. };
  40.  
  41.  
  42. struct langtab langtab[] = {
  43. #define    SCAN_C        (&langtab[0])
  44. {&langtab[1],    "c",        getCId,        setCArgs,    NULL},
  45. #define    SCAN_ASM    (&langtab[1])
  46. {&langtab[2],    "asm",        getAsmId,    setAsmArgs,    NULL},
  47. #define    SCAN_ADA    (&langtab[2])
  48. {&langtab[3],    "ada",        getAdaId,    setAdaArgs,    NULL},
  49. #define    SCAN_PASCAL    (&langtab[3])
  50. {&langtab[4],    "pascal",    getPascalId,    setPascalArgs,    NULL},
  51. #define    SCAN_LISP    (&langtab[4])
  52. {&langtab[5],    "lisp",        getLispId,    setLispArgs,    NULL},
  53. #define    SCAN_TEXT    (&langtab[5])
  54. {&langtab[6],    "text",        getTextId,    setTextArgs,    NULL},
  55. #define SCAN_VHIL    (&langtab[6])
  56. {&langtab[7],    "vhil",        getVhilId,    setCArgs,    NULL},
  57. #define SCAN_TEX    (&langtab[7])
  58. {&langtab[8],    "tex",        getTextId,    setTextArgs,    "detex -i %s"},
  59. #define SCAN_ROFF    (&langtab[8])
  60. {&langtab[9],    "roff",        getTextId,    setTextArgs,    "sed '/^\\.so/d' < %s | deroff"},
  61. #define SCAN_CATMAN    (&langtab[9])
  62. {&langtab[10],    "catman",    getTextId,    setTextArgs,    "pcat %s | col -b"},
  63. { NULL, NULL, NULL, NULL, NULL}
  64. };
  65.  
  66. /*
  67.     This is a rather incomplete list of default associations
  68.     between suffixes and languages.  You may add more to the
  69.     default list, or you may define them dynamically with the
  70.     `-S<suff>=<lang>' argument to mkid(1) and idx(1).  e.g. to
  71.     associate a `.ada' suffix with the Ada language, use
  72.     `-S.ada=ada'
  73. */
  74. struct sufftab sufftab[] = {
  75. {&sufftab[1],    ".c",    SCAN_C        },
  76. {&sufftab[2],    ".h",    SCAN_C        },
  77. {&sufftab[3],    ".y",    SCAN_C        },
  78. {&sufftab[4],    ".s",    SCAN_ASM    },
  79. {&sufftab[5],    ".p",    SCAN_PASCAL    },
  80. {&sufftab[6],    ".pas",    SCAN_PASCAL    },
  81. {&sufftab[7],    ".x",    SCAN_VHIL    },
  82. {&sufftab[8],    ".l",    SCAN_C        },    /* lex */
  83. {&sufftab[9],    ".doc",    SCAN_TEXT    },
  84. {&sufftab[10],    ".1",    SCAN_ROFF    },
  85. {&sufftab[11],    ".tex",    SCAN_TEX    },
  86. {&sufftab[12],    ".z",    SCAN_CATMAN    },
  87. {&sufftab[13],    "",    SCAN_TEXT    },    /* default to text */
  88. { NULL, NULL, NULL },
  89. };
  90.  
  91. /*
  92.     Return an index into the langtab array for the given suffix.
  93. */
  94. static struct sufftab *
  95. suffSlot(suffix)
  96.     register char    *suffix;
  97. {
  98.     register struct sufftab    *stp;
  99.  
  100.     if (suffix == NULL)
  101.         suffix = "";
  102.  
  103.     for (stp = sufftab; stp->st_next; stp = stp->st_next)
  104.         if (strequ(stp->st_suffix, suffix))
  105.             return stp;
  106.     return stp;
  107. }
  108.  
  109. static struct langtab *
  110. langSlot(lang)
  111.     char        *lang;
  112. {
  113.     register struct langtab    *ltp;
  114.  
  115.     if (lang == NULL)
  116.         lang = "";
  117.  
  118.     for (ltp = langtab; ltp->lt_next; ltp = ltp->lt_next)
  119.         if (strequ(ltp->lt_name, lang))
  120.             return ltp;
  121.     return ltp;
  122. }
  123.  
  124. char *
  125. getLanguage(suffix)
  126.     char        *suffix;
  127. {
  128.     struct sufftab    *stp;
  129.  
  130.     if ((stp = suffSlot(suffix))->st_next == NULL)
  131.         return NULL;
  132.     return (stp->st_lang->lt_name);
  133. }
  134.  
  135. char *
  136. getFilter(suffix)
  137.     char        *suffix;
  138. {
  139.     struct sufftab    *stp;
  140.  
  141.     if ((stp = suffSlot(suffix))->st_next == NULL)
  142.         return NULL;
  143.     return (stp->st_lang->lt_filter);
  144. }
  145.  
  146. char *(*
  147. getScanner(lang))()
  148.     char        *lang;
  149. {
  150.     struct langtab    *ltp;
  151.  
  152.     if ((ltp = langSlot(lang))->lt_next == NULL)
  153.         return NULL;
  154.     return (ltp->lt_getid);
  155. }
  156.  
  157. static void
  158. usage()
  159. {
  160.     fprintf(stderr, "Usage: %s [-S<suffix>=<lang>] [+S(+|-)<arg>] [-S<lang>(+|-)<arg>] [-S<lang>/<lang>/<filter>]\n", MyName);
  161.     exit(1);
  162. }
  163. void
  164. setScanArgs(op, arg)
  165.     int        op;
  166.     char        *arg;
  167. {
  168.     struct langtab    *ltp, *ltp2;
  169.     struct sufftab    *stp;
  170.     char        *lhs, *lhs2;
  171.     int        count = 0;
  172.  
  173.     lhs = arg;
  174.     while (isalnum(*arg) || *arg == '.')
  175.         arg++;
  176.  
  177.     if (strequ(lhs, "?=?")) {
  178.         for (stp = sufftab; stp->st_next; stp = stp->st_next) {
  179.             printf("%s%s=%s", (count++>0)?", ":"", stp->st_suffix, stp->st_lang->lt_name);
  180.             if (stp->st_lang->lt_filter)
  181.                 printf(" (%s)", stp->st_lang->lt_filter);
  182.         }
  183.         if (count)
  184.             putchar('\n');
  185.         return;
  186.     }
  187.  
  188.     if (strnequ(lhs, "?=", 2)) {
  189.         lhs += 2;
  190.         if ((ltp = langSlot(lhs))->lt_next == NULL) {
  191.             printf("No scanner for language `%s'\n", lhs);
  192.             return;
  193.         }
  194.         for (stp = sufftab; stp->st_next; stp = stp->st_next)
  195.             if (stp->st_lang == ltp) {
  196.                 printf("%s%s=%s", (count++>0)?", ":"", stp->st_suffix, ltp->lt_name);
  197.                 if (stp->st_lang->lt_filter)
  198.                     printf(" (%s)", stp->st_lang->lt_filter);
  199.             }
  200.         if (count)
  201.             putchar('\n');
  202.         return;
  203.     }
  204.  
  205.     if (strequ(arg, "=?")) {
  206.         lhs[strlen(lhs)-2] = '\0';
  207.         if ((stp = suffSlot(lhs))->st_next == NULL) {
  208.             printf("No scanner assigned to suffix `%s'\n", lhs);
  209.             return;
  210.         }
  211.         printf("%s=%s", stp->st_suffix, stp->st_lang->lt_name);
  212.         if (stp->st_lang->lt_filter)
  213.             printf(" (%s)",stp->st_lang->lt_filter);
  214.         printf("\n");
  215.         return;
  216.     }
  217.  
  218.     if (*arg == '=') {
  219.         *arg++ = '\0';
  220.         
  221.         if ((ltp = langSlot(arg))->lt_next == NULL) {
  222.             fprintf(stderr, "%s: Language undefined: %s\n", MyName, arg);
  223.             return;
  224.         }
  225.         if ((stp = suffSlot(lhs))->st_next == NULL) {
  226.             stp->st_suffix = lhs;
  227.             stp->st_lang = ltp;
  228.             stp->st_next = NEW(struct sufftab);
  229.         } else if (!strequ(arg, stp->st_lang->lt_name)) {
  230.             fprintf(stderr, "%s: Note: `%s=%s' overrides `%s=%s'\n", MyName, lhs, arg, lhs, stp->st_lang->lt_name);
  231.             stp->st_lang = ltp;
  232.         }
  233.         return;
  234.     } else if (*arg == '/') {
  235.         *arg++ = '\0';
  236.         if ((ltp = langSlot(lhs))->lt_next == NULL) {
  237.             ltp->lt_name = lhs;
  238.             ltp->lt_getid = getTextId;
  239.             ltp->lt_setargs = setTextArgs;
  240.             ltp->lt_filter = NULL;
  241.             ltp->lt_next = NEW(struct langtab);
  242.         }
  243.         lhs2 = arg;
  244.         arg = strchr(arg, '/');
  245.         if (arg == NULL) {
  246.             ltp2 = ltp;
  247.         } else {
  248.             *arg++ = '\0';
  249.             if ((ltp2 = langSlot(lhs2))->lt_next == NULL) {
  250.                 fprintf(stderr,"%s: language %s not defined.\n", MyName, lhs2);
  251.                 ltp2 = ltp;
  252.             }
  253.         }
  254.         ltp->lt_getid = ltp2->lt_getid;
  255.         ltp->lt_setargs = ltp2->lt_setargs;
  256.         if ((ltp->lt_filter != NULL) && (!strequ(arg, ltp->lt_filter))){
  257.             fprintf(stderr, "%s: Note: `%s/%s' overrides `%s/%s'\n", MyName, lhs, arg, lhs, ltp->lt_filter);
  258.         }
  259.         ltp->lt_filter = arg;
  260.         return;
  261.     }
  262.     
  263.     if (op == '+') {
  264.         switch (op = *arg++)
  265.         {
  266.         case '+':
  267.         case '-':
  268.         case '?':
  269.             break;
  270.         default:
  271.             usage();
  272.         }
  273.         for (ltp = langtab; ltp->lt_next; ltp = ltp->lt_next)
  274.             (*ltp->lt_setargs)(NULL, op, arg);
  275.         return;
  276.     }
  277.  
  278.     if (*arg == '-' || *arg == '+' || *arg == '?') {
  279.         op = *arg;
  280.         *arg++ = '\0';
  281.         
  282.         if ((ltp = langSlot(lhs))->lt_next == NULL) {
  283.             fprintf(stderr, "%s: Language undefined: %s\n", MyName, lhs);
  284.             return;
  285.         }
  286.         (*ltp->lt_setargs)(lhs, op, arg);
  287.         return;
  288.     }
  289.  
  290.     usage();
  291. }
  292.  
  293. /*
  294.     Notify user of unimplemented scanners.
  295. */
  296. static void
  297. sorryNoScan(lang)
  298.     char        *lang;
  299. {
  300.     if (lang == NULL)
  301.         return;
  302.     fprintf(stderr, "Sorry, no scanner is implemented for %s...\n", lang);
  303. }
  304.