|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)context.c 3.9 (Berkeley) 6/29/88";
20: #endif /* not lint */
21:
22: #include <stdio.h>
23: #include "value.h"
24: #include "string.h"
25: #include "context.h"
26:
27: /*
28: * Context push/pop for nested command files.
29: */
30:
31: char *malloc();
32:
33: cx_alloc()
34: {
35: register struct context *xp;
36:
37: if (cx.x_type != 0) {
38: xp = (struct context *)
39: malloc((unsigned) sizeof (struct context));
40: if (xp == 0)
41: return -1;
42: *xp = cx;
43: cx.x_link = xp;
44: cx.x_type = 0;
45: }
46: cx.x_erred = 0;
47: cx.x_synerred = 0;
48: cx.x_abort = 0;
49: return 0;
50: }
51:
52: cx_free()
53: {
54: struct context *xp;
55:
56: if ((xp = cx.x_link) != 0) {
57: cx = *xp;
58: free((char *)xp);
59: } else
60: cx.x_type = 0;
61: }
62:
63: cx_beginfile(filename)
64: char *filename;
65: {
66: if (cx_alloc() < 0)
67: return -1;
68: cx.x_type = X_FILE;
69: if ((cx.x_filename = str_cpy(filename)) == 0)
70: goto bad;
71: cx.x_fp = fopen(filename, "r");
72: if (cx.x_fp == 0)
73: goto bad;
74: cx.x_bol = 1;
75: cx.x_lineno = 0;
76: cx.x_errwin = 0;
77: cx.x_noerr = 0;
78: return 0;
79: bad:
80: if (cx.x_filename != 0)
81: str_free(cx.x_filename);
82: cx_free();
83: return -1;
84: }
85:
86: cx_beginbuf(buf, arg, narg)
87: char *buf;
88: struct value *arg;
89: int narg;
90: {
91: if (cx_alloc() < 0)
92: return -1;
93: cx.x_type = X_BUF;
94: cx.x_bufp = cx.x_buf = buf;
95: cx.x_arg = arg;
96: cx.x_narg = narg;
97: return 0;
98: }
99:
100: cx_end()
101: {
102: switch (cx.x_type) {
103: case X_BUF:
104: break;
105: case X_FILE:
106: (void) fclose(cx.x_fp);
107: str_free(cx.x_filename);
108: break;
109: }
110: cx_free();
111: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.