source: branches/libc-0.6/src/binutils/gas/input-file.c

Last change on this file was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 5.8 KB
Line 
1/* input_file.c - Deal with Input Files -
2 Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1999, 2000, 2001
3 Free Software Foundation, Inc.
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS 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 2, or (at your option)
10 any later version.
11
12 GAS 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 GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21
22/* Confines all details of reading source bytes to this module.
23 All O/S specific crocks should live here.
24 What we lose in "efficiency" we gain in modularity.
25 Note we don't need to #include the "as.h" file. No common coupling! */
26
27#include <stdio.h>
28#include <string.h>
29#include "as.h"
30#include "input-file.h"
31#include "safe-ctype.h"
32
33static int input_file_get PARAMS ((char *, int));
34
35/* This variable is non-zero if the file currently being read should be
36 preprocessed by app. It is zero if the file can be read straight in. */
37int preprocess = 0;
38
39/* This code opens a file, then delivers BUFFER_SIZE character
40 chunks of the file on demand.
41 BUFFER_SIZE is supposed to be a number chosen for speed.
42 The caller only asks once what BUFFER_SIZE is, and asks before
43 the nature of the input files (if any) is known. */
44
45#define BUFFER_SIZE (32 * 1024)
46
47/* We use static data: the data area is not sharable. */
48
49static FILE *f_in;
50static char *file_name;
51
52/* Struct for saving the state of this module for file includes. */
53struct saved_file
54 {
55 FILE * f_in;
56 char * file_name;
57 int preprocess;
58 char * app_save;
59 };
60
61
62/* These hooks accomodate most operating systems. */
63
64void
65input_file_begin ()
66{
67 f_in = (FILE *) 0;
68}
69
70void
71input_file_end ()
72{
73}
74
75/* Return BUFFER_SIZE. */
76unsigned int
77input_file_buffer_size ()
78{
79 return (BUFFER_SIZE);
80}
81
82int
83input_file_is_open ()
84{
85 return f_in != (FILE *) 0;
86}
87
88/* Push the state of our input, returning a pointer to saved info that
89 can be restored with input_file_pop (). */
90
91char *
92input_file_push ()
93{
94 register struct saved_file *saved;
95
96 saved = (struct saved_file *) xmalloc (sizeof *saved);
97
98 saved->f_in = f_in;
99 saved->file_name = file_name;
100 saved->preprocess = preprocess;
101 if (preprocess)
102 saved->app_save = app_push ();
103
104 /* Initialize for new file. */
105 input_file_begin ();
106
107 return (char *) saved;
108}
109
110void
111input_file_pop (arg)
112 char *arg;
113{
114 register struct saved_file *saved = (struct saved_file *) arg;
115
116 input_file_end (); /* Close out old file. */
117
118 f_in = saved->f_in;
119 file_name = saved->file_name;
120 preprocess = saved->preprocess;
121 if (preprocess)
122 app_pop (saved->app_save);
123
124 free (arg);
125}
126
127
128void
129input_file_open (filename, pre)
130 char *filename; /* "" means use stdin. Must not be 0. */
131 int pre;
132{
133 int c;
134 char buf[80];
135
136 preprocess = pre;
137
138 assert (filename != 0); /* Filename may not be NULL. */
139 if (filename[0])
140 { /* We have a file name. Suck it and see. */
141 f_in = fopen (filename, FOPEN_RT);
142 file_name = filename;
143 }
144 else
145 { /* use stdin for the input file. */
146 f_in = stdin;
147 file_name = _("{standard input}"); /* For error messages. */
148 }
149 if (f_in == (FILE *) 0)
150 {
151 as_bad (_("can't open %s for reading"), file_name);
152 as_perror ("%s", file_name);
153 return;
154 }
155
156 c = getc (f_in);
157 if (c == '#')
158 {
159 /* Begins with comment, may not want to preprocess. */
160 c = getc (f_in);
161 if (c == 'N')
162 {
163 fgets (buf, 80, f_in);
164 if (!strncmp (buf, "O_APP", 5) && ISSPACE (buf[5]))
165 preprocess = 0;
166 if (!strchr (buf, '\n'))
167 ungetc ('#', f_in); /* It was longer. */
168 else
169 ungetc ('\n', f_in);
170 }
171 else if (c == 'A')
172 {
173 fgets (buf, 80, f_in);
174 if (!strncmp (buf, "PP", 2) && ISSPACE (buf[2]))
175 preprocess = 1;
176 if (!strchr (buf, '\n'))
177 ungetc ('#', f_in);
178 else
179 ungetc ('\n', f_in);
180 }
181 else if (c == '\n')
182 ungetc ('\n', f_in);
183 else
184 ungetc ('#', f_in);
185 }
186 else
187 ungetc (c, f_in);
188}
189
190/* Close input file. */
191
192void
193input_file_close ()
194{
195 /* Don't close a null file pointer. */
196 if (f_in != NULL)
197 fclose (f_in);
198
199 f_in = 0;
200}
201
202/* This function is passed to do_scrub_chars. */
203
204static int
205input_file_get (buf, buflen)
206 char *buf;
207 int buflen;
208{
209 int size;
210
211 size = fread (buf, sizeof (char), buflen, f_in);
212 if (size < 0)
213 {
214 as_perror (_("Can't read from %s"), file_name);
215 size = 0;
216 }
217 return size;
218}
219
220/* Read a buffer from the input file. */
221
222char *
223input_file_give_next_buffer (where)
224 char *where; /* Where to place 1st character of new buffer. */
225{
226 char *return_value; /* -> Last char of what we read, + 1. */
227 register int size;
228
229 if (f_in == (FILE *) 0)
230 return 0;
231 /* fflush (stdin); could be done here if you want to synchronise
232 stdin and stdout, for the case where our input file is stdin.
233 Since the assembler shouldn't do any output to stdout, we
234 don't bother to synch output and input. */
235 if (preprocess)
236 size = do_scrub_chars (input_file_get, where, BUFFER_SIZE);
237 else
238 size = fread (where, sizeof (char), BUFFER_SIZE, f_in);
239 if (size < 0)
240 {
241 as_perror (_("Can't read from %s"), file_name);
242 size = 0;
243 }
244 if (size)
245 return_value = where + size;
246 else
247 {
248 if (fclose (f_in))
249 as_perror (_("Can't close %s"), file_name);
250 f_in = (FILE *) 0;
251 return_value = 0;
252 }
253
254 return return_value;
255}
Note: See TracBrowser for help on using the repository browser.