118746Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 5*42835Sbostic * %sccs.include.redist.c% 618746Sedward */ 718746Sedward 833514Sbostic #ifndef lint 9*42835Sbostic static char sccsid[] = "@(#)context.c 3.11 (Berkeley) 06/02/90"; 1033514Sbostic #endif /* not lint */ 1133514Sbostic 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