Annotation of 43BSD/contrib/apl/src/xed.c, revision 1.1

1.1     ! root        1: static char Sccsid[] = "xed.c @(#)xed.c        1.1     10/1/82 Berkeley ";
        !             2: #
        !             3: 
        !             4: /*
        !             5:  *     V7.15 81/09/16 14:22    Fixed bug causing bus errors occasionally
        !             6:  *     V7.14 81/09/10 21:50    -B dynamically allocated line buffer
        !             7:  *     V7.13 81/07/25 22:51    added -O and "long" pointers
        !             8:  *
        !             9:  * Editor
        !            10:  *
        !            11:  *     Major additions beginning       77/04
        !            12:  *     Conversion to version 7         79/12
        !            13:  *     Conversion to VAX               80/11
        !            14:  *
        !            15:  *     Purdue University, Engineering Computer Network
        !            16:  *
        !            17:  *     Tgi -- Room 337A
        !            18:  *     Electrical Engineering Dept
        !            19:  *     Purdue University
        !            20:  *     West Lafayette, Indiana
        !            21:  *     47907
        !            22:  *     317/49-41592
        !            23:  */
        !            24: 
        !            25: #define XED            /* enable powerful stuff */
        !            26: #define V7             /* enable environment stuff for protocol */
        !            27: 
        !            28: /*
        !            29:  *     At the entry to a function (PDP-11) the following sequence
        !            30:  *     of instructions is executed:
        !            31:  *             func:   jsr     r5,csv
        !            32:  *             csv:    mov     r5,r0
        !            33:  *             csv+2:  mov     sp,r5
        !            34:  *     If a signal occurs between the first and second, or between the
        !            35:  *     second and third instructions, r5 will NOT contain a valid
        !            36:  *     stack address.  Hence, when longjmp() attempts to validate
        !            37:  *     the environment pointer (r5) links, an instruction will be
        !            38:  *     fetched instead of a valid pointer, and will generally cause
        !            39:  *     one of "memory fault", "bus error", or "illegal instruction"
        !            40:  *     resulting in the loss of the editing session.
        !            41:  *
        !            42:  *     Due to this wonderful feature of version 7 ingenuity, I have
        !            43:  *     reverted to using setexit/reset, since they are simpler and
        !            44:  *     do not assume that I do not know what I am doing.
        !            45:  *
        !            46:  *     80/11/10 V7.01 Tgi
        !            47:  */
        !            48: 
        !            49: #ifndef pdp11
        !            50: #include <setjmp.h>
        !            51: jmp_buf        _env_rst;
        !            52: #define setexit() setjmp(_env_rst)
        !            53: #define reset()        longjmp(_env_rst,1)
        !            54: #endif
        !            55: 
        !            56: #include <sys/types.h>
        !            57: #include <sys/stat.h>
        !            58: 
        !            59: /*
        !            60:  * Machine-dependent definitions
        !            61:  */
        !            62: 
        !            63: #ifdef pdp11
        !            64: # define BPB   8       /* bits per byte */
        !            65: # define BPW   (BPB*sizeof(int))/* bits per word */
        !            66: # define BPWC  4       /* log2(BPW) */
        !            67: # define BPWM  017     /* mask of BPWC bits */
        !            68:   typedef short        block;
        !            69:   typedef short        charac;
        !            70:   typedef short        filedes;
        !            71:   typedef short        flag;
        !            72:   typedef int  (*func)();
        !            73:   typedef short        linep;
        !            74: #endif
        !            75: 
        !            76: #ifdef vax
        !            77: # define BPB   8       /* bits per byte */
        !            78: # define BPW   (BPB*sizeof(int))/* bits per word */
        !            79: # define BPWC  5       /* log2(BPW) */
        !            80: # define BPWM  037     /* mask of BPWC bits */
        !            81:   typedef long block;
        !            82:   typedef int  charac;
        !            83:   typedef short        filedes;
        !            84:   typedef char flag;
        !            85:   typedef int  (*func)();
        !            86:   typedef long linep;  /* NEW */
        !            87: #endif
        !            88: 
        !            89: /*
        !            90:  * conditional compilation
        !            91:  */
        !            92: 
        !            93: #ifdef XED
        !            94: # define AGAIN         /* enable "o" "again" command */
        !            95: # define ALLOC 1024    /* line buffer size */
        !            96: # define APLMAP                /* enable Apl character mapping */
        !            97: # define DEBUG         /* enable "du" command */
        !            98: # define DUMB  0       /* enable command to disable spcl chars */
        !            99: # define EOL           /* enable special eol stuff */
        !           100: # define EXTMARK       /* extended "k" capability */
        !           101: # define G_VFY         /* enable verifying on "g" command */
        !           102: # define HELP  "/etc/xed.doc"
        !           103: # ifdef pdp11          /* only needed on 16-bit machines */
        !           104: #  define HUGE         /* enable "huge" file stuff */
        !           105: # endif
        !           106: # define PAGE          /* enable proper line counting on ":" */
        !           107: # define PARENS                /* enable "b" suffix to count parentheses */
        !           108: # define PIPE          /* enable | command to pipe to process */
        !           109: # define PROMPT        ">"
        !           110: # define STRLEN                /* enable string-length counting code */
        !           111: # define TABS  ((LBSIZE+sizeof(int)-1)/sizeof(int)) /* words for tab stops */
        !           112: # define TTL   "XED\tV7.15"
        !           113: /* #define TTL_NL      9       /* location of newline in TTL */
        !           114: # define UNDO          /* enable "u"ndo command */
        !           115: # define USE           /* enable "@" command */
        !           116: # define XDEL          /* enable undelete stuff */
        !           117: # define YINT          /* enable special interrupt processing */
        !           118: #endif
        !           119: 
        !           120: /*
        !           121:  * stuff for EED, instead of XED
        !           122:  */
        !           123: 
        !           124: #ifndef XED
        !           125: # define HELP  "/etc/eed.doc"
        !           126: # define PROMPT        "*"
        !           127: # define TTL   "EED"
        !           128: #else
        !           129: # define EEDHELP       "/etc/eed.doc"
        !           130: # define EEDPROMPT "*"
        !           131: # define EEDTTL        "EED"
        !           132: #endif
        !           133: 
        !           134: /*
        !           135:  * stuff normally enabled
        !           136:  */
        !           137: 
        !           138: #define CLEAR  "\33:\33H\33J\32\14"    /* HP-2640A, Lear ADM-3A */
        !           139: #define CMDS   "edsav" /* all commands written if exists */
        !           140: #ifndef DUMB
        !           141: # define DUMB  1       /* enable command to disable spcl chars */
        !           142: #endif
        !           143: 
        !           144: /*
        !           145:  * special stuff, occasionally enabled
        !           146:  */
        !           147: 
        !           148: #define LOG    "/a/tgi/etc/xed.log"    /* feature use logging */
        !           149: 
        !           150: /*
        !           151:  * data #defines
        !           152:  */
        !           153: 
        !           154: #define BAK    4       /* file.bak - backup() */
        !           155: #define BLKSIZE        512     /* disk block size (bytes) */
        !           156: #define BS1    0100000 /* stty() */
        !           157: #define CBACK  14      /* back-reference: \(blah\)more\1 */
        !           158: #define CBRA   1       /* \( */
        !           159: #define CCHR   2       /* literal character */
        !           160: #define CCL    6       /* character class [x...y] */
        !           161: #define CCOUNT (80-1)  /* terminal width */
        !           162: #define CDOL   10      /* ...$ */
        !           163: #define CDOT   4       /*  .  */
        !           164: #define CEOF   11      /* end of pattern */
        !           165: #define CKET   12      /* \) */
        !           166: #define EOF    -1      /* end of file */
        !           167: #define ESIZE  128     /* regular expression size */
        !           168: #define FILE   0       /* no extension - backup() */
        !           169: #define FNSIZE 64      /* max size of pathname to file */
        !           170: #define GBSIZE 256     /* max global command length */
        !           171: #define HUP    3       /* file.hup - backup() */
        !           172: #define INT    2       /* file.int - backup() */
        !           173: #define LBSIZE 512     /* max line length */
        !           174: #define LMASK  077     /* mask for "locked" file */
        !           175: #define LMODE  (MODE&~LMASK)   /* mode for "locked" file */
        !           176: #define MODCNT 35      /* default mod count before auto-write */
        !           177: #define MODE   0666    /* mode for normal files */
        !           178: #define NBRA   9       /* number of \( \) pairs */
        !           179: #define NCCL   8       /* not in character class: [^x...y] */
        !           180: #define PAGSIZ 22      /* page size for ":" command */
        !           181: #define READ   0       /* getblock: read function */
        !           182: #define SIGBUS 10      /* Bus error */
        !           183: #define SIGEMT 7       /* EMT trap */
        !           184: #define SIGFPE 8       /* Floating Point Exception */
        !           185: #define SIGHUP 1       /* Hangup signal */
        !           186: #define SIGILL 4       /* Illegal instruction */
        !           187: #define SIGINT 2       /* Interrupt signal */
        !           188: #define SIGIOT 6       /* IOT trap */
        !           189: #define SIGPIP 13      /* Broken pipe for ! stuff */
        !           190: #define SIGQIT 3       /* Quit signal */
        !           191: #define SIGSEGV        11      /* Memory fault */
        !           192: #define SIGSYS 12      /* Bad system call */
        !           193: #define SIGTRC 5       /* Trace/BPT for mail stuff */
        !           194: #define SIGTRM 15      /* Termination */
        !           195: #define STAR   1       /*  *  */
        !           196: #define TABFILL        '\t'    /* fill character for tab expansion */
        !           197: #define TMP    1       /* file.edt - backup() */
        !           198: #define TRM    5       /* file.trm - backup() */
        !           199: #define TTSIZE (512+4) /* terminal output buffer size */
        !           200: #define WRITE  1       /* getblock: write function */
        !           201: #define ever   (;;)
        !           202: 
        !           203: #define error  errfunc
        !           204: #define ctrl(x)        ((x)&037)
        !           205: 
        !           206: #ifdef AGAIN
        !           207: char   agbuf[GBSIZE],  /* save area for "again" command */
        !           208:        *agp    = 0;    /* "again" command pointer */
        !           209: flag   agf     = 0;    /* "again" flag  (executing the command) */
        !           210: #endif
        !           211: 
        !           212: #ifdef ALLOC
        !           213: int    lbsize  = LBSIZE;/* line buffer size */
        !           214: #endif
        !           215: 
        !           216: #ifdef APLMAP
        !           217: flag   aplmap  = 0;    /* Apl character mapping */
        !           218: #include "aplmap.h"    /* apl ADM-3A char set mapping tables */
        !           219: #endif
        !           220: 
        !           221: #ifdef CKPT
        !           222: char   *cfname = "/tmp/ce00000";/* filename for checkpoint */
        !           223: int    recovry = 0,    /* non-zero to recover checkpointed session */
        !           224:        tfnum;          /* index into tfname for "00000" string */
        !           225: #endif
        !           226: 
        !           227: #ifdef CLEAR
        !           228: char   *clears = CLEAR;/* screen-clear sequence */
        !           229: flag   zflg    = 0;    /* if "stty bs1" not set */
        !           230:                        /* bs1 displays ctrl-z as ^Z on tty */
        !           231: #endif
        !           232: 
        !           233: #ifdef CMDS
        !           234: filedes        cmd     = 0;    /* file des for command-save file */
        !           235: char   cmdfil[] = CMDS;/* command-save file */
        !           236: #endif
        !           237: 
        !           238: #ifdef DEBUG
        !           239: flag   tflg    = 0;    /* tracing flag */
        !           240: #endif
        !           241: 
        !           242: #ifdef DUMB
        !           243: flag   dumbf   = DUMB; /* 1 = disable special chars in patterns */
        !           244: #endif
        !           245: 
        !           246: #ifdef EOL
        !           247: charac eol     = 0;    /* "end-of-line" char for multiple commands */
        !           248:                        /*   per line */
        !           249: flag   prompt3 = 1;    /* disable prompts for "eol" stuff */
        !           250: #endif
        !           251: 
        !           252: #ifdef G_VFY
        !           253: flag   gaskf   = 0;    /* verify mode on global command */
        !           254: #endif
        !           255: 
        !           256: #ifdef HELP
        !           257: filedes        doc     = 0;    /* "help" file descriptor */
        !           258: char   *help   = HELP; /* "help" file name */
        !           259: #endif
        !           260: 
        !           261: #ifdef LOG
        !           262: char   logfile[]= LOG; /* logging use of features */
        !           263: filedes        lfile   = 0;    /* logging file descriptor */
        !           264: short  logamp;         /* since s/x/&/ may be done many times */
        !           265: struct logstat {
        !           266:        short   l_uid;  /* user id of caller */
        !           267:        char    l_xed,          /* 1 if xed, 0 if eed, 2 if apled */
        !           268:                l_inter;        /* 1 if interactive */
        !           269: /* command features */
        !           270:        short   lc_shell,       /*  !  */
        !           271:                lc_pipe,        /*  |  */
        !           272:                lc_piplus,      /*  |+  */
        !           273:                lc_piminus,     /*  |-  */
        !           274:                lc_dpipe,       /*  ||  */
        !           275:                lc_pfrom,       /*  |<  */
        !           276:                lc_pto,         /*  |>  */
        !           277:                lc_at,          /*  @  */
        !           278:                lc_colon,       /*  :  */
        !           279:                lc_star,        /*  *  */
        !           280:                lc_clnminus,    /*  :-  */
        !           281:                lc_comment,     /*  : stuff  or  * stuff  */
        !           282:                lc_append,      /*  a  */
        !           283:                lc_abort,       /*  abort  */
        !           284:                lc_aspace,      /*  a line  */
        !           285:                lc_aslash,      /*  a/string/  */
        !           286:                lc_browse,      /*  bN  */
        !           287:                lc_change,      /*  c  */
        !           288:                lc_cslash,      /*  c/s1/s2/  */
        !           289:                lc_copy,        /*  coNN  */
        !           290:                lc_delete,      /*  d  */
        !           291:                lc_depth,       /*  d=NN  */
        !           292:                lc_directory,   /*  d path  */
        !           293:                lc_edit,        /*  e file  */
        !           294:                lc_eol,         /*  e=C  */
        !           295:                lc_errmsg,      /*  eNN  */
        !           296:                lc_exp,         /*  exp  */
        !           297:                lc_eplus,       /*  e+  */
        !           298:                lc_eminus,      /*  e-  */
        !           299:                lc_fshow,       /*  f  */
        !           300:                lc_fset,        /*  f file  */
        !           301:                lc_fillset,     /*  f=C  */
        !           302:                lc_global,      /*  g/str/cmd  */
        !           303:                lc_gvfy,        /*  g/str/vcmd  */
        !           304:                lc_header,      /*  h  */
        !           305:                lc_help,        /*  help  */
        !           306:                lc_insert,      /*  i  */
        !           307:                lc_islash,      /*  i/string/  */
        !           308:                lc_join,        /*  j  */
        !           309:                lc_jglue,       /*  j/glue/  */
        !           310:                lc_klist,       /*  k  */
        !           311:                lc_kset,        /*  kC  */
        !           312:                lc_list,        /*  l  */
        !           313:                lc_move,        /*  mNN  */
        !           314:                lc_moove,       /*  moNN  */
        !           315:                lc_magic,       /*  m  */
        !           316:                lc_numbers,     /*  n  */
        !           317:                lc_numinus,     /*  n-  */
        !           318:                lc_numplus,     /*  n+  */
        !           319:                lc_o,           /*  o ^Q  */
        !           320:                lc_print,       /*  p  */
        !           321:                lc_pprint,      /*  pp  */
        !           322:                lc_quit,        /*  q  */
        !           323:                lc_qimm,        /*  qi  */
        !           324:                lc_quote,       /*  q=C  */
        !           325:                lc_read,        /*  r  */
        !           326:                lc_substitute,  /*  s/s1/s2/  */
        !           327:                lc_stop,        /*  s  */
        !           328:                lc_savecount,   /*  saNN  */
        !           329:                lc_tablist,     /*  t  */
        !           330:                lc_tabset,      /*  t,NN  */
        !           331:                lc_tabchar,     /*  t=C  */
        !           332:                lc_transfer,    /*  tNN  */
        !           333:                lc_undo,        /*  u  */
        !           334:                lc_vglobal,     /*  v/str/cmd  */
        !           335:                lc_write,       /*  w  */
        !           336:                lc_wonto,       /*  w>  */
        !           337:                lc_wimm,        /*  wi  */
        !           338:                lc_width,       /*  w=NN  */
        !           339:                lc_xundelete,   /*  x  */
        !           340:                lc_yintr,       /*  y  */
        !           341:                lc_yminus,      /*  y-  */
        !           342:                lc_yplus,       /*  y+  */
        !           343: /* address features */
        !           344:                la_dot,         /*  .  */
        !           345:                la_dotdot,      /*  ..  */
        !           346:                la_dol,         /*  $  */
        !           347:                la_num,         /*  NN  */
        !           348:                la_plus,        /*  +  */
        !           349:                la_minus,       /*  -  */
        !           350:                la_caret,       /*  ^  */
        !           351:                la_quote,       /*  'a  */
        !           352:                la_letter,      /*  A  */
        !           353:                la_slash,       /*  /str/  */
        !           354:                la_query,       /*  ?str?  */
        !           355:                la_equal,       /*  =  */
        !           356: /* pattern features */
        !           357:                lp_caret,       /*  ^  */
        !           358:                lp_dol,         /*  $  */
        !           359:                lp_dot,         /*  .  */
        !           360:                lp_star,        /*  *  */
        !           361:                lp_ccl,         /*  [ ]  */
        !           362:                lp_nccl,        /*  [^ ]  */
        !           363:                lp_paren,       /*  \( \)  */
        !           364:                lp_digit,       /*  \1 \2 \3 ...  */
        !           365: /* substitution features */
        !           366:                lp_amp,         /*  &  */
        !           367: /* miscellaneous features */
        !           368:                lm_quote,       /*  ...q  */
        !           369:                lm_bracket,     /*  ...b  */
        !           370:                lm_overwrite;   /*  -O,wi  */
        !           371: /* resources */
        !           372:        long    lt_start,       /* starting time */
        !           373:                lt_end,         /* elapsed time */
        !           374:                lt_usercpu,     /* user cpu time */
        !           375:                lt_syscpu,      /* system cpu time */
        !           376:                lt_kidscpu,     /* total ! kids time */
        !           377:                lt_rlines,      /* total lines read */
        !           378:                lt_wlines;      /* total lines written */
        !           379: } logstats;
        !           380: #endif
        !           381: 
        !           382: #ifdef PAGE
        !           383: int    ccount  = CCOUNT;/* terminal width */
        !           384: #endif
        !           385: 
        !           386: #ifdef PARENS
        !           387: int    parenc[3] = {0, 0, 0};/* parentheses counts */
        !           388: flag   parenf  = 0;    /* count parentheses and brackets */
        !           389: #endif
        !           390: 
        !           391: #ifdef PIPE
        !           392: filedes        pfile   = 0;    /* "pipe" file descriptor */
        !           393: char   *pfname = "/tmp/ep00000";/* for "double-piping" */
        !           394: flag   piperr  = 0,    /* pipe error flag - shell() */
        !           395:        pno     = -1,   /* piping line numbering flag (default n-) */
        !           396:        strict  = 1;    /* strict exit status checking for | */
        !           397: #endif
        !           398: 
        !           399: #ifdef STRLEN
        !           400: charac quotec  = '\0', /* quote character other than " or ' */
        !           401:        quotec2 = '\0'; /* closing quote */
        !           402: int    quotef  = 0;    /* length of strings within " or ' chars */
        !           403: #endif
        !           404: 
        !           405: #ifdef TABS
        !           406: charac tabfill = TABFILL,/* fill character */
        !           407:        tabc    = 0;    /* tab character - if 0 no tab processing */
        !           408: int    maxtab  = -1,   /* last column number with tab stop */
        !           409:        tabs[TABS];     /* each bit on = tab stop */
        !           410: #endif
        !           411: 
        !           412: #ifdef UNDO
        !           413: linep  undo_oldp,      /* original line pointer */
        !           414:        undo_newp;      /* replacement line */
        !           415: #endif
        !           416: 
        !           417: #ifdef USE
        !           418: filedes        alt     = 0;    /* alternate command input file */
        !           419: char   altfile[FNSIZE];
        !           420: flag   eflg2   = 0;    /* another kludge */
        !           421: #endif
        !           422: 
        !           423: #ifdef XDEL
        !           424: linep  deleted = 0;    /* pointer to deleted line pointers */
        !           425: int    ndeleted = 0;   /* number of lines */
        !           426: #endif
        !           427: 
        !           428: #ifdef YINT
        !           429: flag   yflg    = 0;    /* page upon interrupt */
        !           430: linep  *yplus  = 0;    /* page from this line - if zero, from dot */
        !           431: #endif
        !           432: 
        !           433: /*
        !           434:  * globals
        !           435:  */
        !           436: 
        !           437: block  iblock  = -1,   /* block number of input buffer */
        !           438:        oblock  = -1;   /* output buffer block number */
        !           439: 
        !           440: char   *braelist[NBRA],        /* bracket \( \) end list */
        !           441:        *braslist[NBRA],        /* bracket \( \) start list */
        !           442:        dotbak[] = ".bak",
        !           443:        dotedt[] = ".edt",      /* "file saved" file */
        !           444:        dothup[] = ".hup",
        !           445:        dotint[] = ".int",
        !           446:        dottrm[] = ".trm",
        !           447:        *dots[] = { dothup, dottrm, dotedt, dotint, 0 },
        !           448:        expbuf[ESIZE + 4],      /* expression buffer */
        !           449:        file[FNSIZE],           /* filename buffer */
        !           450: #ifndef ALLOC
        !           451:        genbuf[LBSIZE],         /* generated line buffer */
        !           452: #else
        !           453:        *genbuf,                /* generated line buffer pointer */
        !           454: #endif
        !           455:        ibuff[BLKSIZE],         /* input tmpfile buffer */
        !           456:        line[TTSIZE + 4],       /* terminal output buffer */
        !           457: #ifndef ALLOC
        !           458:        linebuf[LBSIZE],        /* line buffer for getline()/putline() */
        !           459: #else
        !           460:        *linebuf,               /* line buffer for getline()/putline() */
        !           461: #endif
        !           462:        no[]    = "no ",
        !           463:        null[]  = "",           /* "" */
        !           464:        obuff[BLKSIZE],         /* output tmpfile buffer */
        !           465:        off[]   = "off",
        !           466:        on[]    = "on",
        !           467:        prcntu[] = "%u\n",      /* %u */
        !           468:        quote_s[] = "s",        /* "s" */
        !           469:        rhsbuf[LBSIZE / 2],     /* right-hand-side expression buffer */
        !           470:        savedfile[FNSIZE],      /* saved filename */
        !           471:        tempfile[FNSIZE],       /* scratch area for filename */
        !           472: 
        !           473:        *editor,        /* argv[0] */
        !           474:        *e_prompt = PROMPT,/* editor command prompt */
        !           475:        *fmtlno = "%7u=",/* format for line-number output */
        !           476:        *globp,         /* global command pointer */
        !           477:        *linp   = line, /* line pointer */
        !           478:        *linebp,
        !           479:        *loc1,          /* start pointer of & string */
        !           480:        *loc2,          /* end pointer of & string */
        !           481:        *locs,
        !           482:        *nextip,
        !           483:        *overfile,      /* filename mode was changed on */
        !           484:        *tfname = "/tmp/e00000",/* "buffer" name */
        !           485:        *ver    = TTL;  /* ID message */
        !           486: 
        !           487: charac lastc   = 0,    /* peekc set to lastc on interrupt */
        !           488:        peekc   = 0;    /* one character pushback */
        !           489: 
        !           490: int    brcount = 1,    /* number of lines to output on "newline" */
        !           491:        col     = 0,    /* column counter for calculating line wraps */
        !           492:        line_num,       /* integer for line number on output */
        !           493:        modcount = MODCNT,/* number of mods before auto-write */
        !           494:        overmode,       /* mode of overridden file */
        !           495:        mods    = 0,    /* number of mods */
        !           496:        nbra    = 0,    /* count of currently defined \( \) pairs */
        !           497:        ninbuf,         /* bytes in tmpfile input buffer */
        !           498:        nleft,          /* bytes remaining in tmpfile output buffer */
        !           499:        num_reads = 0,  /* indicator to aid text_modified-- */
        !           500:                        /* first read isn't really a modify */
        !           501:        pcount  = PAGSIZ-1,/* number of lines to display on ":" command */
        !           502:        s_cnt   = 0,    /* counter for "s/str1/str2/nn" */
        !           503:        s_tmp   = 0,    /* scratch var for same */
        !           504:        savf,           /* counter for auto-write stuff */
        !           505:        text_modified = 0;/* flag--on if text was modified */
        !           506: 
        !           507: filedes        fout    = 1,    /* putchar() writes on this fildes */
        !           508:        io      = 0,    /* file descriptor for "r", "w", "e" */
        !           509:        tfile   = -1;   /* file des for "buffer" */
        !           510: 
        !           511: flag   aflg    = 0,    /* "apl mode" flag */
        !           512:        appflg  = 0,    /* append flag (if "w>file") */
        !           513:        badf    = 0,    /* bad read on temp file */
        !           514:        bflg    = 0,    /* "back-up" flag -- Generate back-up file */
        !           515:        bflg2   = 0,    /* Secondary "back-up" flag */
        !           516:        circfl,         /* reg expr started with ^ */
        !           517:        curt    = 0,    /* short error messages -- ie: '?' */
        !           518:        deltflg = 0,    /* don't delete .edt file upon exit */
        !           519:        eflg    = 0,    /* echo input flag */
        !           520:        eof     = 0,    /* eof was last char typed */
        !           521:        fflg    = 0,    /* "create" flag */
        !           522:        globf2  = 0,    /* kludge for -f */
        !           523: #ifdef HUGE
        !           524:        hugef   = 0,    /* -h is process huge file */
        !           525:        hugef2  = 0,    /* getblock() conversion to huge */
        !           526: #endif
        !           527:        hupflag = 0,    /* hangup signal has been caught */
        !           528:        ichanged,       /* ibuf has been changed */
        !           529:        iflg    = 0,    /* file.int and exit on interrupt */
        !           530:        immflg  = 0,    /* immediate flag -- q and e */
        !           531:        io_w    = 0,    /* writing in progress */
        !           532:        listf   = 0,    /* list control chars explicitly */
        !           533:        noshell = 0,    /* true if no ! command allowed */
        !           534:        over    = 0,    /* override permissions on write if possible */
        !           535:        pflag,          /* print line after doing command */
        !           536:        pipef   = 0,    /* for talking to pipes */
        !           537:        prompt1 = 1,    /* flag--enable or disable line-num prompts */
        !           538:        prompt2 = 1,    /* flag--enable or disable ALL prompting */
        !           539:        reading = 0,    /* waiting on tty read */
        !           540:        seekf   = 0,    /* no seek to EOF on error on fd 0 */
        !           541:        termflg = 0;    /* if termination signal (15) occurred */
        !           542: 
        !           543: linep  *addr1,         /* lower line bound */
        !           544:        *addr2,         /* upper line bound */
        !           545:        *dol,           /* last line in file */
        !           546:        *dot,           /* "current" line */
        !           547:        *dotdot,        /* last different "dot" */
        !           548:        *endcore,       /* current end of memory */
        !           549:        *fendcore,      /* start of dynamic area */
        !           550:        *lastdot,       /* last "dot" */
        !           551:        names['z' - 'a' + 1],   /* "k" command markers */
        !           552: #ifdef EXTMARK
        !           553:        names2['z' - 'a' + 1],  /* "k" command markers */
        !           554: #endif
        !           555:        *old_a1,        /* previous address bounds */
        !           556:        *old_a2,
        !           557:        tline,          /* pointer to next available pos in tmpfile */
        !           558:        *zero;          /* anchor line for all other lines */
        !           559: 
        !           560: /*
        !           561:  * magic constants used in many places
        !           562:  */
        !           563: 
        !           564: #ifdef pdp11
        !           565: # define _1a    ~0377
        !           566: # define _2a     0400
        !           567: # define _3a     0377
        !           568: # define _4a     0774
        !           569: # define _5a      255
        !           570: # define _6a   077776
        !           571: # define _1b    ~0177
        !           572: # define _2b     0200
        !           573: # define _3b     0777
        !           574: # define _4b     0774
        !           575: # define _5b      511
        !           576: # define _6b   077777
        !           577: #endif
        !           578: 
        !           579: #ifdef vax
        !           580: # define _1a       ~0377
        !           581: # define _2a        0400
        !           582: # define _3a   077777777
        !           583: # define _4a        0774
        !           584: # define _5a       65535
        !           585: # define _6a   077777776
        !           586: #endif
        !           587: 
        !           588: #ifdef HUGE
        !           589: int    _1[]    = { _1a, _1b }, /* tl &= _1; getline() */
        !           590:        _2[]    = { _2a, _2b }, /* tl += _2; getline()... */
        !           591:        _3[]    = { _3a, _3b }, /* bno = ... & _3; getblock() */
        !           592:        _4[]    = { _4a, _4b }, /* off = ... & _4; getblock() */
        !           593:        _5[]    = { _5a, _5b }, /* if (bno >= _5)... getblock() */
        !           594:        _6[]    = { _6a, _6b }; /* tline += ... & _6; */
        !           595: #else
        !           596: # define _1    _1a
        !           597: # define _2    _2a
        !           598: # define _3    _3a
        !           599: # define _4    _4a
        !           600: # define _5    _5a
        !           601: # define _6    _6a
        !           602: #endif
        !           603: 
        !           604: /*
        !           605:  * error messages
        !           606:  *
        !           607:  *     (there are more than these)
        !           608:  */
        !           609: 
        !           610: char   *errtext[] = {
        !           611:        /*  0 */        "syntax is k[a-z]",
        !           612:        /*  1 */        "illegal command format",
        !           613:        /*  2 */        "no command",
        !           614:        /*  3 */        "no tab character",
        !           615:        /*  4 */        "can't change filename",
        !           616:        /*  5 */        "file name syntax",
        !           617:        /*  6 */        "recursive \"@\" command",
        !           618:        /*  7 */        "null file name illegal",
        !           619:        /*  8 */        "unrecognized command",
        !           620:        /*  9 */        "no tabs set",
        !           621:        /* 10 */        "global command not allowed with huge file",
        !           622:        /* 11 */        "file name too long",
        !           623:        /* 12 */        "expanded line too long",
        !           624:        /* 13 */        "no such line",
        !           625:        /* 14 */        "can't fork",
        !           626:        /* 15 */        "can't write to process",
        !           627:        /* 16 */        "no lines",
        !           628:        /* 17 */        "backup(FILE) error (?)",
        !           629:        /* 18 */        "string not found",
        !           630:        /* 19 */        "  '  must be followed by [a-z]",
        !           631:        /* 20 */        "address syntax error",
        !           632:        /* 21 */        "lower address bound > upper one",
        !           633:        /* 22 */        "address illegal here",
        !           634:        /* 23 */        "non-existent line number",
        !           635:        /* 24 */        "bottom of file reached",
        !           636:        /* 25 */        "command syntax error",
        !           637:        /* 26 */        "\"advance\" error (?)",
        !           638:        /* 27 */        "null string illegal",
        !           639:        /* 28 */        "destination not found",
        !           640:        /* 29 */        "INTERRUPT!",
        !           641:        /* 30 */        "line too long",
        !           642:        /* 31 */        "missing destination address",
        !           643:        /* 32 */        "I/O error--file not saved!",
        !           644:        /* 33 */        "file overflows available memory",
        !           645:        /* 34 */        "file too large (TMPERR)",
        !           646:        /* 35 */        "I/O error on temp file (TMPERR)",
        !           647:        /* 36 */        "open error on temp file (TMPERR)",
        !           648:        /* 37 */        "recursive global command",
        !           649:        /* 38 */        "global command list too long",
        !           650:        /* 39 */        "substitute pattern not found",
        !           651:        /* 40 */        "missing substring",
        !           652:        /* 41 */        "string2 too long",
        !           653:        /* 42 */        "substring too long",
        !           654:        /* 43 */        "substituted string too long",
        !           655:        /* 44 */        "too many  \\(",
        !           656:        /* 45 */        "unbalanced  \\(  \\)",
        !           657:        /* 46 */        "\\n  illegal",
        !           658:        /* 47 */        "unimplemented feature",
        !           659:        /* 48 */        "[nothing written]",
        !           660:        /* 49 */        "pattern too complicated",
        !           661:        /* 50 */        "can't create temp file (TMPERR)",
        !           662:        /* 51 */        "bad directory",
        !           663:        /* 52 */        "no ! allowed",
        !           664:        /* 53 */        "can't read ",
        !           665:        /* 54 */        "can't create ",
        !           666:        /* 55 */        "%u line%s\n",
        !           667:        /* 56 */        "[file saved]",
        !           668:        /* 57 */        "\nHangup!\n",
        !           669:        /* 58 */        "\nTerminated...\n",
        !           670:        /* 59 */        "EOF illegal here",
        !           671:        /* 60 */        "can't join to line 0",
        !           672:        /* 61 */        "! not allowed with global command",
        !           673:        /* 62 */        "no filename specified",
        !           674:        /* 63 */        "not enough  \\( \\)  pairs",
        !           675:        /* 64 */        "can't create pipe file (PIPERR)",
        !           676:        /* 65 */        "open error on pipe file (PIPERR)",
        !           677:        /* 66 */        "can't checkpoint",
        !           678:        /* 67 */        "can't recover",
        !           679: };
        !           680: #define NERR   (sizeof errtext / sizeof errtext[0])
        !           681: 
        !           682: /*
        !           683:  * ! error strings
        !           684:  */
        !           685: 
        !           686: char *status[] = {
        !           687:        /*  0 */        0,
        !           688:        /*  1 */        "hangup",
        !           689:        /*  2 */        "interrupt",
        !           690:        /*  3 */        "quit",
        !           691:        /*  4 */        "illegal instruction",
        !           692:        /*  5 */        "bpt",
        !           693:        /*  6 */        "iot",
        !           694:        /*  7 */        "emt",
        !           695:        /*  8 */        "fpp",
        !           696:        /*  9 */        "killed",
        !           697:        /* 10 */        "bus error",
        !           698:        /* 11 */        "memory fault",
        !           699:        /* 12 */        "bad sys call",
        !           700:        /* 13 */        "broken pipe",
        !           701:        /* 14 */        "alarm",
        !           702:        /* 15 */        "terminated",
        !           703: #ifdef pdp11
        !           704:        /* 16 */        "time limit",
        !           705: #else
        !           706:        /* 16 */        0,
        !           707:        /* 17 */        "stopped",
        !           708:        /* 18 */        "terminal stop",
        !           709:        /* 19 */        "continue",
        !           710:        /* 20 */        "child status changed",
        !           711:        /* 21 */        "terminal input",
        !           712:        /* 22 */        "terminal output",
        !           713:        /* 23 */        "terminal input ready",
        !           714:        /* 24 */        "cpu timelimit exceeded",
        !           715:        /* 25 */        "filesize limit exceeded",
        !           716: #endif
        !           717: };
        !           718: #define NSTR   (sizeof status / sizeof status[0])
        !           719: 
        !           720: #define putsn(x) (puts2((x)),putchar('\n'))
        !           721: #define min(x,y) ((x)<(y)?(x):(y))
        !           722: #define max(x,y) ((x)>(y)?(x):(y))
        !           723: 
        !           724: /*
        !           725:  * function declarations
        !           726:  */
        !           727: 
        !           728: linep  *findmark();
        !           729: char   *getblock();
        !           730: long   lseek();
        !           731: func   signal();
        !           732: #ifndef CKPT
        !           733: int    badsig(),
        !           734: #else
        !           735: int    checkpoint(),
        !           736: #endif
        !           737:        hangup(),
        !           738:        mail(),
        !           739:        onintr(),
        !           740:        term();
        !           741: 
        !           742: /*
        !           743:  * signals
        !           744:  */
        !           745: 
        !           746: struct sigtab {
        !           747:        int     s_sig,
        !           748:                s_func;
        !           749: } sigtab1[] = {
        !           750: #ifdef CKPT
        !           751:        SIGILL,         checkpoint,
        !           752:        SIGIOT,         checkpoint,
        !           753:        SIGEMT,         checkpoint,
        !           754:        SIGFPE,         checkpoint,
        !           755:        SIGBUS,         checkpoint,
        !           756:        SIGSEGV,        checkpoint,
        !           757:        SIGSYS,         checkpoint,
        !           758: #else
        !           759:        SIGILL,         badsig,
        !           760:        SIGIOT,         badsig,
        !           761:        SIGEMT,         badsig,
        !           762:        SIGFPE,         badsig,
        !           763:        SIGBUS,         badsig,
        !           764:        SIGSEGV,        badsig,
        !           765:        SIGSYS,         badsig,
        !           766: #endif
        !           767:        0,              0,
        !           768: }, sigtab2[] = {
        !           769:        SIGTRC,         mail,
        !           770:        SIGHUP,         hangup,
        !           771:        SIGTRM,         term,
        !           772:        SIGINT,         onintr,
        !           773:        0,              0,
        !           774: };
        !           775: 
        !           776: main(argc, argv)
        !           777: char **argv;
        !           778: {
        !           779: #ifdef CKPT
        !           780:        extern checkpoint();
        !           781: #else
        !           782:        extern badsig();
        !           783: #endif
        !           784:        extern onintr(), hangup(), mail(), term();
        !           785: #ifdef DEBUG
        !           786: #ifdef EXPDMP
        !           787:        extern expdmp();
        !           788: #endif
        !           789: #endif
        !           790:        register n;
        !           791:        register char *p1, *p2, *ep;
        !           792:        func savint;
        !           793: 
        !           794:        signal(SIGQIT, 1);
        !           795:        savint = signal(SIGINT, 1);
        !           796:        ep = *argv;
        !           797: #ifdef XED
        !           798:        p1 = ep;
        !           799:        p2 = p1;
        !           800:        while (*p1)
        !           801:                if (*p1++ == '/' && *p1 && *p1 != '/')
        !           802:                        p2 = p1;
        !           803:        p1 = p2;
        !           804:        *argv = p2;
        !           805:        n = 0;
        !           806:        while (*p1)
        !           807:                if (*p1++ == 'x') {     /* xed .vs. eed */
        !           808:                        ++n;
        !           809:                        break;
        !           810:                }
        !           811:        if (n == 0) {
        !           812:                e_prompt = EEDPROMPT;
        !           813:                ver = EEDTTL;
        !           814:                help = EEDHELP;
        !           815:                dumbf = 1;
        !           816:        }
        !           817: #ifdef LOG
        !           818:        logstats.l_xed = n;
        !           819: #endif
        !           820: #endif
        !           821:        prompt2 = istty(0);
        !           822: #ifdef V7
        !           823:        if (getenv("_OVERWRITE_"))
        !           824:                ++over;
        !           825: #endif
        !           826:        while (--argc)
        !           827:                if (**++argv == '-') {
        !           828:                        while (*++*argv) {
        !           829:                                switch (**argv) {
        !           830:                                case '!':  /* no ! allowed */
        !           831:                                        noshell = 1;
        !           832:                                        break;
        !           833: #ifdef APLMAP
        !           834:                                case 'A':  /* apl char mapping */
        !           835:                                        aplmap = 1;
        !           836:                                        errtext[29] = "G interrupt G";
        !           837:                                        p1 = ver;
        !           838:                                        while (*p1) {
        !           839:                                                if ('A' <= *p1 && *p1 <= 'Z')
        !           840:                                                        *p1 |= 040;
        !           841:                                                ++p1;
        !           842:                                        }
        !           843: #endif
        !           844:                                case 'a':  /* apl mode */
        !           845:                                        aflg = 1;
        !           846:                                        fmtlno = "[ %u ]\t";
        !           847: #ifdef DUMB
        !           848:                                        dumbf = 1;
        !           849: #endif
        !           850: #ifdef XED
        !           851: #ifdef TTL_NL
        !           852:                                        ver[TTL_NL] = 0;
        !           853: #endif
        !           854: #endif
        !           855:                                        break;
        !           856:                                case 'b':  /* file.bak on entry */
        !           857:                                        bflg = 1;
        !           858:                                        bflg2 = 1;
        !           859:                                        break;
        !           860: #ifdef PAGE
        !           861:                                case 'c':  /* crt depth in lines */
        !           862:                                        ++*argv;
        !           863:                                        n = argnum(argv);
        !           864:                                        if (n >= 0)
        !           865:                                                pcount = n;
        !           866:                                        break;
        !           867: #endif
        !           868:                                case 'd':  /* don't delete .edt file */
        !           869:                                        deltflg = 1;
        !           870:                                        break;
        !           871:                                case 'e':  /* echo input commands */
        !           872:                                        eflg = 1;
        !           873:                                        break;
        !           874:                                case 'f':  /* create mode */
        !           875:                                        fflg = 1;
        !           876:                                        break;
        !           877: #ifdef HUGE
        !           878:                                case 'h':  /* edit "huge" file */
        !           879:                                        hugef = 1;
        !           880:                                        break;
        !           881: #endif
        !           882:                                case 'i':  /* file.int on interrupt */
        !           883:                                        iflg = 1;
        !           884:                                        break;
        !           885:                                case 'k':  /* kill verbose messages */
        !           886:                                        curt = 1;
        !           887:                                        break;
        !           888: #ifdef EOL
        !           889:                                case 'l':  /* set eol char to "x" */
        !           890:                                        if (*++*argv)
        !           891:                                                eol = **argv;
        !           892:                                        else
        !           893:                                                --*argv;
        !           894:                                        break;
        !           895: #endif
        !           896:                                case 'm':  /* mod cnt for autosave */
        !           897:                                        ++*argv;
        !           898:                                        n = argnum(argv);
        !           899:                                        if (n >= 0)
        !           900:                                                modcount = n;
        !           901:                                        break;
        !           902:                                case 'n':  /* no line num */
        !           903:                                        prompt1 = 0;
        !           904:                                        break;
        !           905:                                case 'o':  /* no seek to EOF on error */
        !           906:                                        seekf = 1;
        !           907:                                        break;
        !           908:                                case 'p':  /* force prompts for pipe */
        !           909:                                        pipef = 1;
        !           910:                                        prompt2 = 1;
        !           911:                                        break;
        !           912:                                case 'q':  /* don't inhibit quits */
        !           913:                                        signal(SIGQIT, 0);
        !           914:                                        break;
        !           915: #ifdef DUMB
        !           916:                                case 'r':  /* spcl char meaning */
        !           917:                                        dumbf ^= 01;
        !           918:                                        break;
        !           919: #endif
        !           920:                                case 's':  /* silent mode */
        !           921:                                        prompt2 = 0;
        !           922:                                        break;
        !           923: #ifdef TABS
        !           924:                                case 't':  /* tab char */
        !           925:                                        if (*++*argv)
        !           926:                                                tabc = **argv;
        !           927:                                        else
        !           928:                                                --*argv;
        !           929:                                        break;
        !           930: #endif
        !           931: #ifdef TABS
        !           932:                                case 'v':  /* tab fill char */
        !           933:                                        if (*++*argv)
        !           934:                                                tabfill = **argv;
        !           935:                                        else
        !           936:                                                --*argv;
        !           937:                                        break;
        !           938: #endif
        !           939: #ifdef PAGE
        !           940:                                case 'w':  /* crt width */
        !           941:                                        ++*argv;
        !           942:                                        n = argnum(argv);
        !           943:                                        if (--n >= 2)
        !           944:                                                ccount = n;
        !           945:                                        break;
        !           946: #endif
        !           947: #ifdef YINT
        !           948:                                case 'y':  /* page on interrupt */
        !           949:                                        yflg = 1;
        !           950:                                        break;
        !           951: #endif
        !           952: #ifdef USE
        !           953:                                case '@':  /* set "@" filename */
        !           954:                                        p2 = altfile;
        !           955:                                        p1 = ++*argv;
        !           956:                                        while (*p1 && p2 < &altfile[FNSIZE - 2])
        !           957:                                                *p2++ = *p1++;
        !           958:                                        if (*p1) {
        !           959:                                                p2 = altfile;
        !           960:                                                putsn(errtext[11]);
        !           961:                                        }
        !           962:                                        *p2 = '\0';
        !           963:                                        *argv = &p1[-1];
        !           964:                                        break;
        !           965: #endif
        !           966: #ifdef ALLOC
        !           967:                                case 'B':  /* line buffer size */
        !           968:                                        ++*argv;
        !           969:                                        n = argnum(argv);
        !           970:                                        if (n >= LBSIZE)
        !           971:                                                lbsize = n;
        !           972:                                        break;
        !           973: #endif
        !           974: #ifdef DEBUG
        !           975:                                case 'D':  /* trace mode -- debug */
        !           976:                                        tflg = 1;
        !           977:                                        break;
        !           978: #ifdef EXPDMP
        !           979:                                case 'Q':  /* show pattern on quit */
        !           980:                                        signal(SIGQIT, expdmp);
        !           981:                                        break;
        !           982: #endif
        !           983: #endif
        !           984: #ifdef XED
        !           985:                                case 'I':  /* suppress ID message */
        !           986:                                        ver = 0;
        !           987:                                        break;
        !           988:                                case 'P':  /* prompt */
        !           989:                                        p1 = *argv;
        !           990:                                        e_prompt = ++p1;
        !           991:                                        while (*p1++);
        !           992:                                        *argv = &p1[-2];
        !           993:                                        break;
        !           994:                                case 'L':  /* line number prompt */
        !           995:                                        p1 = *argv;
        !           996:                                        fmtlno = ++p1;
        !           997:                                        while (*p1++);
        !           998:                                        *argv = &p1[-2];
        !           999:                                        break;
        !          1000:                                case 'C':  /* screen-clear */
        !          1001:                                        p1 = *argv;
        !          1002:                                        clears = ++p1;
        !          1003:                                        while (*p1++);
        !          1004:                                        *argv = &p1[-2];
        !          1005:                                        break;
        !          1006: #ifdef CKPT
        !          1007:                                case 'R':  /* recover */
        !          1008:                                        ++*argv;
        !          1009:                                        if ((recovry = argnum(argv)) == 0)
        !          1010:                                                recovry = 1;
        !          1011:                                        break;
        !          1012: #endif
        !          1013:                                case 'O':  /* over-ride write perm */
        !          1014:                                        over ^= 01;
        !          1015:                                        break;
        !          1016:                                case 'T':  /* temp filename */
        !          1017:                                        p1 = *argv;
        !          1018:                                        tfname = ++p1;
        !          1019: #ifdef PIPE
        !          1020:                                        while (*p1)
        !          1021:                                                if (*p1++ == ':') {
        !          1022:                                                        p1[-1] = '\0';
        !          1023:                                                        pfname = p1;
        !          1024: #ifdef CKPT
        !          1025:                                                        break;
        !          1026: #endif
        !          1027:                                                }
        !          1028: #endif
        !          1029: #ifdef CKPT
        !          1030:                                        while (*p1)
        !          1031:                                                if (*p1++ == ':') {
        !          1032:                                                        p1[-1] = '\0';
        !          1033:                                                        cfname = p1;
        !          1034:                                                }
        !          1035: #endif
        !          1036:                                        *argv = &p1[-1];
        !          1037:                                        break;
        !          1038: #endif
        !          1039:                                default:  /* tabs stops/illegals */
        !          1040:                                        if (!**argv || **argv == '-'
        !          1041: #ifdef TABS
        !          1042:                                                    || **argv == ','
        !          1043: #endif
        !          1044:                                                                    )
        !          1045:                                                break;
        !          1046: #ifdef TABS
        !          1047:                                        if (**argv < '0' ||
        !          1048:                                            **argv > '9') {
        !          1049: #endif
        !          1050:                                                printf("bad flag: -%c\n",
        !          1051:                                                    **argv);
        !          1052:                                                exit(1);
        !          1053: #ifdef TABS
        !          1054:                                        }
        !          1055:                                        n = argnum(argv);
        !          1056:                                        settab(n);
        !          1057: #endif
        !          1058:                                }
        !          1059:                        }
        !          1060:                } else {
        !          1061:                        p1 = *argv;
        !          1062:                        p2 = savedfile;
        !          1063:                        while (*p2++ = *p1++)
        !          1064:                                if (p2 >= &savedfile[FNSIZE - 2]) {
        !          1065:                                        putsn(errtext[11]);
        !          1066:                                        exit(1);
        !          1067:                                }
        !          1068:                        globf2 = 1;
        !          1069:                        if (fflg)
        !          1070:                                globp = "a\n";
        !          1071:                        else
        !          1072:                                globp = "r\n";
        !          1073:                }
        !          1074: 
        !          1075: 
        !          1076: #ifdef YINT
        !          1077:        if (iflg)
        !          1078:                yflg = 0;
        !          1079: #endif
        !          1080: #ifdef ALLOC
        !          1081:        linebuf = sbrk(lbsize);
        !          1082:        genbuf = sbrk(lbsize);
        !          1083: #endif
        !          1084:        fendcore = sbrk(0);
        !          1085: #ifdef CKPT
        !          1086:        if ((n = recovry) == 0)
        !          1087: #endif
        !          1088:                n = getpid();
        !          1089: #ifdef PIPE
        !          1090:        tmpname(pfname, n);
        !          1091: #endif
        !          1092: #ifdef CKPT
        !          1093:        tmpname(cfname, n);
        !          1094: #endif
        !          1095:        tmpname(tfname, n);     /* MUST be last call to tmpname */
        !          1096: #ifdef LOG
        !          1097:        logstats.l_uid = getuid();
        !          1098:        time(&logstats.lt_start);
        !          1099:        if (prompt2)
        !          1100:                ++logstats.l_inter;
        !          1101:        if (aflg)
        !          1102:                logstats.l_xed = 2;     /* magic num for apled */
        !          1103: #endif
        !          1104: #ifdef CKPT
        !          1105:        if (recovry)
        !          1106:                recover();
        !          1107: #endif
        !          1108:        editor = ep;
        !          1109:        if (prompt2) {
        !          1110: #ifdef CMDS
        !          1111:                if ((cmd = open(cmdfil, 1)) > 0)
        !          1112:                        lseek(cmd, 0L, 2);
        !          1113:                else
        !          1114:                        cmd = 0;
        !          1115: #endif
        !          1116:                if (ver)
        !          1117:                        putsn(ver);     /* XED V0.00 ... */
        !          1118:                flush_buf();
        !          1119:        } else
        !          1120:                modcount = 0;
        !          1121: #ifdef CMDS
        !          1122:        if (cmd && *savedfile) {
        !          1123:                write(cmd, "e,", 2);
        !          1124:                p1 = savedfile;
        !          1125:                while (*p1++);
        !          1126:                write(cmd, savedfile, --p1 - savedfile);
        !          1127:                write(cmd, "\n", 1);
        !          1128:        }
        !          1129: #endif
        !          1130:        signals(sigtab1);
        !          1131:        setexit();
        !          1132:        if (((int)savint & 01) == 0)
        !          1133:                signals(sigtab2);
        !          1134: #ifdef YINT
        !          1135:        else
        !          1136:                yflg = 0;
        !          1137: #endif
        !          1138: #ifdef CKPT
        !          1139:        if (!recovry)
        !          1140: #endif
        !          1141:                init();
        !          1142:        setexit();
        !          1143: cant:  do {
        !          1144:                commands(0);
        !          1145:        } while (are_you_sure());
        !          1146:        if (immflg == 0) {
        !          1147:                if (fflg)
        !          1148:                        if (backup(FILE))
        !          1149:                                text_modified = 0;
        !          1150:                        else
        !          1151:                                goto cant;
        !          1152:                if (text_modified == 0)
        !          1153:                        backup(-TMP);
        !          1154:                else if (modcount && eof)
        !          1155:                        if (backup(TMP) && prompt2)
        !          1156:                                if (!curt)
        !          1157:                                        putsn(errtext[56]);
        !          1158:        }
        !          1159:        delexit(0);
        !          1160: }
        !          1161: 
        !          1162: abort() {
        !          1163:        register char *p;
        !          1164:        register charac c;
        !          1165: 
        !          1166:        setnoaddr();
        !          1167:        peekc = 0;
        !          1168:        p = "ort\n";
        !          1169:        while (*p)
        !          1170:                if ((c = getchar()) != *p++) {
        !          1171:                        peekc = c;
        !          1172:                        errmsg(25);
        !          1173:                }
        !          1174: #ifdef LOG
        !          1175:        ++logstats.lc_abort;
        !          1176: #endif
        !          1177:        delexit(1);
        !          1178: }
        !          1179: 
        !          1180: linep *
        !          1181: address() {
        !          1182:        register minus;
        !          1183:        register charac c;
        !          1184:        register linep *a1, *start;
        !          1185:        register n, relerr;
        !          1186: 
        !          1187:        minus = 0;
        !          1188:        a1 = 0;
        !          1189:        for ever {
        !          1190:                c = getchar();
        !          1191:                if ('0' <= c && c <= '9') {
        !          1192:                        peekc = c;
        !          1193:                        n = getnum();
        !          1194:                        if (a1 == 0) {
        !          1195:                                a1 = zero;
        !          1196:                                n += aflg;
        !          1197: #ifdef LOG
        !          1198:                                if (!globp)
        !          1199:                                        ++logstats.la_num;
        !          1200: #endif
        !          1201:                        }
        !          1202:                        if (minus < 0)
        !          1203:                                n = -n;
        !          1204:                        a1 += n;
        !          1205:                        minus = 0;
        !          1206:                        continue;
        !          1207:                }
        !          1208:                relerr = 0;
        !          1209:                if (a1 || minus)
        !          1210:                        relerr++;
        !          1211:                switch (c) {
        !          1212:                case ' ':
        !          1213:                case '\t':
        !          1214:                        continue;
        !          1215: 
        !          1216:                case '+':
        !          1217:                        minus += brcount;
        !          1218:                        if (a1 == 0)
        !          1219:                                a1 = dot;
        !          1220: #ifdef LOG
        !          1221:                        if (!globp)
        !          1222:                                ++logstats.la_plus;
        !          1223: #endif
        !          1224:                        continue;
        !          1225: 
        !          1226:                case '-':
        !          1227:                case '^':       /* for upwards compatibility */
        !          1228:                        minus -= brcount;
        !          1229:                        if (a1 == 0)
        !          1230:                                a1 = dot;
        !          1231: #ifdef LOG
        !          1232:                        if (!globp)
        !          1233:                                if (c == '^')
        !          1234:                                        ++logstats.la_caret;
        !          1235:                                else
        !          1236:                                        ++logstats.la_minus;
        !          1237: #endif
        !          1238:                        continue;
        !          1239: 
        !          1240:             /* search: */
        !          1241:                case '?':
        !          1242:                        minus++;
        !          1243:                case '/':
        !          1244:                        compile(c);
        !          1245:                        if (a1 == 0)
        !          1246:                                a1 = dot;
        !          1247:                        if (a1 < zero)
        !          1248:                                a1 = zero;
        !          1249:                        if (a1 > dol)
        !          1250:                                a1 = dol;
        !          1251:                        start = a1;
        !          1252: #ifdef LOG
        !          1253:                        if (!globp)
        !          1254:                                if (minus)
        !          1255:                                        ++logstats.la_query;
        !          1256:                                else
        !          1257:                                        ++logstats.la_slash;
        !          1258: #endif
        !          1259:                        for ever {
        !          1260:                                if (minus == 0) {
        !          1261:                                        if (++a1 > dol)
        !          1262:                                                a1 = zero;
        !          1263:                                } else {
        !          1264:                                        if (--a1 < zero)
        !          1265:                                                a1 = dol;
        !          1266:                                }
        !          1267:                                if (execute(0, a1)) {
        !          1268:                                        minus = 0;
        !          1269:                                        relerr = 0;
        !          1270:                                        break;
        !          1271:                                }
        !          1272:                                if (a1 == start)
        !          1273:                                        errmsg(18);
        !          1274:                        }
        !          1275:                        break;
        !          1276: 
        !          1277:                case '$':
        !          1278:                        a1 = dol;
        !          1279: #ifdef LOG
        !          1280:                        if (!globp)
        !          1281:                                ++logstats.la_dol;
        !          1282: #endif
        !          1283:                        break;
        !          1284: 
        !          1285:                case '.':
        !          1286:                        if ((peekc = getchar()) == '.') {
        !          1287:                                peekc = 0;
        !          1288:                                a1 = dotdot;
        !          1289: #ifdef LOG
        !          1290:                                if (!globp)
        !          1291:                                        ++logstats.la_dotdot;
        !          1292: #endif
        !          1293:                        } else {
        !          1294:                                a1 = dot;
        !          1295: #ifdef LOG
        !          1296:                                if (!globp)
        !          1297:                                        ++logstats.la_dot;
        !          1298: #endif
        !          1299:                        }
        !          1300:                        break;
        !          1301: 
        !          1302:                case '\'':
        !          1303:                        if (((c = getchar()) | 040) < 'a' ||
        !          1304:                            (c | 040) > 'z') {
        !          1305:                                peekc = c;
        !          1306:                                errmsg(19);
        !          1307:                        }
        !          1308:                        c |= 040;
        !          1309: #ifdef LOG
        !          1310:                        if (!globp)
        !          1311:                                ++logstats.la_quote;
        !          1312: #endif
        !          1313:                casemark:
        !          1314: #ifdef EXTMARK
        !          1315:                        n = 3;
        !          1316:                        if ((peekc = getchar()) == '^') {
        !          1317:                                n = 1;
        !          1318:                                peekc = 0;
        !          1319:                        } else if (peekc == '$') {
        !          1320:                                n = 2;
        !          1321:                                if (names2[c - 'a'] == 0)
        !          1322:                                        n = 1;
        !          1323:                                peekc = 0;
        !          1324:                        }
        !          1325:                        if (n & 01)
        !          1326:                                if ((a1=findmark(names[c-'a'],0))==0) {
        !          1327:                                        a1 = dol;
        !          1328:                                        n = 0;
        !          1329:                                }
        !          1330:                        if (n > 1 && names2[c - 'a']) {
        !          1331:                                if (n == 3) {
        !          1332:                                        if (addr1 || addr2)
        !          1333:                                                errmsg(20);
        !          1334:                                        addr1 = a1;
        !          1335:                                }
        !          1336:                                a1 = findmark(names2[c - 'a'], dol);
        !          1337:                                if (n == 2)
        !          1338:                                        break;
        !          1339:                                addr2 = a1;
        !          1340:                                return(0);
        !          1341:                        }
        !          1342: #else
        !          1343:                        a1 = findmark(names[c - 'a'], dol);
        !          1344: #endif
        !          1345:                        break;
        !          1346: 
        !          1347:                case '=':
        !          1348: #ifdef LOG
        !          1349:                        if (!globp)
        !          1350:                                ++logstats.la_equal;
        !          1351: #endif
        !          1352:                        if ((peekc = getchar()) == '^')
        !          1353:                                a1 = old_a1;
        !          1354:                        else if (peekc == '$')
        !          1355:                                a1 = old_a2;
        !          1356:                        else {
        !          1357:                                if (addr1 || addr2 || a1)
        !          1358:                                        errmsg(20);
        !          1359:                                addr1 = old_a1;
        !          1360:                                addr2 = old_a2;
        !          1361:                                return(0);
        !          1362:                        }
        !          1363:                        peekc = 0;
        !          1364:                        break;
        !          1365: 
        !          1366:                default:
        !          1367:                        if ('A' <= c && c <= 'Z') {
        !          1368:                                c |= 040;
        !          1369: #ifdef LOG
        !          1370:                                if (!globp)
        !          1371:                                        ++logstats.la_letter;
        !          1372: #endif
        !          1373:                                goto casemark;
        !          1374:                        }
        !          1375:                        peekc = c;
        !          1376:                        if (a1 == 0)
        !          1377:                                if (c == ',' || c == ';')
        !          1378:                                        if (dot + 1 > dol)
        !          1379:                                                return(dol);
        !          1380:                                        else
        !          1381:                                                return(dot + 1);
        !          1382:                                else
        !          1383:                                        return(0);
        !          1384:                        a1 += minus;
        !          1385:                        if (a1 < zero)
        !          1386:                                a1 = zero + (zero != dol);
        !          1387:                        else if (a1 > dol)
        !          1388:                                a1 = dol;
        !          1389:                        return(a1);
        !          1390:                }
        !          1391:                if (relerr)
        !          1392:                        errmsg(20);
        !          1393:        }
        !          1394: }
        !          1395: 
        !          1396: advance(alp, aep) {
        !          1397:        register char *lp, *ep, *curlp;
        !          1398:        register s_sav, i;
        !          1399: 
        !          1400:        lp = alp;
        !          1401:        ep = aep;
        !          1402:        for ever switch (*ep++) {
        !          1403: 
        !          1404:        case CCHR:
        !          1405:                if (*ep++ == *lp++)
        !          1406:                        continue;
        !          1407:                return(0);
        !          1408: 
        !          1409:        case CDOT:
        !          1410:                if (*lp++)
        !          1411:                        continue;
        !          1412:                return(0);
        !          1413: 
        !          1414:        case CDOL:
        !          1415:                if (*lp == 0)
        !          1416:                        continue;
        !          1417:                return(0);
        !          1418: 
        !          1419:        case CEOF:
        !          1420:                loc2 = lp;
        !          1421:                if (--s_tmp > 0)
        !          1422:                        return(0);
        !          1423:                return(1);
        !          1424: 
        !          1425:        case CCL:
        !          1426:        case NCCL:
        !          1427:                if (cclass(ep, *lp++, ep[-1] == CCL)) {
        !          1428:                        ep += *ep;
        !          1429:                        continue;
        !          1430:                }
        !          1431:                return(0);
        !          1432: 
        !          1433:        case CBRA:
        !          1434:                braslist[*ep++] = lp;
        !          1435:                continue;
        !          1436: 
        !          1437:        case CKET:
        !          1438:                braelist[*ep++] = lp;
        !          1439:                continue;
        !          1440: 
        !          1441:        case CBACK:
        !          1442:                if (braelist[i = *ep++] == 0)
        !          1443:                        errmsg(63);
        !          1444:                if (backref(i, lp)) {
        !          1445:                        lp += braelist[i] - braslist[i];
        !          1446:                        continue;
        !          1447:                }
        !          1448:                return(0);
        !          1449: 
        !          1450:        case CBACK | STAR:
        !          1451:                if (braelist[i = *ep++] == 0)
        !          1452:                        errmsg(63);
        !          1453:                curlp = lp;
        !          1454:                while (backref(i, lp))
        !          1455:                        lp += braelist[i] - braslist[i];
        !          1456:                while (lp >= curlp) {
        !          1457:                        if (advance(lp, ep))
        !          1458:                                return(1);
        !          1459:                        lp -= braelist[i] - braslist[i];
        !          1460:                }
        !          1461:                continue;
        !          1462: 
        !          1463:        case CDOT | STAR:
        !          1464:                curlp = lp;
        !          1465:                while (*lp++);
        !          1466:                goto star;
        !          1467: 
        !          1468:        case CCHR | STAR:
        !          1469:                curlp = lp;
        !          1470:                while (*lp++ == *ep);
        !          1471:                ep++;
        !          1472:                goto star;
        !          1473: 
        !          1474:        case CCL | STAR:
        !          1475:        case NCCL | STAR:
        !          1476:                curlp = lp;
        !          1477:                while (cclass(ep, *lp++, ep[-1] == (CCL | STAR)));
        !          1478:                ep += *ep;
        !          1479:                /* goto star; */
        !          1480: 
        !          1481:        star:
        !          1482:                s_sav = s_tmp;
        !          1483:                do {
        !          1484:                        if (--lp == locs)
        !          1485:                                break;
        !          1486:                        if (advance(lp, ep))
        !          1487:                                return(1);
        !          1488:                        s_tmp = s_sav;
        !          1489:                } while (lp > curlp);
        !          1490:                --s_tmp;
        !          1491:                return(0);
        !          1492: 
        !          1493:        default:
        !          1494:                errmsg(-26);
        !          1495:        }
        !          1496: }
        !          1497: 
        !          1498: linep *
        !          1499: append(f, a, single, bkpf)
        !          1500: func f;
        !          1501: linep *a;
        !          1502: {
        !          1503:        register linep *a1, *a2, *rdot;
        !          1504:        register nline, tl;
        !          1505: 
        !          1506:        nline = 0;
        !          1507:        dot = a;
        !          1508:        while ((*f)(single) == 0) {
        !          1509:                if (dol >= endcore) {
        !          1510:                        if (sbrk(1024) == -1)
        !          1511:                                errmsg(33);
        !          1512:                        endcore = (int)endcore + 1024;
        !          1513:                }
        !          1514:                tl = putline();
        !          1515:                nline++;
        !          1516:                a1 = ++dol;
        !          1517:                a2 = a1 + 1;
        !          1518:                rdot = ++dot;
        !          1519:                while (a1 > rdot)
        !          1520:                        *--a2 = *--a1;
        !          1521:                *rdot = tl;
        !          1522:                if (bkpf) {
        !          1523:                        mods++;
        !          1524:                        backchk();
        !          1525:                }
        !          1526:                if (single)
        !          1527:                        break;
        !          1528:        }
        !          1529:        return(nline);
        !          1530: }
        !          1531: 
        !          1532: are_you_sure() {
        !          1533: #ifdef USE
        !          1534:        if (alt)
        !          1535:                return(1);
        !          1536: #endif
        !          1537:        if (!text_modified || fflg || immflg || zero == dol)
        !          1538:                return(0);
        !          1539:        return(yes_no(curt? "?forget" :
        !          1540:            "did you forget to save your text", 1, 1, 0));
        !          1541: }
        !          1542: 
        !          1543: argnum(ap)
        !          1544: char **ap;
        !          1545: {
        !          1546:        register n;
        !          1547:        register char *p;
        !          1548: 
        !          1549:        p = *ap;
        !          1550:        n = 0;
        !          1551:        while ('0' <= *p && *p <= '9')
        !          1552:                n = n * 10 + *p++ - '0';
        !          1553:        *ap = --p;
        !          1554:        return(n);
        !          1555: }
        !          1556: 
        !          1557: backchk() {
        !          1558:        if (modcount == 0)
        !          1559:                return;
        !          1560:        if (mods >= modcount) {
        !          1561:                mods = 0;
        !          1562: #ifdef EOL
        !          1563:                if (backup(TMP) && prompt2 && prompt3)
        !          1564: #endif
        !          1565: #ifndef EOL
        !          1566:                if (backup(TMP) && prompt2)
        !          1567: #endif
        !          1568:                        if (!curt)
        !          1569:                                putsn(errtext[56]);
        !          1570:        }
        !          1571: }
        !          1572: 
        !          1573: backref(an, alp)
        !          1574: char *alp;
        !          1575: {
        !          1576:        register n;
        !          1577:        register char *bp, *lp;
        !          1578: 
        !          1579:        n = an;
        !          1580:        bp = braslist[n];
        !          1581:        lp = alp;
        !          1582:        while (*bp++ == *lp++)
        !          1583:                if (bp >= braelist[n])
        !          1584:                        return(1);
        !          1585:        return(0);
        !          1586: }
        !          1587: 
        !          1588: backup(af) {
        !          1589:        register char *p1, *p2, *t2;
        !          1590:        register linep *a1, *a2;
        !          1591:        register func savint, savhup;
        !          1592: 
        !          1593:        if (io) {
        !          1594:                putsn("******** backup: I/O in progress");
        !          1595:                return(0);
        !          1596:        }
        !          1597:        flush_buf();
        !          1598:        p1 = savedfile;
        !          1599:        t2 = p2 = file;
        !          1600:        while (*p2 = *p1++)
        !          1601:                if (*p2++ == '/')
        !          1602:                        t2 = p2;
        !          1603:        if (p2 > t2 + 10)
        !          1604:                p2 = t2 + 10;
        !          1605:        if (af != FILE && p2 >= &file[FNSIZE - 6])
        !          1606:                errmsg(11);
        !          1607:        switch (af < 0? -af : af) {
        !          1608:                case FILE:      p1 = 0;         break;
        !          1609:                case TMP:       p1 = dotedt;    break;
        !          1610:                case INT:       p1 = dotint;    break;
        !          1611:                case HUP:       p1 = dothup;    break;
        !          1612:                case BAK:       p1 = dotbak;    break;
        !          1613:                case TRM:       p1 = dottrm;    break;
        !          1614:                default:        errmsg(-17);
        !          1615:        }
        !          1616:        if (p1)
        !          1617:                while (*p2++ = *p1++);
        !          1618:        if (af < 0) {
        !          1619:                if (deltflg)
        !          1620:                        return(1);
        !          1621:                return(!unlink(file));
        !          1622:        }
        !          1623:        if (dol == zero && !fflg) {
        !          1624:                if (af == FILE)
        !          1625:                        if (curt)
        !          1626:                                putsn("?48");
        !          1627:                        else
        !          1628:                                putsn(errtext[48]);
        !          1629:                return(1);
        !          1630:        }
        !          1631:        if (dol == zero)
        !          1632:                return(1);
        !          1633:        if (!iflg) {
        !          1634:                savhup = signal(SIGHUP, 1);
        !          1635:                savint = signal(SIGINT, 1);
        !          1636:        }
        !          1637:        if (over && af == FILE)
        !          1638:                override();
        !          1639:        io = create(file, (af == FILE? MODE : LMODE));
        !          1640:        if (overfile) {
        !          1641:                chmod(overfile, overmode);
        !          1642:                overfile = 0;
        !          1643:        }
        !          1644:        if (io < 0) {
        !          1645:                io = 0;
        !          1646:                if (af != TMP) {
        !          1647:                        if (curt)
        !          1648:                                putsn("?54");
        !          1649:                        else {
        !          1650:                                puts2(errtext[54]);
        !          1651:                                putsn(file);
        !          1652:                        }
        !          1653:                }
        !          1654:                if (!iflg) {
        !          1655:                        signal(SIGHUP, savhup);
        !          1656:                        signal(SIGINT, savint);
        !          1657:                }
        !          1658:                return(0);
        !          1659:        }
        !          1660:        io_w++;
        !          1661:        a1 = addr1;
        !          1662:        a2 = addr2;
        !          1663:        addr1 = zero + 1;
        !          1664:        addr2 = dol;
        !          1665:        putfile();
        !          1666:        close(io);
        !          1667:        io = 0;
        !          1668:        io_w = 0;
        !          1669:        addr1 = a1;
        !          1670:        addr2 = a2;
        !          1671:        if (!iflg) {
        !          1672:                signal(SIGHUP, savhup);
        !          1673:                signal(SIGINT, savint);
        !          1674:        }
        !          1675:        return(1);
        !          1676: }
        !          1677: 
        !          1678: #ifndef CKPT
        !          1679: badsig(an) {
        !          1680:        register n;
        !          1681: 
        !          1682:        if (n = backup(TMP))
        !          1683:                putsn(errtext[56]);
        !          1684:        puts("  Fatal Signal: ");
        !          1685:        if (0 < an && an < NSTR && status[an])
        !          1686:                putsn(status[an]);
        !          1687:        else
        !          1688:                printf("%d\n", an);
        !          1689:        flush_buf();
        !          1690:        if (n)
        !          1691:                exit(1);
        !          1692:        error();
        !          1693: }
        !          1694: #endif
        !          1695: 
        !          1696: blkio(b, buf, iofcn)
        !          1697: func iofcn;
        !          1698: {
        !          1699:        lseek(tfile, 512L * b, 0);
        !          1700:        if ((*iofcn)(tfile, buf, BLKSIZE) != BLKSIZE) {
        !          1701:                badf++;
        !          1702:                errmsg(-35);
        !          1703:        }
        !          1704: }
        !          1705: 
        !          1706: cclass(aset, ac, af)
        !          1707: char *aset;
        !          1708: charac ac;
        !          1709: {
        !          1710:        register char *set;
        !          1711:        register n;
        !          1712:        register charac c, m;
        !          1713: 
        !          1714:        set = aset;
        !          1715:        if ((c = ac) == 0)
        !          1716:                return(0);
        !          1717:        n = *set++;
        !          1718:        while (--n)
        !          1719:                if (set[1] == '-' && n > 2) {
        !          1720:                        c = min(set[0], set[2]);
        !          1721:                        m = max(set[0], set[2]);
        !          1722:                        do {
        !          1723:                                if (c == ac)
        !          1724:                                        return(af);
        !          1725:                        } while (++c != m);
        !          1726:                        set += 2;
        !          1727:                        c = ac;
        !          1728:                } else
        !          1729:                        if (*set++ == c)
        !          1730:                                return(af);
        !          1731:        return(!af);
        !          1732: }
        !          1733: 
        !          1734: #ifdef CKPT
        !          1735: checkpoint(asig) {
        !          1736:        extern etext;
        !          1737:        register filedes f;
        !          1738:        register char *p;
        !          1739:        register func savint, savqit;
        !          1740:        int n;
        !          1741: 
        !          1742:        savint = signal(SIGINT, 1);
        !          1743:        savqit = signal(SIGQIT, 1);
        !          1744:        p = &etext;     /* won't work for -n, -i, or -z */
        !          1745:        n = (char *)dol - p;
        !          1746:        n += sizeof (int);
        !          1747:        if ((f = create(cfname, LMODE)) < 0 ||
        !          1748:            write(f, &n, sizeof n) != sizeof n) {
        !          1749:                n = 66;
        !          1750:                goto cerror;
        !          1751:        }
        !          1752: #ifdef pdp11   /* 16 bit byte count only */
        !          1753:        if (n < 0) {
        !          1754:                if (write(f, etext, 32256) != 32256) {
        !          1755:                        n = 66;
        !          1756:                        goto cerror;
        !          1757:                }
        !          1758:                n -= 32256;     /* 63 blocks, since 64 is < 0 */
        !          1759:                p += 32256;
        !          1760:        }
        !          1761: #endif
        !          1762:        if (write(f, p, n) != n)
        !          1763:                n = 66;
        !          1764:        else
        !          1765:                n = 0;
        !          1766:     cerror:
        !          1767:        close(f);
        !          1768:        if (n) {
        !          1769:                signal(SIGINT, savint);
        !          1770:                signal(SIGQIT, savqit);
        !          1771:                recovry = 0;
        !          1772:                errmsg(n);
        !          1773:        }
        !          1774:        if (asig) {
        !          1775:                puts2(status[asig]);
        !          1776:                if (!curt)
        !          1777:                        puts(": Fatal error");
        !          1778:        }
        !          1779:        if (curt)
        !          1780:                puts2("?CKPT ");
        !          1781:        else {
        !          1782:                puts2("Editing session checkpointed to \"");
        !          1783:                puts2(cfname);
        !          1784:                puts("\".\nTo recover your work, type:");
        !          1785:                if (editor && *editor)
        !          1786:                        puts2(editor);
        !          1787:                else
        !          1788:                        puts2("edit");
        !          1789:                puts2(" -R");
        !          1790:        }
        !          1791:        puts(&tfname[tfnum]);
        !          1792:        exit(1);
        !          1793: }
        !          1794: #endif
        !          1795: 
        !          1796: chk() {
        !          1797:        register charac c;
        !          1798:        register char *p2, *p1, *t2, **p;
        !          1799:        register charac oldc;
        !          1800:        long t;
        !          1801:        struct stat s;
        !          1802: 
        !          1803:        if (*savedfile == '\0')
        !          1804:                return(0);
        !          1805:        t2 = p2 = file;
        !          1806:        p1 = savedfile;
        !          1807:        if (stat(p1, &s) >= 0)
        !          1808:                t = s.st_mtime;
        !          1809:        else
        !          1810:                t = 0L;
        !          1811:        while (*p2 = *p1++)
        !          1812:                if (*p2++ == '/')
        !          1813:                        t2 = p2;
        !          1814:        if (p2 > t2 + 10)
        !          1815:                p2 = t2 + 10;
        !          1816:        if (p2 >= &file[FNSIZE - 6])
        !          1817:                return(0);
        !          1818:        t2 = p2;
        !          1819:        p = dots;
        !          1820:        while (p1 = *p++) {
        !          1821:                p2 = t2;
        !          1822:                while (*p2++ = *p1++);
        !          1823:                if (stat(file, &s) >= 0 && s.st_mtime >= t) {
        !          1824:                        if (curt) {
        !          1825:                                puts2("?\"");
        !          1826:                                puts2(file);
        !          1827:                                puts2("\"  ");
        !          1828:                        } else {
        !          1829:                                putsn("When you were last editing this file");
        !          1830:                                putsn("you did not exit the editor normally,");
        !          1831:                                puts2("leaving the file:  \"");
        !          1832:                                puts2(file);
        !          1833:                                if (p1 == dotedt) {
        !          1834:                                        putsn("\".\nIt contains your file up to the last \"[file saved]\"");
        !          1835:                                        putsn("message.  This file will be deleted if you do");
        !          1836:                                        putsn("not read it into the editor now.  If you read");
        !          1837:                                        putsn("it, then decide not to use it, exit the editor");
        !          1838:                                        putsn("with \"qi\".");
        !          1839:                                } else
        !          1840:                                        putsn("\".");
        !          1841:                        }
        !          1842:                        return(yes_no(curt? "read" : "Do you wish to read it",
        !          1843:                            1, -1, 0));
        !          1844:                }
        !          1845:        }
        !          1846:        return(0);
        !          1847: }
        !          1848: 
        !          1849: _cleanup() {
        !          1850:        flush_buf();
        !          1851: }
        !          1852: 
        !          1853: #ifdef CLEAR
        !          1854: clear() {
        !          1855:        register l, i;
        !          1856: 
        !          1857:        l = listf;
        !          1858:        listf = 0;
        !          1859:        puts2(clears);  /* clear sequence */
        !          1860:        flush_buf();
        !          1861:        i = 5;
        !          1862:        while (--i >= 0)
        !          1863:                putchar(0);     /* ADM-3A's need padding at 19.2 */
        !          1864:        putchar('\n');
        !          1865:        listf = l;
        !          1866: }
        !          1867: #endif
        !          1868: 
        !          1869: commands(baseflg) {
        !          1870:        extern getfile(), gettty();
        !          1871:        register linep *a1;
        !          1872:        register charac c;
        !          1873:        register char *p;
        !          1874:        register r, num;
        !          1875: 
        !          1876:     for ever {
        !          1877: #ifdef AGAIN
        !          1878:        if (agp) {
        !          1879:                *agp++ = '\n';
        !          1880:                *agp = '\0';
        !          1881:        }
        !          1882:        agf = 0;
        !          1883:        agp = 0;
        !          1884: #endif
        !          1885:        immflg = 0;
        !          1886: #ifdef LOG
        !          1887:        if (logamp) {
        !          1888:                ++logstats.lp_amp;
        !          1889:                logamp = 0;
        !          1890:        }
        !          1891: #endif
        !          1892:        if (!globp && (hupflag || termflg)) {
        !          1893:                if (hupflag) {
        !          1894:                        backup(HUP);
        !          1895:                        puts2(errtext[57]);
        !          1896:                } else {
        !          1897:                        backup(TRM);
        !          1898:                        puts2(errtext[58]);
        !          1899:                }
        !          1900:                delexit(1);
        !          1901:        }
        !          1902:        if (pflag) {
        !          1903:                pflag = 0;
        !          1904:                addr1 = addr2 = dot;
        !          1905:                goto print;
        !          1906:        }
        !          1907:        if (!globp) {
        !          1908: #ifdef USE
        !          1909:            if (!alt) {
        !          1910: #endif
        !          1911:                if (modcount) {
        !          1912:                        if (text_modified > savf)
        !          1913:                                mods++;
        !          1914:                        savf = text_modified;
        !          1915:                        backchk();
        !          1916:                }
        !          1917: #ifdef EOL
        !          1918: #ifdef USE
        !          1919:                if (prompt2 && prompt3 && !eflg2)
        !          1920: #endif
        !          1921: #ifndef USE
        !          1922:                if (prompt2 && prompt3)
        !          1923: #endif
        !          1924: #endif
        !          1925: #ifndef EOL
        !          1926: #ifdef USE
        !          1927:                if (prompt2 && !eflg2)
        !          1928: #endif
        !          1929: #ifndef USE
        !          1930:                if (prompt2)
        !          1931: #endif
        !          1932: #endif
        !          1933:                {
        !          1934:                        puts2(e_prompt);
        !          1935:                        flush_buf();
        !          1936:                }
        !          1937: #ifdef USE
        !          1938:            }
        !          1939: #endif
        !          1940:        }
        !          1941:        if (!globp) {
        !          1942:                if (dotdot > dol)
        !          1943:                        dotdot = dol;
        !          1944:                if (dotdot < zero)
        !          1945:                        dotdot = zero;
        !          1946:                if (dot != lastdot) {
        !          1947:                        dotdot = lastdot;
        !          1948:                        lastdot = dot;
        !          1949:                }
        !          1950:        }
        !          1951:        addr1 = 0;
        !          1952:        addr2 = 0;
        !          1953:        s_tmp = 0;
        !          1954:        s_cnt = 0;
        !          1955:        r = 1;
        !          1956:        do {
        !          1957:                addr1 = addr2;
        !          1958:                if ((a1 = address()) == 0) {
        !          1959:                        c = getchar();
        !          1960:                        break;
        !          1961:                }
        !          1962:                addr2 = a1;
        !          1963:                if ((c = getchar()) == ';') {
        !          1964:                        c = ',';
        !          1965:                        dot = a1;
        !          1966:                }
        !          1967:        } while (c == ',' && --r >= 0);
        !          1968:        if (addr1 == 0)
        !          1969:                addr1 = addr2;
        !          1970:        if (!globp && !baseflg) {
        !          1971:                if (addr1) {
        !          1972:                        old_a1 = addr1;
        !          1973:                        old_a2 = addr2;
        !          1974:                }
        !          1975:        }
        !          1976:        line_num = (addr1? addr1 : dot) - zero;
        !          1977: #ifdef AGAIN
        !          1978:        if (c == 'o' || c == ctrl('Q')) { /* again command "o" */
        !          1979:                if (c != ctrl('Q') && (peekc = getchar()) != '\n')
        !          1980:                        errmsg(1);
        !          1981:                if (c == ctrl('Q'))
        !          1982:                        putchar(lastc = '\n');
        !          1983:                if (*agbuf == 0)
        !          1984:                        errmsg(2);
        !          1985:                agf++;
        !          1986:                agp = agbuf;
        !          1987:                c = *agp++;
        !          1988:                peekc = 0;
        !          1989: #ifdef LOG
        !          1990:                ++logstats.lc_o;
        !          1991: #endif
        !          1992:        } else if (baseflg == 0 && globp == 0)
        !          1993:                if (c != '\n') {
        !          1994:                        agp = agbuf;
        !          1995:                        *agp++ = c;  /* first char not yet saved */
        !          1996:                }
        !          1997: #endif
        !          1998: 
        !          1999:        switch (c) {
        !          2000:        case 'a':
        !          2001:                if ((peekc = getchar()) == 'b')
        !          2002:                        abort();
        !          2003:                setdot();
        !          2004: #ifdef XED
        !          2005:                if (peekc != ' ' && peekc != '\n') {
        !          2006:                        c = peekc;
        !          2007:                        peekc = 0;
        !          2008:                        if (tack(c, 1))
        !          2009:                                text_modified++;
        !          2010: #ifdef LOG
        !          2011:                        ++logstats.lc_aslash;
        !          2012: #endif
        !          2013:                        continue;
        !          2014:                }
        !          2015: #endif
        !          2016:                line_num++;
        !          2017:                num = addr2;
        !          2018: #ifdef LOG
        !          2019:                ++logstats.lc_append;
        !          2020: #endif
        !          2021:        caseadd:
        !          2022:                if ((c = getchar()) == ' ') {
        !          2023:                        r = 1;
        !          2024: #ifdef LOG
        !          2025:                        ++logstats.lc_aspace;
        !          2026: #endif
        !          2027:                } else {
        !          2028: #ifndef XED
        !          2029:                        if (c != '\n') {
        !          2030:                                peekc = c;
        !          2031:                                newline();
        !          2032:                        }
        !          2033: #endif
        !          2034:                        r = 0;
        !          2035:                }
        !          2036:                if (append(gettty, num, r, 1))
        !          2037:                        text_modified++;
        !          2038:                continue;
        !          2039: 
        !          2040:        case 'b':
        !          2041:                setnoaddr();
        !          2042:                white_space();
        !          2043:                if ((brcount = setnum(1)) <= 0)
        !          2044:                        brcount = 1;
        !          2045: #ifdef LOG
        !          2046:                ++logstats.lc_browse;
        !          2047: #endif
        !          2048:                continue;
        !          2049: 
        !          2050:        case 'c':
        !          2051:                if ((peekc = getchar()) == 'o') {  /* co == t */
        !          2052:                        peekc = 0;
        !          2053: #ifdef LOG
        !          2054:                        ++logstats.lc_copy;
        !          2055: #endif
        !          2056:                        goto casecopy;
        !          2057:                }
        !          2058:                if (peekc != '\n')
        !          2059:                        goto casesub;
        !          2060:                newline();
        !          2061:                setdot();
        !          2062:                nonzero();
        !          2063:                delete();
        !          2064:                text_modified++;
        !          2065: #ifdef LOG
        !          2066:                ++logstats.lc_change;
        !          2067: #endif
        !          2068:                append(gettty, addr1 - 1, 0, 0);
        !          2069:                continue;
        !          2070: 
        !          2071:        case 'd':
        !          2072: #ifdef DEBUG
        !          2073: /*             *du     Dump command (testing only)     */
        !          2074:                if ((peekc = getchar()) == 'u') {
        !          2075:                        peekc = 0;
        !          2076:                        dump();
        !          2077:                        continue;
        !          2078:                }
        !          2079: #endif
        !          2080:                if ((peekc = getchar()) == ' ' || peekc == ',') {
        !          2081:                        peekc = 0;
        !          2082:                        white_space();
        !          2083:                        p = linebuf;
        !          2084:                        if ((c = getchar()) == '\n')
        !          2085:                                errmsg(51);
        !          2086:                        do {
        !          2087:                                *p++ = c;
        !          2088: #ifndef ALLOC
        !          2089:                                if (p >= &linebuf[LBSIZE - 2])
        !          2090: #else
        !          2091:                                if (p >= &linebuf[lbsize - 2])
        !          2092: #endif
        !          2093:                                        errmsg(11);
        !          2094:                        } while ((c = getchar()) >= 0 && c != '\n');
        !          2095:                        *p = 0;
        !          2096: #ifdef LOG
        !          2097:                        ++logstats.lc_directory;
        !          2098: #endif
        !          2099:                        if (chdir(linebuf) < 0)
        !          2100:                                errmsg(51);
        !          2101:                        continue;
        !          2102:                }
        !          2103: #ifdef PAGE
        !          2104:                if (peekc == '=') {     /* d=<depth> */
        !          2105:                        peekc = 0;
        !          2106:                        setnoaddr();
        !          2107:                        pcount = setnum(PAGSIZ);
        !          2108: #ifdef LOG
        !          2109:                        ++logstats.lc_depth;
        !          2110: #endif
        !          2111:                        continue;
        !          2112:                }
        !          2113: #endif
        !          2114:                newline();
        !          2115:                setdot();
        !          2116:                nonzero();
        !          2117:                delete();
        !          2118:                text_modified++;
        !          2119: #ifdef LOG
        !          2120:                ++logstats.lc_delete;
        !          2121: #endif
        !          2122:                continue;
        !          2123: 
        !          2124:        case 'e':
        !          2125:            eagain:
        !          2126:                if ((peekc = getchar()) != '\n') {
        !          2127: #ifdef EOL
        !          2128:                        if (peekc == '=') {  /* e=c - set eol to 'c' */
        !          2129:                                peekc = 0;
        !          2130:                                if (immflg)
        !          2131:                                        errmsg(8);
        !          2132:                                setnoaddr();
        !          2133:                                eol = setchar(0);
        !          2134: #ifdef LOG
        !          2135:                                ++logstats.lc_eol;
        !          2136: #endif
        !          2137:                                continue;
        !          2138:                        }
        !          2139: #endif
        !          2140: #ifdef TABS
        !          2141:                        if (peekc == 'x') {
        !          2142:                                peekc = 0;
        !          2143:                                if (immflg)
        !          2144:                                        errmsg(8);
        !          2145:                                if ((c = getchar()) != 'p')
        !          2146:                                        errmsg(8);
        !          2147:                                newline();
        !          2148:                                if (!tabc)
        !          2149:                                        errmsg(3);
        !          2150:                                if (maxtab < 0)
        !          2151:                                        errmsg(9);
        !          2152:                                if (exp())
        !          2153:                                        text_modified++;
        !          2154: #ifdef LOG
        !          2155:                                ++logstats.lc_exp;
        !          2156: #endif
        !          2157:                                continue;
        !          2158:                        }
        !          2159: #endif
        !          2160:                        if ('0' <= peekc && peekc <= '9') {
        !          2161:                                c = getnum();
        !          2162:                                newline();
        !          2163:                                if (0 <= c && c < NERR)
        !          2164:                                        printf("%3d: %s\n",
        !          2165:                                            c, errtext[c]);
        !          2166: #ifdef LOG
        !          2167:                                ++logstats.lc_errmsg;
        !          2168: #endif
        !          2169:                                continue;
        !          2170:                        }
        !          2171:                        if (peekc == '+' || peekc == '-') {
        !          2172:                                c = peekc;
        !          2173:                                peekc = 0;
        !          2174:                                newline();
        !          2175:                                curt = c == '-';
        !          2176: #ifdef LOG
        !          2177:                                if (curt)
        !          2178:                                        ++logstats.lc_eminus;
        !          2179:                                else
        !          2180:                                        ++logstats.lc_eplus;
        !          2181: #endif
        !          2182:                                continue;
        !          2183:                        }
        !          2184:                        if (peekc == 'i') {
        !          2185:                                peekc = 0;
        !          2186:                                if (immflg)
        !          2187:                                        errmsg(8);
        !          2188:                                immflg++;
        !          2189:                                goto eagain;
        !          2190:                        }
        !          2191:                        setnoaddr();
        !          2192:                        if (fflg)
        !          2193:                                errmsg(4);
        !          2194:                        if (peekc != ' ' && peekc != ',')
        !          2195:                illfnm:         errmsg(5);
        !          2196:                        scopy(savedfile, tempfile);
        !          2197:                        if (zero == dol || text_modified == 0)
        !          2198:                                backup(-TMP);
        !          2199:                        savedfile[0] = 0;
        !          2200:                        filename();
        !          2201:                        if (text_modified && are_you_sure()) {
        !          2202:                                scopy(tempfile, savedfile);
        !          2203:                                error();
        !          2204:                        }
        !          2205:                        peekc = '\n';
        !          2206:                } else {
        !          2207:                        setnoaddr();
        !          2208:                        if (text_modified) {
        !          2209:                                r = peekc;
        !          2210:                                peekc = 0;
        !          2211:                                if (are_you_sure()) {
        !          2212:                                        peekc = r;
        !          2213:                                        error();
        !          2214:                                }
        !          2215:                                peekc = r;
        !          2216:                        }
        !          2217:                        if (zero == dol || text_modified == 0)
        !          2218:                                backup(-TMP);
        !          2219:                }
        !          2220:                if (init())
        !          2221:                        continue;
        !          2222: #ifdef LOG
        !          2223:                ++logstats.lc_edit;
        !          2224: #endif
        !          2225:                goto caseread;
        !          2226: 
        !          2227:        case 'f':
        !          2228:                setnoaddr();
        !          2229: #ifdef TABS
        !          2230:                if ((peekc = getchar()) == '=') {  /* f=c fill char */
        !          2231:                        peekc = 0;
        !          2232:                        tabfill = setchar(TABFILL);
        !          2233: #ifdef LOG
        !          2234:                        ++logstats.lc_fillset;
        !          2235: #endif
        !          2236:                        continue;
        !          2237:                }
        !          2238: #endif
        !          2239:                if ((c = getchar()) != '\n') {
        !          2240:                        if (fflg)
        !          2241:                                errmsg(4);
        !          2242:                        peekc = c;
        !          2243:                        filename();
        !          2244:                        scopy(file, savedfile);
        !          2245: #ifdef LOG
        !          2246:                        ++logstats.lc_fset;
        !          2247: #endif
        !          2248:                        if (prompt2 == 0)
        !          2249:                                continue;
        !          2250:                }
        !          2251: #ifdef LOG
        !          2252:                  else
        !          2253:                        ++logstats.lc_fshow;
        !          2254: #endif
        !          2255:                putsn(savedfile);
        !          2256:                continue;
        !          2257: 
        !          2258:        case 'g':
        !          2259:                global(1);
        !          2260:                continue;
        !          2261: 
        !          2262:        case 'h':
        !          2263: #ifdef HELP
        !          2264:                if ((peekc = getchar()) == 'e') {  /* he[lp] */
        !          2265:                        peekc = 0;
        !          2266:                        setnoaddr();
        !          2267:                        skip_rest();
        !          2268: #ifdef LOG
        !          2269:                        ++logstats.lc_help;
        !          2270: #endif
        !          2271:                        if ((doc = open(help, 0)) > 0) {
        !          2272:                                while ((c = read(doc, linebuf,
        !          2273: #ifndef ALLOC
        !          2274:                                    LBSIZE)) > 0)
        !          2275: #else
        !          2276:                                    lbsize)) > 0)
        !          2277: #endif
        !          2278:                                        write(1, linebuf, c);
        !          2279:                                close(doc);
        !          2280:                        }
        !          2281:                        doc = 0;
        !          2282:                        continue;
        !          2283:                }
        !          2284: #endif
        !          2285:                if (zero != dol) {
        !          2286:                        setdot();
        !          2287:                        nonzero();
        !          2288:                }
        !          2289: #ifdef LOG
        !          2290:                ++logstats.lc_header;
        !          2291: #endif
        !          2292:                header();
        !          2293:                continue;
        !          2294: 
        !          2295:        case 'i':
        !          2296:                setdot();
        !          2297: #ifdef XED
        !          2298:                if ((peekc = getchar()) != ' ' && peekc != '\n') {
        !          2299:                        c = peekc;
        !          2300:                        peekc = 0;
        !          2301:                        if (tack(c, 0))
        !          2302:                                text_modified++;
        !          2303: #ifdef LOG
        !          2304:                        ++logstats.lc_islash;
        !          2305: #endif
        !          2306:                        continue;
        !          2307:                }
        !          2308: #endif
        !          2309:                nonzero();
        !          2310:                num = addr2 - 1;
        !          2311: #ifdef LOG
        !          2312:                ++logstats.lc_insert;
        !          2313: #endif
        !          2314:                goto caseadd;
        !          2315: 
        !          2316: #ifdef XED
        !          2317:        case 'j':
        !          2318:                setdot();
        !          2319:                nonzero();
        !          2320:                join();
        !          2321:                text_modified++;
        !          2322:                continue;
        !          2323: #endif
        !          2324: 
        !          2325:        case 'k':
        !          2326:                if ((c = getchar()) == '\n') {
        !          2327:                        setnoaddr();
        !          2328: #ifdef LOG
        !          2329:                        ++logstats.lc_klist;
        !          2330: #endif
        !          2331:                        printmarks();
        !          2332:                        continue;
        !          2333:                }
        !          2334:                if ('A' <= c && c <= 'Z')
        !          2335:                        c |= 040;
        !          2336:                if (c < 'a' || c > 'z')
        !          2337:                        errmsg(0);
        !          2338:                newline();
        !          2339:                setdot();
        !          2340:                nonzero();
        !          2341: #ifdef HUGE
        !          2342:                r = hugef ^ 01;
        !          2343: #else
        !          2344: #define r      1
        !          2345: #endif
        !          2346: #ifdef EXTMARK
        !          2347:                if (addr1 != addr2) {
        !          2348:                        names[c - 'a'] = *addr1 | r;
        !          2349:                        names2[c - 'a'] = *addr2 | r;
        !          2350:                } else {
        !          2351:                        names[c - 'a'] = *addr2 | r;
        !          2352:                        names2[c - 'a'] = 0;
        !          2353:                }
        !          2354: #else
        !          2355:                names[c - 'a'] = *addr2 | r;
        !          2356: #endif
        !          2357: #ifdef LOG
        !          2358:                ++logstats.lc_kset;
        !          2359: #endif
        !          2360:                continue;
        !          2361: #ifndef HUGE
        !          2362: #undef  r
        !          2363: #endif
        !          2364: 
        !          2365:        case 'm':
        !          2366: #ifdef DUMB
        !          2367:                if ((peekc = getchar()) == '\n') {
        !          2368:                        setnoaddr();
        !          2369:                        peekc = 0;
        !          2370:                        dumbf ^= 01;
        !          2371: #ifdef LOG
        !          2372:                        ++logstats.lc_magic;
        !          2373: #endif
        !          2374:                        if (curt)
        !          2375:                                putsn(dumbf? off : on);
        !          2376:                        else {
        !          2377:                                puts2("\"$&[^.*\\(\\)\" have ");
        !          2378:                                if (dumbf)
        !          2379:                                        puts2(no);
        !          2380:                                putsn("special meaning");
        !          2381:                        }
        !          2382:                        continue;
        !          2383:                }
        !          2384: #endif
        !          2385:                if ((peekc = getchar()) == 'o') {  /* mo == m */
        !          2386:                        peekc = 0;
        !          2387: #ifdef LOG
        !          2388:                        ++logstats.lc_moove;
        !          2389: #endif
        !          2390:                }
        !          2391: #ifdef LOG
        !          2392:                  else
        !          2393:                        ++logstats.lc_move;
        !          2394: #endif
        !          2395:                move(0);
        !          2396:                text_modified++;
        !          2397:                continue;
        !          2398: 
        !          2399:        case 'n':
        !          2400:                setnoaddr();
        !          2401: #ifdef PIPE
        !          2402:                if ((peekc = getchar()) == '+') {
        !          2403:                        peekc = 0;
        !          2404:                        newline();
        !          2405:                        pno = 1;
        !          2406: #ifdef LOG
        !          2407:                        ++logstats.lc_numplus;
        !          2408: #endif
        !          2409:                        continue;
        !          2410:                }
        !          2411:                if (peekc == '-') {
        !          2412:                        peekc = 0;
        !          2413:                        newline();
        !          2414:                        pno = -1;
        !          2415: #ifdef LOG
        !          2416:                        ++logstats.lc_numinus;
        !          2417: #endif
        !          2418:                        continue;
        !          2419:                }
        !          2420: #endif
        !          2421:                newline();
        !          2422:                prompt1 ^= 01;
        !          2423: #ifdef LOG
        !          2424:                ++logstats.lc_numbers;
        !          2425: #endif
        !          2426:                if (curt)
        !          2427:                        putsn(prompt1? on : off);
        !          2428:                else {
        !          2429:                        if (prompt1 == 0)
        !          2430:                                puts2(no);
        !          2431:                        putsn("line numbers");
        !          2432:                }
        !          2433:                continue;
        !          2434: 
        !          2435:        case '\n':
        !          2436:                if (globp || addr2 > dol)
        !          2437:                        continue;
        !          2438:                if (addr2 == 0) {
        !          2439:                        addr1 = addr2 = dot + 1;
        !          2440:                        if (addr2 <= dol)
        !          2441:                                line_num++;
        !          2442:                        if (brcount != 1) {
        !          2443:                                addr2 = dot + brcount;
        !          2444:                                if (addr1 > dol)
        !          2445:                                        continue;
        !          2446:                                if (addr2 > dol)
        !          2447:                                        addr2 = dol;
        !          2448:                                if (addr2 < zero)
        !          2449:                                        addr2 = zero;
        !          2450: #ifdef CLEAR
        !          2451:                                if (zflg && addr2 - addr1 > pcount / 2)
        !          2452:                                        clear();
        !          2453: #endif
        !          2454:                        }
        !          2455:                }
        !          2456:                if (addr2 <= dol) {
        !          2457:                        pflag = 0;
        !          2458:                        goto print;
        !          2459:                }
        !          2460:                continue;
        !          2461: 
        !          2462:        case 'l':
        !          2463:                listf++;
        !          2464: #ifdef LOG
        !          2465:                ++logstats.lc_list;
        !          2466: #endif
        !          2467:        case 'p':
        !          2468:                if ((peekc = getchar()) == 'a') {
        !          2469:                        peekc = 0;
        !          2470:        case ':':
        !          2471:        case '*':
        !          2472:                        num = 0;
        !          2473:                        if (c == ':' || c == '*') {
        !          2474:                                if ((peekc = getchar()) == ' ' ||
        !          2475:                                    peekc == '\t') {
        !          2476:                                        skip_rest();    /* comments */
        !          2477: #ifdef LOG
        !          2478:                                        ++logstats.lc_comment;
        !          2479: #endif
        !          2480:                                        continue;
        !          2481:                                }
        !          2482:                                r = peekc;
        !          2483:                                peekc = 0;
        !          2484: #ifdef LOG
        !          2485:                                if (r == '-' || r == '+')
        !          2486:                                        ++logstats.lc_clnminus;
        !          2487:                                else if (c == '*')
        !          2488:                                        ++logstats.lc_star;
        !          2489:                                else
        !          2490:                                        ++logstats.lc_colon;
        !          2491: #endif
        !          2492:                                while (r == '-' || r == '^' || r == '+') {
        !          2493:                                        if (r == '+')
        !          2494:                                                ++num;
        !          2495:                                        else
        !          2496:                                                --num;
        !          2497:                                        r = getchar();
        !          2498:                                }
        !          2499:                                peekc = r;
        !          2500:                        }
        !          2501: #ifdef LOG
        !          2502:                          else
        !          2503:                                if (c != 'p')
        !          2504:                                        ++logstats.lc_print;
        !          2505: #endif
        !          2506:                        newline();
        !          2507:                        pflag = 0;
        !          2508:                        if (addr1 == addr2) {
        !          2509:                                if (num == -1 && c == ':') {
        !          2510:                                        if (addr2 == 0)
        !          2511:                                                addr2 = dot;
        !          2512:                                        addr1 = addr2 - pcount;
        !          2513:                                        if (addr1 <= zero)
        !          2514:                                                addr1 = zero + 1;
        !          2515: #ifdef CLEAR
        !          2516:                                        if (zflg)
        !          2517:                                                clear();
        !          2518: #endif
        !          2519:                                        goto print;
        !          2520:                                }
        !          2521:                                num *= pcount;
        !          2522:                                if (c == '*')
        !          2523:                                        num -= (pcount + 1) / 2;
        !          2524:                                if (addr1 == 0)
        !          2525:                                        a1 = dot + (num? num : 1);
        !          2526:                                else
        !          2527:                                        a1 = addr1 + num;
        !          2528:                                if (a1 <= zero)
        !          2529:                                        a1 = zero + 1;
        !          2530:                                addr1 = addr2 = a1;
        !          2531:                        }
        !          2532:                        nonzero();
        !          2533:                        if (addr1 == addr2 || addr2 > dol ||
        !          2534:                            addr2 <= zero)
        !          2535:                                addr2 = dol;
        !          2536:                        setdot();
        !          2537: #ifdef CLEAR
        !          2538:                        if (zflg && addr2 - addr1 > pcount / 2)
        !          2539:                                clear();
        !          2540: #endif
        !          2541: #ifndef PAGE
        !          2542:                        if (addr2 > addr1 + pcount)
        !          2543:                                addr2 = addr1 + pcount;
        !          2544:                        goto print;
        !          2545: #else
        !          2546:                        page();
        !          2547:                        listf = 0;
        !          2548: #ifdef PARENS
        !          2549:                        parenf = 0;
        !          2550: #endif
        !          2551: #ifdef STRLEN
        !          2552:                        quotef = 0;
        !          2553: #endif
        !          2554:                        continue;
        !          2555: #endif
        !          2556:                } else if (peekc == 'p' || peekc == 'l') {
        !          2557:                        peekc = 0;
        !          2558:                        addr1 = zero + 1;
        !          2559:                        addr2 = dol;
        !          2560: #ifdef LOG
        !          2561:                        ++logstats.lc_pprint;
        !          2562: #endif
        !          2563:                }
        !          2564:                newline();
        !          2565:                pflag = 0;
        !          2566:     print:
        !          2567:                setdot();
        !          2568:                nonzero();
        !          2569:                a1 = addr1;
        !          2570: #ifdef PARENS
        !          2571:                parenc[0] = 0;
        !          2572:                parenc[1] = 0;
        !          2573:                parenc[2] = 0;
        !          2574: #endif
        !          2575:                do {
        !          2576:                        col = 0;
        !          2577:                        printlno(line_num = a1 - zero);
        !          2578:                        puts(getline(*a1++));
        !          2579:                } while (a1 <= addr2);
        !          2580:                dot = addr2;
        !          2581:                listf = 0;
        !          2582: #ifdef PARENS
        !          2583:                parenf = 0;
        !          2584: #endif
        !          2585: #ifdef STRLEN
        !          2586:                quotef = 0;
        !          2587: #endif
        !          2588:                continue;
        !          2589: 
        !          2590:        case 'q':
        !          2591:                if ((peekc = getchar()) == 'i') {  /* qi - immediate */
        !          2592:                        peekc = 0;
        !          2593:                        newline();
        !          2594:                        immflg++;
        !          2595: #ifdef LOG
        !          2596:                        ++logstats.lc_qimm;
        !          2597: #endif
        !          2598:                        return;
        !          2599:                }
        !          2600: #ifdef STRLEN
        !          2601:                if (peekc == '=') {     /* q=cc  set quote chars */
        !          2602:                        peekc = 0;
        !          2603:                        if ((c = getchar()) == '\\')
        !          2604:                                c = getchar();
        !          2605:                        quotec = quotec2 = c;
        !          2606: #ifdef LOG
        !          2607:                        ++logstats.lc_quote;
        !          2608: #endif
        !          2609:                        if (c != '\n') {
        !          2610:                                if ((c = getchar()) == '\\')
        !          2611:                                        c = getchar();
        !          2612:                                if (c == '\n')
        !          2613:                                        continue;
        !          2614:                                quotec2 = c;
        !          2615:                        } else {
        !          2616:                                quotec = 0;
        !          2617:                                quotec2 = 0;
        !          2618:                                continue;
        !          2619:                        }
        !          2620:                        if (c != '\n')
        !          2621:                                newline();
        !          2622:                        continue;
        !          2623:                }
        !          2624: #endif
        !          2625:                setnoaddr();
        !          2626:                if ((peekc = getchar()) != '\n')
        !          2627:                        errmsg(25);
        !          2628:                peekc = 0;
        !          2629: #ifdef LOG
        !          2630:                ++logstats.lc_quit;
        !          2631: #endif
        !          2632:                return;
        !          2633: 
        !          2634:        case 'r':
        !          2635: #ifdef LOG
        !          2636:                ++logstats.lc_read;
        !          2637: #endif
        !          2638:        caseread:
        !          2639:                filename();
        !          2640:                if ((io = open(file, 0)) < 0) {
        !          2641:                        io = 0;
        !          2642:                        lastc = '\n';
        !          2643:                        if (curt)
        !          2644:                                errmsg(53);
        !          2645:                        puts2(errtext[53]);
        !          2646:                        putsn(file);
        !          2647:                        error();
        !          2648:                }
        !          2649:                setall();
        !          2650:                ninbuf = 0;
        !          2651:                r = append(getfile, addr2, 0, 0);
        !          2652:                if (prompt2)
        !          2653:                        printf((curt? prcntu : errtext[55]),
        !          2654:                            r, (r == 1? null : quote_s));
        !          2655:                close(io);
        !          2656:                io = 0;
        !          2657: #ifdef LOG
        !          2658:                logstats.lt_rlines += r;
        !          2659: #endif
        !          2660:                if (num_reads++ || fflg) {
        !          2661:                        if (r)
        !          2662:                                text_modified++;
        !          2663:                } /* else
        !          2664:                        text_modified = 0; */
        !          2665:                if ((c == 'e' && bflg == 1) || bflg2 == 1) {
        !          2666:                        bflg2 = 0;
        !          2667:                        backup(BAK);
        !          2668:                }
        !          2669:                continue;
        !          2670: 
        !          2671:        case 's':
        !          2672:                if (!globp && (peekc = getchar()) == '\n') {  /* w;q */
        !          2673:                        setnoaddr();
        !          2674: #ifdef LOG
        !          2675:                        ++logstats.lc_stop;
        !          2676: #endif
        !          2677:                        if (text_modified && !fflg)
        !          2678:                                if (backup(FILE) == 0)
        !          2679:                                        error();  /* errmsg(10) */
        !          2680:                        peekc = text_modified = 0;
        !          2681: #ifdef LOG
        !          2682:                        logstats.lt_wlines += dol - zero;
        !          2683: #endif
        !          2684:                        return;
        !          2685:                }
        !          2686:                if (peekc == 'a') {  /* sa - count before auto-save */
        !          2687:                        setnoaddr();
        !          2688:                        peekc = 0;
        !          2689:                        modcount = setnum(MODCNT);
        !          2690:                        mods = 0;
        !          2691: #ifdef LOG
        !          2692:                        ++logstats.lc_savecount;
        !          2693: #endif
        !          2694:                        continue;
        !          2695:                }
        !          2696:        casesub:
        !          2697:                setdot();
        !          2698:                nonzero();
        !          2699:                substitute(globp);
        !          2700:                text_modified++;
        !          2701: #ifdef LOG
        !          2702:                if (c == 's')
        !          2703:                        ++logstats.lc_substitute;
        !          2704:                else
        !          2705:                        ++logstats.lc_cslash;
        !          2706: #endif
        !          2707:                continue;
        !          2708: 
        !          2709:        case 't':
        !          2710: #ifdef TABS
        !          2711:                if ((peekc = getchar()) == '=') {  /* t=c tab char */
        !          2712:                        setnoaddr();
        !          2713:                        peekc = 0;
        !          2714:                        tabc = setchar(0);
        !          2715: #ifdef LOG
        !          2716:                        ++logstats.lc_tabchar;
        !          2717: #endif
        !          2718:                        continue;
        !          2719:                } else if (peekc == ',') {      /* t,nn  set tabs */
        !          2720:                        setnoaddr();
        !          2721: #ifdef LOG
        !          2722:                        ++logstats.lc_tabset;
        !          2723: #endif
        !          2724:                        while ((c = getchar()) == ',') {
        !          2725:                                while ((c = getchar()) == ',');
        !          2726:                                if ((c < '0' || c > '9') && c != '-')
        !          2727:                                        break;
        !          2728:                                peekc = c;
        !          2729:                                settab(getsnum());
        !          2730:                        }
        !          2731:                        peekc = c;
        !          2732:                        newline();
        !          2733:                        continue;
        !          2734:                } else if (peekc == '\n') {     /* list tabs */
        !          2735:                        setnoaddr();
        !          2736:                        peekc = 0;
        !          2737: #ifdef LOG
        !          2738:                        ++logstats.lc_tablist;
        !          2739: #endif
        !          2740:                        listabs();
        !          2741:                        continue;
        !          2742:                }
        !          2743: #endif
        !          2744: #ifdef LOG
        !          2745:                ++logstats.lc_transfer;
        !          2746: #endif
        !          2747:        casecopy:
        !          2748:                move(1);
        !          2749:                text_modified++;
        !          2750:                continue;
        !          2751: 
        !          2752: #ifdef UNDO
        !          2753:        case 'u':
        !          2754:                setnoaddr();
        !          2755:                newline();
        !          2756:                undo();
        !          2757: #ifdef LOG
        !          2758:                ++logstats.lc_undo;
        !          2759: #endif
        !          2760:                continue;
        !          2761: #endif
        !          2762: 
        !          2763:        case 'v':
        !          2764:                global(0);
        !          2765:                continue;
        !          2766: 
        !          2767:        case 'w':
        !          2768: #ifdef PAGE
        !          2769:                if ((peekc = getchar()) == '=') {  /* w=<width> */
        !          2770:                        peekc = 0;
        !          2771:                        ccount = setnum(CCOUNT);
        !          2772: #ifdef LOG
        !          2773:                        ++logstats.lc_width;
        !          2774: #endif
        !          2775:                        continue;
        !          2776:                }
        !          2777: #endif
        !          2778:                if ((peekc = getchar()) == 'i') {       /* wi over-ride */
        !          2779:                        ++immflg;
        !          2780:                        peekc = 0;
        !          2781: #ifdef LOG
        !          2782:                        ++logstats.lc_wimm;
        !          2783: #endif
        !          2784:                }
        !          2785: #ifdef LOG
        !          2786:                  else
        !          2787:                        ++logstats.lc_write;
        !          2788: #endif
        !          2789:                filename();
        !          2790: #ifdef LOG
        !          2791:                if (appflg) {
        !          2792:                        --logstats.lc_write;
        !          2793:                        ++logstats.lc_wonto;
        !          2794:                }
        !          2795: #endif
        !          2796:                if (globp) {
        !          2797:                        setdot();
        !          2798:                        appflg++;
        !          2799:                } else
        !          2800:                        setall();
        !          2801:                if (dol == zero) {
        !          2802:                        if (curt)
        !          2803:                                putsn("?48");
        !          2804:                        else
        !          2805:                                putsn(errtext[48]);
        !          2806:                        if (!fflg || appflg)
        !          2807:                                continue;
        !          2808:                }
        !          2809:                if (over || immflg)
        !          2810:                        override();
        !          2811:                if (appflg)
        !          2812:                        io = open(file, 1);
        !          2813:                if (!appflg || io < 0)
        !          2814:                        io = creat(file, MODE);
        !          2815:                if (overfile) {
        !          2816:                        chmod(overfile, overmode);
        !          2817:                        overfile = 0;
        !          2818:                }
        !          2819:                if (io < 0) {
        !          2820:                        io = 0;
        !          2821:                        if (curt)
        !          2822:                                errmsg(54);
        !          2823:                        puts2(errtext[54]);
        !          2824:                        putsn(file);
        !          2825:                        error();
        !          2826:                }
        !          2827:                io_w++;
        !          2828:                if (appflg)
        !          2829:                        lseek(io, 0L, 2);       /* append onto file */
        !          2830:                putfile();
        !          2831:                close(io);
        !          2832:                io = 0;
        !          2833:                io_w = 0;
        !          2834:                if (addr1 == zero + 1 && addr2 == dol)
        !          2835:                        text_modified = 0;
        !          2836: #ifdef LOG
        !          2837:                logstats.lt_wlines += dol - zero;
        !          2838: #endif
        !          2839:                continue;
        !          2840: 
        !          2841: #ifdef USE
        !          2842:        case '@':
        !          2843:                setnoaddr();
        !          2844:                if (alt)
        !          2845:                        errmsg(6);
        !          2846:                if ((peekc = getchar()) == 'p')
        !          2847:                        peekc = 0;
        !          2848:                else
        !          2849:                        eflg2++;
        !          2850:                if ((peekc = getchar()) == '\n' && altfile[0]) {
        !          2851:                        peekc = 0;
        !          2852:                        goto altname;
        !          2853:                }
        !          2854:                if ((c = getchar()) != ' ' && c != '\t' && c != ',')
        !          2855:                        errmsg(5);
        !          2856:                white_space();
        !          2857:                if ((c = getchar()) == '\n')
        !          2858:                        errmsg(7);
        !          2859:                p = altfile;
        !          2860:                *p++ = c;
        !          2861:                while ((c = getchar()) != '\n') {
        !          2862:                        if (c < 0)
        !          2863:                                errmsg(59);
        !          2864:                        *p++ = c;
        !          2865:                }
        !          2866:                *p = '\0';
        !          2867:        altname:
        !          2868: #ifdef LOG
        !          2869:                ++logstats.lc_at;
        !          2870: #endif
        !          2871:                if ((alt = open(altfile, 0)) < 0) {
        !          2872:                        alt = 0;        /* this MUST be 0 */
        !          2873:                        lastc = '\n';
        !          2874:                        if (curt)
        !          2875:                                errmsg(53);
        !          2876:                        puts2(errtext[53]);
        !          2877:                        putsn(altfile);
        !          2878:                        error();
        !          2879:                }
        !          2880:                continue;
        !          2881: #endif
        !          2882: 
        !          2883: #ifdef DEBUG
        !          2884:        case '#':       /* toggle debug flag */
        !          2885:                if (addr1 != addr2 || addr1 != zero)
        !          2886:                        goto illcmd;
        !          2887:                newline();
        !          2888:                tflg ^= 01;
        !          2889:                continue;
        !          2890: 
        !          2891: #ifdef XDEL
        !          2892:        case '`':
        !          2893:                setnoaddr();
        !          2894:                newline();
        !          2895:                if (ndeleted == 0)
        !          2896:                        errmsg(16);
        !          2897:                printf("deleted = %o  ndeleted = %d\n", deleted, ndeleted);
        !          2898:                { register n, *bp, nl;
        !          2899:                    int tl;
        !          2900: 
        !          2901:                    tl = deleted;
        !          2902:                    bp = getblock(tl, READ);
        !          2903: #ifdef HUGE
        !          2904:                    tl &= _1[hugef];
        !          2905: #else
        !          2906:                    tl &= _1;
        !          2907: #endif
        !          2908:                    nl = nleft / sizeof(linep);
        !          2909:                    for (n = 0; n < ndeleted; n++) {
        !          2910:                        printf("%7d: %6o\n", n + 1, *bp++);
        !          2911:                        if (--nl <= 0) {
        !          2912: #ifdef HUGE
        !          2913:                            bp = getblock(tl += _2[hugef], READ);
        !          2914: #else
        !          2915:                            bp = getblock(tl += _2, READ);
        !          2916: #endif
        !          2917:                            nl = nleft / sizeof(linep);
        !          2918:                        }
        !          2919:                    }
        !          2920:                }
        !          2921:                continue;
        !          2922: #endif
        !          2923: #endif
        !          2924: 
        !          2925: #ifdef XDEL
        !          2926:        case 'x':
        !          2927:                newline();
        !          2928:                r = undelete();
        !          2929: #ifdef LOG
        !          2930:                ++logstats.lc_xundelete;
        !          2931: #endif
        !          2932:                if (prompt2)
        !          2933:                        printf((curt? prcntu : errtext[55]),
        !          2934:                            r, (r == 1? null : quote_s));
        !          2935:                text_modified++;
        !          2936:                continue;
        !          2937: #endif
        !          2938: 
        !          2939: #ifdef YINT
        !          2940:        case 'y':
        !          2941:                if ((c = getchar()) == '+') {
        !          2942:                        setdot();
        !          2943:                        nonzero();
        !          2944:                        newline();
        !          2945:                        if (zero == dol)
        !          2946:                                yplus = 0;
        !          2947:                        else
        !          2948:                                yplus = *addr2 | 01;
        !          2949:                        yflg = 1;
        !          2950: #ifdef LOG
        !          2951:                        ++logstats.lc_yplus;
        !          2952: #endif
        !          2953:                } else if (c == '-') {
        !          2954:                        setnoaddr();
        !          2955:                        newline();
        !          2956:                        yflg = 0;
        !          2957: #ifdef LOG
        !          2958:                        ++logstats.lc_yminus;
        !          2959: #endif
        !          2960:                } else {
        !          2961:                        setnoaddr();
        !          2962:                        peekc = c;
        !          2963:                        newline();
        !          2964:                        yflg = 1;
        !          2965:                        yplus = 0;
        !          2966: #ifdef LOG
        !          2967:                        ++logstats.lc_yintr;
        !          2968: #endif
        !          2969:                }
        !          2970:                continue;
        !          2971: #endif
        !          2972: 
        !          2973: #ifdef PIPE
        !          2974:        case '|':
        !          2975: #ifndef XED
        !          2976:                if (globp)              /* turkeys will be turkeys */
        !          2977:                        errmsg(61);
        !          2978: #endif
        !          2979:                if (noshell)
        !          2980:                        errmsg(52);
        !          2981:                if ((peekc = getchar()) == '+') {
        !          2982:                        peekc = 0;
        !          2983:                        newline();
        !          2984:                        setnoaddr();
        !          2985:                        strict++;
        !          2986: #ifdef LOG
        !          2987:                        ++logstats.lc_piplus;
        !          2988: #endif
        !          2989:                        continue;
        !          2990:                } else if (peekc == '-') {
        !          2991:                        peekc = 0;
        !          2992:                        newline();
        !          2993:                        setnoaddr();
        !          2994:                        strict = 0;
        !          2995: #ifdef LOG
        !          2996:                        ++logstats.lc_piminus;
        !          2997: #endif
        !          2998:                        continue;
        !          2999:                }
        !          3000:                setdot();
        !          3001:                shell();
        !          3002:                continue;
        !          3003: #endif
        !          3004: 
        !          3005:        case '!':
        !          3006: #ifndef XED
        !          3007:                if (globp)
        !          3008:                        errmsg(61);
        !          3009: #endif
        !          3010:                if (noshell)
        !          3011:                        errmsg(52);
        !          3012:                setnoaddr();
        !          3013:                shell();
        !          3014:                continue;
        !          3015: 
        !          3016: #ifdef CKPT
        !          3017:        case 'z':
        !          3018:                newline();
        !          3019:                setnoaddr();
        !          3020:                checkpoint(0);  /* doesn't return */
        !          3021: #endif
        !          3022: 
        !          3023:        case EOF:
        !          3024: #ifdef USE
        !          3025:                if (!baseflg && alt) {
        !          3026:                        close(alt);
        !          3027:                        alt = 0;
        !          3028:                        eflg2 = 0;
        !          3029:                        continue;
        !          3030:                }
        !          3031: #endif
        !          3032:                return;
        !          3033: 
        !          3034:        }
        !          3035:     illcmd:
        !          3036:                errmsg(8);
        !          3037:     }  /* nothing lasts "for ever" */
        !          3038: }
        !          3039: 
        !          3040: compile(aeof)
        !          3041: charac aeof;
        !          3042: {
        !          3043:        register charac eof, c;
        !          3044:        register char *ep, *lastep, *bracketp;
        !          3045:        register cclcnt;
        !          3046:        char bracket[NBRA];
        !          3047: 
        !          3048:        ep = expbuf;
        !          3049:        lastep = 0;
        !          3050:        eof = aeof;
        !          3051:        bracketp = bracket;
        !          3052:        if ((c = getchar()) == eof || c == '\n') {
        !          3053:                if (*ep == 0)
        !          3054:                        errmsg(27);
        !          3055:                if (c == '\n')
        !          3056:                        peekc = c;
        !          3057:                return;
        !          3058:        }
        !          3059:        circfl = 0;
        !          3060:        nbra = 0;
        !          3061:        if (
        !          3062: #ifdef DUMB
        !          3063:            !dumbf &&
        !          3064: #endif
        !          3065:                        c == '^') {
        !          3066:                c = getchar();
        !          3067:                circfl++;
        !          3068: #ifdef LOG
        !          3069:                ++logstats.lp_caret;
        !          3070: #endif
        !          3071:        }
        !          3072: /*     if (c == '*') {         /* if first = *, then quote it */
        !          3073: /*             *ep++ = CCHR;   */
        !          3074: /*             *ep++ = c;      */
        !          3075: /*             c = 0;  */
        !          3076: /*     }       */
        !          3077:        peekc = c;
        !          3078:        for ever {
        !          3079:                if (ep >= &expbuf[ESIZE - 2 - (bracketp - bracket) * 2])
        !          3080:                        break;
        !          3081:                c = getchar();
        !          3082:                if (c == eof || c == '\n') {
        !          3083:                        while (bracketp > bracket) {
        !          3084:                                *ep++ = CKET;
        !          3085:                                *ep++ = *--bracketp;
        !          3086:                        }
        !          3087:                        *ep++ = CEOF;
        !          3088:                        if (c == '\n') {
        !          3089:                                if (prompt2)
        !          3090:                                        pflag++;
        !          3091:                                peekc = c;
        !          3092:                        }
        !          3093:                        return;
        !          3094:                }
        !          3095:                if (c != '*')
        !          3096:                        lastep = ep;
        !          3097: #ifdef DUMB
        !          3098:                if (dumbf && c >= 0)
        !          3099:                        goto defchar;
        !          3100: #endif
        !          3101:                switch (c) {
        !          3102:                case '\\':
        !          3103:                        if ((c = getchar()) == '(') {
        !          3104:                                if (nbra >= NBRA) {
        !          3105:                                        c = 44;
        !          3106:                                        goto cerror;
        !          3107:                                }
        !          3108:                                *bracketp++ = nbra;
        !          3109:                                *ep++ = CBRA;
        !          3110:                                *ep++ = nbra++;
        !          3111: #ifdef LOG
        !          3112:                                ++logstats.lp_paren;
        !          3113: #endif
        !          3114:                                continue;
        !          3115:                        }
        !          3116:                        if (c == ')') {
        !          3117:                                if (bracketp <= bracket) {
        !          3118:                                        c = 45;
        !          3119:                                        goto cerror;
        !          3120:                                }
        !          3121:                                *ep++ = CKET;
        !          3122:                                *ep++ = *--bracketp;
        !          3123:                                continue;
        !          3124:                        }
        !          3125:                        if ('1' <= c && c < '1' + nbra) {
        !          3126:                                *ep++ = CBACK;
        !          3127:                                *ep++ = c - '1';
        !          3128: #ifdef LOG
        !          3129:                                ++logstats.lp_digit;
        !          3130: #endif
        !          3131:                                continue;
        !          3132:                        }
        !          3133:                        if (c == '\n') {
        !          3134:                                c = 46;
        !          3135:                                goto cerror;
        !          3136:                        }
        !          3137:                defchar:
        !          3138:                default:
        !          3139:                        *ep++ = CCHR;
        !          3140:                        *ep++ = c;
        !          3141:                        continue;
        !          3142: 
        !          3143:                case '.':
        !          3144:                        *ep++ = CDOT;
        !          3145: #ifdef LOG
        !          3146:                        ++logstats.lp_dot;
        !          3147: #endif
        !          3148:                        continue;
        !          3149: 
        !          3150:                case '*':
        !          3151:                        if (lastep == 0 ||
        !          3152:                            *lastep == CBRA || *lastep == CKET)
        !          3153:                                goto defchar;
        !          3154:                        *lastep |= STAR;
        !          3155: #ifdef LOG
        !          3156:                        ++logstats.lp_star;
        !          3157: #endif
        !          3158:                        continue;
        !          3159: 
        !          3160:                case '$':
        !          3161:                        if ((peekc = getchar()) != eof && peekc != '\n')
        !          3162:                                goto defchar;
        !          3163:                        *ep++ = CDOL;
        !          3164: #ifdef LOG
        !          3165:                        ++logstats.lp_dol;
        !          3166: #endif
        !          3167:                        continue;
        !          3168: 
        !          3169:                case '[':
        !          3170:                        *ep++ = CCL;
        !          3171:                        *ep++ = 0;
        !          3172:                        cclcnt = 1;
        !          3173:                        if ((c = getchar()) == '^') {
        !          3174:                                c = getchar();
        !          3175:                                ep[-2] = NCCL;
        !          3176: #ifdef LOG
        !          3177:                                ++logstats.lp_nccl;
        !          3178: #endif
        !          3179:                        }
        !          3180: #ifdef LOG
        !          3181:                          else
        !          3182:                                ++logstats.lp_ccl;
        !          3183: #endif
        !          3184:                        do {
        !          3185:                                if (c == '\\')
        !          3186:                                        c = getchar();
        !          3187:                                if (c == '\n') {
        !          3188:                                        peekc = c;
        !          3189:                                        break;
        !          3190:                                }
        !          3191:                                if (c < 0) {
        !          3192:                                        c = 59;
        !          3193:                                        goto cerror;
        !          3194:                                }
        !          3195:                                *ep++ = c;
        !          3196:                                cclcnt++;
        !          3197:                                if (ep >= &expbuf[ESIZE - 2]) {
        !          3198:                                        c = 49;
        !          3199:                                        goto cerror;
        !          3200:                                }
        !          3201:                        } while ((c = getchar()) != ']');
        !          3202:                        lastep[1] = cclcnt;
        !          3203:                        continue;
        !          3204: 
        !          3205:                case EOF:
        !          3206:                        c = 59;
        !          3207:                        goto cerror;
        !          3208:                }
        !          3209:        }
        !          3210:        c = 42;
        !          3211:    cerror:
        !          3212:        expbuf[0] = '\0';
        !          3213:        nbra = 0;
        !          3214:        errmsg(c);
        !          3215: }
        !          3216: 
        !          3217: compsub() {
        !          3218:        register charac seof, c;
        !          3219:        register char *p;
        !          3220: 
        !          3221:        if ((seof = getchar()) == '\n')
        !          3222:                errmsg(40);
        !          3223:        compile(seof);
        !          3224:        p = rhsbuf;
        !          3225:        for ever {
        !          3226:                c = getchar();
        !          3227:                if (c < 0)
        !          3228:                        errmsg(59);
        !          3229:                if (c == '\\')
        !          3230:                        c = getchar() | 0200;
        !          3231:                if (c == '\n') {
        !          3232:                        *p = 0;
        !          3233:                        peekc = 0;
        !          3234:                        if (prompt2)
        !          3235:                                pflag++;
        !          3236:                        return(0);
        !          3237:                }
        !          3238:                if (c == seof)
        !          3239:                        break;
        !          3240:                *p++ = c;
        !          3241:                if (p >= &rhsbuf[LBSIZE / 2 - 2])
        !          3242:                        errmsg(41);
        !          3243:        }
        !          3244:        *p = '\0';
        !          3245:        p = 0;
        !          3246:        if ((peekc = getchar()) == 'g') {       /* if in 'glob' */
        !          3247:                peekc = 0;
        !          3248:                p = 1;
        !          3249:        } else if ('0' <= peekc && peekc <= '9')
        !          3250:                if ((s_cnt = getnum()) < 0)
        !          3251:                        s_cnt = 0;
        !          3252:        newline();
        !          3253:        return(p);
        !          3254: }
        !          3255: 
        !          3256: create(as, am)
        !          3257: char *as;
        !          3258: {
        !          3259:        register savmask;
        !          3260:        register func savint, savqit;
        !          3261:        register ret;
        !          3262: 
        !          3263:        if (am == LMODE) {
        !          3264:                savint = signal(SIGINT, 1);
        !          3265:                savqit = signal(SIGQIT, 1);
        !          3266:                savmask = umask(LMASK);
        !          3267:        }
        !          3268:        ret = creat(as, am);
        !          3269:        if (am == LMODE) {
        !          3270:                umask(savmask);
        !          3271:                signal(SIGINT, savint);
        !          3272:                signal(SIGQIT, savqit);
        !          3273:        }
        !          3274:        return(ret);
        !          3275: }
        !          3276: 
        !          3277: delete() {
        !          3278:        register linep *a1, *a2, *a3;
        !          3279: 
        !          3280:        a1 = addr1;
        !          3281:        a2 = addr2 + 1;
        !          3282: #ifdef XDEL
        !          3283:        if (!globp)
        !          3284:                saveline();
        !          3285: #endif
        !          3286:        a3 = dol;
        !          3287:        dol -= a2 - a1;
        !          3288:        do {
        !          3289:                *a1++ = *a2++;
        !          3290:        } while (a2 <= a3);
        !          3291:        a1 = addr1;
        !          3292:        if (a1 > dol)
        !          3293:                a1 = dol;
        !          3294:        dot = a1;
        !          3295: }
        !          3296: 
        !          3297: delexit(aretcode) {
        !          3298: #ifdef LOG
        !          3299: #include <sys/times.h>
        !          3300:        struct tms t;
        !          3301: #endif
        !          3302: 
        !          3303:        unlink(tfname);
        !          3304: #ifdef LOG
        !          3305:        if ((io = open(LOG, 1)) >= 0) {
        !          3306:                time(&logstats.lt_end);
        !          3307:                times(&t);
        !          3308:                logstats.lt_usercpu = t.tms_utime;
        !          3309:                logstats.lt_syscpu = t.tms_stime;
        !          3310:                logstats.lt_kidscpu = t.tms_cutime + t.tms_cstime;
        !          3311:                lseek(io, 0L, 2);
        !          3312:                write(io, &logstats, sizeof logstats);
        !          3313:        }
        !          3314: #endif
        !          3315:        exit(aretcode);
        !          3316: }
        !          3317: 
        !          3318: dosub() {
        !          3319:        register char *lp, *sp, *rp;
        !          3320:        register charac c;
        !          3321: 
        !          3322:        lp = linebuf;
        !          3323:        sp = genbuf;
        !          3324:        rp = rhsbuf;
        !          3325:        while (lp < loc1)
        !          3326:                *sp++ = *lp++;
        !          3327:        while (c = *rp++) {
        !          3328: #ifdef DUMB
        !          3329:                if (!dumbf)
        !          3330: #endif
        !          3331:                        if (c == '&') {
        !          3332: #ifdef LOG
        !          3333:                                ++logamp;
        !          3334: #endif
        !          3335:                                sp = place(sp, loc1, loc2);
        !          3336:                                continue;
        !          3337:                        } else if (c < 0 && (c &= 0177) >= '1' &&
        !          3338:                            c < nbra + '1') {
        !          3339:                                c -= '1';
        !          3340:                                sp = place(sp,braslist[c],braelist[c]);
        !          3341:                                continue;
        !          3342:                        }
        !          3343:                *sp++ = c & 0177;
        !          3344: #ifndef ALLOC
        !          3345:                if (sp >= &genbuf[LBSIZE - 2])
        !          3346: #else
        !          3347:                if (sp >= &genbuf[lbsize - 2])
        !          3348: #endif
        !          3349:                        errmsg(42);
        !          3350:        }
        !          3351:        lp = loc2;
        !          3352:        loc2 = sp + (linebuf - genbuf);
        !          3353:        while (*sp++ = *lp++)
        !          3354: #ifndef ALLOC
        !          3355:                if (sp >= &genbuf[LBSIZE - 2])
        !          3356: #else
        !          3357:                if (sp >= &genbuf[lbsize - 2])
        !          3358: #endif
        !          3359:                        errmsg(43);
        !          3360:        lp = linebuf;
        !          3361:        sp = genbuf;
        !          3362:        while (*lp++ = *sp++);
        !          3363: }
        !          3364: 
        !          3365: #ifdef DEBUG
        !          3366: dump() {
        !          3367:        register linep *i;
        !          3368:        register b, o;
        !          3369: 
        !          3370:        setdot();
        !          3371:        nonzero();
        !          3372:        newline();
        !          3373:        line_num = addr1 - zero;
        !          3374:        for (i = addr1; i <= addr2; i++) {
        !          3375: #ifdef HUGE
        !          3376:                b = (*i >> (8 - hugef)) & _3[hugef];
        !          3377:                o = (*i << (1 + hugef)) & _4[hugef];
        !          3378: #else
        !          3379:                b = (*i >> 8) & _3;
        !          3380:                o = (*i << 1) & _4;
        !          3381: #endif
        !          3382:                printlno(line_num++);
        !          3383: #ifdef pdp11
        !          3384:                printf("%6o:%7o%6d/%d\n", i, *i, b, o);
        !          3385: #else
        !          3386:                printf("%6o:%7o%6d/%d\n", i, *i&(unsigned)(unsigned short)-1, b, o);
        !          3387: #endif
        !          3388:        }
        !          3389:        dot = addr2;
        !          3390: }
        !          3391: #endif
        !          3392: 
        !          3393: echo(ch)
        !          3394: charac ch;
        !          3395: {
        !          3396: #ifdef AGAIN
        !          3397:        static charac lastchar;
        !          3398: #endif
        !          3399: #ifdef USE
        !          3400:        if (eflg || alt && !eflg2)
        !          3401: #endif
        !          3402: #ifndef USE
        !          3403:        if (eflg)
        !          3404: #endif
        !          3405:                write(2, &ch, 1);
        !          3406: #ifdef AGAIN
        !          3407:        if (!agf && agp) {      /* save current command for "again" */
        !          3408:                if (agp >= &agbuf[GBSIZE - 2])
        !          3409:                        agp = agbuf[0] = 0;
        !          3410:                else
        !          3411:                        *agp++ = ch;
        !          3412:                if (ch == '\n' && lastchar != '\\')
        !          3413:                        agp = *agp = 0;
        !          3414:        }
        !          3415:        lastchar = ch;
        !          3416: #endif
        !          3417:        return(ch);
        !          3418: }
        !          3419: 
        !          3420: errfunc() {
        !          3421:        if (io) {
        !          3422:                close(io);
        !          3423:                io = 0;
        !          3424:                io_w = 0;
        !          3425:        }
        !          3426:        if (overfile) {
        !          3427:                chmod(overfile, overmode);
        !          3428:                overfile = 0;
        !          3429:        }
        !          3430: #ifdef HELP
        !          3431:        if (doc) {
        !          3432:                close(doc);
        !          3433:                doc = 0;
        !          3434:        }
        !          3435: #endif
        !          3436: #ifdef PIPE
        !          3437:        if (pfile) {
        !          3438:                close(pfile);
        !          3439:                unlink(pfname);
        !          3440:                pfile = 0;
        !          3441:        }
        !          3442: #endif
        !          3443: /*     puts("?");      */
        !          3444:        if (!seekf)
        !          3445:                lseek(0, 0L, 2);
        !          3446:        pflag = 0;
        !          3447:        listf = 0;
        !          3448: #ifdef PARENS
        !          3449:        parenf = 0;
        !          3450: #endif
        !          3451: #ifdef STRLEN
        !          3452:        quotef = 0;
        !          3453: #endif
        !          3454:        if (globp) {
        !          3455:                lastc = '\n';
        !          3456:                globp = 0;
        !          3457:        }
        !          3458:        peekc = lastc;
        !          3459:        skip_rest();
        !          3460:        eflg2 = 0;
        !          3461:        reset();
        !          3462: }
        !          3463: 
        !          3464: errmsg(n) {
        !          3465:        extern errno;
        !          3466: 
        !          3467:        listf = 0;
        !          3468: #ifdef PARENS
        !          3469:        parenf = 0;
        !          3470: #endif
        !          3471: #ifdef STRLEN
        !          3472:        quotef = 0;
        !          3473: #endif
        !          3474:        col = 0;
        !          3475:        if (n < 0) {
        !          3476:                puts2("\7******** ");
        !          3477:                printf("%d ", errno);
        !          3478:                n = -n;
        !          3479:        }
        !          3480:        if (curt)
        !          3481:                printf("?%d\n", n);
        !          3482:        else
        !          3483:                if (0 <= n && n < NERR)
        !          3484:                        putsn(errtext[n]);
        !          3485:                else
        !          3486:                        printf("bad error number: %d\n", n);
        !          3487:        error();
        !          3488: }
        !          3489: 
        !          3490: execute(gf, addr)
        !          3491: linep *addr;
        !          3492: {
        !          3493:        register char *p1, *p2;
        !          3494:        register charac c;
        !          3495: 
        !          3496:        if (gf) {
        !          3497:                if (circfl)
        !          3498:                        return(0);
        !          3499:                p1 = linebuf;
        !          3500:                p2 = genbuf;
        !          3501:                while (*p1++ = *p2++);
        !          3502:                locs = p1 = loc2;
        !          3503:        } else {
        !          3504:                if (addr == zero)
        !          3505:                        return(0);
        !          3506:                p1 = getline(*addr);
        !          3507:                locs = 0;
        !          3508:        }
        !          3509:        p2 = expbuf;
        !          3510:        c = NBRA;
        !          3511:        while (--c >= 0) {
        !          3512:                braslist[c] = 0;
        !          3513:                braelist[c] = 0;
        !          3514:        }
        !          3515:        if (circfl) {
        !          3516:                loc1 = p1;
        !          3517:                return(advance(p1, p2));
        !          3518:        }
        !          3519:        /* fast check for first character */
        !          3520:        if (*p2 == CCHR) {
        !          3521:                c = p2[1];
        !          3522:                do {
        !          3523:                        if (*p1 != c)
        !          3524:                                continue;
        !          3525:                        if (advance(p1, p2)) {
        !          3526:                                loc1 = p1;
        !          3527:                                return(1);
        !          3528:                        }
        !          3529:                } while (*p1++);
        !          3530:                return(0);
        !          3531:        }
        !          3532:        /* regular algorithm */
        !          3533:        do {
        !          3534:                if (advance(p1, p2)) {
        !          3535:                        loc1 = p1;
        !          3536:                        return(1);
        !          3537:                }
        !          3538:        } while (*p1++);
        !          3539:        return(0);
        !          3540: }
        !          3541: 
        !          3542: #ifdef TABS
        !          3543: exp() {
        !          3544:        register n;
        !          3545:        register linep p, *a1;
        !          3546: 
        !          3547:        setdot();
        !          3548:        nonzero();
        !          3549:        n = 0;
        !          3550:        for (a1 = addr1; a1 <= addr2; a1++) {
        !          3551:                getline(*a1);
        !          3552:                if (expand()) {
        !          3553:                        n++;
        !          3554:                        p = *a1;
        !          3555:                        *a1 = putline();
        !          3556:                        savemark(p, *a1);
        !          3557:                }
        !          3558:        }
        !          3559:        dot = addr2;
        !          3560:        return(n);
        !          3561: }
        !          3562: 
        !          3563: expand() {
        !          3564:        register char *p2;
        !          3565:        register charac c;
        !          3566:        register n;
        !          3567:        register char *p1;
        !          3568:        register cnt, i;
        !          3569:        register flag tabflg;
        !          3570: 
        !          3571:        p1 = linebuf;
        !          3572:        p2 = genbuf;
        !          3573:        while (*p2++ = *p1++);
        !          3574:        p2 = linebuf;
        !          3575:        p1 = genbuf;
        !          3576:        cnt = col = n = 0;
        !          3577:        while (c = *p1++) {
        !          3578:                if (c == tabc && col < maxtab) {
        !          3579:                        n = col;
        !          3580:                        c = tabfill;
        !          3581:                        if (c == '\t') {
        !          3582:                                n = col;
        !          3583:                                tabflg = 0;
        !          3584:                                while (n < maxtab) {
        !          3585:                                        if ((++n & 07) == 0) {
        !          3586:                                                *p2++ = c;
        !          3587:                                                tabflg++;
        !          3588:                                                if (p2 >=
        !          3589: #ifndef ALLOC
        !          3590:                                                    &linebuf[LBSIZE - 2]
        !          3591: #else
        !          3592:                                                    &linebuf[lbsize - 2]
        !          3593: #endif
        !          3594:                                                    || n >= TABS * BPW)
        !          3595:                                                        goto experr;
        !          3596:                                        }
        !          3597:                                        if (tabs[n >> BPWC] >> (n & BPWM) & 01)
        !          3598:                                                if (*p1 == tabc &&
        !          3599:                                                    n < maxtab) {
        !          3600:                                                        p1++;
        !          3601:                                                        cnt++;
        !          3602:                                                } else
        !          3603:                                                        break;
        !          3604:                                }
        !          3605:                                i = n;
        !          3606:                                if (tabflg)
        !          3607:                                        n &= 07;
        !          3608:                                else
        !          3609:                                        n -= col;
        !          3610:                                col = i;
        !          3611:                                while (n--) {
        !          3612:                                        *p2++ = ' ';
        !          3613: #ifndef ALLOC
        !          3614:                                        if (p2 >= &linebuf[LBSIZE - 2])
        !          3615: #else
        !          3616:                                        if (p2 >= &linebuf[lbsize - 2])
        !          3617: #endif
        !          3618:                                                goto experr;
        !          3619:                                }
        !          3620:                                cnt++;
        !          3621:                                continue;
        !          3622:                        }
        !          3623:                        do {
        !          3624:                                *p2++ = c;
        !          3625: #ifndef ALLOC
        !          3626:                                if (p2 >= &linebuf[LBSIZE - 2]
        !          3627: #else
        !          3628:                                if (p2 >= &linebuf[lbsize - 2]
        !          3629: #endif
        !          3630:                                    || n >= TABS * BPW)
        !          3631:                                        goto experr;
        !          3632:                                n++;
        !          3633:                        } while (!(tabs[n >> BPWC] >> (n & BPWM) & 01));
        !          3634:                        col = n;
        !          3635:                        cnt++;
        !          3636:                        continue;
        !          3637:                } else if ('\0' < c && c < ' ') {
        !          3638:                        switch (c) {
        !          3639:                        case '\b':
        !          3640:                                col -= 2;
        !          3641:                                break;
        !          3642:                        case '\t':
        !          3643:                                col += 7 - (col & 07);
        !          3644:                                break;
        !          3645:                        case '\r':
        !          3646:                                col = -1;
        !          3647:                                break;
        !          3648:                        default:
        !          3649:                                col--;
        !          3650:                        }
        !          3651:                }
        !          3652:                if (c) {
        !          3653:                        *p2++ = c;
        !          3654:                        col++;
        !          3655: #ifndef ALLOC
        !          3656:                        if (p2 >= &linebuf[LBSIZE - 2] ||
        !          3657: #else
        !          3658:                        if (p2 >= &linebuf[lbsize - 2] ||
        !          3659: #endif
        !          3660:                            col >= TABS * BPW)
        !          3661:        experr:                 errmsg(12);
        !          3662:                }
        !          3663:        }
        !          3664:        *p2++ = 0;
        !          3665:        return(cnt);
        !          3666: }
        !          3667: #endif
        !          3668: 
        !          3669: #ifdef DEBUG
        !          3670: #ifdef EXPDMP
        !          3671: expdmp() {
        !          3672:        register n;
        !          3673:        register char *ep, **p;
        !          3674:        register flag star;
        !          3675: 
        !          3676:        signal(SIGQIT, expdmp);
        !          3677:        ep = expbuf;
        !          3678:        putchar('"');
        !          3679:        if (circfl)
        !          3680:                putchar('^');
        !          3681:        while (*ep) {
        !          3682:                n = 0;
        !          3683:                star = 0;
        !          3684:                switch (*ep++) {
        !          3685:                case CCHR | STAR:
        !          3686:                        star++;
        !          3687:                case CCHR:
        !          3688:                        putchar(*ep++);
        !          3689:                        break;
        !          3690:                case CDOT | STAR:
        !          3691:                        star++;
        !          3692:                case CDOT:
        !          3693:                        putchar('.');
        !          3694:                        break;
        !          3695:                case CDOL:
        !          3696:                        putchar('$');
        !          3697:                        break;
        !          3698:                case CEOF:
        !          3699:                        putchar('"');
        !          3700:                        goto done;
        !          3701:                case NCCL | STAR:
        !          3702:                        star++;
        !          3703:                case NCCL:
        !          3704:                        n++;
        !          3705:                        goto ccl;
        !          3706:                case CCL | STAR:
        !          3707:                        star++;
        !          3708:                case CCL: ccl:
        !          3709:                        putchar('[');
        !          3710:                        if (n)
        !          3711:                                putchar('^');
        !          3712:                        n = *ep++;
        !          3713:                        while (--n)
        !          3714:                                putchar(*ep++);
        !          3715:                        putchar(']');
        !          3716:                        break;
        !          3717:                case CBRA:
        !          3718:                        putchar('\\');
        !          3719:                        putchar('(');
        !          3720:                        ep++;
        !          3721:                        break;
        !          3722:                case CKET:
        !          3723:                        putchar('\\');
        !          3724:                        putchar(')');
        !          3725:                        ep++;
        !          3726:                        break;
        !          3727:                case CBACK | STAR:
        !          3728:                        star++;
        !          3729:                case CBACK:
        !          3730:                        putchar('\\');
        !          3731:                        putchar(*ep++ + '1');
        !          3732:                        break;
        !          3733:                default:
        !          3734:                        putchar('?');
        !          3735:                        break;
        !          3736:                }
        !          3737:                if (star)
        !          3738:                        putchar('*');
        !          3739:        }
        !          3740: done:  putchar('\n');
        !          3741:        if (reading)
        !          3742:                reset();
        !          3743: }
        !          3744: #endif
        !          3745: #endif
        !          3746: 
        !          3747: filename() {
        !          3748:        register char *p1, *p2;
        !          3749:        register charac c;
        !          3750: 
        !          3751:        appflg = 0;
        !          3752:        c = getchar();
        !          3753:        if (c < 0)
        !          3754:                errmsg(59);
        !          3755:        if (c == '\n') {
        !          3756:     noname:
        !          3757:                if (savedfile[0] == 0)
        !          3758:                        errmsg(62);
        !          3759:                scopy(savedfile, file);
        !          3760:                return;
        !          3761:        }
        !          3762:        if (c != ' ' && c != '\t' && c != ',' && c != '>')
        !          3763:                errmsg(5);
        !          3764:        if (c != ',')
        !          3765:                peekc = c;
        !          3766:        white_space();
        !          3767:        if ((c = getchar()) == '>') {
        !          3768:                while ((c = getchar()) == '>');
        !          3769:                appflg++;
        !          3770:                if (c == '\n')
        !          3771:                        goto noname;
        !          3772:                peekc = c;
        !          3773:                white_space();
        !          3774:                c = getchar();
        !          3775:        }
        !          3776:        if (c == '\n')
        !          3777:                errmsg(7);
        !          3778:        p1 = file;
        !          3779:        do {
        !          3780:                *p1++ = c;
        !          3781:                if (p1 >= &file[FNSIZE - 2])
        !          3782:                        errmsg(11);
        !          3783:        } while ((c = getchar()) != '\n');
        !          3784:        *p1++ = 0;
        !          3785:        if (savedfile[0] == 0)
        !          3786:                scopy(file, savedfile);
        !          3787: }
        !          3788: 
        !          3789: linep *
        !          3790: findmark(alp, adflt)
        !          3791: linep alp, *adflt;
        !          3792: {
        !          3793:        register linep *a, v;
        !          3794: #ifdef HUGE
        !          3795:        register i;
        !          3796: 
        !          3797:        i = hugef ^ 01;
        !          3798: #endif
        !          3799:        v = alp;
        !          3800:        for (a = zero + 1; a <= dol; a++)
        !          3801:                if (v == (*a |
        !          3802: #ifdef HUGE
        !          3803:                                i
        !          3804: #else
        !          3805:                                1
        !          3806: #endif
        !          3807:                                ))
        !          3808:                        return(a);
        !          3809:        return(adflt);
        !          3810: }
        !          3811: 
        !          3812: flush_buf() {
        !          3813:        register n;
        !          3814: 
        !          3815:        if (n = linp - line) {
        !          3816:                linp = line;
        !          3817:                write(fout, line, n);
        !          3818:        }
        !          3819: }
        !          3820: 
        !          3821: #ifdef G_VFY
        !          3822: gask(a1)
        !          3823: linep *a1;
        !          3824: {
        !          3825:        register charac c;
        !          3826: 
        !          3827:        col = 0;
        !          3828:        printlno(line_num = a1 - zero);
        !          3829:        puts(linebuf);
        !          3830:        puts2("Ok? ");
        !          3831:        flush_buf();
        !          3832:        if ((c = getchar()) < 0) {
        !          3833:                putchar('\n');
        !          3834:                return(-1);
        !          3835:        }
        !          3836:        if (c == '\n')
        !          3837:                return(1);
        !          3838:        skip_rest();
        !          3839:        return(c != 'n');
        !          3840: }
        !          3841: #endif
        !          3842: 
        !          3843: char *
        !          3844: getblock(atl, iof) {
        !          3845:        extern read(), write();
        !          3846:        register bno, off;
        !          3847:        register linep *a;
        !          3848: #ifdef HUGE
        !          3849:        register flag c;
        !          3850:        register func savint;
        !          3851: 
        !          3852:        bno = (atl >> (8 - hugef)) & _3[hugef];
        !          3853:        off = (atl << (1 + hugef)) & _4[hugef];
        !          3854: #else
        !          3855:        bno = (atl >> 8) & _3;
        !          3856:        off = (atl << 1) & _4;
        !          3857: #endif
        !          3858:        if (bno >=
        !          3859: #ifdef HUGE
        !          3860:                   _5[hugef]
        !          3861: #else
        !          3862:                   _5
        !          3863: #endif
        !          3864:                            ) {
        !          3865: #ifdef HUGE
        !          3866:                if (!hugef && !globp) { /* let's try converting to huge */
        !          3867:                        if (!curt) {
        !          3868:                                putsn("File too large for normal editing.");
        !          3869:                                puts2("Conversion to \"huge\" mode disallows ");
        !          3870:                                puts2("use of the global command.");
        !          3871:                        }
        !          3872:                        c = yes_no(curt? "?huge" : "Do you wish to convert",
        !          3873:                            1, 0, 0);
        !          3874:                        if (c) {
        !          3875:                                savint = signal(SIGINT, 1);
        !          3876:                                for (a = zero + 1; a <= dol; a++)
        !          3877:                                        *a = ((unsigned)*a) >> 1;
        !          3878:                                hugef++;
        !          3879:                                hugef2++;       /* conversion occurred */
        !          3880:                                atl = (atl >> 1) & _6[hugef];
        !          3881: #ifdef XDEL
        !          3882:                                ndeleted = 0;   /* useless pointers */
        !          3883:                                deleted = 0;
        !          3884: #endif
        !          3885:                                signal(SIGINT, savint);
        !          3886:                                goto huger;
        !          3887:                        }
        !          3888:                }
        !          3889: #endif
        !          3890:                errmsg(34);
        !          3891:        }
        !          3892: #ifdef HUGE
        !          3893:     huger:
        !          3894: #endif
        !          3895:        nleft = BLKSIZE - off;
        !          3896:        if (bno == iblock && !badf) {
        !          3897:                ichanged |= iof;
        !          3898:                return(ibuff + off);
        !          3899:        }
        !          3900:        if (bno == oblock)
        !          3901:                return(obuff + off);
        !          3902:        if (iof == READ) {
        !          3903:                if (ichanged) {
        !          3904:                        blkio(iblock, ibuff, write);
        !          3905:                        ichanged = 0;
        !          3906:                }
        !          3907:                iblock = bno;
        !          3908:                blkio(bno, ibuff, read);
        !          3909:                return(ibuff + off);
        !          3910:        }
        !          3911:        if (oblock >= 0)
        !          3912:                blkio(oblock, obuff, write);
        !          3913:        oblock = bno;
        !          3914:        return(obuff + off);
        !          3915: }
        !          3916: 
        !          3917: charac
        !          3918: getchar() {
        !          3919:        flush_buf();
        !          3920:        eof = 0;
        !          3921:        if (lastc = peekc) {
        !          3922:                peekc = 0;
        !          3923:                return(lastc);
        !          3924:        }
        !          3925:        if (globp) {
        !          3926:                if (lastc = *globp++) {
        !          3927:                        if (globf2 && *globp == 0)
        !          3928:                                globp = globf2 = 0;
        !          3929:                        return(lastc);
        !          3930:                }
        !          3931:                globp = 0;
        !          3932:                return(EOF);
        !          3933:        }
        !          3934: #ifdef AGAIN
        !          3935:        if (agf
        !          3936: #ifdef USE
        !          3937:                && !alt
        !          3938: #endif
        !          3939:                        ) {     /* "again" stuff */
        !          3940:                if (lastc = *agp++)
        !          3941:                        return(lastc);
        !          3942:                agf = agp = 0;
        !          3943:        }
        !          3944: #endif
        !          3945:        reading++;
        !          3946: #ifdef USE
        !          3947:        if (read(alt, &lastc, 1) <= 0) {
        !          3948: #endif
        !          3949: #ifndef USE
        !          3950:        if (read(0, &lastc, 1) <= 0) {
        !          3951: #endif
        !          3952:                reading = 0;
        !          3953:                eof++;
        !          3954:                return(lastc = EOF);
        !          3955:        }
        !          3956:        reading = 0;
        !          3957:        lastc &= 0177;
        !          3958: #ifdef APLMAP
        !          3959:        if (aplmap && lastc > ' ')
        !          3960:                lastc = map_ascii[lastc - (' ' + 1)];
        !          3961: #endif
        !          3962: #ifdef EOL
        !          3963:        if (lastc == '\n')
        !          3964:                prompt3 = 1;
        !          3965:        else if (eol && lastc == eol) {
        !          3966:                lastc = '\n';
        !          3967:                prompt3 = 0;
        !          3968:        }
        !          3969: #endif
        !          3970: #ifdef CMDS
        !          3971:        if (cmd)
        !          3972:                write(cmd, &lastc, 1);
        !          3973: #endif
        !          3974:        eof = 0;
        !          3975:        return(echo(lastc));
        !          3976: }
        !          3977: 
        !          3978: getcopy() {
        !          3979:        if (addr1 > addr2)
        !          3980:                return(EOF);
        !          3981:        getline(*addr1++);
        !          3982:        return(0);
        !          3983: }
        !          3984: 
        !          3985: getfile() {
        !          3986:        register charac c;
        !          3987:        register char *lp, *fp;
        !          3988: 
        !          3989:        lp = linebuf;
        !          3990:        fp = nextip;
        !          3991:        do {
        !          3992:                if (--ninbuf < 0) {
        !          3993: #ifndef ALLOC
        !          3994:                        if ((ninbuf = read(io, genbuf, LBSIZE) - 1) < 0)
        !          3995: #else
        !          3996:                        if ((ninbuf = read(io, genbuf, lbsize) - 1) < 0)
        !          3997: #endif
        !          3998:                                if (lp == linebuf)
        !          3999:                                        return(EOF);
        !          4000:                                else {
        !          4001:                                        lp++;
        !          4002:                                        break;
        !          4003:                                }
        !          4004:                        fp = genbuf;
        !          4005:                }
        !          4006: #ifndef ALLOC
        !          4007:                if (lp >= &linebuf[LBSIZE - 2] && (*fp & 0177) != '\n') {
        !          4008: #else
        !          4009:                if (lp >= &linebuf[lbsize - 2] && (*fp & 0177) != '\n') {
        !          4010: #endif
        !          4011:                        printf((curt? "?long%u\n" : "line %u in file too long\n"),
        !          4012:                            dot - zero + 1);
        !          4013:                        flush_buf();
        !          4014:                        lp++;
        !          4015:                        ninbuf++;
        !          4016:                        break;
        !          4017:                }
        !          4018:                if ((*lp++ = c = *fp++ & 0177) == 0) {
        !          4019:                        lp--;
        !          4020:                        continue;
        !          4021:                }
        !          4022:        } while (c != '\n');
        !          4023:        *--lp = 0;
        !          4024:        nextip = fp;
        !          4025:        return(0);
        !          4026: }
        !          4027: 
        !          4028: getline(tl) {
        !          4029:        register char *bp, *lp;
        !          4030:        register nl;
        !          4031: 
        !          4032: #ifdef DEBUG
        !          4033:        if (tflg)
        !          4034:                printf("getline:\t%o\n", tl);
        !          4035: #endif
        !          4036:        lp = linebuf;
        !          4037:        bp = getblock(tl, READ);
        !          4038: #ifdef HUGE
        !          4039:        if (hugef2) {
        !          4040:                hugef2 = 0;
        !          4041:                tl = (tl >> 1) & _6[hugef];
        !          4042:        }
        !          4043:        tl &= _1[hugef];
        !          4044: #else
        !          4045:        tl &= _1;
        !          4046: #endif
        !          4047:        nl = nleft;
        !          4048:        while (*lp++ = *bp++)
        !          4049:                if (--nl <= 0) {
        !          4050: #ifdef HUGE
        !          4051:                        bp = getblock(tl += _2[hugef], READ);
        !          4052: #else
        !          4053:                        bp = getblock(tl += _2, READ);
        !          4054: #endif
        !          4055:                        nl = nleft;
        !          4056:                }
        !          4057:        return(linebuf);
        !          4058: }
        !          4059: 
        !          4060: getnum() {
        !          4061:        register n;
        !          4062:        register charac c;
        !          4063: 
        !          4064:        n = 0;
        !          4065:        while ('0' <= (c = getchar()) && c <= '9')
        !          4066:                n = n * 10 + c - '0';
        !          4067:        peekc = c;
        !          4068:        return(n);
        !          4069: }
        !          4070: 
        !          4071: getsnum() {
        !          4072:        register sign;
        !          4073: 
        !          4074:        if (sign = (peekc = getchar()) == '-')
        !          4075:                peekc = 0;
        !          4076:        return(sign? -getnum() : getnum());
        !          4077: }
        !          4078: 
        !          4079: getsub() {
        !          4080:        register char *p1, *p2;
        !          4081: 
        !          4082:        p1 = linebuf;
        !          4083:        if ((p2 = linebp) == 0)
        !          4084:                return(EOF);
        !          4085:        while (*p1++ = *p2++);
        !          4086:        linebp = 0;
        !          4087:        return(0);
        !          4088: }
        !          4089: 
        !          4090: gettty(single) {
        !          4091:        register charac c;
        !          4092:        register char *p, *gf;
        !          4093: #ifdef TABS
        !          4094:        int tabf;
        !          4095: 
        !          4096:        tabf = 0;
        !          4097: #endif
        !          4098:        p = linebuf;
        !          4099:        gf = globp;
        !          4100: #ifdef EOL
        !          4101:        if (prompt2 && prompt3 && !single) {
        !          4102: #endif
        !          4103: #ifndef EOL
        !          4104:        if (prompt2 && !single) {
        !          4105: #endif
        !          4106:                printlno(line_num);
        !          4107:                flush_buf();
        !          4108:        }
        !          4109:        line_num++;
        !          4110:        while ((c = getchar()) != '\n') {
        !          4111:                if (c < 0) {
        !          4112:                        if (gf)
        !          4113:                                peekc = c;
        !          4114:                        else if (prompt2 && (prompt1 || !zflg))
        !          4115:                                putchar('\n');
        !          4116:                        if (p > linebuf)
        !          4117:                                break;
        !          4118:                        return(c);
        !          4119:                }
        !          4120:                if ((c &= 0177) == 0)
        !          4121:                        continue;
        !          4122: #ifdef TABS
        !          4123:                if (tabc && c == tabc)
        !          4124:                        tabf++;
        !          4125: #endif
        !          4126:                *p++ = c;
        !          4127: #ifndef ALLOC
        !          4128:                if (p >= &linebuf[LBSIZE - 2])
        !          4129: #else
        !          4130:                if (p >= &linebuf[lbsize - 2])
        !          4131: #endif
        !          4132:                        errmsg(30);
        !          4133:        }
        !          4134:        *p++ = 0;
        !          4135: #ifdef TABS
        !          4136:        if (tabf)
        !          4137:                expand();
        !          4138: #endif
        !          4139:        if (!single && linebuf[0] == '.' && linebuf[1] == 0)
        !          4140:                return(EOF);
        !          4141:        return(0);
        !          4142: }
        !          4143: 
        !          4144: global(k) {
        !          4145:        register char *gp;
        !          4146:        register charac c;
        !          4147:        register linep *a1;
        !          4148:        register flag globpf;
        !          4149:        char globuf[GBSIZE];
        !          4150: 
        !          4151: #ifdef HUGE
        !          4152:        if (hugef)
        !          4153:                errmsg(10);
        !          4154: #endif
        !          4155:        if (globp)
        !          4156:                errmsg(37);
        !          4157:        setall();
        !          4158:        nonzero();
        !          4159:        if ((c = getchar()) == '\n')
        !          4160:                peekc = c;
        !          4161:        compile(c);
        !          4162: #ifdef G_VFY
        !          4163:        gaskf = 0;
        !          4164:        if ((peekc = getchar()) == 'v') {
        !          4165:                gaskf++;
        !          4166:                peekc = 0;
        !          4167:        }
        !          4168: #endif
        !          4169:        globpf = pflag;
        !          4170:        if (peekc == '\n')
        !          4171:                globpf = 0;
        !          4172:        pflag = 0;
        !          4173:        gp = globuf;
        !          4174:        if ((peekc = getchar()) < 0)
        !          4175:                errmsg(59);
        !          4176:        if (peekc == '\n') {
        !          4177:                *gp++ = 'p';
        !          4178:                peekc = 0;
        !          4179:        } else
        !          4180:                while ((c = getchar()) != '\n') {
        !          4181:                        if (c == '\\') {
        !          4182:                                c = getchar();
        !          4183:                                if (c != '\n')
        !          4184:                                        *gp++ = '\\';
        !          4185:                        }
        !          4186:                        if (c < 0)
        !          4187:                                errmsg(59);
        !          4188:                        *gp++ = c;
        !          4189:                        if (gp >= &globuf[GBSIZE - 2])
        !          4190:                                errmsg(38);
        !          4191:                }
        !          4192:        *gp++ = '\n';
        !          4193:        *gp = 0;
        !          4194:        c = 0;
        !          4195: #ifdef LOG
        !          4196: #ifdef G_VFY
        !          4197:        if (gaskf)
        !          4198:                ++logstats.lc_gvfy;
        !          4199: #endif
        !          4200:        if (k)
        !          4201:                ++logstats.lc_global;
        !          4202:        else
        !          4203:                ++logstats.lc_vglobal;
        !          4204: #endif
        !          4205:        for (a1 = zero + 1; a1 <= dol; a1++) {
        !          4206:                *a1 &= ~01;
        !          4207:                s_tmp = 0;
        !          4208:                if (a1 >= addr1 && a1 <= addr2 && execute(0, a1) == k)
        !          4209: #ifdef G_VFY
        !          4210:                        if (!gaskf || (c = gask(a1)))
        !          4211:                                if (c < 0)
        !          4212:                                        addr2 = a1;
        !          4213:                                else
        !          4214: #endif
        !          4215:                                        *a1 |= 01;
        !          4216:        }
        !          4217:        for (a1 = zero + 1; a1 <= dol; a1++)
        !          4218:                if (*a1 & 01) {
        !          4219:                        *a1 &= ~01;
        !          4220:                        dot = a1;
        !          4221:                        globp = globuf;
        !          4222:                        pflag = globpf;
        !          4223:                        commands(1);
        !          4224:                        a1 = zero;
        !          4225:                }
        !          4226: }
        !          4227: 
        !          4228: hangup() {
        !          4229:        signal(SIGHUP, 1);
        !          4230:        if (reading) {
        !          4231:                backup(HUP);
        !          4232:                if (fout != 1) {
        !          4233:                        flush_buf();
        !          4234:                        fout = 1;
        !          4235:                }
        !          4236:                puts2(errtext[57]);
        !          4237:                delexit(1);
        !          4238:        }
        !          4239:        hupflag++;
        !          4240: }
        !          4241: 
        !          4242: header() {
        !          4243:        register colnum, number;
        !          4244:        register flag lf;
        !          4245: 
        !          4246:        number = 0;
        !          4247:        if ((peekc = getchar()) != '\n') {
        !          4248:                white_space();
        !          4249:                number = getnum();
        !          4250:        }
        !          4251:        if (!number)
        !          4252:                number = ccount - (prompt1? 8 : 0);
        !          4253:        newline();
        !          4254:        if (zero != dol)
        !          4255:                dot = addr2;
        !          4256:        lf = listf;
        !          4257:        listf = 0;
        !          4258:        if (prompt1)
        !          4259:                putchar('\t');
        !          4260:        for (colnum = 0; colnum < number / 10; colnum++)
        !          4261:                printf("%10d", colnum + 1);
        !          4262:        putchar('\n');
        !          4263:        if (prompt1)
        !          4264:                putchar('\t');
        !          4265:        for (colnum = 1; colnum <= number; colnum++)
        !          4266: #ifdef TABS
        !          4267:                if (colnum < (TABS << BPWC) &&
        !          4268:                    (tabs[(colnum - 1) >> BPWC] >>
        !          4269:                    ((colnum - 1) & BPWM) & 01))
        !          4270:                        putchar('-');
        !          4271:                else
        !          4272: #endif
        !          4273:                        putchar(colnum % 10 + '0');
        !          4274:        putchar('\n');
        !          4275:        listf = lf;
        !          4276: }
        !          4277: 
        !          4278: init() {
        !          4279:        register n;
        !          4280:        register char *p;
        !          4281: 
        !          4282:        if (tfile > 0)
        !          4283:                close(tfile);
        !          4284:        if (io) {
        !          4285:                close(io);
        !          4286:                io = 0;
        !          4287:                io_w = 0;
        !          4288:        }
        !          4289: #ifdef HELP
        !          4290:        if (doc) {
        !          4291:                close(doc);
        !          4292:                doc = 0;
        !          4293:        }
        !          4294: #endif
        !          4295: #ifdef USE
        !          4296:        if (alt) {
        !          4297:                close(alt);
        !          4298:                alt = 0;
        !          4299:                eflg2 = 0;
        !          4300:        }
        !          4301: #endif
        !          4302: #ifdef PIPE
        !          4303:        if (pfile) {
        !          4304:                close(pfile);
        !          4305:                unlink(pfname);
        !          4306:                pfile = 0;
        !          4307:        }
        !          4308: #endif
        !          4309:        tline = 0;
        !          4310: #ifdef XDEL
        !          4311:        deleted = 0;
        !          4312:        ndeleted = 0;
        !          4313: #endif
        !          4314:        num_reads = 0;
        !          4315:        text_modified = 0;
        !          4316: #ifdef YINT
        !          4317:        yplus = 0;
        !          4318: #endif
        !          4319: #ifdef UNDO
        !          4320:        undo_oldp = 0;
        !          4321:        undo_newp = 0;
        !          4322: #endif
        !          4323: #ifdef V7
        !          4324:        if (overfile) {
        !          4325:                chmod(overfile, overmode);
        !          4326:                overfile = 0;
        !          4327:        }
        !          4328: #endif
        !          4329:        iblock = oblock = -1;
        !          4330:        badf = 0;
        !          4331:        ichanged = 0;
        !          4332:        if ((n = create(tfname, LMODE)) < 0) {
        !          4333:                putsn(errtext[50]);
        !          4334:                exit(1);
        !          4335:        }
        !          4336:        close(n);
        !          4337:        if ((tfile = open(tfname, 2)) < 0) {
        !          4338:                putsn(errtext[36]);
        !          4339:                exit(1);
        !          4340:        }
        !          4341:        addr1 = addr2 = dot = dotdot = lastdot = zero = dol = fendcore;
        !          4342:        endcore = fendcore - 2;
        !          4343:        brk(fendcore);
        !          4344:        n = 26;
        !          4345:        while (--n >= 0) {      /* kill marks */
        !          4346:                names[n] = 0;
        !          4347: #ifdef EXTMARK
        !          4348:                names2[n] = 0;
        !          4349: #endif
        !          4350:        }
        !          4351:        p = globp;
        !          4352:        globp = 0;
        !          4353:        if (chk()) {
        !          4354:                if ((io = open(file, 0)) < 0) {
        !          4355:                        io = 0;
        !          4356:                        lastc = '\n';
        !          4357:                        if (curt)
        !          4358:                                putsn("?53");
        !          4359:                        else {
        !          4360:                                puts2(errtext[53]);
        !          4361:                                putsn(file);
        !          4362:                        }
        !          4363:                        flush_buf();
        !          4364:                } else {
        !          4365:                        n = append(getfile, addr1, 0, 0);
        !          4366:                        if (prompt2)
        !          4367:                                printf((curt? prcntu : errtext[55]),
        !          4368:                                    n, (n == 1? null : quote_s));
        !          4369:                        if (n) {
        !          4370:                                num_reads++;
        !          4371:                                text_modified++;
        !          4372:                        }
        !          4373:                        if (io) {
        !          4374:                                close(io);
        !          4375:                                io = 0;
        !          4376:                                io_w = 0;
        !          4377:                        }
        !          4378:                }
        !          4379:                return(1);
        !          4380:        }
        !          4381:        globp = p;
        !          4382:        return(0);
        !          4383: }
        !          4384: 
        !          4385: istty(fd) {
        !          4386:        register r;
        !          4387:        short buf[3];   /* naughty int's */
        !          4388: 
        !          4389:        buf[2] = BS1;
        !          4390:        r = 0;
        !          4391:        if (gtty(fd, buf) >= 0)
        !          4392:                ++r;
        !          4393: #ifdef CLEAR
        !          4394:        zflg = (buf[2] & BS1) == 0;
        !          4395: #endif
        !          4396:        if (pipef
        !          4397: #ifdef V7
        !          4398:                  || getenv("_NO_STDIO_BUF")
        !          4399: #endif
        !          4400:                                            )
        !          4401:                ++r;
        !          4402:        return(r);
        !          4403: }
        !          4404: 
        !          4405: #ifdef XED
        !          4406: join() {
        !          4407:        register linep *a1;
        !          4408:        register char *p1, *p2;
        !          4409:        register charac c, ceof;
        !          4410: 
        !          4411:        setdot();
        !          4412:        nonzero();
        !          4413:        if (addr1 == addr2)
        !          4414:                --addr1;
        !          4415:        if (addr1 <= zero)
        !          4416:                errmsg(60);
        !          4417: 
        !          4418:        p2 = rhsbuf;
        !          4419:        if ((c = peekc = getchar()) < 0)
        !          4420:                errmsg(59);
        !          4421:        ceof = 0;
        !          4422:        if (peekc != '\n' && peekc != 'p' && peekc != 'l'
        !          4423: #ifdef PARENS
        !          4424:            && peekc != 'b'
        !          4425: #endif
        !          4426: #ifdef STRLEN
        !          4427:                            && peekc != 'q'
        !          4428: #endif
        !          4429:                                           ) {
        !          4430:                ceof = peekc;
        !          4431:                peekc = 0;
        !          4432:                while ((c = getchar()) != ceof && c != '\n') {
        !          4433:                        if (c < 0)
        !          4434:                                errmsg(59);
        !          4435:                        if (c == '\\')
        !          4436:                                if ((c = getchar()) == '\n')
        !          4437:                                        errmsg(46);
        !          4438:                        *p2++ = c;
        !          4439:                        if (p2 >= &rhsbuf[LBSIZE / 2 - 2])
        !          4440:                                errmsg(42);
        !          4441:                }
        !          4442:                if (c != '\n')
        !          4443:                        c = '\0';
        !          4444:                else
        !          4445:                        if (prompt2)
        !          4446:                                pflag++;
        !          4447:                if (p2 != rhsbuf)
        !          4448:                        *p2 = '\0';
        !          4449:                if (*rhsbuf == 0)
        !          4450:                        errmsg(27);
        !          4451: #ifdef LOG
        !          4452:                ++logstats.lc_jglue;
        !          4453: #endif
        !          4454:        }
        !          4455: #ifdef LOG
        !          4456:          else
        !          4457:                ++logstats.lc_join;
        !          4458: #endif
        !          4459:        peekc = c;
        !          4460:        newline();
        !          4461: 
        !          4462:        p1 = rhsbuf;
        !          4463:        while (*p1)
        !          4464:                if (*p1++ == '\n')
        !          4465:                        errmsg(46);
        !          4466: 
        !          4467:        p2 = genbuf;
        !          4468:        a1 = addr1;
        !          4469: 
        !          4470:        while (a1 <= addr2) {
        !          4471:                p1 = getline(*a1++);
        !          4472:                while (*p2++ = *p1++)
        !          4473: #ifndef ALLOC
        !          4474:                        if (p2 >= &genbuf[LBSIZE - 2])
        !          4475: #else
        !          4476:                        if (p2 >= &genbuf[lbsize - 2])
        !          4477: #endif
        !          4478:                                errmsg(12);
        !          4479:                --p2;
        !          4480:                if (ceof && a1 <= addr2) {
        !          4481:                        p1 = rhsbuf;
        !          4482:                        while (*p2++ = *p1++)
        !          4483: #ifndef ALLOC
        !          4484:                                if (p2 >= &genbuf[LBSIZE - 2])
        !          4485: #else
        !          4486:                                if (p2 >= &genbuf[lbsize - 2])
        !          4487: #endif
        !          4488:                                        errmsg(12);
        !          4489:                        --p2;
        !          4490:                }
        !          4491:        }
        !          4492:        *p2 = '\0';
        !          4493: 
        !          4494:        p1 = genbuf;
        !          4495:        p2 = linebuf;
        !          4496:        while (*p2++ = *p1++);
        !          4497: 
        !          4498:        a1 = putline();
        !          4499:        savemark(*addr1, a1);
        !          4500:        *addr1++ = a1;
        !          4501:        delete();
        !          4502:        dot = --addr1;
        !          4503:        if (dot > dol)
        !          4504:                dot = dol;
        !          4505: }
        !          4506: #endif
        !          4507: 
        !          4508: #ifdef TABS
        !          4509: listabs() {
        !          4510:        register n;
        !          4511: 
        !          4512:        if (maxtab < 0)
        !          4513:                errmsg(9);
        !          4514:        n = next_tab(-1);
        !          4515:        printf("tabs: %d", n + 1);
        !          4516:        while ((n = next_tab(n)) >= 0)
        !          4517:                printf(",%d", n + 1);
        !          4518:        putchar('\n');
        !          4519: }
        !          4520: #endif
        !          4521: 
        !          4522: mail() {
        !          4523:        delexit(1);
        !          4524: }
        !          4525: 
        !          4526: move(cflag) {
        !          4527:        extern getcopy();
        !          4528:        register linep *adt, *ad1, *ad2;
        !          4529: 
        !          4530:        setdot();
        !          4531:        nonzero();
        !          4532:        if ((adt = address()) == 0)
        !          4533:                errmsg(31);
        !          4534:        ad1 = addr1;
        !          4535:        ad2 = addr2;
        !          4536:        newline();
        !          4537:        if (cflag) {
        !          4538:                ad1 = dol;
        !          4539:                append(getcopy, ad1++, 0, 0);
        !          4540:                ad2 = dol;
        !          4541:        }
        !          4542:        ad2++;
        !          4543:        if (adt < ad1) {
        !          4544:                dot = adt + (ad2 - ad1);
        !          4545:                if (++adt == ad1)
        !          4546:                        return;
        !          4547:                reverse(adt, ad1);
        !          4548:                reverse(ad1, ad2);
        !          4549:                reverse(adt, ad2);
        !          4550:        } else if (adt >= ad2) {
        !          4551:                dot = adt++;
        !          4552:                reverse(ad1, ad2);
        !          4553:                reverse(ad2, adt);
        !          4554:                reverse(ad1, adt);
        !          4555:        } else
        !          4556:                errmsg(28);
        !          4557: }
        !          4558: 
        !          4559: newline() {
        !          4560:        register charac c;
        !          4561: 
        !          4562:        if ((c = getchar()) == '\n')
        !          4563:                return;
        !          4564:        if (c == 'p' || c == 'l'
        !          4565: #ifdef PARENS
        !          4566:                                 || c == 'b'
        !          4567: #endif
        !          4568: #ifdef STRLEN
        !          4569:                                             || c == 'q'
        !          4570: #endif
        !          4571:                                                        ) {
        !          4572:                pflag++;
        !          4573:                if (c == 'l')
        !          4574:                        listf++;
        !          4575: #ifdef PARENS
        !          4576:                else if (c == 'b')
        !          4577:                        parenf++;
        !          4578: #endif
        !          4579: #ifdef STRLEN
        !          4580:                else if (c == 'q')
        !          4581:                        quotef++;
        !          4582: #endif
        !          4583:                if (getchar() == '\n')
        !          4584:                        return;
        !          4585:        }
        !          4586:        errmsg(25);
        !          4587: }
        !          4588: 
        !          4589: #ifdef TABS
        !          4590: next_tab(acol) {
        !          4591:        register n;
        !          4592: 
        !          4593:        if ((n = acol) < maxtab) {
        !          4594:                do {
        !          4595:                        n++;
        !          4596:                } while (!(tabs[n >> BPWC] >> (n & BPWM) & 01));
        !          4597:                return(n);
        !          4598:        }
        !          4599:        return(-1);
        !          4600: }
        !          4601: #endif
        !          4602: 
        !          4603: nonzero() {
        !          4604:        if (addr1 <= zero)
        !          4605:                errmsg(23);
        !          4606:        if (addr2 > dol)
        !          4607:                errmsg(24);
        !          4608: }
        !          4609: 
        !          4610: #ifdef PIPE
        !          4611: oil_spilled() {
        !          4612:        if (!iflg) {
        !          4613:                signal(SIGINT, 1);
        !          4614:                signal(SIGQIT, 1);
        !          4615:        }
        !          4616:        signal(SIGPIP, 1);
        !          4617:        piperr++;
        !          4618: }
        !          4619: #endif
        !          4620: 
        !          4621: onintr() {
        !          4622:        register char *p1, *p2;
        !          4623: 
        !          4624:        signal(SIGINT, onintr);
        !          4625: #ifdef USE
        !          4626:        if (alt) {
        !          4627:                close(alt);
        !          4628:                alt = 0;
        !          4629:                eflg2 = 0;
        !          4630:        }
        !          4631: #endif
        !          4632:        if (io) {
        !          4633:                if (curt)
        !          4634:                        putsn("?intI/O");
        !          4635:                else {
        !          4636:                        puts2("\7Interrupted I/O!!!\7\nWarning: \"");
        !          4637:                        puts2(file);
        !          4638:                        if (io_w) {
        !          4639:                                putsn("\" is probably truncated.");
        !          4640:                                puts2("You should probably re-write it.");
        !          4641:                        } else {
        !          4642:                                putsn("\" was not read entirely.");
        !          4643:                                puts2("If you write the buffer, ");
        !          4644:                                puts2("part of the file may be lost.");
        !          4645:                        }
        !          4646:                }
        !          4647:                flush_buf();
        !          4648:        }
        !          4649: #ifdef EOL
        !          4650:        prompt3 = 1;
        !          4651: #endif
        !          4652:        if (fout != 1) {
        !          4653:                close(fout);
        !          4654:                fout = 1;
        !          4655:        }
        !          4656: #ifdef YINT
        !          4657:        if (!globp && reading && yflg) {
        !          4658:                globp = ".:\n";
        !          4659:                if (yplus) {
        !          4660:                        dot = findmark(yplus, 0);
        !          4661:                } else
        !          4662:                        globp++;
        !          4663:                peekc = 0;
        !          4664:                putchar('\n');
        !          4665:                commands(1);
        !          4666:                reset();
        !          4667:        }
        !          4668: #endif
        !          4669:        if (iflg) {
        !          4670:                signal(SIGINT, 1);
        !          4671:                backup(INT);
        !          4672:                delexit(1);
        !          4673:        }
        !          4674:        putchar(lastc = '\n');
        !          4675:        errmsg(29);
        !          4676: }
        !          4677: 
        !          4678: override() {
        !          4679:        struct stat s;
        !          4680: 
        !          4681:        if (access(file, 02) < 0) {
        !          4682:                if (stat(file, &s) >= 0 && (s.st_mode & S_IFMT) == S_IFREG) {
        !          4683:                        overmode = s.st_mode & 07777;
        !          4684:                        if (chmod(file, overmode) < 0)
        !          4685:                                return;
        !          4686:                        if (immflg == 0) {
        !          4687:                                if (curt) {
        !          4688:                                        puts2("?\"");
        !          4689:                                        puts2(file);
        !          4690:                                        puts2("\"  ");
        !          4691:                                } else {
        !          4692:                                        puts2("The file \"");
        !          4693:                                        puts2(file);
        !          4694:                                        puts2("\" is write-protected.");
        !          4695:                                }
        !          4696:                                if (yes_no(curt? "override" :
        !          4697:                                    "Do you wish to over-ride the permission",
        !          4698:                                    0, 1, 1))
        !          4699:                                        return;
        !          4700:                        }
        !          4701:                        overfile = file;
        !          4702:                        if (chmod(overfile, overmode | 0200) < 0)
        !          4703:                                overfile = 0;
        !          4704:                        else {
        !          4705:                                putsn("[over-riding]");
        !          4706: #ifdef LOG
        !          4707:                                ++logstats.lm_overwrite;
        !          4708: #endif
        !          4709:                        }
        !          4710:                }
        !          4711:        }
        !          4712: }
        !          4713: 
        !          4714: #ifdef PAGE
        !          4715: page() {
        !          4716:        register cl, n;
        !          4717:        register char *p, *pp;
        !          4718:        register linep *a, *b;
        !          4719:        register l;
        !          4720: 
        !          4721:        a = addr1;
        !          4722:        if (addr2 != addr1)
        !          4723:                b = addr2;
        !          4724:        else
        !          4725:                b = dol;
        !          4726: #ifdef PARENS
        !          4727:        parenc[0] = 0;
        !          4728:        parenc[1] = 0;
        !          4729:        parenc[2] = 0;
        !          4730: #endif
        !          4731:        for (n = pcount; n >= 0 && a <= b; n--) {
        !          4732:                pp = p = getline(*a);
        !          4733:                cl = prompt1? 8 : 0;
        !          4734:                l = 0;
        !          4735:                while (*p) {
        !          4736:                        if (*p < ' ' || *p > '~')
        !          4737:                                switch (*p) {
        !          4738:                                case '\b':
        !          4739:                                        if (listf)
        !          4740:                                                cl++;
        !          4741:                                        else {
        !          4742:                                                cl--;
        !          4743:                                                if (aflg
        !          4744: #ifdef PARENS
        !          4745:                                                         && !parenf
        !          4746: #endif
        !          4747: #ifdef STRLEN
        !          4748:                                                         && !quotef
        !          4749: #endif
        !          4750:                                                                   )
        !          4751:                                                        l++;
        !          4752:                                        }
        !          4753:                                        break;
        !          4754:                                case '\t':
        !          4755:                                        if (listf)
        !          4756:                                                cl++;
        !          4757:                                        else
        !          4758:                                                cl += 8 - cl % 8;
        !          4759:                                        break;
        !          4760:                                case '\r':
        !          4761:                                        if (listf)
        !          4762:                                                cl += 2;
        !          4763:                                        else
        !          4764:                                                cl = 0;
        !          4765:                                        break;
        !          4766:                                case ctrl('L'): /* ADM-3A's */
        !          4767:                                        if (listf)
        !          4768:                                                cl++;
        !          4769:                                        cl++;
        !          4770:                                        break;
        !          4771:                                default:
        !          4772:                                        if (listf || zflg)
        !          4773:                                                cl += 2;
        !          4774:                                }
        !          4775:                        else
        !          4776:                                cl++;
        !          4777: #ifdef PARENS
        !          4778:                        if (parenf && paren(*p))
        !          4779:                                l++;
        !          4780: #endif
        !          4781: #ifdef STRLEN
        !          4782:                        /* if (quotef && (*p == '"' || *p == '\'')) */
        !          4783:                        if (quotef && (quotec? *p == quotec :
        !          4784:                            *p == '"' || *p == '\''))
        !          4785:                                l++;
        !          4786: #endif
        !          4787:                        if (cl < 0)
        !          4788:                                cl = 0;
        !          4789:                        else if (cl > ccount) {
        !          4790:                                cl = 0;
        !          4791:                                if (--n < 0)
        !          4792:                                        goto done;
        !          4793:                        }
        !          4794:                        p++;
        !          4795:                }
        !          4796:                if (l)
        !          4797:                        if (--n < 0)
        !          4798:                                goto done;
        !          4799:                col = 0;
        !          4800:                printlno(line_num = a - zero);
        !          4801:                puts(pp);
        !          4802:                a++;
        !          4803:        }
        !          4804:     done:
        !          4805:        dot = a - 1;
        !          4806: }
        !          4807: #endif
        !          4808: 
        !          4809: #ifdef PARENS
        !          4810: paren(ac) {
        !          4811:        switch (ac) {
        !          4812:        case '(':       return(1);
        !          4813:        case '[':       return(2);
        !          4814:        case '{':       return(3);
        !          4815:        case ')':       return(-1);
        !          4816:        case ']':       return(-2);
        !          4817:        case '}':       return(-3);
        !          4818:        }
        !          4819:        return(0);
        !          4820: }
        !          4821: #endif
        !          4822: 
        !          4823: place(asp, al1, al2) {
        !          4824:        register char *sp, *l1, *l2;
        !          4825: 
        !          4826:        sp = asp;
        !          4827:        l1 = al1;
        !          4828:        l2 = al2;
        !          4829:        while (l1 < l2) {
        !          4830:                *sp++ = *l1++;
        !          4831: #ifndef ALLOC
        !          4832:                if (sp >= &genbuf[LBSIZE - 2])
        !          4833: #else
        !          4834:                if (sp >= &genbuf[lbsize - 2])
        !          4835: #endif
        !          4836:                        errmsg(42);
        !          4837:        }
        !          4838:        return(sp);
        !          4839: }
        !          4840: 
        !          4841: /*VARARGS*/
        !          4842: printf(as, aarglist)
        !          4843: char *as;
        !          4844: {
        !          4845:        register *args, w;
        !          4846:        register char *q;
        !          4847:        register flag f;
        !          4848: 
        !          4849:        args = &aarglist;
        !          4850:        while (*as) {
        !          4851:                if (*as != '%') {
        !          4852:                        putchar(*as++);
        !          4853:                        continue;
        !          4854:                }
        !          4855:                if (*++as == '\0')
        !          4856:                        return;
        !          4857:                w = 0;  /* no default width */
        !          4858:                f = 0;  /* unsigned default */
        !          4859:                while ('0' <= *as && *as <= '9')
        !          4860:                        w = w * 10 + *as++ - '0';
        !          4861:                if (*as == '\0')
        !          4862:                        return;
        !          4863:                switch (*as++) {
        !          4864:                case 'c':       /* char */
        !          4865:                        putchar(*args++);
        !          4866:                        continue;
        !          4867:                case 'd':       /* signed decimal */
        !          4868:                        f = 1;  /* signed */
        !          4869:                case 'u':       /* unsigned decimal */
        !          4870:                        printfn(*args++, 10, f, w);
        !          4871:                        continue;
        !          4872:                case 'o':       /* unsigned octal */
        !          4873:                        printfn(*args++, 8, 0, w);
        !          4874:                        continue;
        !          4875:                case 's':       /* string */
        !          4876:                        q = *args++;
        !          4877:                        while (*q) {
        !          4878:                                putchar(*q++);
        !          4879:                                --w;
        !          4880:                        }
        !          4881:                        while (--w > 0)
        !          4882:                                putchar(' ');
        !          4883:                        continue;
        !          4884:                default:
        !          4885:                        putchar(as[-1]);
        !          4886:                        continue;
        !          4887:                }
        !          4888:        }
        !          4889: }
        !          4890: 
        !          4891: printfn(an, ab, af, aw) {
        !          4892:        register w;
        !          4893:        register unsigned n;
        !          4894:        register char *p;
        !          4895:        char buf[(sizeof(int) != 2? 10 : 6) + 2];
        !          4896: 
        !          4897:        w = aw;
        !          4898:        p = &buf[sizeof buf];
        !          4899:        *--p = '\0';
        !          4900:        n = an;
        !          4901:        if (af)
        !          4902:                if (an < 0)
        !          4903:                        n = -an;
        !          4904:                else
        !          4905:                        af = 0;
        !          4906:        do {
        !          4907:                *--p = n % ab + '0';
        !          4908:                --w;
        !          4909:        } while (n /= ab);
        !          4910:        if (af) {
        !          4911:                *--p = '-';
        !          4912:                --w;
        !          4913:        }
        !          4914:        while (--w >= 0)
        !          4915:                putchar(' ');
        !          4916:        while (*p)
        !          4917:                putchar(*p++);
        !          4918: }
        !          4919: 
        !          4920: printlno(an) {
        !          4921:        register flag l;
        !          4922: 
        !          4923:        if (prompt1) {
        !          4924:                l = listf;
        !          4925:                listf = 0;
        !          4926:                printf(fmtlno, an - aflg);
        !          4927:                col = 8;
        !          4928:                listf = l;
        !          4929:        }
        !          4930: }
        !          4931: 
        !          4932: printmarks() {
        !          4933:        register linep *a1;
        !          4934:        register charac c;
        !          4935:        register n, i;
        !          4936: 
        !          4937: #ifdef HUGE
        !          4938:        i = hugef ^ 01;
        !          4939: #endif
        !          4940:        for (c = 'a' - 'a'; c <= 'z' - 'a'; c++) {
        !          4941:            if (names[c] == 0)  /* zap marks to deleted lines */
        !          4942:                continue;
        !          4943:            n = 0;
        !          4944:            for (a1 = zero + 1; a1 <= dol; a1++)
        !          4945:                if (names[c] == (*a1 |
        !          4946: #ifdef HUGE
        !          4947:                                        i
        !          4948: #else
        !          4949:                                        01
        !          4950: #endif
        !          4951:                                          )) {
        !          4952:                    n++;
        !          4953:                    printf("%c=%u", c + 'a', a1 - zero);
        !          4954: #ifdef EXTMARK
        !          4955:                    if (names2[c]) {
        !          4956:                        for (a1++; a1 <= dol; a1++)
        !          4957:                            if (names2[c] == (*a1 | 01)) {
        !          4958:                                printf(",%u", a1 - zero);
        !          4959:                                break;
        !          4960:                            }
        !          4961:                    }
        !          4962: #endif
        !          4963:                    putchar(' ');
        !          4964:                    break;
        !          4965:                }
        !          4966:            if (n == 0)
        !          4967:                names[c] = 0;   /* clear unknown marks */
        !          4968:        }
        !          4969:        putchar('\n');
        !          4970: }
        !          4971: 
        !          4972: putchar(ac)
        !          4973: charac ac;
        !          4974: {
        !          4975:        register char *lp;
        !          4976:        register charac c;
        !          4977: 
        !          4978:        lp = linp;
        !          4979:        c = ac;
        !          4980: #ifdef APLMAP
        !          4981:        if (aplmap && fout == 1 && c > ' ')
        !          4982:                c = map_apl[c - (' ' + 1)];
        !          4983: #endif
        !          4984:        if (listf) {
        !          4985:                if (++col >= ccount - 1) {
        !          4986:                        col = 1;
        !          4987:                        if (c != '\n') {
        !          4988:                                *lp++ = '\\';
        !          4989:                                *lp++ = '\n';
        !          4990:                        }
        !          4991:                }
        !          4992:                if (c == '\t') {
        !          4993:                        c = '>';
        !          4994:                        goto esc;
        !          4995:                }
        !          4996:                if (c == '\b') {
        !          4997:                        c = '<';
        !          4998:                esc:
        !          4999:                        *lp++ = '-';
        !          5000:                        *lp++ = '\b';
        !          5001:                        *lp++ = c;
        !          5002:                        goto out;
        !          5003:                }
        !          5004:                if (c < ' ' && c != '\n' || c == 0177) {
        !          5005:                        *lp++ = '^';
        !          5006:                        *lp++ = c ^ 0100;
        !          5007:                        col++;
        !          5008:                        goto out;
        !          5009:                }
        !          5010:        }
        !          5011:        *lp++ = c;
        !          5012: out:
        !          5013:        if (lp >= &line[TTSIZE]) {
        !          5014:                linp = line;
        !          5015:                write(fout, line, lp - line);
        !          5016:                return;
        !          5017:        }
        !          5018:        linp = lp;
        !          5019: }
        !          5020: 
        !          5021: putfile() {
        !          5022:        register char *fp, *lp;
        !          5023:        register nib;
        !          5024:        register linep *a1;
        !          5025: 
        !          5026:        nib = BLKSIZE;
        !          5027:        fp = genbuf;
        !          5028:        a1 = addr1;
        !          5029:        do {
        !          5030:                lp = getline(*a1++);
        !          5031:                for ever {
        !          5032:                        if (--nib < 0) {
        !          5033:                                wte(io, genbuf, fp - genbuf);
        !          5034:                                nib = BLKSIZE - 1;
        !          5035:                                fp = genbuf;
        !          5036:                        }
        !          5037:                        if ((*fp++ = *lp++) == 0) {
        !          5038:                                fp[-1] = '\n';
        !          5039:                                break;
        !          5040:                        }
        !          5041:                }
        !          5042:        } while (a1 <= addr2);
        !          5043:        wte(io, genbuf, fp - genbuf);
        !          5044: }
        !          5045: 
        !          5046: putline() {
        !          5047:        register char *bp, *lp;
        !          5048:        register nl, tl;
        !          5049: 
        !          5050:        lp = linebuf;
        !          5051:        tl = tline;
        !          5052: #ifdef DEBUG
        !          5053:        if (tflg)
        !          5054:                printf("putline:\t%o\n", tl);
        !          5055: #endif
        !          5056:        bp = getblock(tl, WRITE);
        !          5057: #ifdef HUGE
        !          5058:        if (hugef2) {
        !          5059:                hugef2 = 0;
        !          5060:                tl = tline = (tline >> 1) & _6[hugef];
        !          5061:        }
        !          5062:        tl &= _1[hugef];
        !          5063: #else
        !          5064:        tl &= _1;
        !          5065: #endif
        !          5066:        nl = nleft;
        !          5067:        while (*bp = *lp++) {
        !          5068:                if (*bp++ == '\n') {
        !          5069:                        *--bp = 0;
        !          5070:                        linebp = lp;
        !          5071:                        break;
        !          5072:                }
        !          5073:                if (--nl <= 0) {
        !          5074: #ifdef HUGE
        !          5075:                        bp = getblock(tl += _2[hugef], WRITE);
        !          5076: #else
        !          5077:                        bp = getblock(tl += _2, WRITE);
        !          5078: #endif
        !          5079:                        nl = nleft;
        !          5080:                }
        !          5081:        }
        !          5082:        nl = tline;
        !          5083: #ifdef HUGE
        !          5084:        tline += (((lp - linebuf) + 03) >> (1 + hugef)) & _6[hugef];
        !          5085: #else
        !          5086:        tline += (((lp - linebuf) + 03) >> 1) & _6;
        !          5087: #endif
        !          5088:        return(nl);
        !          5089: }
        !          5090: 
        !          5091: #ifdef PARENS
        !          5092: putparen(an) {
        !          5093:        register c;
        !          5094: 
        !          5095:        an %= 10 + 26 + 26;
        !          5096:        if (an < 0)
        !          5097:                an += 10 + 26 + 26;
        !          5098:        c = '0';
        !          5099:        if (an > 9 + 26)
        !          5100:                c = 'a' - (10 + 26);
        !          5101:        else if (an > 9)
        !          5102:                c = 'A' - 10;
        !          5103:        putchar(c + an);
        !          5104: }
        !          5105: #endif
        !          5106: 
        !          5107: puts(as) {
        !          5108:        register n;
        !          5109:        register flag ovp;
        !          5110:        register char *sp, *s;
        !          5111: 
        !          5112:        sp = as;
        !          5113:        ovp = 0;
        !          5114:        while (*sp) {
        !          5115:                if (aflg &&
        !          5116: #ifdef PARENS
        !          5117:                            !parenf &&
        !          5118: #endif
        !          5119: #ifdef STRLEN
        !          5120:                                       !quotef &&
        !          5121: #endif
        !          5122:                                                  !listf && *sp == '\b') {
        !          5123:                        ovp = 1;
        !          5124:                        sp += 2;
        !          5125:                        continue;
        !          5126:                }
        !          5127: #ifdef PARENS
        !          5128:                if (!ovp && parenf && !listf && paren(*sp))
        !          5129:                        ovp = 1;
        !          5130: #endif
        !          5131: #ifdef STRLEN
        !          5132:        /* if (!ovp && quotef && !listf && (*sp == '"' || *sp == '\'')) */
        !          5133:                if (!ovp && quotef && !listf && (
        !          5134:                    quotec? *sp == quotec : *sp == '"' || *sp == '\''))
        !          5135:                        ovp = 1;
        !          5136: #endif
        !          5137:                putchar(*sp++);
        !          5138:        }
        !          5139:        sp = as;
        !          5140:        if (aflg && ovp &&
        !          5141: #ifdef PARENS
        !          5142:                           !parenf &&
        !          5143: #endif
        !          5144: #ifdef STRLEN
        !          5145:                                      !quotef &&
        !          5146: #endif
        !          5147:                                                 !listf) {
        !          5148:                putchar('\n');
        !          5149:                if (prompt1)
        !          5150:                        putchar('\t');
        !          5151:                for (; *sp; sp++)
        !          5152:                        if (sp[1] == '\b' && sp[2]) {
        !          5153:                                putchar(sp[2]);
        !          5154:                                sp += 2;
        !          5155:                        } else if (*sp == '\t')
        !          5156:                                putchar('\t');
        !          5157:                        else if (*sp >= ' ')
        !          5158:                                putchar(' ');
        !          5159:                ovp = 0;
        !          5160:        }
        !          5161: #ifdef PARENS
        !          5162:        if (parenf && ovp && !listf) {
        !          5163:                putchar('\n');
        !          5164:                if (prompt1)
        !          5165:                        putchar('\t');
        !          5166:                for (; *sp; sp++)
        !          5167:                        if (n = paren(*sp)) {
        !          5168:                                if (n < 0) {
        !          5169:                                        n = -n - 1;
        !          5170:                                        putparen(parenc[n]--);
        !          5171:                                } else
        !          5172:                                        putparen(++parenc[--n]);
        !          5173:                        } else if (*sp == '\t' || *sp >= ' ')
        !          5174:                                putchar(*sp == '\t'? '\t' : ' ');
        !          5175:                ovp = 0;
        !          5176:        }
        !          5177: #endif
        !          5178: #ifdef STRLEN
        !          5179:        if (quotef && ovp && !listf) {
        !          5180:                s = null;
        !          5181:                n = 0;
        !          5182:                ovp = 0;
        !          5183:                putchar('\n');
        !          5184:                if (prompt1)
        !          5185:                        putchar('\t');
        !          5186:                for (; *sp; sp++) {
        !          5187:                /* if (n == 0 && (*sp == '"' || *sp == '\'') || */
        !          5188:                        if (n == 0 && (quotec? *sp == (ovp?
        !          5189:                            quotec : quotec2) : *sp == '"' || *sp == '\'') ||
        !          5190:                            *sp == n) {
        !          5191:                                if (ovp) {
        !          5192:                                        ovp = 0;
        !          5193:                                        goto not;
        !          5194:                                }
        !          5195:                                if (n)
        !          5196:                                        n = 0;
        !          5197:                                else {
        !          5198:                                        s = sp++;
        !          5199:                                        n = 0;
        !          5200:                                        while (*sp && *sp != *s) {
        !          5201:                                                if (*sp == '\\') {
        !          5202:                                                  if ('0' <= *++sp && *sp <= '7') {
        !          5203:                                                    if ('0' <= *++sp && *sp <= '7') 
        !          5204:                                                      if ('0' <= *++sp && *sp <= '7') 
        !          5205:                                                        sp++;
        !          5206:                                                  } else
        !          5207:                                                        sp++;
        !          5208:                                                } else
        !          5209:                                                        sp++;
        !          5210:                                                n++;
        !          5211:                                        }
        !          5212:                                        sp = s;
        !          5213:                                        s = &"00000"[5];
        !          5214:                                        do {
        !          5215:                                                *--s = n % 10 + '0';
        !          5216:                                        } while (n /= 10);
        !          5217:                                        n = *sp;
        !          5218:                                }
        !          5219:                        }
        !          5220:     not:               if (*s)
        !          5221:                                putchar(*s++);
        !          5222:                        else
        !          5223:                                putchar(*sp == '\t'? '\t' : ' ');
        !          5224:                        if (*sp == '\\')
        !          5225:                                ovp ^= 01;
        !          5226:                }
        !          5227:                ovp = 0;
        !          5228:        }
        !          5229: #endif
        !          5230:        putchar('\n');
        !          5231: }
        !          5232: 
        !          5233: puts2(as) {
        !          5234:        register char *sp;
        !          5235: 
        !          5236:        sp = as;
        !          5237:        while (*sp)
        !          5238:                putchar(*sp++);
        !          5239: }
        !          5240: 
        !          5241: #ifdef CKPT
        !          5242: recover() {
        !          5243:        extern etext;
        !          5244:        register filedes f;
        !          5245:        register char *p;
        !          5246:        register func savint, savqit;
        !          5247:        int n;
        !          5248: 
        !          5249:        savint = signal(SIGINT, 1);
        !          5250:        savqit = signal(SIGQIT, 1);
        !          5251:        if ((f = open(cfname, 0)) < 0 ||
        !          5252:            read(f, &n, sizeof n) != sizeof n) {
        !          5253:                n = 67;
        !          5254:                goto cerror;
        !          5255:        }
        !          5256:        p = &etext;
        !          5257:        if (brk(p + n) == -1) {
        !          5258:                n = 67;
        !          5259:                goto cerror;
        !          5260:        }
        !          5261: #ifdef pdp11   /* 16 bit byte count only */
        !          5262:        if (n < 0) {
        !          5263:                if (read(f, p, 32256) != 32256) {
        !          5264:                        n = 67;
        !          5265:                        goto cerror;
        !          5266:                }
        !          5267:                n -= 32256;     /* 63 blocks, since 64 is < 0 */
        !          5268:                p += 32256;
        !          5269:        }
        !          5270: #endif
        !          5271:        if (read(f, p, n) != n ||
        !          5272:            (tfile = open(tfname, 2)) < 0)
        !          5273:                n = 67;
        !          5274:        else
        !          5275:                n = 0;
        !          5276:        recovry = 1;    /* overwritten by reading data space */
        !          5277:     cerror:
        !          5278:        if (n) {
        !          5279:                puts(errtext[n]);
        !          5280:                exit(1);
        !          5281:        }
        !          5282:        if (f > 0)
        !          5283:                close(f);
        !          5284: 
        !          5285:        /*
        !          5286:         * "initialize" special stuff to restore order
        !          5287:         */
        !          5288: 
        !          5289:        globp = 0;
        !          5290:        io = 0;
        !          5291:        io_w = 0;
        !          5292: #ifdef HELP
        !          5293:        doc = 0;
        !          5294: #endif
        !          5295: #ifdef USE
        !          5296:        alt = 0;
        !          5297: #endif
        !          5298: #ifdef AGAIN
        !          5299:        agf = 0;
        !          5300:        agp = 0;
        !          5301: #endif
        !          5302: #ifdef EOL
        !          5303:        prompt3 = 1;
        !          5304: #endif
        !          5305: #ifdef PIPE
        !          5306:        if (pfile) {
        !          5307:                unlink(pfname);
        !          5308:                pfile = 0;
        !          5309:        }
        !          5310: #endif
        !          5311: 
        !          5312:        signal(SIGINT, savint);
        !          5313:        signal(SIGQIT, savqit);
        !          5314: }
        !          5315: #endif
        !          5316: 
        !          5317: reverse(aa1, aa2) {
        !          5318:        register linep *a1, *a2, t;
        !          5319: 
        !          5320:        a1 = aa1;
        !          5321:        a2 = aa2;
        !          5322:        for ever {
        !          5323:                t = *--a2;
        !          5324:                if (a2 <= a1)
        !          5325:                        return;
        !          5326:                *a2 = *a1;
        !          5327:                *a1++ = t;
        !          5328:        }
        !          5329: }
        !          5330: 
        !          5331: #ifdef XDEL
        !          5332: saveline() {
        !          5333:        register linep *a1, *a2, *bp;
        !          5334:        register nl, tl;
        !          5335: 
        !          5336:        a1 = addr1;
        !          5337:        a2 = addr2;
        !          5338:        ndeleted = a2 - a1 + 1;
        !          5339:        tl = tline;
        !          5340: #ifdef DEBUG
        !          5341:        if (tflg)
        !          5342:                printf("saveline:\t%o\n", tl);
        !          5343: #endif
        !          5344:        bp = getblock(tl, WRITE);
        !          5345: #ifdef HUGE
        !          5346:        if (hugef2) {
        !          5347:                hugef2 = 0;
        !          5348:                tl = (tl >> 1) & _6[hugef];
        !          5349:        }
        !          5350:        tl &= _1[hugef];
        !          5351: #else
        !          5352:        tl &= _1;
        !          5353: #endif
        !          5354:        nl = nleft / sizeof(linep);
        !          5355:        while (a1 <= a2) {
        !          5356:                *bp++ = *a1++;
        !          5357:                if (--nl <= 0) {
        !          5358: #ifdef HUGE
        !          5359:                        bp = getblock(tl += _2[hugef], WRITE);
        !          5360:                        if (hugef2) {
        !          5361:                                hugef2 = 0;
        !          5362:                                tl = (tl >> 1) & _6[hugef];
        !          5363:                        }
        !          5364: #else
        !          5365:                        bp = getblock(tl += _2, WRITE);
        !          5366: #endif
        !          5367:                        nl = nleft / sizeof(linep);
        !          5368:                }
        !          5369:        }
        !          5370:        deleted = tline;
        !          5371: #ifdef HUGE
        !          5372:        tline += ((a2 - addr1 + 1) << (1 - hugef)) & _6[hugef];
        !          5373: #else
        !          5374:        tline += ((a2 - addr1 + 1) << 1) & _6;
        !          5375: #endif
        !          5376: }
        !          5377: #endif
        !          5378: 
        !          5379: savemark(p1, p2)
        !          5380: linep p1, p2;
        !          5381: {
        !          5382:        register n;
        !          5383: #ifdef HUGE
        !          5384:        register i;
        !          5385: 
        !          5386:        i = hugef ^ 01;
        !          5387:        p1 |= i;
        !          5388:        p2 |= i;
        !          5389: #else
        !          5390:        p1 |= 01;
        !          5391:        p2 |= 01;
        !          5392: #endif
        !          5393:        /* save "marks" on lines so marked */
        !          5394:        for (n = 0; n <= 'z' - 'a'; n++) {
        !          5395:                if (names[n] == 0)      /* zap marks to deleted lines */
        !          5396:                        continue;
        !          5397:                if (names[n] == p1)
        !          5398:                        names[n] = p2;
        !          5399: #ifdef EXTMARK
        !          5400:                if (names2[n] && names2[n] == p1)
        !          5401:                        names2[n] = p2;
        !          5402: #endif
        !          5403:        }
        !          5404: #ifdef YINT
        !          5405:        /* don't lose "y+" line either */
        !          5406:        if (yplus == p1)
        !          5407:                yplus = p2;
        !          5408: #endif
        !          5409: #ifdef UNDO
        !          5410:        /* and remember the line for "undo" */
        !          5411:        undo_oldp = p1;
        !          5412:        undo_newp = p2;
        !          5413: #endif
        !          5414: }
        !          5415: 
        !          5416: scopy(ass, ads)
        !          5417: char *ass, *ads;
        !          5418: {
        !          5419:        register char *p, *q;
        !          5420: 
        !          5421:        p = ass;
        !          5422:        q = ads;
        !          5423:        while (*q++ = *p++)
        !          5424:                ;
        !          5425:        return(ads);
        !          5426: }
        !          5427: 
        !          5428: setall() {
        !          5429:        if (addr2 == 0) {
        !          5430:                addr1 = zero + (zero != dol);
        !          5431:                addr2 = dol;
        !          5432:        }
        !          5433:        setdot();
        !          5434: }
        !          5435: 
        !          5436: setchar(adflt) {
        !          5437:        register charac c;
        !          5438: 
        !          5439:        if ((c = getchar()) == '\\')
        !          5440:                c = getchar();
        !          5441:        if (c < 0)
        !          5442:                errmsg(59);
        !          5443:        if (c == '\n')
        !          5444:                return(adflt);
        !          5445:        newline();
        !          5446:        return(c);
        !          5447: }
        !          5448: 
        !          5449: setdot() {
        !          5450:        if (addr2 == 0)
        !          5451:                addr1 = addr2 = dot;
        !          5452:        if (addr1 > addr2)
        !          5453:                errmsg(21);
        !          5454: }
        !          5455: 
        !          5456: setnoaddr() {
        !          5457:        if (addr2)
        !          5458:                errmsg(22);
        !          5459: }
        !          5460: 
        !          5461: setnum(adflt) {
        !          5462:        register n;
        !          5463: 
        !          5464:        white_space();
        !          5465:        n = adflt;
        !          5466:        if ('0' <= (peekc = getchar()) && peekc <= '9')
        !          5467:                n = getnum();
        !          5468:        newline();
        !          5469:        return(n);
        !          5470: }
        !          5471: 
        !          5472: #ifdef TABS
        !          5473: settab(acs) {
        !          5474:        register *p, i, n;
        !          5475: 
        !          5476:        if (acs == 0) {
        !          5477:                maxtab = -1;
        !          5478:                n = TABS;
        !          5479:                p = tabs;
        !          5480:                while (--n >= 0)
        !          5481:                        *p++ = 0;
        !          5482:                return;
        !          5483:        }
        !          5484:        i = 0;
        !          5485:        if (acs < 0) {
        !          5486:                acs = -acs;
        !          5487:                i++;
        !          5488:        }
        !          5489:        if (--acs < TABS * BPW) {
        !          5490:                p = &tabs[acs >> BPWC];
        !          5491:                *p |= 01 << (n = acs & BPWM);
        !          5492:                if (i) {
        !          5493:                        *p ^= 01 << n;
        !          5494:                        if (acs == maxtab) {    /* find new maxtab */
        !          5495:                                for (n = TABS - 1; n >= 0; --n)
        !          5496:                                        if (tabs[n >> BPWC] >> (n & BPWM) & 01)
        !          5497:                                                break;
        !          5498:                                maxtab = n;
        !          5499:                        }
        !          5500:                } else if (acs > maxtab)
        !          5501:                        maxtab = acs;
        !          5502:        }
        !          5503: }
        !          5504: #endif
        !          5505: 
        !          5506: shell() {
        !          5507: #ifdef PIPE
        !          5508:        extern oil_spilled();
        !          5509: #endif
        !          5510:        register pid, wpid;
        !          5511:        register linep *a;
        !          5512:        register dp, df, nopipe, c, e, savint, savqit;
        !          5513:        register linep *dest;
        !          5514:        int retcode, p[2];
        !          5515: 
        !          5516: #ifdef PIPE
        !          5517:        dp = 0;
        !          5518:        df = 0;
        !          5519:        if (addr2) {
        !          5520: #ifdef LOG
        !          5521:                ++logstats.lc_pipe;
        !          5522: #endif
        !          5523:                dest = 0;
        !          5524:                nopipe = 0;
        !          5525:                if ((peekc = getchar()) == '|') {
        !          5526:                        nonzero();
        !          5527:                        peekc = 0;
        !          5528:                        dp++;
        !          5529:                        df++;
        !          5530: #ifdef LOG
        !          5531:                        --logstats.lc_pipe;
        !          5532:                        ++logstats.lc_dpipe;
        !          5533: #endif
        !          5534:                }
        !          5535:                if ((peekc = getchar()) == '>') {
        !          5536:                        nonzero();
        !          5537: #ifdef LOG
        !          5538:                        --logstats.lc_pipe;
        !          5539:                        ++logstats.lc_pto;
        !          5540: #endif
        !          5541:                        goto pi;
        !          5542:                } else if ((peekc = getchar()) == '<') {
        !          5543:                        nopipe++;
        !          5544: #ifdef LOG
        !          5545:                        --logstats.lc_pipe;
        !          5546:                        ++logstats.lc_pfrom;
        !          5547: #endif
        !          5548:     pi:                        peekc = 0;
        !          5549:                        dp++;
        !          5550:                        dest = addr2;
        !          5551:                }
        !          5552:                if (dp && '0' <= (peekc = getchar()) && peekc <= '9') {
        !          5553:                        c = getnum();
        !          5554:                        dest = zero + c;
        !          5555:                        if (dest < zero)
        !          5556:                                dest = zero + 1;
        !          5557:                        if (dest > dol)
        !          5558:                                dest = dol;
        !          5559:                }
        !          5560:        }
        !          5561: #ifdef LOG
        !          5562:          else
        !          5563:                ++logstats.lc_shell;
        !          5564: #endif
        !          5565:        piperr = 0;
        !          5566:        if (!iflg)
        !          5567:                if (addr2) {
        !          5568:                        savint = signal(SIGINT, oil_spilled);
        !          5569:                        savqit = signal(SIGQIT, oil_spilled);
        !          5570:                } else {
        !          5571: #endif
        !          5572:                        savint = signal(SIGINT, 1);
        !          5573:                        savqit = signal(SIGQIT, 1);
        !          5574: #ifdef PIPE
        !          5575:                }
        !          5576:        if (addr2 && pipe(p) < 0) {
        !          5577:                c = 15;
        !          5578:     errm:      if (!iflg) {
        !          5579:                        signal(SIGINT, savint);
        !          5580:                        signal(SIGQIT, savqit);
        !          5581:                }
        !          5582:                if (c)
        !          5583:                        errmsg(c);
        !          5584:                error();
        !          5585:        }
        !          5586:        if (dp) {
        !          5587:                if ((pfile = create(pfname, LMODE)) < 0) {
        !          5588:                        pfile = 0;
        !          5589:                        c = 64;
        !          5590:                        goto errm;
        !          5591:                }
        !          5592:                if ((io = open(pfname, 0)) < 0) {
        !          5593:                        io = 0;
        !          5594:                        c = 65;
        !          5595:                        goto errm;
        !          5596:                }
        !          5597:        }
        !          5598: #endif
        !          5599:        if ((pid = fork()) < 0) {
        !          5600: #ifdef PIPE
        !          5601:                if (addr2) {
        !          5602:                        close(p[0]);
        !          5603:                        close(p[1]);
        !          5604:                }
        !          5605: #endif
        !          5606:                c = 14;
        !          5607:                goto errm;
        !          5608:        }
        !          5609:        if (pid == 0) {
        !          5610: /* kid */      if (!iflg) {
        !          5611: /* kid */              signal(SIGHUP, 0);
        !          5612: /* kid */              signal(SIGINT, 0);
        !          5613: /* kid */              signal(SIGQIT, 0);
        !          5614: /* kid */      }
        !          5615: #ifdef PIPE
        !          5616: /* kid */      if (addr2) {
        !          5617: /* kid */              close(0);
        !          5618: /* kid */              dup(p[0]);
        !          5619: /* kid */              close(p[0]);
        !          5620: /* kid */              close(p[1]);
        !          5621: /* kid */              if (dp) {
        !          5622: /* kid */                      close(1);
        !          5623: /* kid */                      dup(pfile);
        !          5624: /* kid */                      close(pfile);
        !          5625: /* kid */              }
        !          5626: /* kid */      }
        !          5627: #endif
        !          5628: /* kid */      execl("/bin/sh", "!sh", "-t", 0);
        !          5629: /* kid */      write(2, "No shell!\n", 10);
        !          5630: /* kid */      exit(0177);
        !          5631:        }
        !          5632: #ifdef CMDS
        !          5633:        if (cmd && !addr2)
        !          5634:                write(cmd, "<UNIX>\n", 7);
        !          5635: #endif
        !          5636: #ifdef PIPE
        !          5637:        if (addr2) {
        !          5638:                signal(SIGPIP, oil_spilled);
        !          5639:                close(p[0]);
        !          5640:                e = eflg2;
        !          5641:                eflg2++;
        !          5642:                fout = p[1];
        !          5643:                while ((c = getchar()) >= 0 && c != '\n')
        !          5644:                        putchar(c);
        !          5645:                putchar('\n');
        !          5646:                if (!nopipe) {
        !          5647:                        line_num = (a = addr1) - zero - aflg;
        !          5648:                        do {
        !          5649:                                if (pno >= 0)
        !          5650:                                        printlno(line_num++);
        !          5651:                                puts(getline(*a++));
        !          5652:                        } while (a <= addr2 && !piperr);
        !          5653:                }
        !          5654:                flush_buf();
        !          5655:                fout = 1;
        !          5656:                eflg2 = e;
        !          5657:                close(p[1]);
        !          5658:                if (!iflg) {
        !          5659:                        signal(SIGINT, 1);
        !          5660:                        signal(SIGQIT, 1);
        !          5661:                }
        !          5662:        }
        !          5663: #endif
        !          5664:        while ((wpid = wait(&retcode)) != pid && wpid >= 0);
        !          5665: #ifdef CMDS
        !          5666:        if (cmd)
        !          5667:                lseek(cmd, 0L, 2);
        !          5668: #endif
        !          5669: #ifdef PIPE
        !          5670:        if (addr2)
        !          5671:                signal(SIGPIP, 0);
        !          5672: #endif
        !          5673:        if (c = retcode & 0177) {
        !          5674:                if (0 < c && c < NSTR && status[c])
        !          5675:                        puts2(status[c]);
        !          5676:                else
        !          5677:                        printf("signal %d", c);
        !          5678:                if (retcode & 0200)
        !          5679:                        puts2(" -- core dumped");
        !          5680:                putchar(lastc = '\n');
        !          5681:                c = 0;
        !          5682:                goto errm;
        !          5683:        } else if (df && strict && retcode >> 8) {
        !          5684:                printf("exit status %d\n", retcode >> 8);
        !          5685:                c = 0;
        !          5686:                goto errm;
        !          5687:        }
        !          5688: #ifdef PIPE
        !          5689:          else if (addr2) {
        !          5690:                if (piperr) {
        !          5691:                        putsn(status[SIGPIP]);
        !          5692:                        c = 0;
        !          5693:                        goto errm;
        !          5694:                }
        !          5695:                if (dp) {
        !          5696:                        if (df) {
        !          5697:                                c = addr2 != dol;
        !          5698:                                delete();
        !          5699:                                if (dest == 0)
        !          5700:                                        dest = dot - c;
        !          5701:                        } else if (dest == 0)
        !          5702:                                dest = addr2;
        !          5703:                        if (dest < zero)
        !          5704:                                dest = zero;
        !          5705:                        if (c = append(getfile, dest, 0, 0))
        !          5706:                                text_modified++;
        !          5707:                        if (prompt2)
        !          5708:                                printf((curt? prcntu : errtext[55]),
        !          5709:                                    c, (c == 1? null : quote_s));
        !          5710:                        close(io);
        !          5711:                        io = 0;
        !          5712:                        unlink(pfname);
        !          5713:                        close(pfile);
        !          5714:                        pfile = 0;
        !          5715:                }
        !          5716:        }
        !          5717: #endif
        !          5718:        if (!iflg) {
        !          5719:                signal(SIGINT, savint);
        !          5720:                signal(SIGQIT, savqit);
        !          5721:        }
        !          5722:        if (!addr2)
        !          5723:                putsn("!");
        !          5724: #ifdef CLEAR
        !          5725:        istty(1);       /* in case bs1 changed */
        !          5726: #endif
        !          5727: }
        !          5728: 
        !          5729: signals(ast)
        !          5730: struct sigtab *ast;
        !          5731: {
        !          5732:        register n;
        !          5733:        register struct sigtab *s;
        !          5734: 
        !          5735:        s = ast - 1;
        !          5736:        while (n = (++s)->s_sig)
        !          5737:                signal(n, s->s_func);
        !          5738: }
        !          5739: 
        !          5740: skip_rest() {
        !          5741:        register charac c;
        !          5742: 
        !          5743:        while ((c = getchar()) >= 0 && c != '\n');
        !          5744: }
        !          5745: 
        !          5746: substitute(inglob) {
        !          5747:        extern getsub();
        !          5748:        register linep *a1, p;
        !          5749:        register nl;
        !          5750:        register flag gsubf;
        !          5751: 
        !          5752:        gsubf = compsub();              /* 0 or 1 depending on 'g' */
        !          5753:        for (a1 = addr1; a1 <= addr2; a1++) {
        !          5754:                s_tmp = s_cnt;
        !          5755:                if (execute(0, a1) == 0)
        !          5756:                        continue;
        !          5757:                inglob |= 01;
        !          5758:                dosub();
        !          5759:                if (gsubf)
        !          5760:                        while (*loc2) {
        !          5761:                                if (execute(1) == 0)
        !          5762:                                        break;
        !          5763:                                dosub();
        !          5764:                        }
        !          5765:                p = *a1;
        !          5766:                *a1 = putline();
        !          5767:                savemark(p, *a1);
        !          5768:                nl = append(getsub, a1, 0, 0);
        !          5769:                a1 += nl;
        !          5770:                addr2 += nl;
        !          5771:        }
        !          5772:        if (inglob == 0)
        !          5773:                errmsg(39);
        !          5774: }
        !          5775: 
        !          5776: #ifdef XED
        !          5777: tack(aeof, aflag)
        !          5778: char aeof;
        !          5779: {
        !          5780:        register n;
        !          5781:        register char *p1, *p2;
        !          5782:        register linep *a;
        !          5783:        register charac c;
        !          5784: 
        !          5785:        nonzero();
        !          5786:        setdot();
        !          5787:        p1 = rhsbuf;    /* i/TEXT screwed for long lines */
        !          5788:        while ((c = getchar()) != aeof && c != '\n') {
        !          5789:                if (c == '\\')
        !          5790:                        if ((c = getchar()) == '\n')
        !          5791:                                break;
        !          5792:                if (c < 0)
        !          5793:                        errmsg(59);
        !          5794:                *p1++ = c;
        !          5795:                if (p1 >= &rhsbuf[LBSIZE / 2 - 2])
        !          5796:                        errmsg(42);
        !          5797:        }
        !          5798:        if (*rhsbuf == 0)
        !          5799:                errmsg(27);
        !          5800:        if (c == '\n') {
        !          5801:                if (prompt2)
        !          5802:                        pflag++;
        !          5803:        } else
        !          5804:                newline();
        !          5805:        if (p1 != rhsbuf)
        !          5806:                *p1 = 0;
        !          5807:        else
        !          5808:                while (*p1)
        !          5809:                        p1++;
        !          5810:        n = p1 - rhsbuf;
        !          5811:        for (a = addr1; a <= addr2; a++) {
        !          5812:                getline(*a);
        !          5813:                for (p2 = linebuf; *p2; p2++);
        !          5814: #ifndef ALLOC
        !          5815:                if (p2 + n >= &linebuf[LBSIZE / 2 - 2])
        !          5816: #else
        !          5817:                if (p2 + n >= &linebuf[lbsize / 2 - 2])
        !          5818: #endif
        !          5819:                        errmsg(30);
        !          5820:                if (aflag) {    /* $ */
        !          5821:                        p1 = rhsbuf;
        !          5822:                        while (*p2++ = *p1++);
        !          5823:                } else {        /* ^ */
        !          5824:                        p1 = p2 + n;
        !          5825:                        *p1 = *p2;
        !          5826:                        while (p2 > linebuf)
        !          5827:                                *--p1 = *--p2;
        !          5828:                        p1 = linebuf;
        !          5829:                        p2 = rhsbuf;
        !          5830:                        while (*p2)
        !          5831:                                *p1++ = *p2++;
        !          5832:                }
        !          5833:                p2 = *a;
        !          5834:                *a = putline();
        !          5835:                savemark(p2, *a);
        !          5836:        }
        !          5837:        dot = addr2;
        !          5838:        return(addr2 - addr1 + 1);
        !          5839: }
        !          5840: #endif
        !          5841: 
        !          5842: term() {
        !          5843:        signal(SIGTRM, 1);
        !          5844:        if (reading) {
        !          5845:                backup(TRM);
        !          5846:                if (fout != 1) {
        !          5847:                        flush_buf();
        !          5848:                        fout = 1;
        !          5849:                }
        !          5850:                puts2(errtext[58]);
        !          5851:                delexit(1);
        !          5852:        }
        !          5853:        termflg++;
        !          5854: }
        !          5855: 
        !          5856: tmpname(as, an)
        !          5857: char *as;
        !          5858: {
        !          5859:        register unsigned n;
        !          5860:        register char *p, c;
        !          5861: 
        !          5862:        p = as;
        !          5863:        n = an;
        !          5864:        while (*p)
        !          5865:                p++;
        !          5866:        while (--p >= as)
        !          5867:                if ((c = *p) == '0' || (c | 040) == 'x') {
        !          5868:                        *p = n % 10 + '0';
        !          5869:                        n /= 10;
        !          5870: #ifdef CKPT
        !          5871:                        tfnum = p - as;
        !          5872: #endif
        !          5873:                }
        !          5874:        return(as);
        !          5875: }
        !          5876: 
        !          5877: #ifdef XDEL
        !          5878: undelete() {
        !          5879:        register linep *a1, *a2, *bp;
        !          5880:        register tl, nl, num;
        !          5881: 
        !          5882:        if ((tl = deleted) == 0)
        !          5883:                errmsg(16);
        !          5884: #ifdef DEBUG
        !          5885:        if (tflg)
        !          5886:                printf("undelete:\t%o\n", tl);
        !          5887: #endif
        !          5888:        setdot();
        !          5889:        a1 = dol + 1;
        !          5890:        a2 = a1 + ndeleted;
        !          5891:        bp = addr2 + 1;
        !          5892:        if (dol + ndeleted > endcore) {
        !          5893:                num = ((ndeleted * 2) + 1023) & ~01777;
        !          5894:                if (sbrk(num) == -1)
        !          5895:                        errmsg(33);
        !          5896:                endcore = (int)endcore + num;
        !          5897:        }
        !          5898:        while (a1 > bp)
        !          5899:                *--a2 = *--a1;
        !          5900:        dol += ndeleted;
        !          5901:        a1 = addr2 + 1;
        !          5902:        a2 = a1 + ndeleted;
        !          5903:        bp = getblock(tl, READ);
        !          5904: #ifdef HUGE
        !          5905:        tl &= _1[hugef];
        !          5906: #else
        !          5907:        tl &= _1;
        !          5908: #endif
        !          5909:        nl = nleft / sizeof(linep);
        !          5910:        while (a1 < a2) {
        !          5911:                *a1++ = *bp++;
        !          5912:                if (--nl <= 0) {
        !          5913: #ifdef HUGE
        !          5914:                        bp = getblock(tl += _2[hugef], READ);
        !          5915: #else
        !          5916:                        bp = getblock(tl += _2, READ);
        !          5917: #endif
        !          5918:                        nl = nleft / sizeof(linep);
        !          5919:                }
        !          5920:        }
        !          5921:        dot = a2 - 1;
        !          5922:        return(ndeleted);
        !          5923: }
        !          5924: #endif
        !          5925: 
        !          5926: #ifdef UNDO
        !          5927: undo() {
        !          5928:        register linep *a, t, o;
        !          5929: 
        !          5930:        if (undo_newp == 0 || (a = findmark(undo_newp, 0)) == 0)
        !          5931:                errmsg(13);
        !          5932:        t = *a |
        !          5933: #ifdef HUGE
        !          5934:                 hugef ^
        !          5935: #endif
        !          5936:                         01;
        !          5937:        o = undo_oldp;
        !          5938:        savemark(*a, o);
        !          5939:        *a = o;
        !          5940:        undo_newp = o;
        !          5941:        undo_oldp = t;
        !          5942:        dot = a;
        !          5943:        if (text_modified == 0)
        !          5944:                text_modified++;
        !          5945: }
        !          5946: #endif
        !          5947: 
        !          5948: white_space() {
        !          5949:        register charac c;
        !          5950: 
        !          5951:        while ((c = getchar()) == ' ' || c == '\t');
        !          5952:        peekc = c;
        !          5953: }
        !          5954: 
        !          5955: wte(fd, buf, len)
        !          5956: char buf[];
        !          5957: {
        !          5958:        if (write(fd, buf, len) != len)
        !          5959:                errmsg(-32);
        !          5960: }
        !          5961: 
        !          5962: /*
        !          5963:  * as  a prompt string
        !          5964:  * ay  yes response, !no response
        !          5965:  * ad  default (\n) response, <0 means no default allowed
        !          5966:  * aef end-of-file response
        !          5967:  */
        !          5968: yes_no(as, ay, ad, aef)
        !          5969: char *as;
        !          5970: {
        !          5971:        register charac c, p;
        !          5972:        register n;
        !          5973:        register flag l;
        !          5974: 
        !          5975:        l = listf;
        !          5976:        listf = 0;
        !          5977:        p = peekc;
        !          5978:        peekc = 0;
        !          5979:        for ever {
        !          5980:                putchar('\n');
        !          5981:                puts2(as);
        !          5982:                puts2("? ");
        !          5983:                for (n = 0; n < 5; n++) {
        !          5984:                        flush_buf();
        !          5985:                        if ((c = getchar()) < 0) {
        !          5986:                                putchar('\n');
        !          5987:                                n = aef;
        !          5988:                                goto ret;
        !          5989:                        }
        !          5990:                        if (c != '\n')
        !          5991:                                skip_rest();
        !          5992:                        else if (ad >= 0) {
        !          5993:                                n = ad;
        !          5994:                                goto ret;
        !          5995:                        }
        !          5996:                        if (c == 'y' || c == 'n') {
        !          5997:                                n = ay;
        !          5998:                                if (c != 'y')
        !          5999:                                        n ^= 01;
        !          6000:                                goto ret;
        !          6001:                        }
        !          6002:                        puts2("yes or no? ");
        !          6003:                }
        !          6004:        }
        !          6005:     ret:
        !          6006:        listf = l;
        !          6007:        peekc = p;
        !          6008:        return(n);
        !          6009: }

unix.superglobalmegacorp.com

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