1 /*-
2 * Copyright (c) 1992, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Rodney Ruddock of the University of Guelph.
7 *
8 * %sccs.include.redist.c%
9 */
10
11 #ifndef lint
12 static char sccsid[] = "@(#)k.c 8.1 (Berkeley) 05/31/93";
13 #endif /* not lint */
14
15 #include <sys/types.h>
16
17 #include <regex.h>
18 #include <setjmp.h>
19 #include <stdio.h>
20 #include <string.h>
21
22 #ifdef DBI
23 #include <db.h>
24 #endif
25
26 #include "ed.h"
27 #include "extern.h"
28
29 /*
30 * This the mark command (k); see ed(1).
31 */
32
33 void
set_mark(inputt,errnum)34 set_mark(inputt, errnum)
35 FILE *inputt;
36 int *errnum;
37 {
38 int l_mark;
39
40 l_mark = getc(inputt);
41 if (End_default == 1)
42 End = current;
43 if (End == NULL) {
44 strcpy(help_msg, "bad address");
45 *errnum = -1;
46 ungetc('\n', inputt);
47 return;
48 }
49 Start_default = End_default = 0;
50
51 /*
52 * The marks have to be "a" to "z" (inclusive); that is, ye olde
53 * portable character set (ASCII) lower case alphabet.
54 */
55 if ((l_mark < 97) || (l_mark > 122) || (End == NULL)) {
56 strcpy(help_msg, "illegal mark character");
57 *errnum = -1;
58 return;
59 }
60 l_mark = l_mark - 97;
61 (mark_matrix[l_mark].address) = End;
62
63 if (rol(inputt, errnum))
64 return;
65
66 *errnum = 1;
67 }
68
69
70 /*
71 * This gets the address of a marked line.
72 */
73 LINE *
get_mark(inputt,errnum)74 get_mark(inputt, errnum)
75 FILE *inputt;
76 int *errnum;
77 {
78 int l_mark;
79
80 l_mark = getc(inputt);
81 /* Ditto above comment. */
82 if ((l_mark < 97) || (l_mark > 122)) {
83 strcpy(help_msg, "illegal mark character");
84 *errnum = -1;
85 return (NULL);
86 }
87 l_mark = l_mark - 97;
88 *errnum = 0;
89 return (mark_matrix[l_mark].address);
90 }
91
92
93 /*
94 * This is for the restoration of marks during an undo.
95 */
96 void
ku_chk(begi,fini,val)97 ku_chk(begi, fini, val)
98 LINE *begi, *fini, *val;
99 {
100 register int l_cnt;
101 LINE *l_midd;
102
103 l_midd = begi;
104 while (l_midd != NULL) {
105 for (l_cnt = 0; l_cnt < 26; l_cnt++)
106 if (mark_matrix[l_cnt].address == l_midd) {
107 u_add_stk(&(mark_matrix[l_cnt].address));
108 (mark_matrix[l_cnt].address) = val;
109 }
110 if (l_midd == fini)
111 break;
112 l_midd = l_midd->below;
113 }
114 }
115