1*15562Sedward #ifndef lint 2*15562Sedward static char *sccsid = "@(#)context.c 3.1 83/11/22"; 3*15562Sedward #endif 4*15562Sedward 5*15562Sedward #include <stdio.h> 6*15562Sedward #include "value.h" 7*15562Sedward #include "context.h" 8*15562Sedward 9*15562Sedward /* 10*15562Sedward * Context push/pop for nested command files. 11*15562Sedward */ 12*15562Sedward 13*15562Sedward char *malloc(); 14*15562Sedward 15*15562Sedward cx_alloc() 16*15562Sedward { 17*15562Sedward register struct context *xp; 18*15562Sedward 19*15562Sedward if (cx.x_type != 0) { 20*15562Sedward xp = (struct context *) 21*15562Sedward malloc(1, (unsigned) sizeof (struct context)); 22*15562Sedward if (xp == 0) 23*15562Sedward return -1; 24*15562Sedward *xp = cx; 25*15562Sedward cx.x_link = xp; 26*15562Sedward cx.x_type = 0; 27*15562Sedward } 28*15562Sedward cx.x_erred = 0; 29*15562Sedward cx.x_synerred = 0; 30*15562Sedward cx.x_abort = 0; 31*15562Sedward return 0; 32*15562Sedward } 33*15562Sedward 34*15562Sedward cx_free() 35*15562Sedward { 36*15562Sedward if (cx.x_link != 0) { 37*15562Sedward free(cx.x_link); 38*15562Sedward cx = *cx.x_link; 39*15562Sedward } else 40*15562Sedward cx.x_type = 0; 41*15562Sedward } 42*15562Sedward 43*15562Sedward cx_setfile(filename) 44*15562Sedward char *filename; 45*15562Sedward { 46*15562Sedward if (cx_alloc() < 0) 47*15562Sedward return -1; 48*15562Sedward cx.x_type = X_FILE; 49*15562Sedward if ((cx.x_filename = str_cpy(filename)) == 0) 50*15562Sedward goto bad; 51*15562Sedward cx.x_fp = fopen(filename, "r"); 52*15562Sedward if (cx.x_fp == 0) 53*15562Sedward goto bad; 54*15562Sedward cx.x_bol = 1; 55*15562Sedward cx.x_lineno = 0; 56*15562Sedward cx.x_errwin = 0; 57*15562Sedward cx.x_baderr = 0; 58*15562Sedward return 0; 59*15562Sedward bad: 60*15562Sedward if (cx.x_filename != 0) 61*15562Sedward str_free(cx.x_filename); 62*15562Sedward cx_free(); 63*15562Sedward return -1; 64*15562Sedward } 65*15562Sedward 66*15562Sedward cx_setbuf(buf) 67*15562Sedward char *buf; 68*15562Sedward { 69*15562Sedward if (cx_alloc() < 0) 70*15562Sedward return -1; 71*15562Sedward cx.x_type = X_BUF; 72*15562Sedward cx.x_bufp = cx.x_buf = buf; 73*15562Sedward return 0; 74*15562Sedward } 75*15562Sedward 76*15562Sedward cx_end() 77*15562Sedward { 78*15562Sedward switch (cx.x_type) { 79*15562Sedward case X_BUF: 80*15562Sedward break; 81*15562Sedward case X_FILE: 82*15562Sedward (void) fclose(cx.x_fp); 83*15562Sedward str_free(cx.x_filename); 84*15562Sedward break; 85*15562Sedward } 86*15562Sedward cx_free(); 87*15562Sedward } 88