xref: /csrg-svn/usr.bin/window/context.c (revision 15562)
1*15562Sedward #ifndef lint
2*15562Sedward static	char *sccsid = "@(#)context.c	3.1 83/11/22";
3*15562Sedward #endif
4*15562Sedward 
5*15562Sedward #include <stdio.h>
6*15562Sedward #include "value.h"
7*15562Sedward #include "context.h"
8*15562Sedward 
9*15562Sedward /*
10*15562Sedward  * Context push/pop for nested command files.
11*15562Sedward  */
12*15562Sedward 
13*15562Sedward char *malloc();
14*15562Sedward 
15*15562Sedward cx_alloc()
16*15562Sedward {
17*15562Sedward 	register struct context *xp;
18*15562Sedward 
19*15562Sedward 	if (cx.x_type != 0) {
20*15562Sedward 		xp = (struct context *)
21*15562Sedward 			malloc(1, (unsigned) sizeof (struct context));
22*15562Sedward 		if (xp == 0)
23*15562Sedward 			return -1;
24*15562Sedward 		*xp = cx;
25*15562Sedward 		cx.x_link = xp;
26*15562Sedward 		cx.x_type = 0;
27*15562Sedward 	}
28*15562Sedward 	cx.x_erred = 0;
29*15562Sedward 	cx.x_synerred = 0;
30*15562Sedward 	cx.x_abort = 0;
31*15562Sedward 	return 0;
32*15562Sedward }
33*15562Sedward 
34*15562Sedward cx_free()
35*15562Sedward {
36*15562Sedward 	if (cx.x_link != 0) {
37*15562Sedward 		free(cx.x_link);
38*15562Sedward 		cx = *cx.x_link;
39*15562Sedward 	} else
40*15562Sedward 		cx.x_type = 0;
41*15562Sedward }
42*15562Sedward 
43*15562Sedward cx_setfile(filename)
44*15562Sedward char *filename;
45*15562Sedward {
46*15562Sedward 	if (cx_alloc() < 0)
47*15562Sedward 		return -1;
48*15562Sedward 	cx.x_type = X_FILE;
49*15562Sedward 	if ((cx.x_filename = str_cpy(filename)) == 0)
50*15562Sedward 		goto bad;
51*15562Sedward 	cx.x_fp = fopen(filename, "r");
52*15562Sedward 	if (cx.x_fp == 0)
53*15562Sedward 		goto bad;
54*15562Sedward 	cx.x_bol = 1;
55*15562Sedward 	cx.x_lineno = 0;
56*15562Sedward 	cx.x_errwin = 0;
57*15562Sedward 	cx.x_baderr = 0;
58*15562Sedward 	return 0;
59*15562Sedward bad:
60*15562Sedward 	if (cx.x_filename != 0)
61*15562Sedward 		str_free(cx.x_filename);
62*15562Sedward 	cx_free();
63*15562Sedward 	return -1;
64*15562Sedward }
65*15562Sedward 
66*15562Sedward cx_setbuf(buf)
67*15562Sedward char *buf;
68*15562Sedward {
69*15562Sedward 	if (cx_alloc() < 0)
70*15562Sedward 		return -1;
71*15562Sedward 	cx.x_type = X_BUF;
72*15562Sedward 	cx.x_bufp = cx.x_buf = buf;
73*15562Sedward 	return 0;
74*15562Sedward }
75*15562Sedward 
76*15562Sedward cx_end()
77*15562Sedward {
78*15562Sedward 	switch (cx.x_type) {
79*15562Sedward 	case X_BUF:
80*15562Sedward 		break;
81*15562Sedward 	case X_FILE:
82*15562Sedward 		(void) fclose(cx.x_fp);
83*15562Sedward 		str_free(cx.x_filename);
84*15562Sedward 		break;
85*15562Sedward 	}
86*15562Sedward 	cx_free();
87*15562Sedward }
88