xref: /csrg-svn/usr.bin/window/context.c (revision 18746)
115562Sedward #ifndef lint
2*18746Sedward static char sccsid[] = "@(#)context.c	3.7 04/24/85";
315562Sedward #endif
415562Sedward 
5*18746Sedward /*
6*18746Sedward  * Copyright (c) 1983 Regents of the University of California,
7*18746Sedward  * All rights reserved.  Redistribution permitted subject to
8*18746Sedward  * the terms of the Berkeley Software License Agreement.
9*18746Sedward  */
10*18746Sedward 
1115562Sedward #include <stdio.h>
1215562Sedward #include "value.h"
1315579Sedward #include "string.h"
1415562Sedward #include "context.h"
1515562Sedward 
1615562Sedward /*
1715562Sedward  * Context push/pop for nested command files.
1815562Sedward  */
1915562Sedward 
2015562Sedward char *malloc();
2115562Sedward 
2215562Sedward cx_alloc()
2315562Sedward {
2415562Sedward 	register struct context *xp;
2515562Sedward 
2615562Sedward 	if (cx.x_type != 0) {
2715562Sedward 		xp = (struct context *)
2815579Sedward 			malloc((unsigned) sizeof (struct context));
2915562Sedward 		if (xp == 0)
3015562Sedward 			return -1;
3115562Sedward 		*xp = cx;
3215562Sedward 		cx.x_link = xp;
3315562Sedward 		cx.x_type = 0;
3415562Sedward 	}
3515562Sedward 	cx.x_erred = 0;
3615562Sedward 	cx.x_synerred = 0;
3715562Sedward 	cx.x_abort = 0;
3815562Sedward 	return 0;
3915562Sedward }
4015562Sedward 
4115562Sedward cx_free()
4215562Sedward {
4315579Sedward 	struct context *xp;
4415579Sedward 
4515579Sedward 	if ((xp = cx.x_link) != 0) {
4615579Sedward 		cx = *xp;
4715579Sedward 		free((char *)xp);
4815562Sedward 	} else
4915562Sedward 		cx.x_type = 0;
5015562Sedward }
5115562Sedward 
5215855Sedward cx_beginfile(filename)
5315562Sedward char *filename;
5415562Sedward {
5515562Sedward 	if (cx_alloc() < 0)
5615562Sedward 		return -1;
5715562Sedward 	cx.x_type = X_FILE;
5815562Sedward 	if ((cx.x_filename = str_cpy(filename)) == 0)
5915562Sedward 		goto bad;
6015562Sedward 	cx.x_fp = fopen(filename, "r");
6115562Sedward 	if (cx.x_fp == 0)
6215562Sedward 		goto bad;
6315562Sedward 	cx.x_bol = 1;
6415562Sedward 	cx.x_lineno = 0;
6515562Sedward 	cx.x_errwin = 0;
6615855Sedward 	cx.x_noerr = 0;
6715562Sedward 	return 0;
6815562Sedward bad:
6915562Sedward 	if (cx.x_filename != 0)
7015562Sedward 		str_free(cx.x_filename);
7115562Sedward 	cx_free();
7215562Sedward 	return -1;
7315562Sedward }
7415562Sedward 
7516448Sedward cx_beginbuf(buf, arg, narg)
7615562Sedward char *buf;
7716448Sedward struct value *arg;
7816448Sedward int narg;
7915562Sedward {
8015562Sedward 	if (cx_alloc() < 0)
8115562Sedward 		return -1;
8215562Sedward 	cx.x_type = X_BUF;
8315562Sedward 	cx.x_bufp = cx.x_buf = buf;
8416448Sedward 	cx.x_arg = arg;
8516448Sedward 	cx.x_narg = narg;
8615562Sedward 	return 0;
8715562Sedward }
8815562Sedward 
8915562Sedward cx_end()
9015562Sedward {
9115562Sedward 	switch (cx.x_type) {
9215562Sedward 	case X_BUF:
9315562Sedward 		break;
9415562Sedward 	case X_FILE:
9515562Sedward 		(void) fclose(cx.x_fp);
9615562Sedward 		str_free(cx.x_filename);
9715562Sedward 		break;
9815562Sedward 	}
9915562Sedward 	cx_free();
10015562Sedward }
101