|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T m ┃
Length: 6486 (0x1956) Types: TextFile Names: »main.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/micrognu/main.c«
/* * Mainline, macro commands. */ #include "def.h" int thisflag; /* Flags, this command */ int lastflag; /* Flags, last command */ int curgoal; /* Goal column */ BUFFER *curbp; /* Current buffer */ WINDOW *curwp; /* Current window */ BUFFER *bheadp; /* BUFFER listhead */ WINDOW *wheadp = (WINDOW *)NULL; /* WINDOW listhead */ KEY kbdm[NKBDM] = {(KCTLX|')')}; /* Macro */ KEY *kbdmip; /* Input for above */ KEY *kbdmop; /* Output for above */ char pat[NPAT]; /* Pattern */ #ifdef HASH SYMBOL *symbol[NSHASH]; /* Symbol table listhead. */ #else /* should really be a *symbol, but don't want to break the hash code yet */ SYMBOL *symbol[1]; #endif SYMBOL *binding[NKEYS]; /* Key bindings. */ #ifdef DPROMPT extern char prompt[], *promptp; /* delayed prompting */ #endif main(argc, argv) char *argv[]; { register KEY c; register int f; register int n; register int mflag; #ifdef STARTUP char *sfile, *startupfile(); #endif char bname[NBUFN]; #ifdef SYSINIT SYSINIT; /* system dependent. */ #endif vtinit(); /* Virtual terminal. */ edinit(); /* Buffers, windows. */ keymapinit(); /* Symbols, bindings. */ /* doing update() before reading files causes the error messages from * the file I/O show up on the screen. (and also an extra display * of the mode line if there are files specified on the command line.) */ update(); #ifdef STARTUP /* User startup file. */ if ((sfile = startupfile()) != NULL) (VOID) load(sfile); #endif while (--argc > 0) { makename(bname, *++argv); curbp = bfind(bname, TRUE); (VOID) showbuffer(curbp, curwp, 0); (VOID) readin(*argv); } lastflag = 0; /* Fake last flags. */ loop: #ifdef DPROMPT *(promptp = prompt) = '\0'; if(epresf == KPROMPT) eerase(); #endif update(); /* Fix up the screen. */ c = getkey(KPROMPT); if (epresf == TRUE) { eerase(); update(); } f = FALSE; n = 1; if (((KMETA|'0') <= c && c <= (KMETA|'9')) || c == (KMETA|'-')) { f = TRUE; c = c & ~KMETA; } else if (c == (KCTRL|'U')) { f = TRUE; n = 4; while ((c=getkey(KNOMAC | KPROMPT)) == (KCTRL|'U')) n *= 4; } if (f == TRUE) { if ((c>='0' && c<='9') || c=='-') { if (c == '-') { n = 0; mflag = TRUE; } else { n = ((int) c) - '0'; mflag = FALSE; } while ((c=getkey(KNOMAC | KPROMPT))>='0' && c<='9') n = 10*n + ((int) c) - '0'; if (mflag != FALSE) n = -n; } } if (kbdmip != NULL) { /* Terminate macros. */ if (c!=(KCTLX|')') && kbdmip>&kbdm[NKBDM-6]) { (VOID) ctrlg(FALSE, 0, KRANDOM); goto loop; } if (f != FALSE) { kbdmip[-1] = (KEY) (KCTRL|'U');/* overwrite ESC */ *kbdmip++ = (KEY) n; *kbdmip++ = (KEY) c; } } switch (execute(c, f, n)) { /* Do it. */ case TRUE: break; case ABORT: ewprintf("Quit"); /* and fall through */ case FALSE: default: ttbeep(); if (kbdmip != NULL) { kbdm[0] = (KEY) (KCTLX|')'); kbdmip = NULL; } } goto loop; } /* * Command execution. Look up the binding in the the * binding array, and do what it says. Return a very bad status * if there is no binding, or if the symbol has a type that * is not usable (there is no way to get this into a symbol table * entry now). Also fiddle with the flags. */ execute(c, f, n) KEY c; { register SYMBOL *sp; register int status; if ((sp=binding[c]) != NULL) { thisflag = 0; status = (*sp->s_funcp)(f, n, c); lastflag = thisflag; return (status); } lastflag = 0; return (FALSE); } /* * Initialize all of the buffers * and windows. The buffer name is passed down as * an argument, because the main routine may have been * told to read in a file by default, and we want the * buffer name to be right. */ edinit() { register BUFFER *bp; register WINDOW *wp; bheadp = NULL; bp = bfind("*scratch*", TRUE); /* Text buffer. */ wp = (WINDOW *)malloc(sizeof(WINDOW)); /* Initial window. */ if (bp==NULL || wp==NULL) panic("edinit"); curbp = bp; /* Current ones. */ wheadp = wp; curwp = wp; wp->w_wndp = NULL; /* Initialize window. */ wp->w_bufp = bp; bp->b_nwnd = 1; /* Displayed. */ wp->w_linep = bp->b_linep; wp->w_dotp = bp->b_linep; wp->w_doto = 0; wp->w_markp = NULL; wp->w_marko = 0; wp->w_toprow = 0; wp->w_ntrows = nrow-2; /* 2 = mode, echo. */ wp->w_force = 0; wp->w_flag = WFMODE|WFHARD; /* Full. */ } /* * Quit command. If an argument, always * quit. Otherwise confirm if a buffer has been * changed and not written out. Normally bound * to "C-X C-C". */ /*ARGSUSED*/ quit(f, n, k) { register int s; if ((s = anycb(FALSE)) == ABORT) return ABORT; if (s == FALSE || eyesno("Some modified buffers exist, really exit") == TRUE) { vttidy(); exit(GOOD); } return TRUE; } /* * Begin a keyboard macro. * Error if not at the top level * in keyboard processing. Set up * variables and return. */ /*ARGSUSED*/ ctlxlp(f, n, k) { if (kbdmip!=NULL || kbdmop!=NULL) { ewprintf("Already defining kbd macro!"); return (FALSE); } ewprintf("Defining kbd macro..."); kbdmip = &kbdm[0]; return (TRUE); } /* * End keyboard macro. Check for * the same limit conditions as the * above routine. Set up the variables * and return to the caller. */ /*ARGSUSED*/ ctlxrp(f, n, k) { if (kbdmip == NULL) { ewprintf("Not defining kbd macro."); return (FALSE); } ewprintf("Keyboard macro defined"); kbdmip = NULL; return (TRUE); } /* * Execute a macro. * The command argument is the * number of times to loop. Quit as * soon as a command gets an error. * Return TRUE if all ok, else * FALSE. */ /*ARGSUSED*/ ctlxe(f, n, k) { register KEY c; register int af; register int an; register int s; if (kbdmip!=NULL || kbdmop!=NULL) { ewprintf("Not now"); return (FALSE); } if (n < 0) return (TRUE); do { kbdmop = &kbdm[0]; do { af = FALSE; an = 1; if ((c = *kbdmop++) == (KCTRL|'U')) { af = TRUE; an = (int) *kbdmop++; c = *kbdmop++; } s = TRUE; } while (c!=(KCTLX|')') && (s=execute(c, af, an))==TRUE); kbdmop = NULL; } while (s==TRUE && --n); return (s); } /* * User abort. Should be called by any input routine that sees a C-g * to abort whatever C-g is aborting these days. Currently does * nothing. */ /*ARGSUSED*/ ctrlg(f, n, k) { return (ABORT); } /* * Display the version. All this does * is copy the version string onto the echo line. */ /*ARGSUSED*/ showversion(f, n, k) { ewprintf(version); return TRUE ; }