|
|
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.