Annotation of 43BSDReno/contrib/emacs-18.55/src/vms-pp.c, revision 1.1.1.1

1.1       root        1: /* vms_pp - preprocess emacs files in such a way that they can be
                      2:  *          compiled on VMS without warnings.
                      3:  * Copyright (C) 1986 Free Software Foundation, Inc.
                      4:    
                      5:    This file is part of GNU Emacs.
                      6:    
                      7:    GNU Emacs is distributed in the hope that it will be useful,
                      8:    but WITHOUT ANY WARRANTY.  No author or distributor
                      9:    accepts responsibility to anyone for the consequences of using it
                     10:    or for whether it serves any particular purpose or works at all,
                     11:    unless he says so in writing.  Refer to the GNU Emacs General Public
                     12:    License for full details.
                     13:    
                     14:    Everyone is granted permission to copy, modify and redistribute
                     15:    GNU Emacs, but only under the conditions described in the
                     16:    GNU Emacs General Public License.   A copy of this license is
                     17:    supposed to have been given to you along with GNU Emacs so you
                     18:    can know your rights and responsibilities.  It should be in a
                     19:    file named COPYING.  Among other things, the copyright notice
                     20:    and this notice must be preserved on all copies.
                     21: 
                     22:  *
                     23:  * Usage:
                     24:  *     vms_pp infile outfile
                     25:  * implicit inputs:
                     26:  *     The file "vms_pp.trans" has the names and their translations.
                     27:  * description:
                     28:  *     Vms_pp takes the input file and scans it, replacing the long
                     29:  *     names with shorter names according to the table read in from
                     30:  *     vms_pp.trans. The line is then written to the output file.
                     31:  *
                     32:  *     Additionally, the "#undef foo" construct is replaced with:
                     33:  *             #ifdef foo
                     34:  *             #undef foo
                     35:  *             #endif
                     36:  *
                     37:  *     The construct #if defined(foo) is replaced with
                     38:  *             #ifdef foo
                     39:  *             #define foo_VAL 1
                     40:  *             #else
                     41:  *             #define foo_VAL 0
                     42:  *             #endif
                     43:  *             #define defined(XX) XX_val
                     44:  *             #if defined(foo)
                     45:  *
                     46:  *     This last contruction only works on single line #if's and takes
                     47:  *     advantage of a questionable C pre-processor trick. If there are
                     48:  *     comments within the #if, that contain "defined", then this will
                     49:  *     bomb.
                     50:  */
                     51: #include <stdio.h>
                     52: 
                     53: #define Max_table 100
                     54: #define Table_name "vms_pp.trans"
                     55: #define Word_member \
                     56: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$"
                     57: 
                     58: static   FILE *in,*out;                        /* read from, write to */
                     59: struct item {                          /* symbol table entries */
                     60:   char *name;
                     61:   char *value;
                     62: };
                     63: static struct item name_table[Max_table]; /* symbol table */
                     64: static int defined_defined = 0;                /* small optimization */
                     65: 
                     66: main(argc,argv) int argc; char **argv; {
                     67:   char buffer[1024];
                     68: 
                     69:   if(argc != 3) {                      /* check argument count */
                     70:     fprintf(stderr,"usage: vms_pp infile outfile");
                     71:     exit();
                     72:   }
                     73:   init_table();                                /* read in translation table */
                     74: 
                     75: /* open input and output files
                     76:  */
                     77:   if((in = fopen(argv[1],"r")) == NULL) {
                     78:     fprintf(stderr,"vms_pp: unable to open file '%s'",argv[1]);
                     79:     exit();
                     80:   }
                     81:   if((out = fopen(argv[2],"w")) == NULL) {
                     82:     fprintf(stderr,"vms_pp: unable to create file '%s'",argv[2]);
                     83:     exit();
                     84:   }
                     85: 
                     86:   while(fgets(buffer,1023,in) != NULL) { /* loop through buffer until end */
                     87:     process_line(buffer);              /* process the line */
                     88:     fputs(buffer,out);                 /* write out the line */
                     89:   }
                     90: }
                     91: 
                     92: /* buy - allocate and copy a string
                     93:  */
                     94: static char *buy(str) char *str; {
                     95:   char *temp;
                     96: 
                     97:   if(!(temp = malloc(strlen(str)+1))) {
                     98:     fprintf(stderr,"vms_pp: can't allocate memory");
                     99:     exit();
                    100:   }
                    101:   strcpy(temp,str);
                    102:   return temp;
                    103: }
                    104: 
                    105: /* gather_word - return a buffer full of the next word
                    106:  */
                    107: static char *gather_word(ptr,word) char *ptr, *word;{
                    108:   for(; strchr(Word_member,*ptr); ptr++,word++)
                    109:     *word = *ptr;
                    110:   *word = 0;
                    111:   return ptr;
                    112: }
                    113: 
                    114: /* skip_white - skip white space
                    115:  */
                    116: static char *skip_white(ptr) char *ptr; {
                    117:   while(*ptr == ' ' || *ptr == '\t')
                    118:     ptr++;
                    119:   return ptr;
                    120: }
                    121: 
                    122: /* init_table - initialize translation table.
                    123:  */
                    124: init_table() {
                    125:   char buf[256],*ptr,word[128];
                    126:   FILE *in;
                    127:   int i;
                    128: 
                    129:   if((in = fopen(Table_name,"r")) == NULL) { /* open file */
                    130:     fprintf(stderr,"vms_pp: can't open '%s'",Table_name);
                    131:     exit();
                    132:   }
                    133:   for(i = 0; fgets(buf,255,in) != NULL;) { /* loop through lines */
                    134:     ptr = skip_white(buf);
                    135:     if(*ptr == '!')                    /* skip comments */
                    136:       continue;
                    137:     ptr = gather_word(ptr,word);       /* get long word */
                    138:     if(*word == 0) {                   /* bad entry */
                    139:       fprintf(stderr,"vms_pp: bad input line '%s'\n",buf);
                    140:       continue;
                    141:     }
                    142:     name_table[i].name = buy(word);    /* set up the name */
                    143:     ptr = skip_white(ptr);             /* skip white space */
                    144:     ptr = gather_word(ptr,word);       /* get equivalent name */
                    145:     if(*word == 0) {                   /* bad entry */
                    146:       fprintf(stderr,"vms_pp: bad input line '%s'\n",buf);
                    147:       continue;
                    148:     }
                    149:     name_table[i].value = buy(word);   /* and the equivalent name */
                    150:     i++;                               /* increment to next position */
                    151:   }
                    152:   for(; i < Max_table; i++)            /* mark rest as unused */
                    153:     name_table[i].name = 0;
                    154: }
                    155: 
                    156: /* process_line - do actual line processing
                    157:  */
                    158: process_line(buf) char *buf; {
                    159:   char *in_ptr,*out_ptr;
                    160:   char word[128],*ptr;
                    161:   int len;
                    162: 
                    163:   check_pp(buf);                       /* check for preprocessor lines */
                    164: 
                    165:   for(in_ptr = out_ptr = buf; *in_ptr;) {
                    166:     if(!strchr(Word_member,*in_ptr))   /* non alpha-numeric? just copy */
                    167:       *out_ptr++ = *in_ptr++;
                    168:     else {
                    169:       in_ptr = gather_word(in_ptr,word); /* get the 'word' */
                    170:       if(strlen(word) > 31)            /* length is too long */
                    171:        replace_word(word);             /* replace the word */
                    172:       for(ptr = word; *ptr; ptr++,out_ptr++) /* copy out the word */
                    173:          *out_ptr = *ptr;
                    174:     }
                    175:   }
                    176:   *out_ptr = 0;
                    177: }
                    178: 
                    179: /* check_pp - check for preprocessor lines
                    180:  */
                    181: check_pp(buf) char *buf; {
                    182:   char *ptr,*p;
                    183:   char word[128];
                    184: 
                    185:   ptr = skip_white(buf);               /* skip white space */
                    186:   if(*ptr != '#')                      /* is this a preprocessor line? */
                    187:     return;                            /* no, just return */
                    188: 
                    189:   ptr = skip_white(++ptr);             /* skip white */
                    190:   ptr = gather_word(ptr,word);         /* get command word */
                    191:   if(!strcmp("undef",word)) {          /* undef? */
                    192:     ptr = skip_white(ptr);
                    193:     ptr = gather_word(ptr,word);       /* get the symbol to undef */
                    194:     fprintf(out,"#ifdef %s\n",word);
                    195:     fputs(buf,out);
                    196:     strcpy(buf,"#endif");
                    197:     return;
                    198:   }
                    199:   if(!strcmp("if",word)) {             /* check for if */
                    200:     for(;;) {
                    201:       ptr = strchr(ptr,'d');           /* look for d in defined */
                    202:       if(!ptr)                         /* are we done? */
                    203:        return;
                    204:       if(strchr(Word_member,*(ptr-1))){        /* at beginning of word? */
                    205:        ptr++; continue;                /* no, continue looking */
                    206:       }
                    207:       ptr = gather_word(ptr,word);     /* get the word */
                    208:       if(strcmp(word,"defined"))       /* skip if not defined */
                    209:        continue;
                    210:       ptr = skip_white(ptr);           /* skip white */
                    211:       if(*ptr != '(')                  /* look for open paren */
                    212:        continue;                       /* error, continue */
                    213:       ptr++;                           /* skip paren */
                    214:       ptr = skip_white(ptr);           /* more white skipping */
                    215:       ptr = gather_word(ptr,word);     /* get the thing to test */
                    216:       if(!*word)                       /* null word is bad */
                    217:        continue;
                    218:       fprintf(out,"#ifdef %s\n",word); /* generate the code */
                    219:       fprintf(out,"#define %s_VAL 1\n",word);
                    220:       fprintf(out,"#else\n");
                    221:       fprintf(out,"#define %s_VAL 0\n",word);
                    222:       fprintf(out,"#endif\n");
                    223:       if(!defined_defined) {
                    224:        fprintf(out,"#define defined(XXX) XXX/**/_VAL\n");
                    225:        defined_defined = 1;
                    226:       }
                    227:     }
                    228:   }
                    229: }
                    230: 
                    231: /* replace_word - look the word up in the table, and replace it
                    232:  *               if a match is found.
                    233:  */
                    234: replace_word(word) char *word; {
                    235:   int i;
                    236: 
                    237:   for(i = 0; i < Max_table && name_table[i].name; i++)
                    238:     if(!strcmp(word,name_table[i].name)) {
                    239:       strcpy(word,name_table[i].value);
                    240:       return;
                    241:     }
                    242:   fprintf(stderr,"couldn't find '%s'\n",word);
                    243: }

unix.superglobalmegacorp.com

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