home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / fish / programming / mkid / src / getscan.c < prev    next >
C/C++ Source or Header  |  1991-02-01  |  6KB  |  254 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 setTextArgs(lang) { sorryNoScan(lang); }
  25. char *getTextId() { setTextArgs("plain text"); return NULL; }
  26.  
  27. void setRoffArgs(lang) { sorryNoScan(lang); }
  28. char *getRoffId() { setRoffArgs("[nt]roff"); return NULL; }
  29.  
  30. void setTeXArgs(lang) { sorryNoScan(lang); }
  31. char *getTeXId() { setTeXArgs("TeX"); return NULL; }
  32.  
  33. void setLispArgs(lang) { sorryNoScan(lang); }
  34. char *getLispId() { setLispArgs("lisp"); return NULL; }
  35.  
  36. struct langtab {
  37.     struct langtab    *lt_next;
  38.     char    *lt_name;
  39.     char    *(*lt_getid)();
  40.     void    (*lt_setargs)();
  41. };
  42.  
  43. struct sufftab {
  44.     struct sufftab    *st_next;
  45.     char    *st_suffix;
  46.     struct langtab *st_lang;
  47. };
  48.  
  49.  
  50. struct langtab langtab[] = {
  51. #define    SCAN_C        (&langtab[0])
  52. {    &langtab[1],    "c",        getCId,        setCArgs    },
  53. #define    SCAN_ASM    (&langtab[1])
  54. {    &langtab[2],    "asm",        getAsmId,    setAsmArgs    },
  55. #define    SCAN_ADA    (&langtab[2])
  56. {    &langtab[3],    "ada",        getAdaId,    setAdaArgs    },
  57. #define    SCAN_PASCAL    (&langtab[3])
  58. {    &langtab[4],    "pascal",    getPascalId,    setPascalArgs    },
  59. #define    SCAN_LISP    (&langtab[4])
  60. {    &langtab[5],    "lisp",        getLispId,    setLispArgs    },
  61. #define    SCAN_TEXT    (&langtab[5])
  62. {    &langtab[6],    "text",        getTextId,    setTextArgs    },
  63. #define    SCAN_ROFF    (&langtab[6])
  64. {    &langtab[7],    "roff",        getRoffId,    setRoffArgs    },
  65. #define    SCAN_TEX    (&langtab[7])
  66. {    &langtab[8],    "tex",        getTeXId,    setTeXArgs    },
  67. { NULL, NULL, NULL, NULL }
  68. };
  69.  
  70. /*
  71.     This is a rather incomplete list of default associations
  72.     between suffixes and languages.  You may add more to the
  73.     default list, or you may define them dynamically with the
  74.     `-S<suff>=<lang>' argument to mkid(1) and idx(1).  e.g. to
  75.     associate a `.ada' suffix with the Ada language, use
  76.     `-S.ada=ada'
  77. */
  78. struct sufftab sufftab[] = {
  79. {    &sufftab[1],    ".c",    SCAN_C        },
  80. {    &sufftab[2],    ".h",    SCAN_C        },
  81. {    &sufftab[3],    ".y",    SCAN_C        },
  82. {    &sufftab[4],    ".s",    SCAN_ASM    },
  83. {    &sufftab[5],    ".p",    SCAN_PASCAL    },
  84. {    &sufftab[6],    ".pas",    SCAN_PASCAL    },
  85. { NULL, NULL, NULL },
  86. };
  87.  
  88. /*
  89.     Return an index into the langtab array for the given suffix.
  90. */
  91. static struct sufftab *
  92. suffSlot(suffix)
  93.     register char    *suffix;
  94. {
  95.     register struct sufftab    *stp;
  96.  
  97.     if (suffix == NULL)
  98.         suffix = "";
  99.  
  100.     for (stp = sufftab; stp->st_next; stp = stp->st_next)
  101.         if (strequ(stp->st_suffix, suffix))
  102.             return stp;
  103.     return stp;
  104. }
  105.  
  106. static struct langtab *
  107. langSlot(lang)
  108.     char        *lang;
  109. {
  110.     register struct langtab    *ltp;
  111.  
  112.     if (lang == NULL)
  113.         lang = "";
  114.  
  115.     for (ltp = langtab; ltp->lt_next; ltp = ltp->lt_next)
  116.         if (strequ(ltp->lt_name, lang))
  117.             return ltp;
  118.     return ltp;
  119. }
  120.  
  121. char *
  122. getLanguage(suffix)
  123.     char        *suffix;
  124. {
  125.     struct sufftab    *stp;
  126.  
  127.     if ((stp = suffSlot(suffix))->st_next == NULL)
  128.         return NULL;
  129.     return (stp->st_lang->lt_name);
  130. }
  131.  
  132. char *(*
  133. getScanner(lang))()
  134.     char        *lang;
  135. {
  136.     struct langtab    *ltp;
  137.  
  138.     if ((ltp = langSlot(lang))->lt_next == NULL)
  139.         return NULL;
  140.     return (ltp->lt_getid);
  141. }
  142.  
  143. static void
  144. usage()
  145. {
  146.     fprintf(stderr, "Usage: %s [-S<suffix>=<lang>] [+S(+|-)<arg>] [-S<lang>(+|-)<arg>]\n", MyName);
  147.     exit(1);
  148. }
  149. void
  150. setScanArgs(op, arg)
  151.     int        op;
  152.     char        *arg;
  153. {
  154.     struct langtab    *ltp;
  155.     struct sufftab    *stp;
  156.     char        *lhs;
  157.     int        count = 0;
  158.  
  159.     lhs = arg;
  160.     while (isalnum(*arg) || *arg == '.')
  161.         arg++;
  162.  
  163.     if (strequ(lhs, "?=?")) {
  164.         for (stp = sufftab; stp->st_next; stp = stp->st_next)
  165.             printf("%s%s=%s", (count++>0)?", ":"", stp->st_suffix, stp->st_lang->lt_name);
  166.         if (count)
  167.             putchar('\n');
  168.         return;
  169.     }
  170.  
  171.     if (strnequ(lhs, "?=", 2)) {
  172.         lhs += 2;
  173.         if ((ltp = langSlot(lhs))->lt_next == NULL) {
  174.             printf("No scanner for language `%s'\n", lhs);
  175.             return;
  176.         }
  177.         for (stp = sufftab; stp->st_next; stp = stp->st_next)
  178.             if (stp->st_lang == ltp)
  179.                 printf("%s%s=%s", (count++>0)?", ":"", stp->st_suffix, ltp->lt_name);
  180.         if (count)
  181.             putchar('\n');
  182.         return;
  183.     }
  184.  
  185.     if (strequ(arg, "=?")) {
  186.         lhs[strlen(lhs)-2] = '\0';
  187.         if ((stp = suffSlot(lhs))->st_next == NULL) {
  188.             printf("No scanner assigned to suffix `%s'\n", lhs);
  189.             return;
  190.         }
  191.         printf("%s=%s\n", stp->st_suffix, stp->st_lang->lt_name);
  192.         return;
  193.     }
  194.  
  195.     if (*arg == '=') {
  196.         *arg++ = '\0';
  197.         
  198.         if ((ltp = langSlot(arg))->lt_next == NULL) {
  199.             fprintf(stderr, "%s: Language undefined: %s\n", MyName, arg);
  200.             return;
  201.         }
  202.         if ((stp = suffSlot(lhs))->st_next == NULL) {
  203.             stp->st_suffix = lhs;
  204.             stp->st_lang = ltp;
  205.             stp->st_next = NEW(struct sufftab);
  206.         } else if (!strequ(arg, stp->st_lang->lt_name)) {
  207.             fprintf(stderr, "%s: Note: `%s=%s' overrides `%s=%s'\n", MyName, lhs, arg, lhs, stp->st_lang->lt_name);
  208.             stp->st_lang = ltp;
  209.         }
  210.         return;
  211.     }
  212.     
  213.     if (op == '+') {
  214.         switch (op = *arg++)
  215.         {
  216.         case '+':
  217.         case '-':
  218.         case '?':
  219.             break;
  220.         default:
  221.             usage();
  222.         }
  223.         for (ltp = langtab; ltp->lt_next; ltp = ltp->lt_next)
  224.             (*ltp->lt_setargs)(NULL, op, arg);
  225.         return;
  226.     }
  227.  
  228.     if (*arg == '-' || *arg == '+' || *arg == '?') {
  229.         op = *arg;
  230.         *arg++ = '\0';
  231.         
  232.         if ((ltp = langSlot(lhs))->lt_next == NULL) {
  233.             fprintf(stderr, "%s: Language undefined: %s\n", MyName, lhs);
  234.             return;
  235.         }
  236.         (*ltp->lt_setargs)(lhs, op, arg);
  237.         return;
  238.     }
  239.  
  240.     usage();
  241. }
  242.  
  243. /*
  244.     Notify user of unimplemented scanners.
  245. */
  246. static void
  247. sorryNoScan(lang)
  248.     char        *lang;
  249. {
  250.     if (lang == NULL)
  251.         return;
  252.     fprintf(stderr, "Sorry, no scanner is implemented for %s...\n", lang);
  253. }
  254.