|
|
|
@ -6,6 +6,8 @@ |
|
|
|
#include "variable.h" |
|
|
|
#include "com_set.h" |
|
|
|
|
|
|
|
wordlist* readifile(wordlist*); |
|
|
|
|
|
|
|
|
|
|
|
/* The set command. Syntax is set [opt ...] [opt = val ...]. Val may |
|
|
|
* be a string, an int, a float, or a list of the form (elt1 elt2 |
|
|
|
@ -19,6 +21,12 @@ com_set(wordlist *wl) |
|
|
|
cp_vprint(); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
/* special case input redirection*/ |
|
|
|
wordlist *ww = wl->wl_next; |
|
|
|
if (ww && eq(ww->wl_word, "<")) |
|
|
|
wl = readifile(wl); |
|
|
|
|
|
|
|
vars = cp_setparse(wl); |
|
|
|
|
|
|
|
/* This is sort of a hassle... */ |
|
|
|
@ -54,3 +62,56 @@ com_set(wordlist *wl) |
|
|
|
tfree(oldvar); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* read a file from cp_in, add the tokens to a wordlist and |
|
|
|
create an input for a string list like set ccc = ( 3 5 7 ). |
|
|
|
Comment lines in input file (starting with '*') are ignored. */ |
|
|
|
wordlist* |
|
|
|
readifile(wordlist* win) |
|
|
|
{ |
|
|
|
/* max file size */ |
|
|
|
char intoken[4096]; |
|
|
|
/* save start address */ |
|
|
|
wordlist* tw = win; |
|
|
|
char *tmpstr; |
|
|
|
|
|
|
|
/* delete wordlist from '<' on */ |
|
|
|
wl_free(win->wl_next); |
|
|
|
wl_append_word(&win, &win, copy("=")); |
|
|
|
wl_append_word(&win, &win, copy("(")); |
|
|
|
/* read a line. If it starts with '*', ignore it */ |
|
|
|
while (fgets(intoken, 4096, cp_in) != NULL) { |
|
|
|
if (intoken[0] == '*') |
|
|
|
continue; |
|
|
|
char* delstr; |
|
|
|
char* instr = delstr = copy(intoken); |
|
|
|
/* get all tokens, ignoring '\n' |
|
|
|
and add to string list */ |
|
|
|
while ((tmpstr = gettok(&instr)) != NULL) { |
|
|
|
wl_append_word(&win, &win, tmpstr); |
|
|
|
} |
|
|
|
tfree(delstr); |
|
|
|
} |
|
|
|
wl_append_word(&win, &win, copy(")")); |
|
|
|
/* close and reset cp_in |
|
|
|
(was opened in streams.c:84) */ |
|
|
|
cp_ioreset(); |
|
|
|
return tw; |
|
|
|
#if 0 |
|
|
|
size_t retval = fread(intoken, 1, 4096, cp_in); |
|
|
|
intoken[retval] = '\0'; |
|
|
|
char* delstr; |
|
|
|
char* instr = delstr = copy(intoken); |
|
|
|
/* get all tokens, ignoring '\n' |
|
|
|
and add to string list */ |
|
|
|
while ((tmpstr = gettok(&instr)) != NULL) { |
|
|
|
wl_append_word(&win, &win, tmpstr); |
|
|
|
} |
|
|
|
tfree(delstr); |
|
|
|
wl_append_word(&win, &win, copy(")")); |
|
|
|
/* close and reset cp_in |
|
|
|
(was opened in streams.c:84) */ |
|
|
|
cp_ioreset(); |
|
|
|
return tw; |
|
|
|
#endif |
|
|
|
} |