Ejemplo n.º 1
0
void free_cmdline(cmd_line *cl)
{
  if(cl  != NULL){
    free_cmd(cl->c);
    free_cmdline(cl->next);
    free(cl);
    return;
  }else {
    return;
  }
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
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;
}