1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #include <stdlib.h>
- #include <assert.h>
- #include "lub/string.h"
- #include "private.h"
- /*----------------------------------------------------------- */
- static int clish_shell_push(clish_shell_t * this, FILE * file,
- const char *fname, bool_t stop_on_error)
- {
- /* Allocate a control node */
- clish_shell_file_t *node = malloc(sizeof(clish_shell_file_t));
- assert(this);
- assert(node);
- /* intialise the node */
- node->file = file;
- if (fname)
- node->fname = lub_string_dup(fname);
- else
- node->fname = NULL;
- node->line = 0;
- node->stop_on_error = stop_on_error;
- node->next = this->current_file;
- /* put the node at the top of the file stack */
- this->current_file = node;
- /* now switch the terminal's input stream */
- tinyrl__set_istream(this->tinyrl, file);
- return 0;
- }
- /*----------------------------------------------------------- */
- int clish_shell_push_file(clish_shell_t * this, const char * fname,
- bool_t stop_on_error)
- {
- FILE *file;
- int res;
- assert(this);
- if (!fname)
- return -1;
- file = fopen(fname, "r");
- if (!file)
- return -1;
- res = clish_shell_push(this, file, fname, stop_on_error);
- if (res)
- fclose(file);
- return res;
- }
- /*----------------------------------------------------------- */
- int clish_shell_push_fd(clish_shell_t *this, FILE *file,
- bool_t stop_on_error)
- {
- return clish_shell_push(this, file, NULL, stop_on_error);
- }
- /*----------------------------------------------------------- */
- int clish_shell_pop_file(clish_shell_t *this)
- {
- int result = -1;
- clish_shell_file_t *node = this->current_file;
- if (!node)
- return -1;
- /* remove the current file from the stack... */
- this->current_file = node->next;
- /* and close the current file... */
- fclose(node->file);
- if (node->next) {
- /* now switch the terminal's input stream */
- tinyrl__set_istream(this->tinyrl, node->next->file);
- result = 0;
- }
- /* and free up the memory */
- if (node->fname)
- lub_string_free(node->fname);
- free(node);
- return result;
- }
- /*----------------------------------------------------------- */
|