Annotation of GNUtools/bison/files.c, revision 1.1

1.1     ! root        1: /* Open and close files for bison,
        !             2:    Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of Bison, the GNU Compiler Compiler.
        !             5: 
        !             6: Bison is free software; you can redistribute it and/or modify
        !             7: it under the terms of the GNU General Public License as published by
        !             8: the Free Software Foundation; either version 2, or (at your option)
        !             9: any later version.
        !            10: 
        !            11: Bison is distributed in the hope that it will be useful,
        !            12: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            14: GNU General Public License for more details.
        !            15: 
        !            16: You should have received a copy of the GNU General Public License
        !            17: along with Bison; see the file COPYING.  If not, write to
        !            18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            19: 
        !            20: 
        !            21: #ifdef VMS
        !            22: #include <ssdef.h>
        !            23: #define unlink delete
        !            24: #ifndef XPFILE
        !            25: #define XPFILE "GNU_BISON:[000000]BISON.SIMPLE"
        !            26: #endif
        !            27: #ifndef XPFILE1
        !            28: #define XPFILE1 "GNU_BISON:[000000]BISON.HAIRY"
        !            29: #endif
        !            30: #endif
        !            31: 
        !            32: #include <stdio.h>
        !            33: #include "system.h"
        !            34: #include "files.h"
        !            35: #include "new.h"
        !            36: #include "gram.h"
        !            37: 
        !            38: FILE *finput = NULL;
        !            39: FILE *foutput = NULL;
        !            40: FILE *fdefines = NULL;
        !            41: FILE *ftable = NULL;
        !            42: FILE *fattrs = NULL;
        !            43: FILE *fguard = NULL;
        !            44: FILE *faction = NULL;
        !            45: FILE *fparser = NULL;
        !            46: 
        !            47: /* File name specified with -o for the output file, or 0 if no -o.  */
        !            48: char *spec_outfile;
        !            49: 
        !            50: char *infile;
        !            51: char *outfile;
        !            52: char *defsfile;
        !            53: char *tabfile;
        !            54: char *attrsfile;
        !            55: char *guardfile;
        !            56: char *actfile;
        !            57: char *tmpattrsfile;
        !            58: char *tmptabfile;
        !            59: char *tmpdefsfile;
        !            60: 
        !            61: extern char    *mktemp();      /* So the compiler won't complain */
        !            62: extern char    *getenv();
        !            63: extern void    perror();
        !            64: FILE   *tryopen();     /* This might be a good idea */
        !            65: void done();
        !            66: 
        !            67: extern char *program_name;
        !            68: extern int verboseflag;
        !            69: extern int definesflag;
        !            70: int fixed_outfiles = 0;
        !            71: 
        !            72: 
        !            73: char*
        !            74: stringappend(string1, end1, string2)
        !            75: char *string1;
        !            76: int end1;
        !            77: char *string2;
        !            78: {
        !            79:   register char *ostring;
        !            80:   register char *cp, *cp1;
        !            81:   register int i;
        !            82: 
        !            83:   cp = string2;  i = 0;
        !            84:   while (*cp++) i++;
        !            85: 
        !            86:   ostring = NEW2(i+end1+1, char);
        !            87: 
        !            88:   cp = ostring;
        !            89:   cp1 = string1;
        !            90:   for (i = 0; i < end1; i++)
        !            91:     *cp++ = *cp1++;
        !            92: 
        !            93:   cp1 = string2;
        !            94:   while (*cp++ = *cp1++) ;
        !            95: 
        !            96:   return ostring;
        !            97: }
        !            98: 
        !            99: 
        !           100: /* JF this has been hacked to death.  Nowaday it sets up the file names for
        !           101:    the output files, and opens the tmp files and the parser */
        !           102: void
        !           103: openfiles()
        !           104: {
        !           105:   char *name_base;
        !           106:   register char *cp;
        !           107:   char *filename;
        !           108:   int base_length;
        !           109:   int short_base_length;
        !           110: 
        !           111: #ifdef VMS
        !           112:   char *tmp_base = "sys$scratch:b_";
        !           113: #else
        !           114:   char *tmp_base = "/tmp/b.";
        !           115: #endif
        !           116:   int tmp_len;
        !           117: 
        !           118: #ifdef MSDOS
        !           119:   tmp_base = getenv ("TMP");
        !           120:   if (tmp_base == 0)
        !           121:     tmp_base = "";
        !           122:   strlwr (infile);
        !           123: #endif /* MSDOS */
        !           124: 
        !           125:   tmp_len = strlen (tmp_base);
        !           126: 
        !           127:   if (spec_outfile)
        !           128:     {
        !           129:       /* -o was specified.  The precise -o name will be used for ftable.
        !           130:         For other output files, remove the ".c" or ".tab.c" suffix.  */
        !           131:       name_base = spec_outfile;
        !           132: #ifdef MSDOS
        !           133:       strlwr (name_base);
        !           134: #endif /* MSDOS */
        !           135:       /* BASE_LENGTH includes ".tab" but not ".c".  */
        !           136:       base_length = strlen (name_base);
        !           137:       if (!strcmp (name_base + base_length - 2, ".c"))
        !           138:        base_length -= 2;
        !           139:       /* SHORT_BASE_LENGTH includes neither ".tab" nor ".c".  */
        !           140:       short_base_length = base_length;
        !           141:       if (!strncmp (name_base + short_base_length - 4, ".tab", 4))
        !           142:        short_base_length -= 4;
        !           143:       else if (!strncmp (name_base + short_base_length - 4, "_tab", 4))
        !           144:        short_base_length -= 4;
        !           145:     }
        !           146:   else if (spec_file_prefix)
        !           147:     {
        !           148:       /* -b was specified.  Construct names from it.  */
        !           149:       /* SHORT_BASE_LENGTH includes neither ".tab" nor ".c".  */
        !           150:       short_base_length = strlen (spec_file_prefix);
        !           151:       /* Count room for `.tab'.  */
        !           152:       base_length = short_base_length + 4;
        !           153:       name_base = (char *) xmalloc (base_length + 1);
        !           154:       /* Append `.tab'.  */
        !           155:       strcpy (name_base, spec_file_prefix);
        !           156: #ifdef VMS
        !           157:       strcat (name_base, "_tab");
        !           158: #else
        !           159:       strcat (name_base, ".tab");
        !           160: #endif
        !           161: #ifdef MSDOS
        !           162:       strlwr (name_base);
        !           163: #endif /* MSDOS */
        !           164:     }
        !           165:   else
        !           166:     {
        !           167:       /* -o was not specified; compute output file name from input
        !           168:         or use y.tab.c, etc., if -y was specified.  */
        !           169: 
        !           170:       name_base = fixed_outfiles ? "y.y" : infile;
        !           171: 
        !           172:       /* BASE_LENGTH gets length of NAME_BASE, sans ".y" suffix if any.  */
        !           173: 
        !           174:       base_length = strlen (name_base);
        !           175:       if (!strcmp (name_base + base_length - 2, ".y"))
        !           176:        base_length -= 2;
        !           177:       short_base_length = base_length;
        !           178: 
        !           179: #ifdef VMS
        !           180:       name_base = stringappend(name_base, short_base_length, "_tab");
        !           181: #else
        !           182: #ifdef MSDOS
        !           183:       name_base = stringappend(name_base, short_base_length, "_tab");
        !           184: #else
        !           185:       name_base = stringappend(name_base, short_base_length, ".tab");
        !           186: #endif /* not MSDOS */
        !           187: #endif
        !           188:       base_length = short_base_length + 4;
        !           189:     }
        !           190: 
        !           191:   finput = tryopen(infile, "r");
        !           192: 
        !           193:   filename = getenv("BISON_SIMPLE");
        !           194: #ifdef MSDOS
        !           195:   /* File doesn't exist in current directory; try in INIT directory.  */
        !           196:   cp = getenv("INIT");
        !           197:   if (filename == 0 && cp != NULL)
        !           198:     {
        !           199:       filename = xmalloc(strlen(cp) + strlen(PFILE) + 2);
        !           200:       strcpy(filename, cp);
        !           201:       cp = filename + strlen(filename);
        !           202:       *cp++ = '/';
        !           203:       strcpy(cp, PFILE);
        !           204:     }
        !           205: #endif /* MSDOS */
        !           206:   fparser = tryopen(filename ? filename : PFILE, "r");
        !           207: 
        !           208:   if (verboseflag)
        !           209:     {
        !           210: #ifdef MSDOS
        !           211:       outfile = stringappend(name_base, short_base_length, ".out");
        !           212: #else
        !           213:       /* We used to use just .out if spec_name_prefix (-p) was used,
        !           214:         but that conflicts with Posix.  */
        !           215:       outfile = stringappend(name_base, short_base_length, ".output");
        !           216: #endif
        !           217:       foutput = tryopen(outfile, "w");
        !           218:     }
        !           219: 
        !           220: #ifdef MSDOS
        !           221:   actfile = mktemp(stringappend(tmp_base, tmp_len, "acXXXXXX"));
        !           222:   tmpattrsfile = mktemp(stringappend(tmp_base, tmp_len, "atXXXXXX"));
        !           223:   tmptabfile = mktemp(stringappend(tmp_base, tmp_len, "taXXXXXX"));
        !           224:   tmpdefsfile = mktemp(stringappend(tmp_base, tmp_len, "deXXXXXX"));
        !           225: #else
        !           226:   actfile = mktemp(stringappend(tmp_base, tmp_len, "act.XXXXXX"));
        !           227:   tmpattrsfile = mktemp(stringappend(tmp_base, tmp_len, "attrs.XXXXXX"));
        !           228:   tmptabfile = mktemp(stringappend(tmp_base, tmp_len, "tab.XXXXXX"));
        !           229:   tmpdefsfile = mktemp(stringappend(tmp_base, tmp_len, "defs.XXXXXX"));
        !           230: #endif /* not MSDOS */
        !           231: 
        !           232:   faction = tryopen(actfile, "w+");
        !           233:   fattrs = tryopen(tmpattrsfile,"w+");
        !           234:   ftable = tryopen(tmptabfile, "w+");
        !           235: 
        !           236:   if (definesflag)
        !           237:     {
        !           238:       defsfile = stringappend(name_base, base_length, ".h");
        !           239:       fdefines = tryopen(tmpdefsfile, "w+");
        !           240:     }
        !           241: 
        !           242: #ifndef MSDOS
        !           243:   unlink(actfile);
        !           244:   unlink(tmpattrsfile);
        !           245:   unlink(tmptabfile);
        !           246:   unlink(tmpdefsfile);
        !           247: #endif
        !           248: 
        !           249:        /* These are opened by `done' or `open_extra_files', if at all */
        !           250:   if (spec_outfile)
        !           251:     tabfile = spec_outfile;
        !           252:   else
        !           253:     tabfile = stringappend(name_base, base_length, ".c");
        !           254: 
        !           255: #ifdef VMS
        !           256:   attrsfile = stringappend(name_base, short_base_length, "_stype.h");
        !           257:   guardfile = stringappend(name_base, short_base_length, "_guard.c");
        !           258: #else
        !           259: #ifdef MSDOS
        !           260:   attrsfile = stringappend(name_base, short_base_length, ".sth");
        !           261:   guardfile = stringappend(name_base, short_base_length, ".guc");
        !           262: #else
        !           263:   attrsfile = stringappend(name_base, short_base_length, ".stype.h");
        !           264:   guardfile = stringappend(name_base, short_base_length, ".guard.c");
        !           265: #endif /* not MSDOS */
        !           266: #endif /* not VMS */
        !           267: }
        !           268: 
        !           269: 
        !           270: 
        !           271: /* open the output files needed only for the semantic parser.
        !           272: This is done when %semantic_parser is seen in the declarations section.  */
        !           273: 
        !           274: void
        !           275: open_extra_files()
        !           276: {
        !           277:   FILE *ftmp;
        !           278:   int c;
        !           279:   char *filename, *cp;
        !           280: 
        !           281:   fclose(fparser);
        !           282: 
        !           283:   filename = (char *) getenv ("BISON_HAIRY");
        !           284: #ifdef MSDOS
        !           285:   /* File doesn't exist in current directory; try in INIT directory.  */
        !           286:   cp = getenv("INIT");
        !           287:   if (filename == 0 && cp != NULL)
        !           288:     {
        !           289:       filename = xmalloc(strlen(cp) + strlen(PFILE1) + 2);
        !           290:       strcpy(filename, cp);
        !           291:       cp = filename + strlen(filename);
        !           292:       *cp++ = '/';
        !           293:       strcpy(cp, PFILE1);
        !           294:     }
        !           295: #endif
        !           296:   fparser= tryopen(filename ? filename : PFILE1, "r");
        !           297: 
        !           298:                /* JF change from inline attrs file to separate one */
        !           299:   ftmp = tryopen(attrsfile, "w");
        !           300:   rewind(fattrs);
        !           301:   while((c=getc(fattrs))!=EOF) /* Thank god for buffering */
        !           302:     putc(c,ftmp);
        !           303:   fclose(fattrs);
        !           304:   fattrs=ftmp;
        !           305: 
        !           306:   fguard = tryopen(guardfile, "w");
        !           307: 
        !           308: }
        !           309: 
        !           310:        /* JF to make file opening easier.  This func tries to open file
        !           311:           NAME with mode MODE, and prints an error message if it fails. */
        !           312: FILE *
        !           313: tryopen(name, mode)
        !           314: char *name;
        !           315: char *mode;
        !           316: {
        !           317:   FILE *ptr;
        !           318: 
        !           319:   ptr = fopen(name, mode);
        !           320:   if (ptr == NULL)
        !           321:     {
        !           322:       fprintf(stderr, "%s: ", program_name);
        !           323:       perror(name);
        !           324:       done(2);
        !           325:     }
        !           326:   return ptr;
        !           327: }
        !           328: 
        !           329: void
        !           330: done(k)
        !           331: int k;
        !           332: {
        !           333:   if (faction)
        !           334:     fclose(faction);
        !           335: 
        !           336:   if (fattrs)
        !           337:     fclose(fattrs);
        !           338: 
        !           339:   if (fguard)
        !           340:     fclose(fguard);
        !           341: 
        !           342:   if (finput)
        !           343:     fclose(finput);
        !           344: 
        !           345:   if (fparser)
        !           346:     fclose(fparser);
        !           347: 
        !           348:   if (foutput)
        !           349:     fclose(foutput);
        !           350: 
        !           351:        /* JF write out the output file */
        !           352:   if (k == 0 && ftable)
        !           353:     {
        !           354:       FILE *ftmp;
        !           355:       register int c;
        !           356: 
        !           357:       ftmp=tryopen(tabfile, "w");
        !           358:       rewind(ftable);
        !           359:       while((c=getc(ftable)) != EOF)
        !           360:         putc(c,ftmp);
        !           361:       fclose(ftmp);
        !           362:       fclose(ftable);
        !           363: 
        !           364:       if (definesflag)
        !           365:         {
        !           366:           ftmp = tryopen(defsfile, "w");
        !           367:           fflush(fdefines);
        !           368:           rewind(fdefines);
        !           369:           while((c=getc(fdefines)) != EOF)
        !           370:             putc(c,ftmp);
        !           371:           fclose(ftmp);
        !           372:           fclose(fdefines);
        !           373:         }
        !           374:     }
        !           375: 
        !           376: #ifdef VMS
        !           377:   if (faction)
        !           378:     delete(actfile);
        !           379:   if (fattrs)
        !           380:     delete(tmpattrsfile);
        !           381:   if (ftable)
        !           382:     delete(tmptabfile);
        !           383:   if (k==0) sys$exit(SS$_NORMAL);
        !           384:   sys$exit(SS$_ABORT);
        !           385: #else
        !           386: #ifdef MSDOS
        !           387:   if (actfile) unlink(actfile);
        !           388:   if (tmpattrsfile) unlink(tmpattrsfile);
        !           389:   if (tmptabfile) unlink(tmptabfile);
        !           390:   if (tmpdefsfile) unlink(tmpdefsfile);
        !           391: #endif /* MSDOS */
        !           392:   exit(k);
        !           393: #endif /* not VMS */
        !           394: }

unix.superglobalmegacorp.com

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