Annotation of GNUtools/cctools/as/input-file.c, revision 1.1.1.1

1.1       root        1: /* input_file.c - Deal with Input Files -
                      2:    Copyright (C) 1987 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GAS, the GNU Assembler.
                      5: 
                      6: GAS 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 1, or (at your option)
                      9: any later version.
                     10: 
                     11: GAS 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 GAS; see the file COPYING.  If not, write to
                     18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     19: 
                     20: /*
                     21:  * Confines all details of reading source bytes to this module.
                     22:  * All O/S specific crocks should live here.
                     23:  * What we lose in "efficiency" we gain in modularity.
                     24:  * Note we don't need to #include the "as.h" file. No common coupling!
                     25:  */
                     26: 
                     27: #define NDEBUG         /* JF remove asserts */
                     28: 
                     29: #include <stdio.h>
                     30: #include <stdlib.h>
                     31: #include <string.h>
                     32: #include <assert.h>
                     33: #include <libc.h>
                     34: #include "input-file.h"
                     35: #include "xmalloc.h"
                     36: #include "input-scrub.h"
                     37: #include "app.h"
                     38: #include "as.h"
                     39: 
                     40: /*
                     41:  * This variable is non-zero if the file currently being read should be
                     42:  * preprocessed by app.  It is zero if the file can be read straight in.
                     43:  */
                     44: #ifndef SUSPECT
                     45: static
                     46: #endif
                     47: int preprocess = 0;
                     48: 
                     49: /*
                     50:  * This code opens a file, then delivers BUFFER_SIZE character
                     51:  * chunks of the file on demand.
                     52:  * BUFFER_SIZE is supposed to be a number chosen for speed.
                     53:  * The caller only asks once what BUFFER_SIZE is, and asks before
                     54:  * the nature of the input files (if any) is known.
                     55:  */
                     56: 
                     57: #define BUFFER_SIZE (32 * 1024)
                     58: 
                     59: #ifndef NeXT
                     60: static char in_buf[BUFFER_SIZE];
                     61: #endif /* !defined(NeXT) */
                     62: 
                     63: /*
                     64:  * We use static data: the data area is not sharable.
                     65:  */
                     66: 
                     67: FILE *f_in = NULL;     /* JF do things the RIGHT way */
                     68: /* static JF remove static so app.c can use file_name */
                     69: char *file_name = NULL;
                     70: 
                     71: /* These hooks accomodate most operating systems. */
                     72: 
                     73: void
                     74: input_file_begin(
                     75: void)
                     76: {
                     77:   /* file_handle = -1; */
                     78:   f_in = (FILE *)0;
                     79: }
                     80: 
                     81: void
                     82: input_file_end(
                     83: void)
                     84: {
                     85: }
                     86: 
                     87: int                            /* Return BUFFER_SIZE. */
                     88: input_file_buffer_size(
                     89: void)
                     90: {
                     91:   return (BUFFER_SIZE);
                     92: }
                     93: 
                     94: int
                     95: input_file_is_open(
                     96: void)
                     97: {
                     98:   /* return (file_handle >= 0); */
                     99:   return f_in!=(FILE *)0;
                    100: }
                    101: 
                    102: void
                    103: input_file_open(
                    104: char *filename,        /* "" means use stdin. Must not be 0. */
                    105: int pre)
                    106: {
                    107:        int     c;
                    108:        char    buf[80];
                    109: 
                    110:        preprocess = pre;
                    111: 
                    112:        assert( filename != 0 );        /* Filename may not be NULL. */
                    113:        if (filename [0]) {     /* We have a file name. Suck it and see. */
                    114:                f_in=fopen(filename,"r");
                    115:                file_name=filename;
                    116:        } else {                        /* use stdin for the input file. */
                    117:                f_in = stdin;
                    118:                file_name = "{standard input}"; /* For error messages. */
                    119:        }
                    120:        if (f_in==(FILE *)0) {
                    121:                as_perror ("Can't open source file for input", file_name);
                    122:                return;
                    123:        }
                    124: #ifdef NeXT    /* .include feature */
                    125:        setbuffer(f_in, xmalloc(BUFFER_SIZE), BUFFER_SIZE);
                    126: #else
                    127:        setbuffer(f_in,in_buf,BUFFER_SIZE);
                    128: #endif
                    129:        c=getc(f_in);
                    130:        if(c=='#') {    /* Begins with comment, may not want to preprocess */
                    131:                c=getc(f_in);
                    132:                if(c=='N') {
                    133:                        fgets(buf,80,f_in);
                    134:                        if(!strcmp(buf,"O_APP\n"))
                    135:                                preprocess=0;
                    136:                        if(!index(buf,'\n'))
                    137:                                ungetc('#',f_in);       /* It was longer */
                    138:                        else
                    139:                                ungetc('\n',f_in);
                    140:                } else if(c=='\n')
                    141:                        ungetc('\n',f_in);
                    142:                else
                    143:                        ungetc('#',f_in);
                    144:        } else
                    145:                ungetc(c,f_in);
                    146: }
                    147: 
                    148: char *
                    149: input_file_give_next_buffer(
                    150: char *where)   /* Where to place 1st character of new buffer. */
                    151: {
                    152:   char *       return_value;   /* -> Last char of what we read, + 1. */
                    153:   register int size;
                    154: 
                    155:   if (f_in == (FILE *)0)
                    156:       return 0;
                    157:       /*
                    158:        * fflush (stdin); could be done here if you want to synchronise
                    159:        * stdin and stdout, for the case where our input file is stdin.
                    160:        * Since the assembler shouldn't do any output to stdout, we
                    161:        * don't bother to synch output and input.
                    162:        */
                    163:   /* size = read (file_handle, where, BUFFER_SIZE); */
                    164:   if(preprocess) {
                    165:        char *p;
                    166:        int n;
                    167:        int ch;
                    168: 
                    169:        scrub_file=f_in;
                    170:        for(p=where,n=BUFFER_SIZE;n;--n) {
                    171:                ch=do_scrub_next_char(scrub_from_file,scrub_to_file);
                    172:                if(ch==EOF)
                    173:                        break;
                    174:                *p++=ch;
                    175:        }
                    176:        size=BUFFER_SIZE-n;
                    177:   } else
                    178:        size= fread(where,sizeof(char),BUFFER_SIZE,f_in);
                    179:   if (size < 0)
                    180:     {
                    181:       as_perror ("Can't read source file: end-of-file faked.", file_name);
                    182:       size = 0;
                    183:     }
                    184:   if (size)
                    185:     return_value = where + size;
                    186:   else
                    187:     {
                    188: #ifdef NeXT    /* .include feature */
                    189:       if(doing_include)
                    190:        free (f_in->_base);
                    191: #endif /* NeXT .include feature */
                    192:       if (fclose (f_in))
                    193:        as_perror ("Can't close source file -- continuing", file_name);
                    194:       f_in = (FILE *)0;
                    195:       return_value = 0;
                    196:     }
                    197:   return (return_value);
                    198: }
                    199: 
                    200: /* end: input_file.c */

unix.superglobalmegacorp.com

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