Annotation of 43BSD/ingres/source/equel/include.c, revision 1.1.1.1

1.1       root        1: # include      <stdio.h>
                      2: # include      "constants.h"
                      3: # include      "globals.h"
                      4: # include      <sccs.h>
                      5: 
                      6: SCCSID(@(#)include.c   8.1     12/31/84)
                      7: 
                      8: 
                      9: 
                     10: /*
                     11: **  TST_INCLUDE -- Test and process a "#include" line
                     12: **
                     13: **     Checks that a line is of the form '# include "<filename.q.h>"',
                     14: **     and calls include to change i/o files if so.
                     15: **
                     16: **     Returns:
                     17: **             1 -- if change of file was done
                     18: **             0 -- otherwise
                     19: */
                     20: 
                     21: 
                     22: tst_include()
                     23: {
                     24:        register char   *lp, *tp, *chp;
                     25:        char            temp [MAXSTRING + 1];
                     26: 
                     27:        /* copy line read into temp ( because temp is same
                     28:         * size as Linebuf, no overflow check is needed 
                     29:         */
                     30:        for (tp = temp, lp = Line_buf; (*tp++ = *lp++) != '\n'; )
                     31:                ;
                     32:        /* skip white space between "#" and "include" */
                     33:        for (tp = &temp [1]; *tp == ' ' || *tp == '\t'; tp++)
                     34:                ;
                     35:        if (scompare("include", 7, tp, 7))
                     36:                return (0);
                     37:        /* skip "include", the white space till '"' */
                     38:        for (tp = &tp [7]; *tp == ' ' || *tp == '\t'; tp++)
                     39:                ;
                     40:        if (*tp++ != '"')
                     41:                return (0);
                     42:        
                     43:        /* {tp points to X in a line "#<white>include<white>"X..." }
                     44:         * make "lp" point at right end '"' (filename must not have
                     45:         * escaped '"' in it
                     46:         */
                     47:        for (lp = tp; *lp != '"' && *lp != '\n'; lp++)
                     48:                ;
                     49:        
                     50:        if (*lp != '"')
                     51:                return (0);
                     52:        /* make sure filename is long enough to have the equel "include"
                     53:         * suffix ".q.h"
                     54:         */
                     55:        if (lp - tp < 4)
                     56:                return (0);
                     57:        if (scompare(".q.h", 4, &lp [-4], 4))
                     58:                return (0);     /* other include (non-equel) */
                     59: 
                     60:        /* "chp" points at 'q' in '.q.h' which will be changed to 'c' */
                     61:        chp = &lp [-3];
                     62: 
                     63:        /* check that rest of the line is white space */
                     64:        for (lp++; *lp == ' ' || *lp == '\t'; lp++)
                     65:                ;
                     66:        if (*lp != '\n')
                     67:        {
                     68:                *lp = '\0';
                     69:                yysemerr("garbage after valid \"#include\"", temp);
                     70:                return (0);
                     71:        }
                     72:        *++lp = '\0';
                     73:        return (include(temp, tp, chp, &chp [3]));
                     74: }
                     75: /*
                     76: **  INCLUDE -- Change i/o files for a file inclusion
                     77: **     Saves status of current i/o files, puts out 
                     78: **     '#include"___.c.h"', and opens appropriate files.
                     79: **     Makes both files legal C files, closing quotes,
                     80: **     and reopeneing them in the new file, if necessary.
                     81: **
                     82: **     Parameters:
                     83: **             buf -- "#include..." line
                     84: **             start -- start of filename
                     85: **             chp -- *chp is 'q' in ".q.h" of filename
                     86: **             end -- ptr to last '"' after filename
                     87: **
                     88: **     Returns:
                     89: **             1 -- if i/o files changed
                     90: **             0 -- otherwise
                     91: **
                     92: **     Called By:
                     93: **             tst_include() -- [include.c] on seeing a pre-processor
                     94: **             line.
                     95: */
                     96: 
                     97: 
                     98: include(buf, start, chp, end)
                     99: char   *buf;
                    100: char   *start;
                    101: char   *chp;
                    102: char   *end;
                    103: {
                    104:        char                            in_q_flag;
                    105:        register struct inc_file        *i_f;
                    106:        char                            *salloc();
                    107: 
                    108:        in_q_flag = In_quote;
                    109:        if (in_q_flag)
                    110:        {
                    111:                end_quote();
                    112:                equate_lines();
                    113:        }
                    114: 
                    115:        if (!(i_f = (struct inc_file *)nalloc(sizeof *i_f)))
                    116:        {
                    117: err1 :
                    118:                *++end = '\0';  /* overwrite before new-line at end */
                    119:                yysemerr("alloc error in #include processing", buf);
                    120:                if (in_q_flag)
                    121:                        begin_quote();
                    122:                *end = '\n';
                    123:                return (0);
                    124:        }
                    125:        i_f->inc_yyline = yyline + 1;   /* next line that will be read is
                    126:                                         * yyline + 1 because getch does not
                    127:                                         * see the '\n' at the end of the
                    128:                                         * "#include" line
                    129:                                         */
                    130:        i_f->inc_lineout = Lineout + 1; /* because the write of the "#include
                    131:                                         * "... .c.h" file is done after the
                    132:                                         * fixation of the value of Lineout.
                    133:                                         */
                    134:        i_f->inc_fid = Input_file_name;
                    135:        i_f->inc_outfile = Out_file;
                    136:        i_f->inc_infile = In_file;
                    137:        i_f->inc_next = 0;
                    138: 
                    139:        *end = '\0';
                    140:        if (!(Input_file_name = salloc(start)))
                    141:        {
                    142:                xfree(i_f);
                    143:                goto err1;
                    144:        }
                    145: 
                    146:        if ((In_file = fopen(Input_file_name, "r")) == NULL)
                    147:        {
                    148:                cant("read", Input_file_name);
                    149: err3 :
                    150:                xfree(Input_file_name);
                    151:                Input_file_name = i_f->inc_fid;
                    152:                In_file = i_f->inc_infile;
                    153:                xfree(i_f);
                    154:                return (0);
                    155:        }
                    156:        *end = '"';
                    157:        *chp = 'c';
                    158: 
                    159:        /* write out "#include..c.h" line (make sure it's at beginning
                    160:         * of line.
                    161:         */
                    162:        equate_lines();
                    163:        if (Charcnt != 0)
                    164:                w_op("\n");
                    165:        w_op(buf);
                    166:        fflush(Out_file);
                    167:        *end = '\0';
                    168:        if ((Out_file = fopen(start, "w")) == NULL)
                    169:        {
                    170:                cant("write", start);
                    171:                fclose(In_file);
                    172:                Out_file = i_f->inc_outfile;
                    173:                goto err3;
                    174:        }
                    175: 
                    176:        /* go to it !!! */
                    177:        Lineout = yyline = Newline = 1;
                    178:        Pre_proc_flg = 0;
                    179:        Line_pos = 0;
                    180:        if (in_q_flag)
                    181:                begin_quote();
                    182:        Inc_files = i_f;
                    183:        return (1);
                    184: }
                    185: /*
                    186: **  RESTOREF -- Restore previous file environment
                    187: **     Closes current files, and restores global variable
                    188: **     values for old files.
                    189: **
                    190: **     Returns:
                    191: **             0 -- if no old files (top level, no "#include"s)
                    192: **             1 -- otherwise
                    193: **
                    194: **     Called By:
                    195: **             equel() -- to close any files that may remain
                    196: **                     open after a reset(III).
                    197: **             getch() -- upon receiving end-of-file
                    198: **                     at some include level.
                    199: */
                    200: 
                    201: 
                    202: restoref()
                    203: {
                    204:        register struct inc_file        *i_f;
                    205: 
                    206:        if (Inc_files)
                    207:        {
                    208:                fclose(Out_file);
                    209:                fclose(In_file);
                    210:                xfree(Input_file_name);
                    211: 
                    212:                /* restore previous environment */
                    213:                i_f = Inc_files;
                    214:                yyline = i_f->inc_yyline;
                    215:                Lineout = i_f->inc_lineout;
                    216:                Input_file_name = i_f->inc_fid;
                    217:                Out_file = i_f->inc_outfile;
                    218:                In_file = i_f->inc_infile;
                    219:                Line_pos = 0;
                    220:                Inc_files = i_f->inc_next;
                    221:                xfree(i_f);
                    222:                return (1);
                    223:        }
                    224:        return (0);
                    225: }

unix.superglobalmegacorp.com

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