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[] = "@(#)input_lines.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 <stdlib.h>
21 #include <string.h>
22
23 #ifdef DBI
24 #include <db.h>
25 #endif
26
27 #include "ed.h"
28 #include "extern.h"
29
30 /*
31 * This central function gets text from some file, which can (and most
32 * oft is) stdin. This flexability allows any text inputing function
33 * to use it.
34 */
35 long
input_lines(fp,errnum)36 input_lines(fp, errnum)
37 FILE *fp;
38 int *errnum;
39 {
40 register long l_nn = 0;
41 register int l_ss = ss;
42 register char *l_text = text;
43 LINE *l_temp_line, *l_temp1;
44 long l_ttl = 0;
45 int l_nn_max = nn_max, l_jmp_flag;
46 char *l_text2;
47
48 if (End_default)
49 Start = current;
50 else
51 Start = End;
52 Start_default = End_default = 0;
53
54 sigspecial++;
55 /* Start == NULL means line 0 which is legal for this function only. */
56 nn_max_end = l_temp_line = Start;
57 if (Start == NULL) {
58 l_temp1 = top;
59 u_add_stk(&(top->above));
60 } else {
61 u_add_stk(&(Start->below));
62 l_temp1 = Start->below;
63 }
64 sigspecial--;
65 if (sigint_flag && (!sigspecial))
66 SIGINT_ACTION;
67
68 sigspecial++;
69 if (l_jmp_flag = setjmp(ctrl_position3))
70 goto point;
71
72 for (;;) {
73 if (sigint_flag)
74 goto point;
75 sigspecial3 = 1;
76 l_ss = getc(fp);
77 sigspecial3 = 0;
78 if (l_ss == EOF) {
79 clearerr(fp);
80 if (l_nn) {
81 printf("<newline> added at end of line\n");
82 l_nn++;
83 goto eof_mk;
84 }
85 break;
86 }
87 l_text[l_nn++] = (char)l_ss;
88 if (l_ss == '\n') {
89 if (sigint_flag)
90 goto point;
91 eof_mk:
92 l_text[l_nn - 1] = '\0';
93 if ((l_nn == 2) && (l_text[0] == '.') && add_flag)
94 break;
95 nn_max_end = (LINE *)malloc(sizeof(LINE));
96 if (nn_max_end == NULL) {
97 *errnum = -1;
98 strcpy(help_msg, "out of memory error");
99 return (0L);
100 }
101 (nn_max_end->len) = l_nn - 1;
102 (nn_max_end->handle) = add_line(l_text, l_nn - 1);
103 (nn_max_end->above) = l_temp_line;
104 (nn_max_end->below) = NULL;
105 if (l_temp_line)
106 (l_temp_line->below) = nn_max_end;
107 else
108 top = nn_max_end;
109 l_temp_line = nn_max_end;
110
111 l_ttl += l_nn;
112 l_nn = 0;
113 if (l_ss == EOF)
114 break;
115 } else
116 if (l_nn > l_nn_max) {
117 l_nn_max += 512;
118 nn_max = l_nn_max;
119 l_text2 = l_text;
120 l_text = text =
121 calloc(l_nn_max + 2, sizeof(char));
122 if (text == NULL) {
123 *errnum = -1;
124 strcpy(help_msg, "out of memory error");
125 return (0L);
126 }
127 memmove(l_text, l_text2, l_nn);
128 free(l_text2);
129 }
130 }
131
132 point: current = nn_max_end;
133 if (current == NULL)
134 current = top;
135 if (l_temp1 == NULL)
136 bottom = nn_max_end;
137 else
138 if (nn_max_end != NULL) {
139 (nn_max_end->below) = l_temp1;
140 u_add_stk(&(l_temp1->above));
141 (l_temp1->above) = nn_max_end;
142 }
143 change_flag = 1;
144 sigspecial--;
145 sigspecial3 = 0;
146 if (sigint_flag && (!sigspecial))
147 SIGINT_ACTION;
148 *errnum = 1;
149 ss = l_ss;
150 return (l_ttl);
151 }
152