|
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 - metrics - downloadIndex: T m
Length: 7568 (0x1d90) Types: TextFile Names: »misc.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec1/jove/misc.c«
/************************************************************************ * This program is Copyright (C) 1986 by Jonathan Payne. JOVE is * * provided to you without charge, and with no warranty. You may give * * away copies of JOVE, including sources, provided that this notice is * * included in all the files. * ************************************************************************/ #include "jove.h" #include "ctype.h" #include <signal.h> #ifdef ANSICODES #include "termcap.h" #endif Digit() { GetExp(LastKeyStruck); } Digit0() { GetExp('0'); } Digit1() { GetExp('1'); } Digit2() { GetExp('2'); } Digit3() { GetExp('3'); } Digit4() { GetExp('4'); } Digit5() { GetExp('5'); } Digit6() { GetExp('6'); } Digit7() { GetExp('7'); } Digit8() { GetExp('8'); } Digit9() { GetExp('9'); } prCTIME() { s_mess(": %f %s", get_time((time_t *) 0, (char *) 0, 0, -1)); } extern int alarmed; FourTime() { int oldc = LastKeyStruck, newc; int nexp; alarmed = 0; exp_p = YES; this_cmd = ARG_CMD; do { if ((nexp = exp * 4) != 0) exp = nexp; if (!alarmed) newc = waitchar(); else newc = getch(); if (alarmed) message(key_strokes); } while (newc == oldc); Ungetc(newc); } int exp_p, exp; GetExp(c) { int sign = 0; static int digited; if (!isdigit(c) && c != '-') complain((char *) 0); if (exp_p == NO) { /* if we just got here */ exp = 0; /* start over */ digited = NO; } else if (exp_p == YES_NODIGIT) { sign = (exp < 0) ? -1 : 1; exp = 0; } if (!sign) sign = (exp < 0) ? -1 : 1; if (sign == -1) exp = -exp; if (c == '-') { sign = -sign; goto goread; } for (;;) { if (alarmed) message(key_strokes); if (isdigit(c)) { exp = (exp * 10) + (c - '0'); digited++; } else { if (digited) exp_p = YES; else { exp = 1; if (exp_p == NO) exp_p = YES_NODIGIT; } exp *= sign; this_cmd = ARG_CMD; Ungetc(c); return; } goread: if (!alarmed) c = waitchar(); else { add_mess(NullStr); c = getch(); } } } ChrToOct() { int c; c = waitchar(); if (alarmed) message(key_strokes); ins_str(sprint("\\%03o", c), NO); } StrLength() { static char inquotes[] = "Where are the quotes?"; char *first = StrIndex(-1, linebuf, curchar, '"'), *last = StrIndex(1, linebuf, curchar + 1, '"'), c; int numchars = 0; if (first == 0 || last == 0) complain(inquotes); first++; while (first < last) { c = *first++; if (c == '\\') { int num; if (!isdigit(*first)) ++first; else { num = 3; while (num-- && isdigit(*first++) && first < last) ; } } numchars++; } s_mess("%d characters", numchars); } /* Transpos cur_char with cur_char - 1 */ TransChar() { char before; if (curchar == 0 || (eolp() && curchar == 1)) complain((char *) 0); /* BEEP */ exp = 1; if (eolp()) BackChar(); before = linebuf[curchar - 1]; DelPChar(); ForChar(); Insert(before); } /* Switch current line with previous one */ TransLines() { disk_line old_prev; if (firstp(curline)) return; exp = 1; lsave(); old_prev = curline->l_prev->l_dline; curline->l_prev->l_dline = curline->l_dline; curline->l_dline = old_prev; getDOT(); if (!lastp(curline)) line_move(FORWARD, NO); modify(); } Leave() { longjmp(mainjmp, QUIT); } /* If argument is specified, kill that many lines down. Otherwise, if we "appear" to be at the end of a line, i.e. everything to the right of the cursor is white space, we delete the line separator as if we were at the end of the line. */ KillEOL() { Line *line2; int char2; if (exp_p) { if (exp == 0) { /* Kill to beginning of line */ line2 = curline; char2 = 0; } else { line2 = next_line(curline, exp); if ((LineDist(curline, line2) < exp) || (line2 == curline)) char2 = length(line2); else char2 = 0; } } else if (blnkp(&linebuf[curchar])) { line2 = next_line(curline, 1); if (line2 == curline) char2 = length(curline); else char2 = 0; } else { line2 = curline; char2 = length(curline); } reg_kill(line2, char2, 0); } /* Kill to beginning of sentence */ KillBos() { exp = -exp; KillEos(); } /* Kill to end of sentence */ KillEos() { Line *line1; int char1; line1 = curline; char1 = curchar; Eos(); reg_kill(line1, char1, 1); } KillExpr() { Line *line1; int char1; line1 = curline; char1 = curchar; FSexpr(); reg_kill(line1, char1, 1); } EscPrefix() { HandlePref(pref1map); } CtlxPrefix() { HandlePref(pref2map); } MiscPrefix() { HandlePref(miscmap); } HandlePref(map) data_obj **map; { register data_obj *cp; register int c; c = waitchar(); if (c == CTL(G)) { message("[Aborted]"); rbell(); return; } if (alarmed) message(key_strokes); cp = map[c]; if (cp == 0) { s_mess("[%sunbound]", key_strokes); rbell(); } else ExecCmd(cp); } Yank() { Line *line, *lp; Bufpos *dot; if (killbuf[killptr] == 0) complain("[Nothing to yank!]"); lsave(); this_cmd = YANKCMD; line = killbuf[killptr]; lp = lastline(line); dot = DoYank(line, 0, lp, length(lp), curline, curchar, curbuf); SetMark(); SetDot(dot); } WtModBuf() { if (!ModBufs(NO)) message("[No buffers need saving]"); else put_bufs(exp_p); } put_bufs(askp) { register Buffer *oldb = curbuf, *b; for (b = world; b != 0; b = b->b_next) { if (!IsModified(b) || b->b_type != B_FILE) continue; SetBuf(b); /* Make this current Buffer */ if (curbuf->b_fname == 0) { char *newname; newname = ask(NullStr, "Buffer \"%s\" needs a file name; type Return to skip: ", b->b_name); if (*newname == 0) continue; setfname(b, newname); } if (askp && (yes_or_no_p("Write %s? ", curbuf->b_fname) == NO)) continue; filemunge(curbuf->b_fname); chk_mtime(curbuf, curbuf->b_fname, "save"); file_write(curbuf->b_fname, 0); unmodify(); } SetBuf(oldb); } ToIndent() { register char *cp, c; for (cp = linebuf; c = *cp; cp++) if (c != ' ' && c != '\t') break; curchar = cp - linebuf; } GoLine() { Line *newline; #ifndef ANSICODES if (exp_p == NO) return; #else if (exp_p == NO || exp <= 0) { if (SP) putpad(SP, 1); /* Ask for cursor position */ return; } #endif newline = next_line(curbuf->b_first, exp - 1); PushPntp(newline); SetLine(newline); } #ifdef ANSICODES MoveToCursor(line, col) { register struct scrimage *sp = &PhysScreen[line]; while (sp->s_id == NULL) sp = &PhysScreen[--line]; if (sp->s_flags & MODELINE) complain((char *) 0); if (curwind != sp->s_window) SetWind(sp->s_window); SetLine(sp->s_lp); curchar = how_far(sp->s_lp, col); } AnsiCodes() { int c; int num1 = 0; int num2; static char *unsupported = "[Unsupported ANSI code received]"; while (isdigit(c = getch())) num1 = (num1*10) + (c - '0'); switch (c) { case ';': num2 = 0; while (isdigit(c = getch())) num2 = (num2*10) + (c - '0'); switch (c) { case 'R': MoveToCursor(--num1, --num2); break; case 'H': Eow(); Bol(); break; default: complain(unsupported); } break; case 'A': line_move(BACKWARD, YES); break; case 'B': line_move(FORWARD, YES); break; case 'C': ForChar(); break; case 'D': BackChar(); break; case 'H': Bow(); break; case 'J': if (num1 == 2) { ClAndRedraw(); break; } /* FALL THROUGH */ default: complain(unsupported); } } #endif ANSICODES NotModified() { unmodify(); } SetLMargin() { LMargin = calc_pos(linebuf, curchar); } SetRMargin() { RMargin = calc_pos(linebuf, curchar); }