|
|
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);
}