X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgetl.c;h=2b689696a60eb3f480b20375f285f7caea483e95;hb=6d2a8977cc6a54e9e2278467f2af3d5ae277cd43;hp=bd380abf7b5b5ab2bb4643651597b4eb8a547be8;hpb=0e4ef2c7099e82d8e43cf87a53c36430d1ce879f;p=pspp diff --git a/src/getl.c b/src/getl.c index bd380abf7b..2b689696a6 100644 --- a/src/getl.c +++ b/src/getl.c @@ -57,14 +57,6 @@ getl_initialize (void) ds_init (&getl_buf, 256); } -/* Close getl. */ -void -getl_uninitialize (void) -{ - getl_close_all(); - ds_destroy (&getl_buf); - ds_destroy (&getl_include_path); -} struct getl_script *getl_head; @@ -333,3 +325,61 @@ getl_reading_script (void) return (getl_head != NULL); } +/* File locator stack. */ +static const struct file_locator **file_loc; +static int nfile_loc, mfile_loc; + +/* Close getl. */ +void +getl_uninitialize (void) +{ + getl_close_all(); + ds_destroy (&getl_buf); + ds_destroy (&getl_include_path); + free(file_loc); + file_loc = NULL; + nfile_loc = mfile_loc = 0; +} + + +/* File locator stack functions. */ + +/* Pushes F onto the stack of file locations. */ +void +err_push_file_locator (const struct file_locator *f) +{ + if (nfile_loc >= mfile_loc) + { + if (mfile_loc == 0) + mfile_loc = 8; + else + mfile_loc *= 2; + + file_loc = xnrealloc (file_loc, mfile_loc, sizeof *file_loc); + } + + file_loc[nfile_loc++] = f; +} + +/* Pops F off the stack of file locations. + Argument F is only used for verification that that is actually the + item on top of the stack. */ +void +err_pop_file_locator (const struct file_locator *f) +{ + assert (nfile_loc >= 0 && file_loc[nfile_loc - 1] == f); + nfile_loc--; +} + +/* Puts the current file and line number in F, or NULL and -1 if + none. */ +void +err_location (struct file_locator *f) +{ + if (nfile_loc) + *f = *file_loc[nfile_loc - 1]; + else + getl_location (&f->filename, &f->line_number); +} + +