]>
git.saurik.com Git - bison.git/blob - src/files.c
   1 /* Open and close files for bison, 
   2    Copyright (C) 1984, 1986, 1989, 1992 Free Software Foundation, Inc. 
   4 This file is part of Bison, the GNU Compiler Compiler. 
   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) 
  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. 
  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.  */ 
  21 #if defined (VMS) & !defined (__VMS_POSIX) 
  25 #define XPFILE "GNU_BISON:[000000]BISON.SIMPLE" 
  28 #define XPFILE1 "GNU_BISON:[000000]BISON.HAIRY" 
  32 #if defined (_MSC_VER) 
  34 #define XPFILE "c:/usr/local/lib/bison.simple" 
  37 #define XPFILE1 "c:/usr/local/lib/bison.hairy" 
  49 FILE *fdefines 
= NULL
; 
  56 /* File name specified with -o for the output file, or 0 if no -o.  */ 
  70 extern int noparserflag
; 
  72 extern char     *mktemp();      /* So the compiler won't complain */ 
  73 extern char     *getenv(); 
  75 FILE    *tryopen();     /* This might be a good idea */ 
  78 extern char *program_name
; 
  79 extern int verboseflag
; 
  80 extern int definesflag
; 
  81 int fixed_outfiles 
= 0; 
  85 stringappend(string1
, end1
, string2
) 
  90   register char *ostring
; 
  91   register char *cp
, *cp1
; 
  97   ostring 
= NEW2(i
+end1
+1, char); 
 101   for (i 
= 0; i 
< end1
; i
++) 
 105   while (*cp
++ = *cp1
++) ; 
 111 /* JF this has been hacked to death.  Nowaday it sets up the file names for 
 112    the output files, and opens the tmp files and the parser */ 
 120   int short_base_length
; 
 122 #if defined (VMS) & !defined (__VMS_POSIX) 
 123   char *tmp_base 
= "sys$scratch:b_"; 
 125   char *tmp_base 
= "/tmp/b."; 
 130   tmp_base 
= getenv ("TMP"); 
 136   tmp_len 
= strlen (tmp_base
); 
 140       /* -o was specified.  The precise -o name will be used for ftable. 
 141          For other output files, remove the ".c" or ".tab.c" suffix.  */ 
 142       name_base 
= spec_outfile
; 
 146       /* BASE_LENGTH includes ".tab" but not ".c".  */ 
 147       base_length 
= strlen (name_base
); 
 148       if (!strcmp (name_base 
+ base_length 
- 2, ".c")) 
 150       /* SHORT_BASE_LENGTH includes neither ".tab" nor ".c".  */ 
 151       short_base_length 
= base_length
; 
 152       if (!strncmp (name_base 
+ short_base_length 
- 4, ".tab", 4)) 
 153         short_base_length 
-= 4; 
 154       else if (!strncmp (name_base 
+ short_base_length 
- 4, "_tab", 4)) 
 155         short_base_length 
-= 4; 
 157   else if (spec_file_prefix
) 
 159       /* -b was specified.  Construct names from it.  */ 
 160       /* SHORT_BASE_LENGTH includes neither ".tab" nor ".c".  */ 
 161       short_base_length 
= strlen (spec_file_prefix
); 
 162       /* Count room for `.tab'.  */ 
 163       base_length 
= short_base_length 
+ 4; 
 164       name_base 
= (char *) xmalloc (base_length 
+ 1); 
 166       strcpy (name_base
, spec_file_prefix
); 
 168       strcat (name_base
, "_tab"); 
 170       strcat (name_base
, ".tab"); 
 178       /* -o was not specified; compute output file name from input 
 179          or use y.tab.c, etc., if -y was specified.  */ 
 181       name_base 
= fixed_outfiles 
? "y.y" : infile
; 
 183       /* BASE_LENGTH gets length of NAME_BASE, sans ".y" suffix if any.  */ 
 185       base_length 
= strlen (name_base
); 
 186       if (!strcmp (name_base 
+ base_length 
- 2, ".y")) 
 188       short_base_length 
= base_length
; 
 191       name_base 
= stringappend(name_base
, short_base_length
, "_tab"); 
 194       name_base 
= stringappend(name_base
, short_base_length
, "_tab"); 
 196       name_base 
= stringappend(name_base
, short_base_length
, ".tab"); 
 197 #endif /* not MSDOS */ 
 199       base_length 
= short_base_length 
+ 4; 
 202   finput 
= tryopen(infile
, "r"); 
 206       filename 
= getenv("BISON_SIMPLE"); 
 208       /* File doesn't exist in current directory; try in INIT directory.  */ 
 210       if (filename 
== 0 && cp 
!= NULL
) 
 212           filename 
= xmalloc(strlen(cp
) + strlen(PFILE
) + 2); 
 213           strcpy(filename
, cp
); 
 214           cp 
= filename 
+ strlen(filename
); 
 219       fparser 
= tryopen(filename 
? filename 
: PFILE
, "r"); 
 225       outfile 
