115562Sedward #ifndef lint 2*15855Sedward static char *sccsid = "@(#)context.c 3.4 84/01/13"; 315562Sedward #endif 415562Sedward 515562Sedward #include <stdio.h> 615562Sedward #include "value.h" 715579Sedward #include "string.h" 815562Sedward #include "context.h" 915562Sedward 1015562Sedward /* 1115562Sedward * Context push/pop for nested command files. 1215562Sedward */ 1315562Sedward 1415562Sedward char *malloc(); 1515562Sedward 1615562Sedward cx_alloc() 1715562Sedward { 1815562Sedward register struct context *xp; 1915562Sedward 2015562Sedward if (cx.x_type != 0) { 2115562Sedward xp = (struct context *) 2215579Sedward malloc((unsigned) sizeof (struct context)); 2315562Sedward if (xp == 0) 2415562Sedward return -1; 2515562Sedward *xp = cx; 2615562Sedward cx.x_link = xp; 2715562Sedward cx.x_type = 0; 2815562Sedward } 2915562Sedward cx.x_erred = 0; 3015562Sedward cx.x_synerred = 0; 3115562Sedward cx.x_abort = 0; 3215562Sedward return 0; 3315562Sedward } 3415562Sedward 3515562Sedward cx_free() 3615562Sedward { 3715579Sedward struct context *xp; 3815579Sedward 3915579Sedward if ((xp = cx.x_link) != 0) { 4015579Sedward cx = *xp; 4115579Sedward free((char *)xp); 4215562Sedward } else 4315562Sedward cx.x_type = 0; 4415562Sedward } 4515562Sedward 46*15855Sedward cx_beginfile(filename) 4715562Sedward char *filename; 4815562Sedward { 4915562Sedward if (cx_alloc() < 0) 5015562Sedward return -1; 5115562Sedward cx.x_type = X_FILE; 5215562Sedward if ((cx.x_filename = str_cpy(filename)) == 0) 5315562Sedward goto bad; 5415562Sedward cx.x_fp = fopen(filename, "r"); 5515562Sedward if (cx.x_fp == 0) 5615562Sedward goto bad; 5715562Sedward cx.x_bol = 1; 5815562Sedward cx.x_lineno = 0; 5915562Sedward cx.x_errwin = 0; 60*15855Sedward cx.x_noerr = 0; 6115562Sedward return 0; 6215562Sedward bad: 6315562Sedward if (cx.x_filename != 0) 6415562Sedward str_free(cx.x_filename); 6515562Sedward cx_free(); 6615562Sedward return -1; 6715562Sedward } 6815562Sedward 69*15855Sedward cx_beginbuf(buf) 7015562Sedward char *buf; 7115562Sedward { 7215562Sedward if (cx_alloc() < 0) 7315562Sedward return -1; 7415562Sedward cx.x_type = X_BUF; 7515562Sedward cx.x_bufp = cx.x_buf = buf; 7615562Sedward return 0; 7715562Sedward } 7815562Sedward 7915562Sedward cx_end() 8015562Sedward { 8115562Sedward switch (cx.x_type) { 8215562Sedward case X_BUF: 8315562Sedward break; 8415562Sedward case X_FILE: 8515562Sedward (void) fclose(cx.x_fp); 8615562Sedward str_free(cx.x_filename); 8715562Sedward break; 8815562Sedward } 8915562Sedward cx_free(); 9015562Sedward } 91