115562Sedward #ifndef lint 2*15579Sedward static char *sccsid = "@(#)context.c 3.2 83/11/22"; 315562Sedward #endif 415562Sedward 515562Sedward #include <stdio.h> 615562Sedward #include "value.h" 7*15579Sedward #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 *) 22*15579Sedward 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 { 37*15579Sedward struct context *xp; 38*15579Sedward 39*15579Sedward if ((xp = cx.x_link) != 0) { 40*15579Sedward cx = *xp; 41*15579Sedward free((char *)xp); 4215562Sedward } else 4315562Sedward cx.x_type = 0; 4415562Sedward } 4515562Sedward 4615562Sedward cx_setfile(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; 6015562Sedward cx.x_baderr = 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 6915562Sedward cx_setbuf(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