= stringappend(name_base
, short_base_length
, ".out"); 
 227       /* We used to use just .out if spec_name_prefix (-p) was used, 
 228          but that conflicts with Posix.  */ 
 229       outfile 
= stringappend(name_base
, short_base_length
, ".output"); 
 231       foutput 
= tryopen(outfile
, "w"); 
 236       /* use permanent name for actions file */ 
 237       actfile 
= stringappend(name_base
, short_base_length
, ".act"); 
 238       faction 
= tryopen(actfile
, "w"); 
 243     actfile 
= mktemp(stringappend(tmp_base
, tmp_len
, "acXXXXXX")); 
 244   tmpattrsfile 
= mktemp(stringappend(tmp_base
, tmp_len
, "atXXXXXX")); 
 245   tmptabfile 
= mktemp(stringappend(tmp_base
, tmp_len
, "taXXXXXX")); 
 246   tmpdefsfile 
= mktemp(stringappend(tmp_base
, tmp_len
, "deXXXXXX")); 
 249     actfile 
= mktemp(stringappend(tmp_base
, tmp_len
, "act.XXXXXX")); 
 250   tmpattrsfile 
= mktemp(stringappend(tmp_base
, tmp_len
, "attrs.XXXXXX")); 
 251   tmptabfile 
= mktemp(stringappend(tmp_base
, tmp_len
, "tab.XXXXXX")); 
 252   tmpdefsfile 
= mktemp(stringappend(tmp_base
, tmp_len
, "defs.XXXXXX")); 
 253 #endif /* not MSDOS */ 
 256     faction 
= tryopen(actfile
, "w+"); 
 257   fattrs 
= tryopen(tmpattrsfile
,"w+"); 
 258   ftable 
= tryopen(tmptabfile
, "w+"); 
 262       defsfile 
= stringappend(name_base
, base_length
, ".h"); 
 263       fdefines 
= tryopen(tmpdefsfile
, "w+"); 
 269   unlink(tmpattrsfile
); 
 274         /* These are opened by `done' or `open_extra_files', if at all */ 
 276     tabfile 
= spec_outfile
; 
 278     tabfile 
= stringappend(name_base
, base_length
, ".c"); 
 281   attrsfile 
= stringappend(name_base
, short_base_length
, "_stype.h"); 
 282   guardfile 
= stringappend(name_base
, short_base_length
, "_guard.c"); 
 285   attrsfile 
= stringappend(name_base
, short_base_length
, ".sth"); 
 286   guardfile 
= stringappend(name_base
, short_base_length
, ".guc"); 
 288   attrsfile 
= stringappend(name_base
, short_base_length
, ".stype.h"); 
 289   guardfile 
= stringappend(name_base
, short_base_length
, ".guard.c"); 
 290 #endif /* not MSDOS */ 
 296 /* open the output files needed only for the semantic parser. 
 297 This is done when %semantic_parser is seen in the declarations section.  */ 
 311       filename 
= (char *) getenv ("BISON_HAIRY"); 
 313       /* File doesn't exist in current directory; try in INIT directory.  */ 
 315       if (filename 
== 0 && cp 
!= NULL
) 
 317           filename 
= xmalloc(strlen(cp
) + strlen(PFILE1
) + 2); 
 318           strcpy(filename
, cp
); 
 319           cp 
= filename 
+ strlen(filename
); 
 324       fparser
= tryopen(filename 
? filename 
: PFILE1
, "r"); 
 327                 /* JF change from inline attrs file to separate one */ 
 328   ftmp 
= tryopen(attrsfile
, "w"); 
 330   while((c
=getc(fattrs
))!=EOF
)  /* Thank god for buffering */ 
 335   fguard 
= tryopen(guardfile
, "w"); 
 339         /* JF to make file opening easier.  This func tries to open file 
 340            NAME with mode MODE, and prints an error message if it fails. */ 
 348   ptr 
= fopen(name
, mode
); 
 351       fprintf(stderr
, "%s: ", program_name
); 
 380         /* JF write out the output file */ 
 381   if (k 
== 0 && ftable
) 
 386       ftmp
=tryopen(tabfile
, "w"); 
 388       while((c
=getc(ftable
)) != EOF
) 
 395           ftmp 
= tryopen(defsfile
, "w"); 
 398           while((c
=getc(fdefines
)) != EOF
) 
 405 #if defined (VMS) & !defined (__VMS_POSIX) 
 406   if (faction 
&& ! noparserflag
) 
 409     delete(tmpattrsfile
); 
 412   if (k
==0) sys$
exit(SS$_NORMAL
); 
 416   if (actfile 
&& ! noparserflag
) unlink(actfile
); 
 417   if (tmpattrsfile
) unlink(tmpattrsfile
); 
 418   if (tmptabfile
) unlink(tmptabfile
); 
 419   if (tmpdefsfile
) unlink(tmpdefsfile
); 
 422 #endif /* not VMS, or __VMS_POSIX */