|
|
1.1 root 1: /*************************************************************************
2: * This program is copyright (C) 1985, 1986 by Jonathan Payne. It is *
3: * provided to you without charge for use only on a licensed Unix *
4: * system. You may copy JOVE provided that this notice is included with *
5: * the copy. You may not sell copies of this program or versions *
6: * modified for use on microcomputer systems, unless the copies are *
7: * included with a Unix system distribution and the source is provided. *
8: *************************************************************************/
9:
10: #include "jove.h"
11: #include "ctype.h"
12: #include <signal.h>
13: #ifdef ANSICODES
14: #include "termcap.h"
15: #endif
16:
17: Digit()
18: {
19: GetExp(LastKeyStruck);
20: }
21:
22: Digit0()
23: {
24: GetExp('0');
25: }
26:
27: Digit1()
28: {
29: GetExp('1');
30: }
31:
32: Digit2()
33: {
34: GetExp('2');
35: }
36:
37: Digit3()
38: {
39: GetExp('3');
40: }
41:
42: Digit4()
43: {
44: GetExp('4');
45: }
46:
47: Digit5()
48: {
49: GetExp('5');
50: }
51:
52: Digit6()
53: {
54: GetExp('6');
55: }
56:
57: Digit7()
58: {
59: GetExp('7');
60: }
61:
62: Digit8()
63: {
64: GetExp('8');
65: }
66:
67: Digit9()
68: {
69: GetExp('9');
70: }
71:
72: prCTIME()
73: {
74: s_mess(": %f %s", get_time((long *) 0, (char *) 0, 0, -1));
75: }
76:
77: extern int alarmed;
78:
79: FourTime()
80: {
81: int oldc = LastKeyStruck,
82: newc;
83: int nexp;
84:
85: alarmed = 0;
86: exp_p = 1;
87: this_cmd = ARG_CMD;
88: do {
89: if ((nexp = exp * 4) != 0)
90: exp = nexp;
91: if (!alarmed)
92: newc = waitchar();
93: else
94: newc = getch();
95: if (alarmed)
96: message(key_strokes);
97: } while (newc == oldc);
98: Ungetc(newc);
99: }
100:
101: int exp_p,
102: exp;
103:
104: GetExp(c)
105: {
106: int sign = 1,
107: i,
108: digited = 0;
109:
110: if (!isdigit(c) && c != '-')
111: complain((char *) 0);
112: if (exp_p)
113: i = exp;
114: else
115: i = 0;
116: if (c == '-') {
117: sign = -1;
118: goto goread;
119: }
120: for (;;) {
121: if (alarmed)
122: message(key_strokes);
123: if (isdigit(c)) {
124: i = i * 10 + (c - '0');
125: digited++;
126: } else {
127: if (digited)
128: exp_p = 1;
129: else
130: i = 1;
131: exp = i * sign;
132: this_cmd = ARG_CMD;
133: Ungetc(c);
134: return;
135: }
136: goread: if (!alarmed)
137: c = waitchar();
138: else {
139: add_mess(NullStr);
140: c = getch();
141: }
142: }
143: }
144:
145: ChrToOct()
146: {
147: int c;
148:
149: c = waitchar();
150: if (alarmed)
151: message(key_strokes);
152: ins_str(sprint("\\%03o", c), NO);
153: }
154:
155: StrLength()
156: {
157: static char inquotes[] = "Where are the quotes?";
158: char *first = StrIndex(-1, linebuf, curchar, '"'),
159: *last = StrIndex(1, linebuf, curchar + 1, '"'),
160: c;
161: int numchars = 0;
162:
163: if (first == 0 || last == 0)
164: complain(inquotes);
165: first++;
166: while (first < last) {
167: c = *first++;
168: if (c == '\\') {
169: int num;
170:
171: if (!isdigit(*first))
172: ++first;
173: else {
174: num = 3;
175: while (num-- && isdigit(*first++) && first < last)
176: ;
177: }
178: }
179: numchars++;
180: }
181: s_mess("%d characters", numchars);
182: }
183:
184: /* Transpos cur_char with cur_char - 1 */
185:
186: TransChar()
187: {
188: char before;
189:
190: if (curchar == 0 || (eolp() && curchar == 1))
191: complain((char *) 0); /* BEEP */
192: exp = 1;
193: if (eolp())
194: BackChar();
195: before = linebuf[curchar - 1];
196: DelPChar();
197: ForChar();
198: Insert(before);
199: }
200:
201: /* Switch current line with previous one */
202:
203: TransLines()
204: {
205: disk_line old_prev;
206:
207: if (firstp(curline))
208: return;
209: exp = 1;
210: lsave();
211: old_prev = curline->l_prev->l_dline;
212: curline->l_prev->l_dline = curline->l_dline;
213: curline->l_dline = old_prev;
214: getDOT();
215: if (!lastp(curline))
216: line_move(FORWARD, NO);
217: modify();
218: }
219:
220: Leave()
221: {
222: longjmp(mainjmp, QUIT);
223: }
224:
225: /* If argument is specified, kill that many lines down. Otherwise,
226: if we "appear" to be at the end of a line, i.e. everything to the
227: right of the cursor is white space, we delete the line separator
228: as if we were at the end of the line. */
229:
230: KillEOL()
231: {
232: Line *line2;
233: int char2;
234:
235: if (exp_p) {
236: if (exp == 0) { /* Kill to beginning of line */
237: line2 = curline;
238: char2 = 0;
239: } else {
240: line2 = next_line(curline, exp);
241: if ((LineDist(curline, line2) < exp) || (line2 == curline))
242: char2 = length(line2);
243: else
244: char2 = 0;
245: }
246: } else if (blnkp(&linebuf[curchar])) {
247: line2 = next_line(curline, 1);
248: if (line2 == curline)
249: char2 = length(curline);
250: else
251: char2 = 0;
252: } else {
253: line2 = curline;
254: char2 = length(curline);
255: }
256: reg_kill(line2, char2, 0);
257: }
258:
259: /* Kill to beginning of sentence */
260:
261: KillBos()
262: {
263: exp = -exp;
264: KillEos();
265: }
266:
267: /* Kill to end of sentence */
268:
269: KillEos()
270: {
271: Line *line1;
272: int char1;
273:
274: line1 = curline;
275: char1 = curchar;
276: Eos();
277: reg_kill(line1, char1, 1);
278: }
279:
280: KillExpr()
281: {
282: Line *line1;
283: int char1;
284:
285: line1 = curline;
286: char1 = curchar;
287: FSexpr();
288: reg_kill(line1, char1, 1);
289: }
290:
291: EscPrefix()
292: {
293: HandlePref(pref1map);
294: }
295:
296: CtlxPrefix()
297: {
298: HandlePref(pref2map);
299: }
300:
301: MiscPrefix()
302: {
303: HandlePref(miscmap);
304: }
305:
306: HandlePref(map)
307: data_obj **map;
308: {
309: register data_obj *cp;
310: register int c;
311:
312: c = waitchar();
313: if (c == CTL(G)) {
314: message("[Aborted]");
315: rbell();
316: return;
317: }
318:
319: if (alarmed)
320: message(key_strokes);
321:
322: cp = map[c];
323: if (cp == 0) {
324: s_mess("[%sunbound]", key_strokes);
325: rbell();
326: } else
327: ExecCmd(cp);
328: }
329:
330: Yank()
331: {
332: Line *line,
333: *lp;
334: Bufpos *dot;
335:
336: if (killbuf[killptr] == 0)
337: complain("[Nothing to yank!]");
338: lsave();
339: this_cmd = YANKCMD;
340: line = killbuf[killptr];
341: lp = lastline(line);
342: dot = DoYank(line, 0, lp, length(lp), curline, curchar, curbuf);
343: SetMark();
344: SetDot(dot);
345: }
346:
347: WtModBuf()
348: {
349: if (!ModBufs(NO))
350: message("[No buffers need saving]");
351: else
352: put_bufs(exp_p);
353: }
354:
355: put_bufs(askp)
356: {
357: register Buffer *oldb = curbuf,
358: *b;
359:
360: for (b = world; b != 0; b = b->b_next) {
361: if (!IsModified(b) || b->b_type != B_FILE)
362: continue;
363: SetBuf(b); /* Make this current Buffer */
364: if (curbuf->b_fname == 0) {
365: char *newname;
366:
367: newname = ask(NullStr, "Buffer \"%s\" needs a file name; type Return to skip: ", b->b_name);
368: if (*newname == 0)
369: continue;
370: setfname(b, newname);
371: }
372: if (SaveBuf(askp))
373: unmodify();
374: }
375: SetBuf(oldb);
376: }
377:
378: SaveBuf(askp)
379: {
380: char *yorn;
381:
382: if (askp) {
383: yorn = ask((char *) 0, "Write %s? ", curbuf->b_fname);
384: if (*yorn != 'Y' && *yorn != 'y')
385: return 0;
386: }
387: file_write(curbuf->b_fname, 0);
388: return 1;
389: }
390:
391: DOTsave(buf)
392: Bufpos *buf;
393: {
394: buf->p_line = curline;
395: buf->p_char = curchar;
396: }
397:
398: ToIndent()
399: {
400: register char *cp,
401: c;
402:
403: for (cp = linebuf; c = *cp; cp++)
404: if (c != ' ' && c != '\t')
405: break;
406: curchar = cp - linebuf;
407: }
408:
409: GoLine()
410: {
411: Line *newline;
412:
413: #ifndef ANSICODES
414: if (exp_p == 0)
415: return;
416: #else
417: if (exp_p == 0 || exp <= 0) {
418: if (SP)
419: putpad(SP, 1); /* Ask for cursor position */
420: return;
421: }
422: #endif
423: newline = next_line(curbuf->b_first, exp - 1);
424: PushPntp(newline);
425: SetLine(newline);
426: }
427:
428: #ifdef ANSICODES
429: MoveToCursor(line, col)
430: {
431: register struct scrimage *sp = &PhysScreen[line];
432:
433: while (sp->s_id == NULL)
434: sp = &PhysScreen[--line];
435: if (sp->s_flags & MODELINE)
436: complain((char *) 0);
437: if (curwind != sp->s_window)
438: SetWind(sp->s_window);
439: SetLine(sp->s_lp);
440: curchar = how_far(sp->s_lp, col);
441: }
442:
443: AnsiCodes()
444: {
445: int c;
446: int num1 = 0;
447: int num2;
448: static char *unsupported = "[Unsupported ANSI code received]";
449:
450: while (isdigit(c = getch()))
451: num1 = (num1*10) + (c - '0');
452:
453: switch (c) {
454: case ';':
455: num2 = 0;
456: while (isdigit(c = getch()))
457: num2 = (num2*10) + (c - '0');
458: switch (c) {
459: case 'R':
460: MoveToCursor(--num1, --num2);
461: break;
462: case 'H':
463: Eow(); Bol();
464: break;
465: default:
466: complain(unsupported);
467: }
468: break;
469: case 'A':
470: line_move(BACKWARD, NO);
471: break;
472: case 'B':
473: line_move(FORWARD, NO);
474: break;
475: case 'C':
476: ForChar();
477: break;
478: case 'D':
479: BackChar();
480: break;
481: case 'H':
482: Bow();
483: break;
484: case 'J':
485: if (num1 == 2) {
486: ClAndRedraw();
487: break;
488: }
489: /* FALL THROUGH */
490: default:
491: complain(unsupported);
492: }
493: }
494: #endif ANSICODES
495:
496: NotModified()
497: {
498: unmodify();
499: }
500:
501: SetLMargin()
502: {
503: LMargin = calc_pos(linebuf, curchar);
504: }
505:
506: SetRMargin()
507: {
508: RMargin = calc_pos(linebuf, curchar);
509: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.