|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)context.c 3.7 4/24/85";
3: #endif
4:
5: /*
6: * Copyright (c) 1983 Regents of the University of California,
7: * All rights reserved. Redistribution permitted subject to
8: * the terms of the Berkeley Software License Agreement.
9: */
10:
11: #include <stdio.h>
12: #include "value.h"
13: #include "string.h"
14: #include "context.h"
15:
16: /*
17: * Context push/pop for nested command files.
18: */
19:
20: char *malloc();
21:
22: cx_alloc()
23: {
24: register struct context *xp;
25:
26: if (cx.x_type != 0) {
27: xp = (struct context *)
28: malloc((unsigned) sizeof (struct context));
29: if (xp == 0)
30: return -1;
31: *xp = cx;
32: cx.x_link = xp;
33: cx.x_type = 0;
34: }
35: cx.x_erred = 0;
36: cx.x_synerred = 0;
37: cx.x_abort = 0;
38: return 0;
39: }
40:
41: cx_free()
42: {
43: struct context *xp;
44:
45: if ((xp = cx.x_link) != 0) {
46: cx = *xp;
47: free((char *)xp);
48: } else
49: cx.x_type = 0;
50: }
51:
52: cx_beginfile(filename)
53: char *filename;
54: {
55: if (cx_alloc() < 0)
56: return -1;
57: cx.x_type = X_FILE;
58: if ((cx.x_filename = str_cpy(filename)) == 0)
59: goto bad;
60: cx.x_fp = fopen(filename, "r");
61: if (cx.x_fp == 0)
62: goto bad;
63: cx.x_bol = 1;
64: cx.x_lineno = 0;
65: cx.x_errwin = 0;
66: cx.x_noerr = 0;
67: return 0;
68: bad:
69: if (cx.x_filename != 0)
70: str_free(cx.x_filename);
71: cx_free();
72: return -1;
73: }
74:
75: cx_beginbuf(buf, arg, narg)
76: char *buf;
77: struct value *arg;
78: int narg;
79: {
80: if (cx_alloc() < 0)
81: return -1;
82: cx.x_type = X_BUF;
83: cx.x_bufp = cx.x_buf = buf;
84: cx.x_arg = arg;
85: cx.x_narg = narg;
86: return 0;
87: }
88:
89: cx_end()
90: {
91: switch (cx.x_type) {
92: case X_BUF:
93: break;
94: case X_FILE:
95: (void) fclose(cx.x_fp);
96: str_free(cx.x_filename);
97: break;
98: }
99: cx_free();
100: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.