void noit_console_dispatch(eventer_t e, const char *buffer, noit_console_closure_t ncct) { char **cmds; HistEvent ev; int i, cnt = 32; cmds = alloca(32 * sizeof(*cmds)); i = noit_tokenize(buffer, cmds, &cnt); /* < 0 is an error, that's fine. We want it in the history to "fix" */ /* > 0 means we had arguments, so let's put it in the history */ /* 0 means nothing -- and that isn't worthy of history inclusion */ if(i) history(ncct->hist, &ev, H_ENTER, buffer); if(i>cnt) nc_printf(ncct, "Command length too long.\n"); else if(i<0) nc_printf(ncct, "Error at offset: %d\n", 0-i); else noit_console_state_do(ncct, cnt, cmds); }
int noit_console_generic_apply(noit_console_closure_t ncct, int argc, char **argv, noit_console_state_t *dstate, void *closure) { int i, j, count; char *name, *range; char **nargv, **expanded = NULL; const char *err; int problems = 0; if(argc < 3) { nc_printf(ncct, "apply <name> <range> cmd ...\n"); return -1; } name = argv[0]; range = argv[1]; argc -= 2; argv += 2; count = expand_range(range, &expanded, 256, &err); if(!count) { nc_printf(ncct, "apply error: '%s' range produced nothing [%s]\n", range, err ? err : "unknown error"); assert(expanded == NULL); return -1; } if(count < 0) { nc_printf(ncct, "apply error: '%s' range would produce %d items.\n", range, count); return -1; } nargv = malloc(argc * sizeof(*nargv)); for(i=0; i<count; i++) { for(j=0; j<argc; j++) nargv[j] = apply_replace(argv[j], name, expanded[i]); if(noit_console_state_do(ncct, argc, nargv)) problems = -1; for(j=0; j<argc; j++) free(nargv[j]); free(expanded[i]); } free(nargv); free(expanded); return problems; }