home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume17 / com_err / part01 / error_table.y < prev    next >
Text File  |  1991-02-25  |  5KB  |  235 lines

  1. %{
  2. #include <stdio.h>
  3. #if !defined(__STDC__) || defined(__HIGHC__)
  4. char *malloc(), *realloc();
  5. #endif     
  6. char *str_concat(), *ds(), *quote();
  7. char *current_token = (char *)NULL;
  8. extern char *table_name;
  9. %}
  10. %union {
  11.     char *dynstr;
  12. }
  13.  
  14. %token ERROR_TABLE ERROR_CODE_ENTRY END
  15. %token <dynstr> STRING QUOTED_STRING
  16. %type <dynstr> ec_name description table_id
  17. %{
  18. %}
  19. %start error_table
  20. %%
  21.  
  22. error_table    :    ERROR_TABLE table_id error_codes END
  23.             { table_name = ds($2);
  24.               current_token = table_name;
  25.               put_ecs(); }
  26.         ;
  27.  
  28. table_id    :    STRING
  29.             { current_token = $1;
  30.               set_table_num($1);
  31.               $$ = $1; }
  32.         ;
  33.  
  34. error_codes    :    error_codes ec_entry
  35.         |    ec_entry
  36.         ;
  37.  
  38. ec_entry    :    ERROR_CODE_ENTRY ec_name ',' description
  39.             { add_ec($2, $4);
  40.               free($2);
  41.               free($4); }
  42.         |    ERROR_CODE_ENTRY ec_name '=' STRING ',' description
  43.             { add_ec_val($2, $4, $6);
  44.               free($2);
  45.               free($4);
  46.               free($6);
  47.             }
  48.         ;
  49.  
  50. ec_name        :    STRING
  51.             { $$ = ds($1);
  52.               current_token = $$; }
  53.         ;
  54.  
  55. description    :    QUOTED_STRING
  56.             { $$ = ds($1);
  57.               current_token = $$; }
  58.         ;
  59.  
  60. %%
  61. /*
  62.  *
  63.  * Copyright 1986, 1987 by the MIT Student Information Processing Board
  64.  *
  65.  * For copyright info, see mit-sipb-copyright.h.
  66.  */
  67.  
  68. #include <string.h>
  69. #include <assert.h>
  70. #include <ctype.h>
  71. #include <sys/types.h>
  72. #include <sys/time.h>
  73. #include "internal.h"
  74. #include "error_table.h"
  75. #include "mit-sipb-copyright.h"
  76.  
  77. #ifndef    lint
  78. static char const rcsid_error_table_y[] =
  79.     "$Header: /afs/athena.mit.edu/user/j/jik/src/delete/et/RCS/error_table.y,v 1.2 89/11/07 18:55:08 jik Exp $";
  80. #endif
  81.  
  82. extern FILE *hfile, *cfile;
  83.  
  84. static long gensym_n = 0;
  85. char *
  86. gensym(x)
  87.     char const *x;
  88. {
  89.     char *symbol;
  90.     if (!gensym_n) {
  91.         struct timeval tv;
  92.         struct timezone tzp;
  93.         gettimeofday(&tv, &tzp);
  94.         gensym_n = (tv.tv_sec%10000)*100 + tv.tv_usec/10000;
  95.     }
  96.     symbol = malloc(32 * sizeof(char));
  97.     gensym_n++;
  98.     sprintf(symbol, "et%ld", gensym_n);
  99.     return(symbol);
  100. }
  101.  
  102. char *
  103. ds(string)
  104.     char const *string;
  105. {
  106.     char *rv;
  107.     rv = malloc(strlen(string)+1);
  108.     strcpy(rv, string);
  109.     return(rv);
  110. }
  111.  
  112. char *
  113. quote(string)
  114.     char const *string;
  115. {
  116.     char *rv;
  117.     rv = malloc(strlen(string)+3);
  118.     strcpy(rv, "\"");
  119.     strcat(rv, string);
  120.     strcat(rv, "\"");
  121.     return(rv);
  122. }
  123.  
  124. long table_number;
  125. int current = 0;
  126. char **error_codes = (char **)NULL;
  127.  
  128. add_ec(name, description)
  129.     char const *name, *description;
  130. {
  131.     fprintf(cfile, "\t\"%s\",\n", description);
  132.     if (error_codes == (char **)NULL) {
  133.         error_codes = (char **)malloc(sizeof(char *));
  134.         *error_codes = (char *)NULL;
  135.     }
  136.     error_codes = (char **)realloc((char *)error_codes,
  137.                        (current + 2)*sizeof(char *));
  138.     error_codes[current++] = ds(name);
  139.     error_codes[current] = (char *)NULL;
  140. }
  141.  
  142. add_ec_val(name, val, description)
  143.     char const *name, *val, *description;
  144. {
  145.     const int ncurrent = atoi(val);
  146.     if (ncurrent < current) {
  147.         printf("Error code %s (%d) out of order", name,
  148.                current);
  149.         return;
  150.     }
  151.       
  152.     while (ncurrent > current)
  153.          fputs("\t(char *)NULL,\n", cfile), current++;
  154.     
  155.     fprintf(cfile, "\t\"%s\",\n", description);
  156.     if (error_codes == (char **)NULL) {
  157.         error_codes = (char **)malloc(sizeof(char *));
  158.         *error_codes = (char *)NULL;
  159.     }
  160.     error_codes = (char **)realloc((char *)error_codes,
  161.                        (current + 2)*sizeof(char *));
  162.     error_codes[current++] = ds(name);
  163.     error_codes[current] = (char *)NULL;
  164.  
  165. put_ecs()
  166. {
  167.     int i;
  168.     for (i = 0; i < current; i++) {
  169.          if (error_codes[i] != (char *)NULL)
  170.           fprintf(hfile, "#define %-40s (%ldL)\n",
  171.               error_codes[i], table_number + i);
  172.     }
  173. }
  174.  
  175. /*
  176.  * char_to_num -- maps letters and numbers into a small numbering space
  177.  *     uppercase ->  1-26
  178.  *    lowercase -> 27-52
  179.  *    digits    -> 53-62
  180.  *    underscore-> 63
  181.  */
  182.  
  183. static const char char_set[] =
  184.     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
  185.  
  186. int char_to_num(c)
  187.     char c;
  188. {
  189.     const char *where;
  190.     int diff;
  191.  
  192.     where = strchr (char_set, c);
  193.     if (where) {
  194.         diff = where - char_set + 1;
  195.         assert (diff < (1 << ERRCODE_RANGE));
  196.         return diff;
  197.     }
  198.     else if (isprint (c))
  199.         fprintf (stderr,
  200.              "Illegal character `%c' in error table name\n",
  201.              c);
  202.     else
  203.         fprintf (stderr,
  204.              "Illegal character %03o in error table name\n",
  205.              c);
  206.     exit (1);
  207. }
  208.  
  209. set_table_num(string)
  210.     char *string;
  211. {
  212.     if (char_to_num (string[0]) > char_to_num ('z')) {
  213.         fprintf (stderr, "%s%s%s%s",
  214.              "First character of error table name must be ",
  215.              "a letter; name ``",
  216.              string, "'' rejected\n");
  217.         exit (1);
  218.     }
  219.     if (strlen(string) > 4) {
  220.         fprintf(stderr, "Table name %s too long, truncated ",
  221.             string);
  222.         string[4] = '\0';
  223.         fprintf(stderr, "to %s\n", string);
  224.     }
  225.     while (*string != '\0') {
  226.         table_number = (table_number << BITS_PER_CHAR)
  227.             + char_to_num(*string);
  228.         string++;
  229.     }
  230.     table_number = table_number << ERRCODE_RANGE;
  231. }
  232.  
  233. #include "et_lex.lex.c"
  234.