home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume14 / jove4.9 / part02 / setmaps.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-04-25  |  4.0 KB  |  210 lines

  1. /***************************************************************************
  2.  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
  3.  * is provided to you without charge, and with no warranty.  You may give  *
  4.  * away copies of JOVE, including sources, provided that this notice is    *
  5.  * included in all the files.                                              *
  6.  ***************************************************************************/
  7.  
  8. #define TXT_TO_C    1    /* must be a number for MAC compiler */
  9.  
  10. #include "funcdefs.c"
  11.  
  12. #ifdef MAC
  13. #include "vars.c"
  14. #endif
  15.  
  16. #undef putchar    /* From jove.h via funcdefs.c, conflicts with STDIO */
  17. #undef putc
  18. #undef getc
  19. #undef EOF
  20. #undef FILE
  21. #undef BUFSIZ
  22. #undef NULL
  23. #include <stdio.h>
  24.  
  25. matchcmd(choices, what)
  26. register struct cmd    choices[];
  27. register char    *what;
  28. {
  29.     register int    len;
  30.     int    i,
  31.         found = 0,
  32.         save,
  33.         exactmatch = -1;
  34.  
  35.     len = strlen(what);
  36.     for (i = 0; choices[i].Name != 0; i++) {
  37.         if (*what != *choices[i].Name)
  38.             continue;
  39. #ifdef MAC /* see "left-margin" and "left-margin-here" */
  40.         if (strcmp(what, choices[i].Name) == 0)
  41. #else
  42.         if (strncmp(what, choices[i].Name, len) == 0)
  43. #endif
  44.         return i;
  45.     }
  46.     return -1;
  47. }
  48.  
  49. #ifdef MAC
  50. matchvar(choices, what)
  51. register struct variable choices[];
  52. register char    *what;
  53. {
  54.     register int    len;
  55.     int    i,
  56.         found = 0,
  57.         save,
  58.         exactmatch = -1;
  59.  
  60.     len = strlen(what);
  61.     for (i = 0; choices[i].Name != 0; i++) {
  62.         if (*what != *choices[i].Name)
  63.             continue;
  64.         if (strcmp(what, choices[i].Name) == 0)
  65.             return i;
  66.     }
  67.     return -1;
  68. }
  69. #endif
  70.  
  71. char *
  72. PPchar(c)
  73. int    c;
  74. {
  75.     static char    str[16];
  76.     char    *cp = str;
  77.  
  78.     if (c & 0200) {
  79.         c &= ~0200;
  80.         strcpy(cp, "M-");
  81.         cp += 2;
  82.     }
  83.     if (c == '\033')
  84.         strcpy(cp, "ESC");
  85. #ifdef IBMPC
  86.     else if (c == '\377')
  87.             strcpy(cp, "M");
  88. #endif /* IBMPC */
  89.     else if (c < ' ')
  90.         (void) sprintf(cp, "C-%c", c + '@');
  91.     else if (c == '\177')
  92.         strcpy(cp, "^?");
  93.     else
  94.         (void) sprintf(cp, "%c", c);
  95.     return str;
  96. }
  97.  
  98. void
  99. extract(into, from)
  100. char    *into,
  101.     *from;
  102. {
  103.     from += 2;    /* Past tab and first double quote. */
  104.     while ((*into = *from++) != '"')
  105.         into += 1;
  106.     *into = 0;
  107. }
  108.  
  109.  
  110. void
  111.  
  112. #ifdef MAC
  113. _main()        /* for Mac, so we can use redirection */
  114. #else
  115. main()
  116. #endif
  117. {
  118.     FILE    *ifile,
  119.         *of;
  120.     char    line[100],
  121. #ifdef MAC
  122.         *which,
  123. #endif
  124.         comname[70];
  125.     int    comnum,
  126.         ch,
  127. #ifdef MAC
  128.         inmenu = 0,
  129. #endif
  130.         savech = -1,
  131.         errors = 0;
  132.  
  133.     ifile = stdin;
  134.     of = stdout;
  135.     if (ifile == NULL || of == NULL) {
  136.         printf("Cannot read input or write output.\n");
  137.         exit(1);
  138.     }
  139.     while (fgets(line, sizeof line, ifile) != NULL) {
  140.         if (strncmp(line, "#if", 3) == 0) {
  141.             savech = ch;
  142.             fprintf(of, line);
  143.             continue;
  144.         } else if (strncmp(line, "#else", 5) == 0) {
  145.             if (savech == -1)
  146.                 fprintf(stderr, "WARNING: ifdef/endif mismatch!\n");
  147.             else
  148.                 ch = savech;
  149.             fprintf(of, line);
  150.             continue;
  151.         } else if (strncmp(line, "#endif", 6) == 0) {
  152.             savech = -1;
  153.             fprintf(of, line);
  154.             continue;
  155. #ifdef MAC
  156.         } else if (strncmp(line, "#MENU", 5) == 0) {
  157.             inmenu = 1;
  158.             continue;
  159. #endif
  160.         } else if (strncmp(line, "\t\"", 2) != 0) {
  161.             fprintf(of, line);
  162.             ch = 0;
  163.             continue;
  164.         }
  165.         extract(comname, line);
  166.         if (strcmp(comname, "unbound") == 0)
  167.             comnum = 12345;
  168.         else {
  169. #ifdef MAC
  170.             which = "commands";
  171. #endif
  172.             comnum = matchcmd(commands, comname);
  173. #ifdef MAC
  174.             if (comnum < 0 && inmenu) {
  175.                 comnum = matchvar(variables, comname);
  176.                 which = "variables";
  177.             }
  178. #endif
  179.             if (comnum < 0) {
  180. #ifdef MAC
  181.                 fprintf(stderr, "Warning: cannot find item \"%s\".\n", comname);
  182. #else
  183.                 fprintf(stderr, "Warning: cannot find command \"%s\".\n", comname);
  184. #endif
  185.                 errors += 1;
  186.                 comnum = 12345;
  187.             }
  188.         }
  189. #ifdef MAC
  190.         if(inmenu) {
  191.             if (comnum == 12345)
  192.                 fprintf(of, "    (data_obj *) 0,\n");
  193.             else
  194.                 fprintf(of, "    (data_obj *) &%s[%d],\n",which, comnum);
  195.         } 
  196.         else {
  197. #endif
  198.         if (comnum == 12345)
  199.             fprintf(of, "    (data_obj *) 0,                 /* %s */\n", PPchar(ch++));
  200.         else
  201.             fprintf(of, "    (data_obj *) &commands[%d],    /* %s */\n", comnum, PPchar(ch++));
  202.     }
  203. #ifdef MAC
  204.     }
  205. #endif
  206.     fclose(of);
  207.     fclose(ifile);
  208.     exit(errors);
  209. }
  210.