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

unix.superglobalmegacorp.com

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