static void init(void) { symtab = symtab_set(symtab, "PS1", SYM_VAR, PS1); #ifdef LSH_ENABLE_EXTERNAL symtab = symtab_set(symtab, "PATH", SYM_VAR, PATH); #endif /* LSH_ENABLE_EXTERNAL */ symtab = symtab_set(symtab, "exit", SYM_INTERNAL, halt); #ifdef LSH_ENABLE_CD symtab = symtab_set(symtab, "cd", SYM_INTERNAL, lsh_cd); #endif /* LSH_ENABLE_CD */ }
/* * Check for the valid forms of command input which are: * * <command> [<arg1> <arg2> ... <argN>] * <name>=<value> */ static int parse(void) { TRIM(cmd); #ifdef LSH_ENABLE_USERVARS regex_t regex; const int cflags = REG_EXTENDED|REG_NEWLINE; int rc; regmatch_t pmatch[4]; // Look for patterns of the form: <name>=<value> (void)regcomp(®ex, "([a-zA-Z]+[a-zA-Z0-9]*)=(.*)", cflags); rc = regexec(®ex, cmd, SZ(pmatch), pmatch, 0); if (rc == 0) { int count = 0; token_t **tokens = tokenise_fetch(cmd, &count); symtab = symtab_set(symtab, tokens[0]->value, SYM_VAR, tokens[2]->value); tokenise_free(tokens, count); } else { /* * Not a variable setting so assume it's a command */ #endif dispatch(); #ifdef LSH_ENABLE_USERVARS } #endif RESET(cmd); // FIXME return 0; }
static void s_arg_list(struct symtab *tab, char *fn, struct p_arg_list *args) { struct s_expr *ex; int n = 0; for (; args; args = args->next) { if (symtab_get(tab, args->id) != NULL) { error("%s declared twice in %s argument list", args->id, fn); } ex = malloc(sizeof(*ex)); ex->type = S_EXPR_ARGUMENT; ex->n = n++; symtab_set(tab, args->id, ex); } }