Annotation of 43BSD/contrib/B/src/bed/main.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

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