Annotation of researchv10dc/cmd/bison/files.c, revision 1.1

1.1     ! root        1: /* Open and close files for bison,
        !             2:    Copyright (C) 1984, 1986 Bob Corbett and Free Software Foundation, Inc.
        !             3: 
        !             4: BISON is distributed in the hope that it will be useful, but WITHOUT ANY
        !             5: WARRANTY.  No author or distributor accepts responsibility to anyone
        !             6: for the consequences of using it or for whether it serves any
        !             7: particular purpose or works at all, unless he says so in writing.
        !             8: Refer to the BISON General Public License for full details.
        !             9: 
        !            10: Everyone is granted permission to copy, modify and redistribute BISON,
        !            11: but only under the conditions described in the BISON General Public
        !            12: License.  A copy of this license is supposed to have been given to you
        !            13: along with BISON so you can know your rights and responsibilities.  It
        !            14: should be in a file named COPYING.  Among other things, the copyright
        !            15: notice and this notice must be preserved on all copies.
        !            16: 
        !            17:  In other words, you are welcome to use, share and improve this program.
        !            18:  You are forbidden to forbid anyone else to use, share and improve
        !            19:  what you give them.   Help stamp out software-hoarding!  */
        !            20: 
        !            21: #ifdef VMS
        !            22: #include <ssdef.h>
        !            23: #define unlink delete
        !            24: #define XPFILE "GNU_BISON:[000000]BISON.SIMPLE"
        !            25: #define XPFILE1 "GNU_BISON:[000000]BISON.HAIRY"
        !            26: #endif
        !            27: 
        !            28: #include <stdio.h>
        !            29: #include "files.h"
        !            30: #include "new.h"
        !            31: #include "gram.h"
        !            32: 
        !            33: FILE *finput = NULL;
        !            34: FILE *foutput = NULL;
        !            35: FILE *fdefines = NULL;
        !            36: FILE *ftable = NULL;
        !            37: FILE *fattrs = NULL;
        !            38: FILE *fguard = NULL;
        !            39: FILE *faction = NULL;
        !            40: FILE *fparser = NULL;
        !            41: 
        !            42: /* File name specified with -o for the output file, or 0 if no -o.  */
        !            43: char *spec_outfile;
        !            44: 
        !            45: char *infile;
        !            46: char *outfile;
        !            47: char *defsfile;
        !            48: char *tabfile;
        !            49: char *attrsfile;
        !            50: char *guardfile;
        !            51: char *actfile;
        !            52: char *tmpattrsfile;
        !            53: char *tmptabfile;
        !            54: 
        !            55: char   *mktemp();      /* So the compiler won't complain */
        !            56: FILE   *tryopen();     /* This might be a good idea */
        !            57: 
        !            58: extern int verboseflag;
        !            59: extern int definesflag;
        !            60: int fixed_outfiles = 0;
        !            61: 
        !            62: 
        !            63: char*
        !            64: stringappend(string1, end1, string2)
        !            65: char *string1;
        !            66: int end1;
        !            67: char *string2;
        !            68: {
        !            69:   register char *ostring;
        !            70:   register char *cp, *cp1;
        !            71:   register int i;
        !            72: 
        !            73:   cp = string2;  i = 0;
        !            74:   while (*cp++) i++;
        !            75: 
        !            76:   ostring = NEW2(i+end1+1, char);
        !            77: 
        !            78:   cp = ostring;
        !            79:   cp1 = string1;
        !            80:   for (i = 0; i < end1; i++)
        !            81:     *cp++ = *cp1++;
        !            82: 
        !            83:   cp1 = string2;
        !            84:   while (*cp++ = *cp1++) ;
        !            85: 
        !            86:   return ostring;
        !            87: }
        !            88: 
        !            89: 
        !            90: /* JF this has been hacked to death.  Nowaday it sets up the file names for
        !            91:    the output files, and opens the tmp files and the parser */
        !            92: openfiles()
        !            93: {
        !            94:   char *name_base;
        !            95:   register char *cp;
        !            96:   char *filename;
        !            97:   int base_length;
        !            98:   int short_base_length;
        !            99: 
        !           100: #ifdef VMS
        !           101:   char *tmp_base = "sys$scratch:b_";
        !           102: #else
        !           103:   char *tmp_base = "/tmp/b.";
        !           104: #endif
        !           105:   int tmp_len = strlen (tmp_base);
        !           106: 
        !           107:   if (spec_outfile)
        !           108:     {
        !           109:       /* -o was specified.  The precise -o name will be used for ftable.
        !           110:         For other output files, remove the ".c" or ".tab.c" suffix.  */
        !           111:       name_base = spec_outfile;
        !           112:       /* BASE_LENGTH includes ".tab" but not ".c".  */
        !           113:       base_length = strlen (name_base);
        !           114:       if (!strcmp (name_base + base_length - 2, ".c"))
        !           115:        base_length -= 2;
        !           116:       /* SHORT_BASE_LENGTH includes neither ".tab" nor ".c".  */
        !           117:       short_base_length = base_length;
        !           118:       if (!strcmp (name_base + short_base_length - 4, ".tab"))
        !           119:        short_base_length -= 4;
        !           120:       else if (!strcmp (name_base + short_base_length - 4, "_tab"))
        !           121:        short_base_length -= 4;
        !           122:     }
        !           123:   else
        !           124:     {
        !           125:       /* -o was not specified; compute output file name from input
        !           126:         or use y.tab.c, etc., if -y was specified.  */
        !           127: 
        !           128:       name_base = fixed_outfiles ? "y.y" : infile;
        !           129: 
        !           130:       /* Discard any directory names from the input file name
        !           131:         to make the base of the output.  */
        !           132:       cp = name_base;
        !           133:       while (*cp)
        !           134:        {
        !           135:          if (*cp == '/')
        !           136:            name_base = cp+1;
        !           137:          cp++;
        !           138:        }
        !           139: 
        !           140:       /* BASE_LENGTH gets length of NAME_BASE, sans ".y" suffix if any.  */
        !           141: 
        !           142:       base_length = strlen (name_base);
        !           143:       if (!strcmp (name_base + base_length - 2, ".y"))
        !           144:        base_length -= 2;
        !           145:       short_base_length = base_length;
        !           146: 
        !           147: #ifdef VMS
        !           148:       name_base = stringappend(name_base, short_base_length, "_tab");
        !           149: #else
        !           150:       name_base = stringappend(name_base, short_base_length, ".tab");
        !           151: #endif
        !           152:       base_length = short_base_length + 4;
        !           153:     }
        !           154: 
        !           155:   finput = tryopen(infile, "r");
        !           156: 
        !           157:   filename = (char *) getenv ("BISON_SIMPLE");
        !           158:   fparser = tryopen(filename ? filename : PFILE, "r");
        !           159: 
        !           160:   if (verboseflag)
        !           161:     {
        !           162:       outfile = stringappend(name_base, short_base_length, ".output");
        !           163:       foutput = tryopen(outfile, "w");
        !           164:     }
        !           165: 
        !           166:   if (definesflag)
        !           167:     {
        !           168:       defsfile = stringappend(name_base, base_length, ".h");
        !           169:       fdefines = tryopen(defsfile, "w");
        !           170:     }
        !           171: 
        !           172:   actfile = mktemp(stringappend(tmp_base, tmp_len, "act.XXXXXX"));
        !           173:   faction = tryopen(actfile, "w+");
        !           174:   unlink(actfile);
        !           175: 
        !           176:   tmpattrsfile = mktemp(stringappend(tmp_base, tmp_len, "attrs.XXXXXX"));
        !           177:   fattrs = tryopen(tmpattrsfile,"w+");
        !           178:   unlink(tmpattrsfile);
        !           179: 
        !           180:   tmptabfile = mktemp(stringappend(tmp_base, tmp_len, "tab.XXXXXX"));
        !           181:   ftable = tryopen(tmptabfile, "w+");
        !           182:   unlink(tmptabfile);
        !           183: 
        !           184:        /* These are opened by `done' or `open_extra_files', if at all */
        !           185:   if (spec_outfile)
        !           186:     tabfile = spec_outfile;
        !           187:   else
        !           188:     tabfile = stringappend(name_base, base_length, ".c");
        !           189: 
        !           190: #ifdef VMS
        !           191:   attrsfile = stringappend(name_base, short_base_length, "_stype.h");
        !           192:   guardfile = stringappend(name_base, short_base_length, "_guard.c");
        !           193: #else
        !           194:   attrsfile = stringappend(name_base, short_base_length, ".stype.h");
        !           195:   guardfile = stringappend(name_base, short_base_length, ".guard.c");
        !           196: #endif
        !           197: }
        !           198: 
        !           199: 
        !           200: 
        !           201: /* open the output files needed only for the semantic parser.
        !           202: This is done when %semantic_parser is seen in the declarations section.  */
        !           203: open_extra_files()
        !           204: {
        !           205:   FILE *ftmp;
        !           206:   int c;
        !           207:   char *filename;
        !           208:                /* JF change open parser file */
        !           209:   fclose(fparser);
        !           210:   filename = (char *) getenv ("BISON_HAIRY");
        !           211:   fparser= tryopen(filename ? filename : PFILE1, "r");
        !           212: 
        !           213:                /* JF change from inline attrs file to separate one */
        !           214:   ftmp = tryopen(attrsfile, "w");
        !           215:   rewind(fattrs);
        !           216:   while((c=getc(fattrs))!=EOF) /* Thank god for buffering */
        !           217:     putc(c,ftmp);
        !           218:   fclose(fattrs);
        !           219:   fattrs=ftmp;
        !           220: 
        !           221:   fguard = tryopen(guardfile, "w");
        !           222: 
        !           223: }
        !           224: 
        !           225:        /* JF to make file opening easier.  This func tries to open file
        !           226:           NAME with mode MODE, and prints an error message if it fails. */
        !           227: FILE *
        !           228: tryopen(name, mode)
        !           229: char *name;
        !           230: char *mode;
        !           231: {
        !           232:   FILE *ptr;
        !           233: 
        !           234:   ptr = fopen(name, mode);
        !           235:   if (ptr == NULL)
        !           236:     {
        !           237:       fprintf(stderr, "bison: ");
        !           238:       perror(name);
        !           239:       done(2);
        !           240:     }
        !           241:   return ptr;
        !           242: }
        !           243: 
        !           244: done(k)
        !           245: int k;
        !           246: {
        !           247:   if (faction)
        !           248:     fclose(faction);
        !           249: 
        !           250:   if (fattrs)
        !           251:     fclose(fattrs);
        !           252: 
        !           253:   if (fguard)
        !           254:     fclose(fguard);
        !           255: 
        !           256:   if (finput)
        !           257:     fclose(finput);
        !           258: 
        !           259:   if (fparser)
        !           260:     fclose(fparser);
        !           261: 
        !           262: /* JF we don't need this anymore
        !           263:   if (fparser1)
        !           264:     fclose(fparser1); */
        !           265: 
        !           266:   if (foutput)
        !           267:     fclose(foutput);
        !           268: 
        !           269:        /* JF write out the output file */
        !           270:   if (k == 0 && ftable)
        !           271:     {
        !           272:       FILE *ftmp;
        !           273:       register int c;
        !           274: 
        !           275:       ftmp=tryopen(tabfile, "w");
        !           276:       rewind(ftable);
        !           277:       while((c=getc(ftable)) != EOF)
        !           278:         putc(c,ftmp);
        !           279:       fclose(ftmp);
        !           280:       fclose(ftable);
        !           281:     }
        !           282: 
        !           283: #ifdef VMS
        !           284:   delete(actfile);
        !           285:   delete(tmpattrsfile);
        !           286:   delete(tmptabfile);
        !           287:   if (k==0) sys$exit(SS$_NORMAL);
        !           288:   sys$exit(SS$_ABORT);
        !           289: #else
        !           290:   exit(k);
        !           291: #endif
        !           292: }

unix.superglobalmegacorp.com

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