/* * Ex allows you to say * delete 5 * to delete 5 lines, etc. * Such nonsense is implemented by setcount. */ setcount() { register int cnt; pastwh(); if (!isdigit(peekchar())) { setdot(); return; } addr1 = addr2; setdot(); cnt = getnum(); if (cnt <= 0) error("Bad count|Nonzero count required"); addr2 += cnt - 1; if (addr2 > dol) addr2 = dol; nonzero(); }
void main() { unsigned short i=0; io_init(); //timer0_init(); //pwm timer1_init(); //1ms irqon(); //enable global interrupt sleep(0); // just refrence #if 0 for(i=0;1;i++){ setdot(i%4); segprint10(i); mdelay(222); if(i>9999) i=0; } #endif #define DL 1 /*sent start ADC to attiny13, address A2, cmd 12*/ again: segprint10(0); //mdelay(DL); i2c_start(); // send start sequence segprint10(1); //mdelay(DL); i2c_tx(0x55); // SRF08 I2C address with R/W bit clear segprint10(2); //mdelay(DL); i2c_tx(0xAA); // SRF08 command register address segprint10(3); //mdelay(DL); i2c_stop(); // send stop sequence segprint10(4); //mdelay(DL); goto again; while(1){ // KEY_FUNC P3_3 KEY_DISCHARGER P3_2 KEY_RESUME P3_1 charging_update_lcd(); } }
void zop(char hadpr) { register int c, lines, op; zhadpr = hadpr; notempty(); znoclear = 0; zweight = 0; switch(c = op = ex_getchar()) { case '^': zweight = 1; case '-': case '+': while (peekchar() == op) { ex_getchar(); zweight++; } case '=': case '.': c = ex_getchar(); break; case EOF: znoclear++; break; default: op = 0; break; } if (digit(c)) { lines = c - '0'; for(;;) { c = ex_getchar(); if (!digit(c)) break; lines *= 10; lines += c - '0'; } if (lines < value(WINDOW)) znoclear++; if (op == '=') lines += 2; } else lines = op == EOF ? value(SCROLL) : value(WINDOW); if (c != EOF) { ungetchar(c); ex_newline(); } addr1 = addr2; setdot(); zop2(lines, op); }
ovbeg() { if (!value(OPEN)) error("Can't use open/visual unless open option is set"); if (inopen) error("Recursive open/visual not allowed"); Vlines = lineDOL(); fixzero(); setdot(); pastwh(); dot = addr2; }
int cverify(void *vp) { int *msgvec = vp, *ip; int ec = 0; if (nss_init() != OKAY) return 1; ssl_vrfy_level = VRFY_STRICT; for (ip = msgvec; *ip; ip++) { setdot(&message[*ip-1]); ec |= verify1(&message[*ip-1], *ip); } return ec; }
/* * Print the top so many lines of each desired message. * The number of lines is taken from the variable "toplines" * and defaults to 5. */ int top(void *v) { int *msgvec = v; int *ip; struct message *mp; int c, topl, lines, lineb; char *valtop, *linebuf = NULL; size_t linesize; FILE *ibuf; topl = 5; valtop = value("toplines"); if (valtop != NULL) { topl = atoi(valtop); if (topl < 0 || topl > 10000) topl = 5; } lineb = 1; for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) { mp = &message[*ip - 1]; touch(mp); setdot(mp); did_print_dot = 1; if (value("quiet") == NULL) printf(catgets(catd, CATSET, 19, "Message %2d:\n"), *ip); if (mp->m_flag & MNOFROM) printf("From %s %s\n", fakefrom(mp), fakedate(mp->m_time)); if ((ibuf = setinput(&mb, mp, NEED_BODY)) == NULL) /* XXX could use TOP */ return 1; c = mp->m_lines; if (!lineb) printf("\n"); for (lines = 0; lines < c && lines <= topl; lines++) { if (readline(ibuf, &linebuf, &linesize) < 0) break; puts(linebuf); lineb = blankline(linebuf); } } if (linebuf) free(linebuf); return(0); }
/* * Make sure all passed messages get mboxed. */ int mboxit(void *v) { int *msgvec = v; int *ip; for (ip = msgvec; *ip != 0; ip++) { setdot(&message[*ip-1]); dot->m_flag |= MTOUCH|MBOX; dot->m_flag &= ~MPRESERVE; /* * POSIX interpretation necessary. */ did_print_dot = 1; } return(0); }
move() { register int *adt; if (Command[0] == 'M') { setdot1(); markpr(addr2 == dot ? addr1 - 1 : addr2 + 1); } else setdot(); nonzero(); adt = address(); if (adt == 0) error("%s where?|%s requires a trailing address", Command); newline(); move1(Command[0] != 'M', adt); killed(); }
/* * Print out the headlines for each message * in the passed message list. */ int from(void *v) { int *msgvec = v; int *ip, n; FILE *obuf = stdout; char *cp; (void)&obuf; (void)&cp; if (is_a_tty[0] && is_a_tty[1] && (cp = value("crt")) != NULL) { for (n = 0, ip = msgvec; *ip; ip++) n++; if (n > (*cp == '\0' ? screensize() : atoi(cp)) + 3) { cp = get_pager(); if (sigsetjmp(pipejmp, 1)) goto endpipe; if ((obuf = Popen(cp, "w", NULL, 1)) == NULL) { perror(cp); obuf = stdout; } else safe_signal(SIGPIPE, onpipe); } } for (ip = msgvec; *ip != 0; ip++) printhead(*ip, obuf, mb.mb_threaded); if (--ip >= msgvec) setdot(&message[*ip - 1]); endpipe: if (obuf != stdout) { safe_signal(SIGPIPE, SIG_IGN); Pclose(obuf); safe_signal(SIGPIPE, dflpipe); } return(0); }
/* * Read a file from the world. * C is command, 'e' if this really an edit (or a recover). */ void rop(int c) { struct stat stbuf; #ifndef __sun register int i; struct exec head; #endif static int ovro; /* old value(READONLY) */ static int denied; /* 1 if READONLY was set due to file permissions */ #ifdef FLOCKFILE int *lp, *iop; #endif io = open(file, O_RDONLY); if (io < 0) { if (c == 'e' && errno == ENOENT) { edited++; /* * If the user just did "ex foo" he is probably * creating a new file. Don't be an error, since * this is ugly, and it screws up the + option. */ if (!seenprompt) { ex_printf(" [New file]"); noonl(); return; } } syserror(); } if (fstat(io, &stbuf)) syserror(); switch (stbuf.st_mode & S_IFMT) { case S_IFBLK: error(" Block special file"); case S_IFCHR: if (isatty(io)) error(" Teletype"); if (samei(&stbuf, _PATH_DEVNULL)) break; error(" Character special file"); case S_IFDIR: error(" Directory"); #ifndef __sun case S_IFREG: #ifdef CRYPT if (xflag) break; #endif i = read(io, (char *)&head, sizeof(head)); (void)lseek(io, 0L, L_SET); if (i != sizeof(head)) break; #ifndef vms switch ( #if defined N_MAGIC N_MAGIC( #elif defined N_GETMAGIC N_GETMAGIC( #else # error #endif head)) { case 0405: /* data overlay on exec */ case OMAGIC: /* unshared */ case NMAGIC: /* shared text */ case 0411: /* separate I/D */ case ZMAGIC: /* VM/Unix demand paged */ case 0430: /* PDP-11 Overlay shared */ case 0431: /* PDP-11 Overlay sep I/D */ error(" Executable"); /* * We do not forbid the editing of portable archives * because it is reasonable to edit them, especially * if they are archives of text files. This is * especially useful if you archive source files together * and copy them to another system with ~%take, since * the files sometimes show up munged and must be fixed. */ case 0177545: case 0177555: error(" Archive"); case 070707: error(" Cpio file"); default: { char *bp = (char *)&head; if ((u_char)bp[0] == (u_char)'\037' && (u_char)bp[1] == (u_char)'\235') error(" Compressed file"); #ifdef ARCHIVES_ARE_OK if (!strncmp(bp, "!<arch>\n__.SYMDEF", 17) || !strncmp(bp, "!<arch>\n", 8)) error(" Archive"); #endif } break; } #endif /* __sun */ #endif } if (c != 'r') { if (value(READONLY) && denied) { value(READONLY) = ovro; denied = 0; } if ((stbuf.st_mode & 0222) == 0 || access(file, 2) < 0) { ovro = value(READONLY); denied = 1; value(READONLY) = 1; } } if (value(READONLY)) { ex_printf(" [Read only]"); flush(); } #ifdef FLOCKFILE /* * Attempt to lock the file. We use an sharable lock if reading * the file, and an exclusive lock if editting a file. * The lock will be released when the file is no longer being * referenced. At any time, the editor can have as many as * three files locked, and with different lock statuses. */ /* * if this is either the saved or alternate file or current file, * point to the appropriate descriptor and file lock status. */ if (strcmp (file,savedfile) == 0) { if (!io_savedfile) io_savedfile = dup(io) ; lp = &lock_savedfile ; iop = &io_savedfile ; } else if (strcmp (file,altfile) == 0) { if (!io_altfile) io_altfile = dup(io) ; lp = &lock_altfile ; iop = &io_altfile ; } else { /* throw away current lock, accquire new current lock */ if (io_curr) close (io_curr) ; io_curr = dup(io) ; lp = &lock_curr ; iop = &io_curr ; lock_curr = 0 ; } if (c == 'r' || value(READONLY) || *lp == 0) { /* if we have a lock already, don't bother */ if (!*lp) { /* try for a shared lock */ if (flock(*iop, LOCK_SH|LOCK_NB) < 0 && errno == EWOULDBLOCK) { ex_printf ( " [FILE BEING MODIFIED BY ANOTHER PROCESS]") ; flush(); goto fail_lock ; } else *lp = LOCK_SH ; } } if ( c != 'r' && !value(READONLY) && *lp != LOCK_EX) { /* if we are editting the file, upgrade to an exclusive lock. */ if (flock(*iop, LOCK_EX|LOCK_NB) < 0 && errno == EWOULDBLOCK) { ex_printf (" [File open by another process]") ; flush(); } else *lp = LOCK_EX ; } fail_lock: #endif if (c == 'r') setdot(); else setall(); if (FIXUNDO && inopen && c == 'r') undap1 = undap2 = dot + 1; rop2(); rop3(c); }
void draw_coral(ModeInfo * mi) { Display *display = MI_DISPLAY(mi); Window window = MI_WINDOW(mi); GC gc = MI_GC(mi); int npoints = 0; int i; coralstruct *cp; if (reefs == NULL) return; cp = &reefs[MI_SCREEN(mi)]; if (cp->reef == NULL) return; MI_IS_DRAWN(mi) = True; for (i = 0; i < cp->nwalkers; i++) { int x = cp->walkers[i].x; int y = cp->walkers[i].y; if (getdot(x, y)) { /* XDrawPoint(display, window, gc, x, y); */ cp->pointbuf[npoints].x = x; cp->pointbuf[npoints].y = y; npoints++; /* Mark the surrounding area as "sticky" */ setdot((x - 1), (y - 1)); setdot(x, (y - 1)); setdot((x + 1), (y - 1)); setdot((x - 1), y); setdot((x + 1), y); setdot((x - 1), (y + 1)); setdot(x, (y + 1)); setdot((x + 1), (y + 1)); cp->nwalkers--; cp->walkers[i].x = cp->walkers[cp->nwalkers].x; cp->walkers[i].y = cp->walkers[cp->nwalkers].y; if (0 == cp->nwalkers || npoints >= MAXPOINTS) { XDrawPoints(display, window, gc, cp->pointbuf, npoints, CoordModeOrigin); npoints = 0; } if (MI_NPIXELS(mi) > 2) { XSetForeground(display, gc, MI_PIXEL(mi, cp->colorindex / COLORTHRESH)); if (++cp->colorindex >= MI_NPIXELS(mi) * COLORTHRESH) cp->colorindex = 0; } else XSetForeground(display, gc, MI_WHITE_PIXEL(mi)); if (0 == cp->nwalkers) { if (cp->pointbuf) free(cp->pointbuf); cp->pointbuf = 0; init_coral(mi); return; } } else { /* move it a notch */ switch (rand_2()) { case 0: if (1 == x) continue; cp->walkers[i].x--; break; case 1: if (cp->width - 2 == x) continue; cp->walkers[i].x++; break; case 2: if (1 == y) continue; cp->walkers[i].y--; break; default: /* case 3: */ if (cp->height - 2 == y) continue; cp->walkers[i].y++; break; } } } if (npoints > 0) { XDrawPoints(display, window, gc, cp->pointbuf, npoints, CoordModeOrigin); } }
/* * Read a file from the world. * C is command, 'e' if this really an edit (or a recover). */ void rop(int c) { register int i; struct stat stbuf; short magic; static int ovro; /* old value(READONLY) */ static int denied; /* 1 if READONLY was set due to file permissions */ io = open(file, O_RDONLY); if (io < 0) { if (c == 'e' && errno == ENOENT) { edited++; /* * If the user just did "ex foo" he is probably * creating a new file. Don't be an error, since * this is ugly, and it screws up the + option. */ if (!seenprompt) { ex_printf(" [New file]"); noonl(); return; } } syserror(); } if (fstat(io, &stbuf)) syserror(); switch (stbuf.st_mode & S_IFMT) { case S_IFBLK: error(" Block special file"); case S_IFCHR: if (isatty(io)) error(" Teletype"); if (samei(&stbuf, "/dev/null")) break; error(" Character special file"); case S_IFDIR: error(" Directory"); case S_IFREG: #ifdef CRYPT if (xflag) break; #endif i = read(io, (char *) &magic, sizeof(magic)); lseek(io, 0l, SEEK_SET); if (i != sizeof(magic)) break; switch (magic) { case 0405: /* Interdata? overlay */ case 0407: /* unshared */ case 0410: /* shared text */ case 0411: /* separate I/D */ case 0413: /* VM/Unix demand paged */ case 0430: /* PDP-11 Overlay shared */ case 0431: /* PDP-11 Overlay sep I/D */ error(" Executable"); /* * We do not forbid the editing of portable archives * because it is reasonable to edit them, especially * if they are archives of text files. This is * especially useful if you archive source files together * and copy them to another system with ~%take, since * the files sometimes show up munged and must be fixed. */ #if 0 case 0177545: case 0177555: error(" Archive"); #endif default: #ifndef BIT8 if (magic & 0100200) error(" Non-ascii file"); #endif break; } } if (c != 'r') { if (value(READONLY) && denied) { value(READONLY) = ovro; denied = 0; } if ((stbuf.st_mode & 0222) == 0 || access(file, 2) < 0) { ovro = value(READONLY); denied = 1; value(READONLY) = 1; } } if (value(READONLY)) { ex_printf(" [Read only]"); flush(); } if (c == 'r') setdot(); else setall(); if (FIXUNDO && inopen && c == 'r') undap1 = undap2 = dot + 1; rop2(); rop3(c); }
int headers(void *v) { int *msgvec = v; int g, k, n, mesg, flag = 0, lastg = 1; struct message *mp, *mq, *lastmq = NULL; int size; enum mflag fl = MNEW|MFLAGGED; size = screensize(); n = msgvec[0]; /* n == {-2, -1, 0}: called from scroll() */ if (screen < 0) screen = 0; k = screen * size; if (k >= msgCount) k = msgCount - size; if (k < 0) k = 0; if (mb.mb_threaded == 0) { g = 0; mq = &message[0]; for (mp = &message[0]; mp < &message[msgCount]; mp++) if (visible(mp)) { if (g % size == 0) mq = mp; if (mp->m_flag&fl) { lastg = g; lastmq = mq; } if (n>0 && mp==&message[n-1] || n==0 && g==k || n==-2 && g==k+size && lastmq || n<0 && g>=k && mp->m_flag&fl) break; g++; } if (lastmq && (n==-2 || n==-1 && mp==&message[msgCount])) { g = lastg; mq = lastmq; } screen = g / size; mp = mq; mesg = mp - &message[0]; if (dot != &message[n-1]) { for (mq = mp; mq < &message[msgCount]; mq++) if (visible(mq)) { setdot(mq); break; } } if (mb.mb_type == MB_IMAP) imap_getheaders(mesg+1, mesg + size); for (; mp < &message[msgCount]; mp++) { mesg++; if (!visible(mp)) continue; if (flag++ >= size) break; printhead(mesg, stdout, 0); } } else { /* threaded */ g = 0; mq = threadroot; for (mp = threadroot; mp; mp = next_in_thread(mp)) if (visible(mp) && (mp->m_collapsed <= 0 || mp == &message[n-1])) { if (g % size == 0) mq = mp; if (mp->m_flag&fl) { lastg = g; lastmq = mq; } if (n>0 && mp==&message[n-1] || n==0 && g==k || n==-2 && g==k+size && lastmq || n<0 && g>=k && mp->m_flag&fl) break; g++; } if (lastmq && (n==-2 || n==-1 && mp==&message[msgCount])) { g = lastg; mq = lastmq; } screen = g / size; mp = mq; if (dot != &message[n-1]) { for (mq = mp; mq; mq = next_in_thread(mq)) if (visible(mq) && mq->m_collapsed <= 0) { setdot(mq); break; } } while (mp) { if (visible(mp) && (mp->m_collapsed <= 0 || mp == &message[n-1])) { if (flag++ >= size) break; printhead(mp - &message[0] + 1, stdout, mb.mb_threaded); } mp = next_in_thread(mp); } } if (flag == 0) { printf(catgets(catd, CATSET, 6, "No more mail.\n")); return(1); } return(0); }
static int type1(int *msgvec, int doign, int page, int pipe, int decode, char *cmd, off_t *tstats) { int *ip; struct message *mp; char *cp; int nlines; off_t mstats[2]; /* * Must be static to become excluded from sigsetjmp(). */ static FILE *obuf; #ifdef __GNUC__ /* Avoid longjmp clobbering */ (void) &cp; (void) &cmd; (void) &obuf; #endif obuf = stdout; if (sigsetjmp(pipestop, 1)) goto close_pipe; if (pipe) { cp = value("SHELL"); if (cp == NULL) cp = SHELL; obuf = Popen(cmd, "w", cp, 1); if (obuf == NULL) { perror(cmd); obuf = stdout; } else { safe_signal(SIGPIPE, brokpipe); } } else if (value("interactive") != NULL && (page || (cp = value("crt")) != NULL)) { nlines = 0; if (!page) { for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) { if ((message[*ip-1].m_have & HAVE_BODY) == 0) { if ((get_body(&message[*ip - 1])) != OKAY) return 1; } nlines += message[*ip - 1].m_lines; } } if (page || nlines > (*cp ? atoi(cp) : realscreenheight)) { cp = get_pager(); obuf = Popen(cp, "w", NULL, 1); if (obuf == NULL) { perror(cp); obuf = stdout; } else safe_signal(SIGPIPE, brokpipe); } } for (ip = msgvec; *ip && ip - msgvec < msgCount; ip++) { mp = &message[*ip - 1]; touch(mp); setdot(mp); uncollapse1(mp, 1); if (value("quiet") == NULL) fprintf(obuf, catgets(catd, CATSET, 17, "Message %2d:\n"), *ip); send(mp, obuf, doign ? ignore : 0, NULL, pipe && value("piperaw") ? SEND_MBOX : decode ? SEND_SHOW : doign ? SEND_TODISP : SEND_TODISP_ALL, mstats); if (pipe && value("page")) { putc('\f', obuf); } if (tstats) { tstats[0] += mstats[0]; tstats[1] += mstats[1]; } } close_pipe: if (obuf != stdout) { /* * Ignore SIGPIPE so it can't cause a duplicate close. */ safe_signal(SIGPIPE, SIG_IGN); Pclose(obuf); safe_signal(SIGPIPE, dflpipe); } return(0); }
void init_coral(ModeInfo * mi) { Display *display = MI_DISPLAY(mi); Window window = MI_WINDOW(mi); GC gc = MI_GC(mi); coralstruct *cp; int size = MI_SIZE(mi); int i; if (reefs == NULL) { if ((reefs = (coralstruct *) calloc(MI_NUM_SCREENS(mi), sizeof (coralstruct))) == NULL) return; } cp = &reefs[MI_SCREEN(mi)]; cp->width = MAX(MI_WIDTH(mi), 4); cp->height = MAX(MI_HEIGHT(mi), 4); cp->widthb = ((cp->width + 31) >> 5); if (cp->reef != NULL) free(cp->reef); if ((cp->reef = (unsigned int *) calloc((cp->widthb + 1) * cp->height, sizeof (unsigned int))) == NULL) { free_coral(cp); return; } if (size < -MINSIZE) cp->density = NRAND(MIN(MAXSIZE, -size) - MINSIZE + 1) + MINSIZE; else if (size < MINSIZE) cp->density = MINSIZE; else cp->density = MIN(MAXSIZE, size); cp->nwalkers = MAX((cp->width * cp->height * cp->density) / 100, 1); if (cp->walkers != NULL) free(cp->walkers); if ((cp->walkers = (XPoint *) calloc(cp->nwalkers, sizeof (XPoint))) == NULL) { free_coral(cp); return; } cp->seeds = MI_COUNT(mi); if (cp->seeds < -MINSEEDS) cp->seeds = NRAND(-cp->seeds - MINSEEDS + 1) + MINSEEDS; else if (cp->seeds < MINSEEDS) cp->seeds = MINSEEDS; MI_CLEARWINDOW(mi); if (MI_NPIXELS(mi) > 2) { cp->colorindex = NRAND(MI_NPIXELS(mi) * COLORTHRESH); XSetForeground(display, gc, MI_PIXEL(mi, cp->colorindex / COLORTHRESH)); } else XSetForeground(display, gc, MI_WHITE_PIXEL(mi)); for (i = 0; i < cp->seeds; i++) { int x, y; do { x = NRAND(cp->width); y = NRAND(cp->height); } while (getdot(x, y)); setdot((x - 1), (y - 1)); setdot(x, (y - 1)); setdot((x + 1), (y - 1)); setdot((x - 1), y); setdot(x, y); setdot((x + 1), y); setdot((x - 1), (y + 1)); setdot(x, (y + 1)); setdot((x + 1), (y + 1)); XDrawPoint(display, window, gc, x, y); } for (i = 0; i < cp->nwalkers; i++) { cp->walkers[i].x = NRAND(cp->width - 2) + 1; cp->walkers[i].y = NRAND(cp->height - 2) + 1; } if (cp->pointbuf) { free(cp->pointbuf); } if ((cp->pointbuf = (XPoint *) calloc((MAXPOINTS + 2), sizeof (XPoint))) == NULL) { free_coral(cp); return; } }
/* * Read a file from the world. * C is command, 'e' if this really an edit (or a recover). */ void rop(int c) { int i; struct stat64 stbuf; short magic; static int ovro; /* old value(vi_READONLY) */ static int denied; /* 1 if READONLY was set due to file permissions */ io = open(file, 0); if (io < 0) { if (c == 'e' && errno == ENOENT) { edited++; /* * If the user just did "ex foo" they're probably * creating a new file. Don't be an error, since * this is ugly, and it messes up the + option. */ if (!seenprompt) { viprintf(gettext(" [New file]")); noonl(); return; } } if (value(vi_READONLY) && denied) { value(vi_READONLY) = ovro; denied = 0; } syserror(0); } if (fstat64(io, &stbuf)) syserror(0); switch (FTYPE(stbuf) & S_IFMT) { case S_IFBLK: error(gettext(" Block special file")); /* FALLTHROUGH */ case S_IFCHR: if (isatty(io)) error(gettext(" Teletype")); if (samei(&stbuf, "/dev/null")) break; error(gettext(" Character special file")); /* FALLTHROUGH */ case S_IFDIR: error(gettext(" Directory")); } if (c != 'r') { if (value(vi_READONLY) && denied) { value(vi_READONLY) = ovro; denied = 0; } if ((FMODE(stbuf) & 0222) == 0 || access((char *)file, 2) < 0) { ovro = value(vi_READONLY); denied = 1; value(vi_READONLY) = 1; } } if (hush == 0 && value(vi_READONLY)) { viprintf(gettext(" [Read only]")); flush(); } if (c == 'r') setdot(); else setall(); /* If it is a read command, then we must set dot to addr1 * (value of N in :Nr ). In the default case, addr1 will * already be set to dot. * * Next, it is necessary to mark the beginning (undap1) and * ending (undap2) addresses affected (for undo). Note that * rop2() and rop3() will adjust the value of undap2. */ if (FIXUNDO && inopen && c == 'r') { dot = addr1; undap1 = undap2 = dot + 1; } rop2(); rop3(c); }
docommand() { register char *p; register int i; register ADDR addr, bkaddr; struct proct *procp; char s[4]; cntval = 1; adrflg = 0; errflg = 0; if (scallf) { doscall(); setcur(1); lastcom = NOCOM; return; } if (reflag) { /* search for regular expression */ dore(); lastcom = PRCOM; return; } if (cmd == '\0') { if (integ != 0 && var[0] != '\0') { error("Invalid command (1)"); return; } if (integ != 0) { /* print line number */ ffind(integ); fprint(); lastcom = PRCOM; return; } if (var[0] != 0) { printf("Unexpected null command\n"); return; } } switch (cmd) { case 'Y': debug = !debug; break; case 'V': version(); break; case 'M': if (args[0]) { setmap(args); } else { printmap("? map", &txtmap); printmap("/ map", &datmap); } break; case 'x': printregs(); break; case 'X': printpc(); break; case 'a': if (integ) { cpstr(args, "l\n"); } else if (proc[0]) { cpall(args, "T\n"); } else { error("Bad arguments"); break; } goto setbrk; break; case 'l': setcur(1); lastcom = NOCOM; break; case 'T': prfrx(1); lastcom = NOCOM; break; case 't': prframe(); lastcom = NOCOM; break; case 'e': p = args; if (*p == '\0') { #ifndef FLEXNAMES printf("%.16s() in \"%s\"\n", curproc()->pname, curfile); #else printf("%s() in \"%s\"\n", curproc()->pname, curfile); #endif break; } while (*p != '\0') if (*p++ == '.') goto l1; /* argument is procedure name */ procp = findproc(args); if ((procp->pname[0] != '\0') && (procp->sfptr != badfile)) { finit(adrtofilep(procp->paddr)->sfilename); ffind(procp->lineno); } else printf("Can't find %s\n", args); #ifndef FLEXNAMES printf("%.16s() in \"%s\"\n", curproc()->pname, curfile); #else printf("%s() in \"%s\"\n", curproc()->pname, curfile); #endif lastcom = PRCOM; break; l1: /* argument is filename */ finit(args); printf("\"%s\"\n", curfile); lastcom = PRCOM; break; case 'p': if (integ) ffind(integ); fprint(); lastcom = PRCOM; break; case 'q': exit(0); case 'w': if (integ) ffind(integ); i = fline; fback(WINDOW/2); fprintn(WINDOW); ffind(i); lastcom = PRCOM; break; case 'Q': prdebug(); break; case 'z': if (integ) ffind(integ); fprintn(WINDOW); lastcom = PRCOM; break; case '-': fback(integ ? integ : 1); fpargs(); lastcom = PRCOM; break; case '+': fforward(integ ? integ : 1); fpargs(); lastcom = PRCOM; break; case '\n': switch (lastcom) { case PRCOM: fforward(1); fprint(); break; case DSCOM: oaddr += oincr ? oincr : typetosize(otype, WORDSIZE); printf("0x%x/ ", oaddr); dispf((ADDR) oaddr, odesc, oclass == N_RSYM ? oclass : N_GSYM, otype, 0, 0, DSP); break; case DSICOM: dot += oincr; prisploc(); dispi(dot, odesc, N_GSYM, 0, 0); break; } break; case '\004': if (!isatty(0)) exit(0); switch (lastcom) { case PRCOM: fforward(1); printf("\b"); fprintn(WINDOW); lastcom = PRCOM; break; case DSICOM: printf("\b"); for (i=0; i<WINDOW; i++) { dot += oincr; prisploc(); if (dispi(dot, odesc, N_GSYM, 0, 0) == -1) break; } break; case DSCOM: printf("\b"); for (i=0; i<WINDOW; i++) { oaddr += oincr ? oincr : typetosize(otype, WORDSIZE); printf("0x%x/ ", oaddr); if (dispf((ADDR) oaddr, odesc, oclass == N_RSYM ? oclass : N_GSYM, otype, 0, 0, DSP) == -1) break; } break; default: printf("\n"); } break; case 'r': if (args[0] == '\0') getargs(); case 'R': signo = 0; cpstr(oldargs, args); if (debug) error("calling dopcs"); if (integ) cntval = integ; if (!executing) { executing = TRUE; if (integ) cntval = integ; dopcs('r'); executing = FALSE; } if (debug) error("exiting dopcs"); bkaddr = -1; goto f1; case 'c': signo = 0; case 'C': if (proc[0] != '\0' || integ != 0) { setdot(); if (dot == -1) { error("Cannot set temporary breakpoint"); break; } dopcs('b'); bkaddr = dot; } else bkaddr = -1; integ = atoi(args); f1: if (debug) error("calling dopcs"); if (integ) cntval = integ; dopcs('c'); if (debug) error("exiting dopcs"); if (bkaddr != -1) { ADDR dotsave; dotsave = dot; dot = bkaddr; dopcs('d'); dot = dotsave; } if (!signo) printf("Breakpoint"); printf(" at\n"); setcur(1); lastcom = NOCOM; break; case 'S': case 's': signo = 0; integ = atoi(args); singstep(integ ? integ : 1, cmd); if (signo) printf("\n"); setcur(1); lastcom = NOCOM; break; case 'g': if (pid == 0 || signo) { error("Not stopped at breakpoint"); break; } setdot(); if (dot == -1) { error("Bad address"); break; } adrflg = 1; integ = atoi(args); if (integ) cntval = integ; dopcs('c'); if (!signo) printf("Breakpoint"); printf(" at\n"); setcur(1); lastcom = NOCOM; break; case 'k': if (scallx) { userpc = dot = *(ADDR *)(((ADDR)&u)+PC) = pcs; *(ADDR *)(((ADDR)&u)+FP) = fps; *(ADDR *)(((ADDR)&u)+AP) = aps; if (bkpts) bkpts->flag = flagss; scallx = 0; error("Procedure killed"); longjmp(env, 0); } else { dopcs('k'); printf("\n"); lastcom = NOCOM; break; } case 'B': prbkpt(); break; case 'b': setbrk: if (proc[0] == '\0' && integ == 0) { integ = fline; } setdot(); if (dot == -1 || dot == 0) { error("Cannot set breakpoint"); break; } dopcs('b'); s[0] = ' '; s[1] = cmd; s[2] = '\n'; s[3] = 0; s[1] = cmd; printbkpt(s, adrtoprocp(dot), dot); break; case 'd': if (proc[0] == '\0' && integ == 0) { idbkpt(); break; } setdot(); if (dot == -1) { error("Non existent breakpoint"); break; } dopcs('d'); break; case 'D': dabkpt(); error("All breakpoints deleted"); break; case 'm': addr = varaddr(proc[0] ? proc : curproc()->pname, var); printf("stopped with value %d\n", monex(addr, 'd')); setcur(1); lastcom = NOCOM; break; case '?': if (!(var[0] == '.' && var[1] == '\0')) setdot(); if (errflg) { error(errflg); break; } prisploc(); dispi(dot, args[0] ? args : "i", N_GSYM, 0, 0); lastcom = DSICOM; break; case '/': if (var[0] == '.' && var[1] == '\0') { if (integ == 0) integ = oaddr; dispf((ADDR) integ, args[0] ? args : odesc, oclass == N_RSYM ? oclass : N_GSYM, otype, 0, 0, DSP); oaddr = integ; } else if (integ && (var[0] == '\0')) { dispf((ADDR) integ, args, N_GSYM, 0, 0, 0, DSP); oaddr = integ; cpstr(odesc, args); oclass = N_GSYM; otype = 0; } else dispvar(proc, var, args); lastcom = DSCOM; break; case '=': if (var[0] == '\0') { if (proc[0]) { addr = getaddr(proc, integ); if (addr == -1) { error("Unknown address"); break; } } else addr = integ; dispf(addr, args[0] ? args : "x", 0, -1, 0, 0, DSP); } else findvar(proc, var, args[0] ? args : "x", 2); break; case '!': if (var[0] == '\0') addr = getaddr(proc, integ); else addr = varaddr(proc, var); if (addr == -1) error("Unknown variable"); else { if (number(args[0]) || eqany(args[0], ".-")) { char *p; double atof(); union { struct{ int w1, w2; } ww; double d; } dbl; p = (args[0] == '-') ? args+1 : args; for (; *p != '.' && *p != 'e'; p++) { if (!number(*p)) goto l2; } dbl.d = atof(args); putval(addr, 'd', dbl.ww.w1); if (typetodesc(sl_type,0)[0] == 'g') putval(addr+WORDSIZE, 'd', dbl.ww.w2); break; } l2: if (percentflag) *(ADDR *)(((ADDR)&u)+addr) = argvalue(args); else if (sl_class == N_RSYM && addr < 16) putreg(addr,typetodesc(sl_type,subflag)[0], argvalue(args)); else putval(addr,typetodesc(sl_type,subflag)[0], argvalue(args)); } lastcom = NOCOM; break; case '"': printf(args); break; } }
/* * Main loop for command mode command decoding. * A few commands are executed here, but main function * is to strip command addresses, do a little address oriented * processing and call command routines to do the real work. */ void commands(bool noprompt, bool exitoneof) { register line *addr; register int c; register int lchng; int given; int seensemi; int cnt; bool hadpr; resetflav(); nochng(); for (;;) { /* * If dot at last command * ended up at zero, advance to one if there is a such. */ if (dot <= zero) { dot = zero; if (dol > zero) dot = one; } shudclob = 0; /* * If autoprint or trailing print flags, * print the line at the specified offset * before the next command. */ if (pflag || (lchng != chng && value(AUTOPRINT) && !inglobal && !inopen && endline)) { pflag = 0; nochng(); if (dol != zero) { addr1 = addr2 = dot + poffset; if (addr1 < one || addr1 > dol) error("Offset out-of-bounds|Offset after command too large"); setdot1(); goto print; } } nochng(); /* * Print prompt if appropriate. * If not in global flush output first to prevent * going into pfast mode unreasonably. */ if (inglobal == 0) { flush(); if (!hush && value(PROMPT) && !globp && !noprompt && endline) { ex_putchar(':'); hadpr = 1; } TSYNC(); } /* * Gobble up the address. * Degenerate addresses yield ".". */ addr2 = 0; given = seensemi = 0; do { addr1 = addr2; addr = address(0); c = getcd(); if (addr == 0) { if (c == ',') addr = dot; else if (addr1 != 0) { addr2 = dot; break; } else break; } addr2 = addr; given++; if (c == ';') { c = ','; dot = addr; seensemi = 1; } } while (c == ','); if (c == '%') { /* %: same as 1,$ */ addr1 = one; addr2 = dol; given = 2; c = ex_getchar(); } if (addr1 == 0) addr1 = addr2; if (c == ':') c = ex_getchar(); /* * Set command name for special character commands. */ tailspec(c); /* * If called via : escape from open or visual, limit * the set of available commands here to save work below. */ if (inopen) { if (c=='\n' || c=='\r' || c==CTRL('d') || c==EOF) { if (addr2) dot = addr2; if (c == EOF) return; continue; } if (any(c, "o")) notinvis: tailprim(Command, 1, 1); } switch (c) { case 'a': switch(peekchar()) { case 'b': /* abbreviate */ tail("abbreviate"); setnoaddr(); mapcmd(0, 1); anyabbrs = 1; continue; case 'r': /* args */ tail("args"); setnoaddr(); eol(); pargs(); continue; } /* append */ if (inopen) goto notinvis; tail("append"); setdot(); aiflag = exclam(); ex_newline(); vmacchng(0); deletenone(); setin(addr2); inappend = 1; ignore(append(gettty, addr2)); inappend = 0; nochng(); continue; case 'c': switch (peekchar()) { /* copy */ case 'o': tail("copy"); vmacchng(0); move(); continue; #ifdef CHDIR /* cd */ case 'd': tail("cd"); goto changdir; /* chdir */ case 'h': ignchar(); if (peekchar() == 'd') { register char *p; tail2of("chdir"); changdir: if (savedfile[0] == '/' || !value(WARN)) ignore(exclam()); else ignore(quickly()); if (skipend()) { p = getenv("HOME"); if (p == NULL) error("Home directory unknown"); } else getone(), p = file; eol(); if (chdir(p) < 0) filioerr(p); if (savedfile[0] != '/') edited = 0; continue; } if (inopen) tailprim("change", 2, 1); tail2of("change"); break; #endif default: if (inopen) goto notinvis; tail("change"); break; } /* change */ aiflag = exclam(); setCNL(); vmacchng(0); setin(addr1); delete(0); inappend = 1; ignore(append(gettty, addr1 - 1)); inappend = 0; nochng(); continue; /* delete */ case 'd': /* * Caution: dp and dl have special meaning already. */ tail("delete"); c = cmdreg(); setCNL(); vmacchng(0); if (c) YANKreg(c); delete(0); appendnone(); continue; /* edit */ /* ex */ case 'e': tail(peekchar() == 'x' ? "ex" : "edit"); editcmd: if (!exclam() && chng) c = 'E'; filename(c); if (c == 'E') { ungetchar(lastchar()); ignore(quickly()); } setnoaddr(); doecmd: init(); addr2 = zero; laste++; ex_sync(); rop(c); nochng(); continue; /* file */ case 'f': tail("file"); setnoaddr(); filename(c); noonl(); /* synctmp(); */ continue; /* global */ case 'g': tail("global"); global(!exclam()); nochng(); continue; /* insert */ case 'i': if (inopen) goto notinvis; tail("insert"); setdot(); nonzero(); aiflag = exclam(); ex_newline(); vmacchng(0); deletenone(); setin(addr2); inappend = 1; ignore(append(gettty, addr2 - 1)); inappend = 0; if (dot == zero && dol > zero) dot = one; nochng(); continue; /* join */ case 'j': tail("join"); c = exclam(); setcount(); nonzero(); ex_newline(); vmacchng(0); if (given < 2 && addr2 != dol) addr2++; join(c); continue; /* k */ case 'k': casek: pastwh(); c = ex_getchar(); if (endcmd(c)) serror("Mark what?|%s requires following letter", Command); ex_newline(); if (!islower(c)) error("Bad mark|Mark must specify a letter"); setdot(); nonzero(); names[c - 'a'] = *addr2 &~ 01; anymarks = 1; continue; /* list */ case 'l': tail("list"); setCNL(); ignorf(setlist(1)); pflag = 0; goto print; case 'm': if (peekchar() == 'a') { ignchar(); if (peekchar() == 'p') { /* map */ tail2of("map"); setnoaddr(); mapcmd(0, 0); continue; } /* mark */ tail2of("mark"); goto casek; } /* move */ tail("move"); vmacchng(0); move(); continue; case 'n': if (peekchar() == 'u') { tail("number"); goto numberit; } /* next */ tail("next"); setnoaddr(); ckaw(); ignore(quickly()); if (getargs()) makargs(); next(); c = 'e'; filename(c); goto doecmd; /* open */ case 'o': tail("open"); oop(); pflag = 0; nochng(); continue; case 'p': case 'P': switch (peekchar()) { /* put */ case 'u': tail("put"); setdot(); c = cmdreg(); eol(); vmacchng(0); if (c) putreg(c); else put(); continue; case 'r': ignchar(); if (peekchar() == 'e') { /* preserve */ tail2of("preserve"); eol(); if (preserve() == 0) error("Preserve failed!"); else error("File preserved."); } tail2of("print"); break; default: tail("print"); break; } /* print */ setCNL(); pflag = 0; print: nonzero(); if (CL && span() > EX_LINES) { flush1(); vclear(); } plines(addr1, addr2, 1); continue; /* quit */ case 'q': tail("quit"); setnoaddr(); c = quickly(); eol(); if (!c) quit: nomore(); if (inopen) { vgoto(WECHO, 0); if (!ateopr()) vnfl(); else { tostop(); } flush(); setty(normf); } cleanup(1); ex_exit(0); case 'r': if (peekchar() == 'e') { ignchar(); switch (peekchar()) { /* rewind */ case 'w': tail2of("rewind"); setnoaddr(); if (!exclam()) { ckaw(); if (chng && dol > zero) error("No write@since last chage (:rewind! overrides)"); } eol(); erewind(); next(); c = 'e'; ungetchar(lastchar()); filename(c); goto doecmd; /* recover */ case 'c': tail2of("recover"); setnoaddr(); c = 'e'; if (!exclam() && chng) c = 'E'; filename(c); if (c == 'E') { ungetchar(lastchar()); ignore(quickly()); } init(); addr2 = zero; laste++; ex_sync(); recover(); rop2(); revocer(); if (status == 0) rop3(c); if (dol != zero) change(); nochng(); continue; } tail2of("read"); } else tail("read"); /* read */ if (savedfile[0] == 0 && dol == zero) c = 'e'; pastwh(); vmacchng(0); if (peekchar() == '!') { setdot(); ignchar(); unix0(0); filter(0); continue; } filename(c); rop(c); nochng(); if (inopen && endline && addr1 > zero && addr1 < dol) dot = addr1 + 1; continue; case 's': switch (peekchar()) { /* * Caution: 2nd char cannot be c, g, or r * because these have meaning to substitute. */ /* set */ case 'e': tail("set"); setnoaddr(); set(); continue; /* shell */ case 'h': tail("shell"); setNAEOL(); vnfl(); putpad(TE); flush(); unixwt(1, unixex("-i", (char *) 0, 0, 0)); vcontin(0); continue; /* source */ case 'o': #ifdef notdef if (inopen) goto notinvis; #endif tail("source"); setnoaddr(); getone(); eol(); source(file, 0); continue; #ifdef SIGTSTP /* stop, suspend */ case 't': tail("stop"); goto suspend; case 'u': tail("suspend"); suspend: if (!dosusp) error("Old tty driver|Not using new tty driver/shell"); c = exclam(); eol(); if (!c) ckaw(); onsusp(0); continue; #endif } /* fall into ... */ /* & */ /* ~ */ /* substitute */ case '&': case '~': Command = "substitute"; if (c == 's') tail(Command); vmacchng(0); if (!substitute(c)) pflag = 0; continue; /* t */ case 't': if (peekchar() == 'a') { tail("tag"); tagfind(exclam()); if (!inopen) lchng = chng - 1; else nochng(); continue; } tail("t"); vmacchng(0); move(); continue; case 'u': if (peekchar() == 'n') { ignchar(); switch(peekchar()) { /* unmap */ case 'm': tail2of("unmap"); setnoaddr(); mapcmd(1, 0); continue; /* unabbreviate */ case 'a': tail2of("unabbreviate"); setnoaddr(); mapcmd(1, 1); anyabbrs = 1; continue; } /* undo */ tail2of("undo"); } else tail("undo"); setnoaddr(); markDOT(); c = exclam(); ex_newline(); undo(c); continue; case 'v': switch (peekchar()) { case 'e': /* version */ tail("version"); setNAEOL(); ex_printf("@(#) Version 3.6, 11/3/80" " (4.0BSD). git " "160803 14:24" +5); noonl(); continue; /* visual */ case 'i': tail("visual"); if (inopen) { c = 'e'; goto editcmd; } vop(); pflag = 0; nochng(); continue; } /* v */ tail("v"); global(0); nochng(); continue; /* write */ case 'w': c = peekchar(); tail(c == 'q' ? "wq" : "write"); wq: if (skipwh() && peekchar() == '!') { pofix(); ignchar(); setall(); unix0(0); filter(1); } else { setall(); wop(1); nochng(); } if (c == 'q') goto quit; continue; /* xit */ case 'x': tail("xit"); if (!chng) goto quit; c = 'q'; goto wq; /* yank */ case 'y': tail("yank"); c = cmdreg(); setcount(); eol(); vmacchng(0); if (c) YANKreg(c); else yank(); continue; /* z */ case 'z': zop(0); pflag = 0; continue; /* * */ /* @ */ case '*': case '@': c = ex_getchar(); if (c=='\n' || c=='\r') ungetchar(c); if (any(c, "@*\n\r")) c = lastmac; if (isupper(c)) c = tolower(c); if (!islower(c)) error("Bad register"); ex_newline(); setdot(); cmdmac(c); continue; /* | */ case '|': endline = 0; goto caseline; /* \n */ case '\n': endline = 1; caseline: notempty(); if (addr2 == 0) { if (UP != NOSTR && c == '\n' && !inglobal) c = CTRL('k'); if (inglobal) addr1 = addr2 = dot; else { if (dot == dol) error("At EOF|At end-of-file"); addr1 = addr2 = dot + 1; } } setdot(); nonzero(); if (seensemi) addr1 = addr2; ex_getline(*addr1); if (c == CTRL('k')) { flush1(); destline--; if (hadpr) shudclob = 1; } plines(addr1, addr2, 1); continue; /* " */ case '"': comment(); continue; /* # */ case '#': numberit: setCNL(); ignorf(setnumb(1)); pflag = 0; goto print; /* = */ case '=': ex_newline(); setall(); if (inglobal == 2) pofix(); ex_printf("%d", lineno(addr2)); noonl(); continue; /* ! */ case '!': if (addr2 != 0) { vmacchng(0); unix0(0); setdot(); filter(2); } else { unix0(1); pofix(); putpad(TE); flush(); unixwt(1, unixex("-c", uxb, 0, 0)); vclrech(1); /* vcontin(0); */ nochng(); } continue; /* < */ /* > */ case '<': case '>': for (cnt = 1; peekchar() == c; cnt++) ignchar(); setCNL(); vmacchng(0); shift(c, cnt); continue; /* ^D */ /* EOF */ case CTRL('d'): case EOF: if (exitoneof) { if (addr2 != 0) dot = addr2; return; } if (!isatty(0)) { if (intty) /* * Chtty sys call at UCB may cause a * input which was a tty to suddenly be * turned into /dev/null. */ onhup(0); return; } if (addr2 != 0) { setlastchar('\n'); putnl(); } if (dol == zero) { if (addr2 == 0) putnl(); notempty(); } ungetchar(EOF); zop(hadpr); continue; default: if (!isalpha(c)) break; ungetchar(c); tailprim("", 0, 0); } ierror("What?|Unknown command character '%c'", c); } }