Annotation of GNUtools/cc/gen-protos.c, revision 1.1.1.1

1.1       root        1: /* gen-protos.c - massages a list of prototypes, for use by fixproto.
                      2:    Copyright (C) 1993 Free Software Foundation, Inc.
                      3: 
                      4: This program is free software; you can redistribute it and/or modify it
                      5: under the terms of the GNU General Public License as published by the
                      6: Free Software Foundation; either version 2, or (at your option) any
                      7: later version.
                      8: 
                      9: This program is distributed in the hope that it will be useful,
                     10: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     12: GNU General Public License for more details.
                     13: 
                     14: You should have received a copy of the GNU General Public License
                     15: along with this program; if not, write to the Free Software
                     16: Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     17: 
                     18: #include <stdio.h>
                     19: #include <ctype.h>
                     20: #include "hconfig.h"
                     21: #include "scan.h"
                     22: 
                     23: #define HASH_SIZE 2503 /* a prime */
                     24: 
                     25: int hash_tab[HASH_SIZE];
                     26: int verbose = 0;
                     27: 
                     28: sstring linebuf;
                     29: 
                     30: /* Avoid error if config defines abort as fancy_abort.
                     31:    It's not worth "really" implementing this because ordinary
                     32:    compiler users never run fix-header.  */
                     33: 
                     34: void
                     35: fancy_abort ()
                     36: {
                     37:   abort ();
                     38: }
                     39: 
                     40: int
                     41: main (argc, argv)
                     42:      int argc;
                     43:      char** argv;
                     44: {
                     45:   FILE *inf = stdin;
                     46:   FILE *outf = stdout;
                     47:   int next_index = 0;
                     48:   int i, i0;
                     49: 
                     50:   fprintf (outf, "struct fn_decl std_protos[] = {\n");
                     51: 
                     52:   for (;;)
                     53:     {
                     54:       int c = skip_spaces (inf, ' ');
                     55:       int param_nesting = 1;
                     56:       char *param_start, *param_end, *decl_start,
                     57:       *name_start, *name_end;
                     58:       register char *ptr;
                     59:       if (c == EOF)
                     60:        break;
                     61:       linebuf.ptr = linebuf.base;
                     62:       ungetc (c, inf);
                     63:       c = read_upto (inf, &linebuf, '\n');
                     64:       if (linebuf.base[0] == '#') /* skip cpp command */
                     65:        continue;
                     66:       if (linebuf.base[0] == '\0') /* skip empty line */
                     67:        continue;
                     68: 
                     69:       ptr = linebuf.ptr - 1;
                     70:       while (*ptr == ' ' || *ptr == '\t') ptr--;
                     71:       if (*ptr-- != ';')
                     72:        {
                     73:          fprintf (stderr, "Funny input line: %s\n", linebuf.base);
                     74:          continue;
                     75:        }
                     76:       while (*ptr == ' ' || *ptr == '\t') ptr--;
                     77:       if (*ptr != ')')
                     78:        {
                     79:          fprintf (stderr, "Funny input line: %s\n", linebuf.base);
                     80:          continue;
                     81:        }
                     82:       param_end = ptr;
                     83:       for (;;)
                     84:        {
                     85:          int c = *--ptr;
                     86:          if (c == '(' && --param_nesting == 0)
                     87:            break;
                     88:          else if (c == ')')
                     89:            param_nesting++;
                     90:        }
                     91:       param_start = ptr+1;
                     92: 
                     93:       ptr--;
                     94:       while (*ptr == ' ' || *ptr == '\t') ptr--;
                     95: 
                     96:       if (!isalnum (*ptr))
                     97:        {
                     98:          if (verbose)
                     99:            fprintf (stderr, "%s: Can't handle this complex prototype: %s\n",
                    100:                     argv[0], linebuf.base);
                    101:          continue;
                    102:        }
                    103:       name_end = ptr+1;
                    104: 
                    105:       while (isalnum (*ptr) || *ptr == '_') --ptr;
                    106:       name_start = ptr+1;
                    107:       while (*ptr == ' ' || *ptr == '\t') ptr--;
                    108:       ptr[1] = 0;
                    109:       *name_end = 0;
                    110:       *param_end = 0;
                    111:       *name_end = 0;
                    112: 
                    113:       decl_start = linebuf.base;
                    114:       if (strncmp (decl_start, "typedef ", 8) == 0)
                    115:        continue;
                    116:       if (strncmp (decl_start, "extern ", 7) == 0)
                    117:        decl_start += 7;
                    118: 
                    119: 
                    120:       /* NOTE:  If you edit this,
                    121:         also edit lookup_std_proto in fix-header.c !! */
                    122:       i = hash (name_start) % HASH_SIZE;
                    123:       i0 = i;
                    124:       if (hash_tab[i] != 0)
                    125:        {
                    126:          for (;;)
                    127:            {
                    128:              i = (i+1) % HASH_SIZE;
                    129:              if (i == i0)
                    130:                abort ();
                    131:              if (hash_tab[i] == 0)
                    132:                break;
                    133:            }
                    134:        }
                    135:       hash_tab[i] = next_index;
                    136: 
                    137:       fprintf (outf, "  {\"%s\", \"%s\", \"%s\" },\n",
                    138:               name_start, decl_start, param_start, i, i0);
                    139: 
                    140:       next_index++;
                    141: 
                    142:       if (c == EOF)
                    143:        break;
                    144:     }
                    145:   fprintf (outf, "{0, 0, 0}\n};\n");
                    146: 
                    147: 
                    148:   fprintf (outf, "#define HASH_SIZE %d\n", HASH_SIZE);
                    149:   fprintf (outf, "short hash_tab[HASH_SIZE] = {\n");
                    150:   for (i = 0; i < HASH_SIZE; i++)
                    151:     fprintf (outf, "  %d,\n", hash_tab[i]);
                    152:   fprintf (outf, "};\n");
                    153: 
                    154:   return 0;
                    155: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.