xref: /original-bsd/contrib/ed/e.c (revision 25342562)
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[] = "@(#)e.c	8.1 (Berkeley) 05/31/93";
13 #endif /* not lint */
14 
15 #include <sys/types.h>
16 #include <sys/stat.h>
17 
18 #include <fcntl.h>
19 #include <limits.h>
20 #include <regex.h>
21 #include <setjmp.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <unistd.h>
26 
27 #ifdef DBI
28 #include <db.h>
29 #endif
30 
31 #include "ed.h"
32 #include "extern.h"
33 
34 /*
35  * Places a new file in the buffer to be editted. The current contents
36  * of the buffer are deleted - no undo can be perfomed. A warning is
37  * issued once if no write has occurred since the last buffer
38  * modification (unless 'E' spec'd).
39  */
40 
41 void
42 e(inputt, errnum)
43 	FILE *inputt;
44 	int *errnum;
45 {
46 	int l_which;		/* which is it? 'e' or 'E' */
47 	char *l_temp;
48 
49 	l_which = ss;
50 
51 	l_temp = filename(inputt, errnum);
52 	if (*errnum == 1) {
53 		sigspecial++;
54 		free(filename_current);
55 		filename_current = l_temp;
56 		sigspecial--;
57 		if (sigint_flag && (!sigspecial))
58 			SIGINT_ACTION;
59 	} else
60 		if (*errnum == -2)
61 			while (((ss = getc(inputt)) != '\n') || (ss == EOF));
62 		else
63 			if (*errnum < 0)
64 				return;
65 	*errnum = 0;
66 
67 	/* Note: 'E' will bypass this if stmt., which warns of no save. */
68 	if ((change_flag == 1L) && (l_which == 'e')) {
69 		change_flag = 0L;
70 		strcpy(help_msg, "warning: buffer changes not saved");
71 		*errnum = -1;
72 		ungetc('\n', inputt);
73 		return;
74 	}
75 	Start = top;
76 	End = bottom;
77 	Start_default = End_default = 0;
78 	if (Start == NULL && bottom == NULL);
79 	else {
80 		ungetc(ss, inputt);
81 		d(inputt, errnum);	/* delete the whole buffer */
82 	}
83 
84 	/* An 'e' clears all traces of last doc'mt, even in 'g'. */
85 	u_clr_stk();
86 	if (*errnum < 0)
87 		return;
88 	*errnum = 0;
89 #ifdef STDIO
90 	if (fhtmp > NULL) {
91 		fclose(fhtmp);
92 		unlink(template);
93 	}
94 #endif
95 #ifdef DBI
96 	if (dbhtmp != NULL) {
97 		(dbhtmp->close) (dbhtmp);
98 		unlink(template);
99 	}
100 #endif
101 
102 	name_set = 1;
103 	e2(inputt, errnum);
104 
105 	*errnum = 1;
106 }
107 
108 /*
109  * This is pulled out of e.c to make the "simulated 'e'" at startup easier to
110  * handle.
111  */
112 void
113 e2(inputt, errnum)
114 	FILE *inputt;
115 	int *errnum;
116 {
117 	char *tmp_path;
118 
119 	sigspecial++;
120 #ifndef MEMORY
121 	if (template == NULL) {
122 		template = (char *) calloc(FILENAME_LEN, sizeof(char));
123 		if (template == NULL)
124 			ed_exit(4);
125 	}
126 	/* create the buffer using the method favored at compile time */
127 	tmp_path = getenv("TMPDIR");
128 	sprintf(template, "%s/_4.4bsd_ed_XXXXXX", tmp_path ? tmp_path : "/tmp");
129 	mktemp(template);
130 #endif
131 #ifdef STDIO
132 	fhtmp = fopen(template, "w+");
133 	if (fhtmp == NULL) {
134 		ed_exit(5); /* unable to create buffer */
135 	}
136 	fwrite("R", sizeof(char), 1, fhtmp);
137 	file_seek = 0;
138 #endif
139 #ifdef DBI
140 	/* open using btree only, recno will mess things up
141 	 * because of garbage collection and how recno operates
142 	 * with delete.
143 	 */
144 	dbhtmp = dbopen(template, O_CREAT | O_RDWR,
145 	    S_IRUSR | S_IWUSR, (DBTYPE) DB_BTREE, NULL);
146 	if (dbhtmp == NULL) {
147 		ed_exit(5); /* unable to create buffer */
148 	}
149 #endif
150 	current = top;
151 	Start = top;
152 	End = bottom;
153 
154 	sigspecial--;
155 	if (sigint_flag &&(!sigspecial))
156 		SIGINT_ACTION;
157 
158 	change_flag = 1;
159 	if (name_set) {
160 		/* So 'r' knows the filename is already read in. */
161 		filename_flag = 1;
162 		r(inputt, errnum);
163 		gut_num = line_number(bottom) + 512;
164 		if (gut == NULL) {
165 			gut = malloc(sizeof(LINE **) * gut_num);
166 			if (gut == NULL) {
167 				*errnum = -1;
168 				strcpy(help_msg, "out of memory error");
169 				return;
170 			}
171 		}
172 	}
173 	change_flag = 0;
174 	*errnum = 1;
175 }
176