1 /* This file is part of the program psim.
3 Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, see <http://www.gnu.org/licenses/>.
21 #include <sys/types.h>
27 #include "build-config.h"
37 typedef struct _open_table open_table;
54 table_push (table *root,
55 table_include *includes,
56 const char *file_name,
65 table_include *include = &dummy;
68 /* dummy up a search of this directory */
69 dummy.next = includes;
72 /* create a file descriptor */
73 file = ZALLOC (open_table);
75 file->nr_fields = nr_fields;
76 file->nr_model_fields = nr_model_fields;
78 file->parent = root->current;
83 /* save the file name */
84 char *dup_name = NZALLOC (char, strlen (include->dir) + strlen (file_name) + 2);
90 if (include->dir[0] != '\0')
92 strcat (dup_name, include->dir);
93 strcat (dup_name, "/");
95 strcat (dup_name, file_name);
96 file->file_name = dup_name;
98 fd = open (dup_name, O_RDONLY, 0);
101 /* free (dup_name); */
102 if (include->next == NULL)
104 error ("Problem opening file `%s'\n", file_name);
108 include = include->next;
111 /* determine the size */
112 if (fstat(fd, &stat_buf) < 0) {
113 perror("table_open.fstat");
116 file->size = stat_buf.st_size;
118 /* allocate this much memory */
119 file->buffer = (char*)zalloc(file->size+1);
120 if(file->buffer == NULL) {
121 perror("table_open.calloc.file->size+1");
124 file->pos = file->buffer;
128 if ((file->size) && ((nr = read(fd, file->buffer, file->size)) <= 0)) {
130 if ((nr = read(fd, file->buffer, file->size)) < file->size) {
132 perror("table_open.read");
136 file->buffer[file->size] = '\0';
143 table_open(const char *file_name,
149 /* create a file descriptor */
150 root = ZALLOC (table);
157 table_push (root, NULL, file_name, nr_fields, nr_model_fields);
162 table_entry_read(table *root)
164 open_table *file = root->current;
168 /* skip comments/blanks */
171 while (*file->pos == '\0')
173 if (file->parent != NULL)
176 root->current = file;
181 /* leading white space */
182 while (*file->pos != '\0'
183 && *file->pos != '\n'
184 && isspace(*file->pos))
187 if (*file->pos == '#') {
190 } while (*file->pos != '\0' && *file->pos != '\n');
193 if (*file->pos == '\n') {
201 /* create this new entry */
202 entry = (table_entry*)zalloc(sizeof(table_entry)
203 + (file->nr_fields + 1) * sizeof(char*));
204 ASSERT(entry != NULL);
205 entry->file_name = file->file_name;
206 entry->nr_fields = file->nr_fields;
208 /* break the line into its colon delimitered fields */
209 for (field = 0; field < file->nr_fields-1; field++) {
210 entry->fields[field] = file->pos;
211 while(*file->pos && *file->pos != ':' && *file->pos != '\n' && *file->pos != '\r')
213 if (*file->pos == ':') {
219 /* any trailing stuff not the last field */
220 ASSERT(field == file->nr_fields-1);
221 entry->fields[field] = file->pos;
222 while (*file->pos && *file->pos != '\n' && *file->pos != '\r') {
225 if (*file->pos == '\r') {
229 if (*file->pos == '\n') {
235 /* if following lines begin with a star, add them to the model
237 while ((file->nr_model_fields > 0) && (*file->pos == '*')) {
238 table_model_entry *model = (table_model_entry*)zalloc(sizeof(table_model_entry)
239 + (file->nr_model_fields + 1) * sizeof(char*));
240 if (entry->model_last)
241 entry->model_last->next = model;
243 entry->model_first = model;
244 entry->model_last = model;
246 /* break the line into its colon delimitered fields */
248 for (field = 0; field < file->nr_model_fields-1; field++) {
249 model->fields[field] = file->pos;
250 while(*file->pos && *file->pos != ':' && *file->pos != '\n' && *file->pos != '\r')
252 if (*file->pos == ':') {
258 /* any trailing stuff not the last field */
259 ASSERT(field == file->nr_model_fields-1);
260 model->fields[field] = file->pos;
261 while (*file->pos && *file->pos != '\n' && *file->pos != '\r') {
264 if (*file->pos == '\r') {
268 if (*file->pos == '\n') {
274 model->line_nr = file->line_nr;
277 entry->line_nr = file->line_nr;
279 /* if following lines are tab indented, put in the annex */
280 if (*file->pos == '\t') {
281 entry->annex = file->pos;
285 } while (*file->pos != '\0' && *file->pos != '\n' && *file->pos != '\r');
286 if (*file->pos == '\n' || *file->pos == '\r') {
287 char *save_pos = ++file->pos;
290 /* Allow tab indented to have blank lines */
291 while (*save_pos == '\n' || *save_pos == '\r') {
295 if (*save_pos == '\t') {
296 file->pos = save_pos;
297 file->line_nr += extra_lines;
300 } while (*file->pos != '\0' && *file->pos == '\t');
301 if (file->pos[-1] == '\n' || file->pos[-1] == '\r')
302 file->pos[-1] = '\0';
314 dump_table_entry(table_entry *entry,
317 printf("(table_entry*)%p\n", entry);
324 dumpf(indent, "(fields");
325 for (field = 0; field < entry->nr_fields; field++) {
326 printf("%c%s", sep, entry->fields[field]);
331 dumpf(indent, "(line_nr %d)\n", entry->line_nr);
333 dumpf(indent, "(file_name %s)\n", entry->file_name);
335 dumpf(indent, "(annex\n%s\n", entry->annex);
336 dumpf(indent, " )\n");
343 table_entry_print_cpp_line_nr(lf *file,
346 lf_print__external_reference(file, entry->line_nr, entry->file_name);