void free_cmdline(cmd_line *cl) { if(cl != NULL){ free_cmd(cl->c); free_cmdline(cl->next); free(cl); return; }else { return; } }
int main(int argc, char *argv[]) { char cmd_buff[1024]; char *pinput; char *fname = argv[1]; char *mode = "r"; FILE *f= fopen(fname, mode); cmd_line *c, *backup; char* extra_buff; char* test = malloc(sizeof(char)*514); char buf[1024]; if(argv[2] != NULL){ /*if trying to run batch with 2 filenames*/ err(); exit(0); } if(f == NULL){ /*if read is invalid*/ err(); exit(0); } dw = getcwd(buf, 1024); /*for global var accessible to function calls*/ while (1) { /*INTERACTIVE MODE*/ if(argv[1] == NULL){ myPrint("myshell> "); pinput = fgets(cmd_buff, 100, stdin); c = parseCmdLine(cmd_buff); backup = c; while(backup != NULL){ processCmd(backup->c); backup = backup->next; } /*BATCH MODE*/ } else if(argv[1] != NULL){ memset(cmd_buff,'\0',514); pinput = fgets(cmd_buff, 514, f); if (!pinput) { /*invalid fgets*/ exit(0); } if((extra_buff = strstr(cmd_buff,"\n"))!=NULL) {/*check if whole command has been taken in*/ if (check_space(cmd_buff)==0) /*if all blank spaces, don't print*/ continue; else { myPrint(cmd_buff); /*print command*/ collapsed_str(cmd_buff,test); /*CATCH ERRORS RIGHT AWAY*/ if(exception1(test)==1){ err(); } else if(exception2(test)==1) { err(); } else if(exception3(test)==1) { continue; } /*PARSE*/ else { c = parseCmdLine(cmd_buff); backup = c; while(backup != NULL){ processCmd(backup->c); backup = backup->next; } free_cmdline(c); } } } /*COMMAND TOO LONG*/ if(extra_buff==NULL) { myPrint(cmd_buff); while(fgets(cmd_buff,1024,f)!=NULL) {/*keep getting more chars while you can*/ if((strlen(cmd_buff)<1023) || cmd_buff[1022]=='\n') { /*if new one is shorter than max, break*/ myPrint(cmd_buff); memset(cmd_buff, '\0', 1024); break; } else myPrint(cmd_buff); /*else keep getting*/ memset(cmd_buff, '\0', 1024); } err(); } } } free(test); fclose(f); return 0; }
static int parse_line(const unsigned char *str, size_t len, testinfo_t *pt, struct testinfo_subst_handler *sh) { unsigned char *subst_str = NULL; const unsigned char *s = str; unsigned char *name_buf = 0, *p; unsigned char *val_buf = 0; unsigned char **ppval; size_t len2; struct cmdline_buf cmd; int retval = 0, x, n; if (sh && pt->enable_subst > 0) { subst_str = sh->substitute(sh, str); str = subst_str; s = str; } memset(&cmd, 0, sizeof(cmd)); if (!(name_buf = (unsigned char *) alloca(len + 1))) FAIL(TINF_E_NO_MEMORY); if (!(val_buf = (unsigned char *) alloca(len + 2))) FAIL(TINF_E_NO_MEMORY); while (isspace(*s)) s++; p = name_buf; if (!is_ident_char(*s)) FAIL(TINF_E_IDENT_EXPECTED); while (is_ident_char(*s)) *p++ = *s++; *p = 0; while (isspace(*s)) s++; if (!*s) { /* implicit "1" */ strcpy(val_buf, "1"); } else if (*s != '=') { FAIL(TINF_E_EQUAL_EXPECTED); } else { s++; while (isspace(*s)) s++; strcpy(val_buf, s); len2 = strlen(val_buf); while (len2 > 0 && isspace(val_buf[len2 - 1])) len2--; } if ((retval = parse_cmdline(val_buf, &cmd)) < 0) { free_cmdline(&cmd); free(subst_str); return retval; } if (!strcmp(name_buf, "params")) { if (pt->cmd_argc >= 0) FAIL(TINF_E_VAR_REDEFINED); pt->cmd_argc = cmd.u; pt->cmd_argv = (char**) cmd.v; memset(&cmd, 0, sizeof(cmd)); } else if (!strcmp(name_buf, "environ")) { if (pt->env_u > 0) FAIL(TINF_E_VAR_REDEFINED); pt->env_u = cmd.u; pt->env_v = (char**) cmd.v; memset(&cmd, 0, sizeof(cmd)); } else if (!strcmp(name_buf, "compiler_env")) { if (pt->compiler_env_u > 0) FAIL(TINF_E_VAR_REDEFINED); pt->compiler_env_u = cmd.u; pt->compiler_env_v = (char**) cmd.v; memset(&cmd, 0, sizeof(cmd)); } else if (!strcmp(name_buf, "style_checker_env")) { if (pt->style_checker_env_u > 0) FAIL(TINF_E_VAR_REDEFINED); pt->style_checker_env_u = cmd.u; pt->style_checker_env_v = (char**) cmd.v; memset(&cmd, 0, sizeof(cmd)); } else if (!strcmp(name_buf, "comment") || !strcmp(name_buf, "team_comment") || !strcmp(name_buf, "source_stub")) { if (!strcmp(name_buf, "comment")) { ppval = (unsigned char**) ((void*) &pt->comment); } else if (!strcmp(name_buf, "source_stub")) { ppval = (unsigned char**) ((void*) &pt->source_stub); } else { ppval = (unsigned char**) ((void*)&pt->team_comment); } if (*ppval) FAIL(TINF_E_VAR_REDEFINED); if (cmd.u < 1) FAIL(TINF_E_EMPTY_VALUE); if (cmd.u > 1) FAIL(TINF_E_MULTIPLE_VALUE); *ppval = cmd.v[0]; cmd.v[0] = 0; } else if (!strcmp(name_buf, "exit_code")) { if (cmd.u < 1) FAIL(TINF_E_EMPTY_VALUE); if (cmd.u > 1) FAIL(TINF_E_MULTIPLE_VALUE); if (sscanf(cmd.v[0], "%d%n", &x, &n) != 1 || cmd.v[0][n] || x < 0 || x > 127) FAIL(TINF_E_INVALID_VALUE); pt->exit_code = x; } else if (!strcmp(name_buf, "check_stderr")) { if (cmd.u < 1) { x = 1; } else { if (cmd.u > 1) FAIL(TINF_E_MULTIPLE_VALUE); if (sscanf(cmd.v[0], "%d%n", &x, &n) != 1 || cmd.v[0][n] || x < 0 || x > 1) FAIL(TINF_E_INVALID_VALUE); } pt->check_stderr = x; } else if (!strcmp(name_buf, "disable_stderr")) { if (cmd.u < 1) { x = 1; } else { if (cmd.u > 1) FAIL(TINF_E_MULTIPLE_VALUE); if (sscanf(cmd.v[0], "%d%n", &x, &n) != 1 || cmd.v[0][n] || x < 0 || x > 1) FAIL(TINF_E_INVALID_VALUE); } pt->disable_stderr = x; } else if (!strcmp(name_buf, "enable_subst")) { if (cmd.u < 1) { x = 1; } else { if (cmd.u > 1) FAIL(TINF_E_MULTIPLE_VALUE); if (sscanf(cmd.v[0], "%d%n", &x, &n) != 1 || cmd.v[0][n] || x < 0 || x > 1) FAIL(TINF_E_INVALID_VALUE); } pt->enable_subst = x; } else if (!strcmp(name_buf, "compiler_must_fail")) { if (cmd.u < 1) { x = 1; } else { if (cmd.u > 1) FAIL(TINF_E_MULTIPLE_VALUE); if (sscanf(cmd.v[0], "%d%n", &x, &n) != 1 || cmd.v[0][n] || x < 0 || x > 1) FAIL(TINF_E_INVALID_VALUE); } pt->compiler_must_fail = x; } else { FAIL(TINF_E_INVALID_VAR_NAME); } free_cmdline(&cmd); free(subst_str); return 0; fail: free_cmdline(&cmd); free(subst_str); return retval; }