|
|
1.1 ! root 1: # include <stdio.h> ! 2: # include "constants.h" ! 3: # include "globals.h" ! 4: # include <setjmp.h> ! 5: # include <sccs.h> ! 6: ! 7: SCCSID(@(#)main.c 8.1 12/31/84) ! 8: ! 9: ! 10: /* ! 11: ** MAIN.C -- Start up routines ! 12: ** ! 13: ** Usage: ! 14: ** equel {-d | -v | -c | -y | -f | -f<integer> | <name>.q} ! 15: ** ! 16: ** Files: ! 17: ** standard output -- for diagnostics ! 18: ** <name>.q -- read ! 19: ** <name>.c -- created and written ! 20: ** any file appearing in a "#include" with a name ! 21: ** <name>.q.h -- read ! 22: ** <name>.c.h -- created and written ! 23: ** ! 24: ** Flags: ! 25: ** possible arguments are: ! 26: ** -d -- enables run-time errors to have the file name ! 27: ** and line number where they occurred reported ! 28: ** Defaults to off. ! 29: ** -f -- specify the number of characters to fill ! 30: ** an output line on quel commands ! 31: ** as being very high (to get C code on the ! 32: ** right line invariably). ! 33: ** -f<integer> -- fill output lines to integer chars ! 34: ** (0 is like -f alone) ! 35: ** Defaults to FILLCNT. ! 36: ** -y -- have the parser print debugging info ! 37: ** Defaults to off. ! 38: ** -v -- (verbose) have the lexical analizer ! 39: ** print the kind of token it sees. ! 40: ** (only available if xDEBUG is defined) ! 41: ** Defaults to off. ! 42: ** -c -- have every character read or backed up ! 43: ** echoed (only if xDEBUG is defined) ! 44: ** Defaults to off. ! 45: ** -r -- reset all previous flags to default ! 46: ** <name>.q -- name of a file to be equel'ed ! 47: ** ! 48: ** Compilation Flags: ! 49: ** xDEBUG -- enables debugging flags -v and -c ! 50: ** ! 51: ** Compilation Instructions: ! 52: ** to setup equel do : ! 53: ** setup equel; setup libq ! 54: */ ! 55: /* ! 56: ** MAIN -- invokes the pre-compiler on all the argument files ! 57: ** ! 58: ** Parameters: ! 59: ** argc ! 60: ** argv ! 61: ** ! 62: ** Returns: ! 63: ** none ! 64: */ ! 65: int Exit_val = 0; /* Value to exit with */ ! 66: jmp_buf Jmpbuf; /* nonlocal goto label */ ! 67: ! 68: main(argc, argv) ! 69: int argc; ! 70: char **argv; ! 71: { ! 72: extern char **argproc(); ! 73: ! 74: ! 75: argv [argc] = 0; ! 76: ! 77: for (argv++; *argv; ) ! 78: { ! 79: argv = argproc(argv); ! 80: if (!Arg_error) ! 81: equel(Input_file_name); ! 82: } ! 83: exit(Exit_val); ! 84: } ! 85: ! 86: /* ! 87: ** ARGPROC -- process arguments on the command line ! 88: ** Arguments have effect on all the files following them ! 89: ** until a "-r" or an argument cancelling the first ! 90: ** ! 91: ** Also performs global initializations. ! 92: ** ! 93: ** Parameters: ! 94: ** argv -- a 0 terminated string vector with the ! 95: ** command lines components. ! 96: ** ! 97: ** Returns: ! 98: ** a new argv with all the leading arguments taken out ! 99: ** ! 100: ** Side Effects: ! 101: ** sets certain variables for certain flags ! 102: ** -d -- Rtdb ! 103: ** -c -- Chardebug ! 104: ** -v -- Lex_debug ! 105: ** -y -- yydebug ! 106: ** -f -- Fillcnt ! 107: ** -r -- resets all variables to default values ! 108: ** Sets Arg_error on an argument error that should abort ! 109: ** the pre-processing of the file read. ! 110: */ ! 111: ! 112: char **argproc(argv) ! 113: char **argv; ! 114: { ! 115: ! 116: /* initializations for a new file */ ! 117: ! 118: C_code_flg = Pre_proc_flg = 0; ! 119: yyline = Newline = Lineout = 1; ! 120: Block_level = Indir_level = In_string = Fillmode = 0; ! 121: Charcnt = Lastc = In_quote = 0; ! 122: Arg_error = 0; ! 123: ! 124: /* free C variable trees, and symbol space */ ! 125: freecvar(&C_locals); ! 126: freecvar(&F_locals); ! 127: freecvar(&C_globals); ! 128: freecvar(&F_globals); ! 129: ! 130: symspfree(); ! 131: ! 132: for ( ; *argv && **argv == '-'; argv++) ! 133: { ! 134: switch (*++*argv) ! 135: { ! 136: ! 137: # ifdef xDEBUG ! 138: case 'v' : ! 139: Lex_debug = 'v'; ! 140: break; ! 141: ! 142: case 'c' : ! 143: Chardebug = 'c'; ! 144: break; ! 145: # endif ! 146: ! 147: case 'y' : ! 148: yydebug = 1; ! 149: break; ! 150: ! 151: case 'd' : ! 152: Rtdb = 1; ! 153: break; ! 154: ! 155: case 'f' : /* line fill */ ! 156: Fillcnt = atoi(++*argv); ! 157: if (!Fillcnt) ! 158: /* make SURE that C_CODE is put ! 159: * on line that it was typed in on ! 160: */ ! 161: Fillcnt = 30000; ! 162: break; ! 163: ! 164: case 'r' : /* reset all flags to ! 165: * their default values. ! 166: */ ! 167: yydebug = Rtdb = 0; ! 168: Fillcnt = FILLCNT; ! 169: # ifdef xDEBUG ! 170: Lex_debug = Chardebug = 0; ! 171: # endif ! 172: break; ! 173: ! 174: default : ! 175: printf("equel: invalid option: '-%c'\n", **argv); ! 176: } ! 177: } ! 178: if (*argv) ! 179: Input_file_name = *argv++; ! 180: else ! 181: { ! 182: printf("equel: missing file name after arguments\n"); ! 183: Arg_error++; ! 184: } ! 185: return (argv); ! 186: } ! 187: ! 188: ! 189: /* ! 190: ** EQUEL -- invokes the precompiler for a non-included file ! 191: ** ! 192: ** Parameters: ! 193: ** filename -- the name of the file to pre-compile ! 194: ** ! 195: ** Returns: ! 196: ** none ! 197: ** ! 198: ** Side Effects: ! 199: ** performs the preprocessing on <filename> ! 200: */ ! 201: ! 202: equel(filename) ! 203: char *filename; ! 204: { ! 205: char o_file [100]; ! 206: register l; ! 207: ! 208: l = length(filename); ! 209: if (l > sizeof o_file - 1) ! 210: { ! 211: printf("equel: filename \"%s\" too long\n", ! 212: filename); ! 213: return; ! 214: } ! 215: if (!sequal(".q", &filename [l - 2])) ! 216: { ! 217: printf("equel: EQUEL source files must end with .q\n"); ! 218: return; ! 219: } ! 220: bmove(filename, o_file, l - 2); ! 221: bmove(".c", &o_file[l - 2], 3); ! 222: Input_file_name = filename; ! 223: In_file = Out_file = NULL; ! 224: ! 225: ! 226: if ((In_file = fopen(filename, "r")) == NULL) ! 227: cant("read", filename); ! 228: else if ((Out_file = fopen(o_file, "w")) == NULL) ! 229: cant("write", o_file); ! 230: else if (!setjmp(Jmpbuf)) ! 231: yyparse(); ! 232: ! 233: /* if a reset(III) is done while processing ! 234: * an included file, then this closes all ! 235: * files skipped. ! 236: */ ! 237: while (restoref()) ! 238: ; ! 239: ! 240: if (Out_file != NULL) ! 241: fclose(Out_file); ! 242: if (In_file != NULL) ! 243: fclose(In_file); ! 244: In_file = Out_file = NULL; ! 245: if (Block_level != 0) ! 246: yysemerr("unclosed block", 0); ! 247: Input_file_name = 0; ! 248: } ! 249: ! 250: /* ! 251: ** CANT -- print error message on failure to open a file ! 252: ** ! 253: ** Parameters: ! 254: ** operation -- "read" or "write", according to what was ! 255: ** attempted ! 256: ** filename -- the name of the file on which attempted ! 257: ** ! 258: ** Returns: ! 259: ** none ! 260: ** ! 261: ** Side Effects: ! 262: ** Prints error message on standard output ! 263: */ ! 264: ! 265: cant(operation, filename) ! 266: char *operation; ! 267: char *filename; ! 268: { ! 269: extern char *sys_errlist[]; ! 270: extern int sys_nerr; ! 271: extern int errno; ! 272: char ebuf[BUFSIZ]; ! 273: ! 274: if (errno > 0 && errno <= sys_nerr) ! 275: sprintf(ebuf, "Can't %s \"%s\": %s", operation, filename, ! 276: sys_errlist[errno]); ! 277: else ! 278: sprintf(ebuf, "Can't %s \"%s\": unknown error", operation, ! 279: filename); ! 280: yysemerr(ebuf, 0); ! 281: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.