|
|
1.1 ! root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ ! 2: static char rcsid[] = "$Header: main.c,v 2.5 85/08/22 16:05:00 timo Exp $"; ! 3: ! 4: /* ! 5: * B editor -- Main program (init/exit processing), error handling. ! 6: */ ! 7: ! 8: /* ! 9: * The B editor is a structured editor for a programming language ! 10: * for beginners and non-professional computer users. ! 11: * [L.G.L.T. Meertens: Draft Proposal for the B programming language, ! 12: * Mathematical Centre, Amsterdam, 1982, ISBN 90 6169 238 2.] ! 13: * Note that `B' is only a provisional name for the language. ! 14: * The editor uses a subset of the run-time system for the B ! 15: * interpreter, so that they may be linked together in a later stage. ! 16: * Also the sharing strategy of the B run-time routines makes a very ! 17: * elegant and powerful UNDO-mechanism possible. ! 18: */ ! 19: ! 20: #include "b.h" /* Contains definitions like string, etc. */ ! 21: #include "feat.h" ! 22: #include "bobj.h" ! 23: ! 24: ! 25: #ifdef SAVEPOS ! 26: #define SAVEPOSFILE ".Bed_pos" /* Last focus position database */ ! 27: #define MAXSAVE 50 /* Maximum number of entries kept in SAVEPOSFILE */ ! 28: #endif SAVEPOS ! 29: ! 30: ! 31: /* Command line flags */ ! 32: ! 33: bool dflag; /* -d: debugging output wanted */ ! 34: ! 35: bool slowterminal; ! 36: /* -s: the terminal is so slow that long messages are annoying */ ! 37: ! 38: bool hushbaby; /* -h: no bells are to be heard */ ! 39: ! 40: #ifdef COMMENTED_OUT /* Lower levels don't respond to this */ ! 41: bool nostandout; /* -n: inhibit use of standout */ ! 42: #endif COMMENTED_OUT ! 43: ! 44: ! 45: /* ! 46: * Main program -- call module initializations, do some work, ! 47: * call module shut-off code, exit. ! 48: */ ! 49: ! 50: Visible Procedure ! 51: main(argc, argv) ! 52: int argc; ! 53: string *argv; ! 54: { ! 55: bool initdone = No; ! 56: bool status = Yes; ! 57: int lineno = 0; ! 58: string arg0 = argv[0]; ! 59: string cp; ! 60: string filename; ! 61: extern string malloc(); ! 62: ! 63: cp = rindex(arg0, '/'); ! 64: if (cp) ! 65: arg0 = cp+1; ! 66: ! 67: /* Process UNIX command line options */ ! 68: for (; argc > 1 && argv[1][0] == '-'; --argc, ++argv) { ! 69: switch (argv[1][1]) { ! 70: ! 71: #ifndef NDEBUG ! 72: case 'd': ! 73: dflag = Yes; ! 74: break; ! 75: #endif NDEBUG ! 76: ! 77: case 'h': ! 78: hushbaby = Yes; ! 79: break; ! 80: ! 81: #ifdef COMMENTED_OUT /* Lower levels don't respond to this */ ! 82: case 'n': ! 83: nostandout = Yes; ! 84: break; ! 85: #endif COMMENTED_OUT ! 86: ! 87: case 's': ! 88: slowterminal = Yes; ! 89: break; ! 90: ! 91: default: ! 92: fprintf(stderr, ! 93: "*** Usage: %s [-h] [-s] %s\n", ! 94: arg0, ! 95: #ifdef FILEARGS ! 96: "[ [+lineno] file ] ..."); ! 97: #else !FILEARGS ! 98: ""); ! 99: #endif !FILEARGS ! 100: exit(1); ! 101: ! 102: } ! 103: } ! 104: ! 105: /* Setbuf must be called before any output is produced! */ ! 106: setbuf(stdout, malloc((unsigned)BUFSIZ)); ! 107: ! 108: #ifdef FILEARGS ! 109: for (; status && argc > 1; --argc, ++argv) { ! 110: if (argv[1][0] == '+') { /* +lineno option */ ! 111: lineno = atoi(argv[1] + 1); ! 112: } ! 113: else { ! 114: filename = argv[1]; ! 115: if (!initdone) { ! 116: initall(); ! 117: initdone = Yes; ! 118: } ! 119: status = demo(filename, lineno); ! 120: lineno = 0; ! 121: } ! 122: } ! 123: #endif FILEARGS ! 124: if (!initdone) { ! 125: #ifdef BTOP ! 126: initall(); ! 127: mainloop(); ! 128: #else BTOP ! 129: #ifndef FILEARGS ! 130: Deliberate error. You should define at least one of BTOP and FILEARGS; ! 131: #endif !FILEARGS ! 132: fprintf(stderr, "*** No file edited\n"); ! 133: exit(0); ! 134: #endif BTOP ! 135: } ! 136: endall(); ! 137: objstats(); ! 138: if (status) ! 139: objcheck(); ! 140: else ! 141: objdump(); ! 142: return !status; ! 143: } ! 144: ! 145: ! 146: /* ! 147: * Module initializations -- for each module xxxx that needs dynamic ! 148: * initialization, call a routine named initxxxx. ! 149: * The order is determined by the inter-module dependencies. ! 150: * Also note that all terminal- and screen-related initializations are called ! 151: * indirectly by initterm(). ! 152: */ ! 153: ! 154: Hidden Procedure ! 155: initall() ! 156: { ! 157: #ifndef NDEBUG ! 158: if (dflag) ! 159: fprintf(stderr, "*** initall();\n\r"); ! 160: #endif NDEBUG ! 161: initfile(); ! 162: initkeys(); ! 163: initgram(); ! 164: #ifdef USERSUGG ! 165: initsugg(); ! 166: #endif USERSUGG ! 167: initunix(); ! 168: initterm(); ! 169: } ! 170: ! 171: ! 172: /* ! 173: * Module shut-off code -- for each module xxxx that needs dynamic ! 174: * shut-off code (what is the inverse of `initialization'?), ! 175: * call a routine named endxxxx. ! 176: * Endall is also called (from module "unix") when a signal or interrupt ! 177: * causes termination. ! 178: */ ! 179: ! 180: Visible Procedure ! 181: endall() ! 182: { ! 183: if (dflag) ! 184: fprintf(stderr, "*** endall();\n\r"); ! 185: endterm(); ! 186: enddemo(); ! 187: endunix(); ! 188: enderro(); ! 189: #ifdef USERSUGG ! 190: endsugg(); ! 191: #endif USERSUGG ! 192: } ! 193: ! 194: ! 195: ! 196: /* ! 197: * System error -- abort the editor with a short error message. ! 198: * Should only be called for catastrophic, unrecoverable errors ! 199: * or those that `cannot happen'. ! 200: */ ! 201: ! 202: /* VARARGS 1 */ ! 203: Visible Procedure ! 204: syserr(fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) ! 205: string fmt; ! 206: { ! 207: #ifdef BTOP ! 208: termchild(); ! 209: #endif BTOP ! 210: endall(); ! 211: fprintf(stderr, "*** System error: "); ! 212: fprintf(stderr, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); ! 213: fprintf(stderr, "\n"); ! 214: #ifndef NDEBUG ! 215: fprintf(stderr, "*** Core dump for B guru: "); ! 216: fflush(stderr); ! 217: abort(); ! 218: #else ! 219: fflush(stderr); ! 220: _exit(1); ! 221: #endif ! 222: /* NOTREACHED */ ! 223: } ! 224: ! 225: ! 226: /* ! 227: * Assertion error. ! 228: * Call syserr with information about where something was wrong. ! 229: * (Sorry, WHAT was wrong must be dug out of the core dump.) ! 230: */ ! 231: ! 232: Visible Procedure ! 233: asserr(file, line) ! 234: string file; ! 235: int line; ! 236: { ! 237: syserr("Assertion failed: file %s, line %d", file, line); ! 238: /* NOTREACHED */ ! 239: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.