Пример #1
0
/* frees all the elements of a sll */
void sll_free(sll *ss)
{
  if(ss == NULL){
    return;
  } else {
    sll_free(ss->next);
    free(ss->next);
  }
}
Пример #2
0
void lsll_free(struct lsortedll_st* lsll)
{
	if (lsll)
	{
		pthread_mutex_destroy(&lsll->lock);

		sll_free(lsll->sll);
		free(lsll);
	}
}
Пример #3
0
void snoc_test()
{
  sll* ss = malloc(sizeof(sll));
  ss->s = "a";
  ss->next = NULL;
  sll_snoc("b", ss);
  sll_snoc("c", ss);
  sll_snoc("d", ss);
  sll_show(ss);
  sll_free(ss);
}
Пример #4
0
struct lnklst_st* new_lstnmods(struct lnklst_st* fkvs)
{
FUNC_ENTER

	struct sortedll_st* ports = NULL;
	struct lnklst_st* lstnmods = NULL;		// ports がユニークなので lnklst_t でよい

	ports = sll_init(NULL, cmp_as_long_, SLLOPT_DISALLOW_DUPVAL);
	if (! ports)
	{
		FIRE("sll_init");
	}

	syserr = ll_foreach(fkvs, collect_port_, ports);
	if (syserr)
	{
		FIRE("ll_foreach");
	}

	lstnmods = new_lstnmods_(ports, fkvs);
	if (! lstnmods)
	{
		FIRE("new_lstnmods_");
	}

FUNC_CHECKPOINT

	if (HAS_ERROR())
	{
		ll_free(lstnmods);
		lstnmods = NULL;
	}

	sll_free(ports);
	ports = NULL;

FUNC_LEAVE

	return lstnmods;
}
Пример #5
0
//
// sorted link list
//
struct sortedll_st* sll_init(v_vp_func free_val, i_cvp_cvp_func cmp_val, unsigned opts)
{
	int syserr = -1;

	struct sortedll_st* sll = NULL;

	sll = calloc(1, sizeof(struct sortedll_st));
	if (! sll)
	{
		goto EXIT_LABEL;
	}

	sll->ll = ll_init(free_val);
	if (! sll->ll)
	{
		goto EXIT_LABEL;
	}

	sll->cmp_val = cmp_val;
	sll->opts = opts;

	syserr = 0;

EXIT_LABEL:

	if (syserr)
	{
		int save_errno = errno;

		sll_free(sll);
		sll = NULL;

		errno = save_errno;
	}

	return sll;
}
Пример #6
0
void execute(char *command)
{
  int n = count_carrots(command);
  if(n>1){
    myError();
    return;
  }
  //  char s[514];
  //strcpy(s,command);
  // char* c = strtok(s, " ");
  if(!strncmp(command,">",1)){
    myError();
    return;
  }
  command = strtok(command, ">");
  if(command==NULL)
    return;
  /*if(redir == 2){
    myError();
    return;
    }*/
  char* fi = strtok(NULL, " > ");
  // fi = removeleadingspace(fi);
  //  fi = strtok(fi, " ");
  //fi = strtok(fi, "\n");
  if(n == 1){    
    sll* tempfi = parse_args(fi);
    if(sll_length(tempfi) > 1){
      myError();
      sll_free(tempfi);
      return;
    }
    sll_free(tempfi);
  }
  int des = 1;
  if(fi!=NULL) {
    if(!strncmp(command, "exit",4)||
       !strncmp(command, "pwd",3) ||
       !strncmp(command, "cd",2)){
      myError();
      return;
    }
    removeleadingspace(fi);
    fi = strtok(fi, " ");
    fi = strtok(fi, "\n");
    des = open(fi, O_WRONLY | O_CREAT | O_EXCL, 0666);
    if(des==-1){
      myError();
      return;
    }
  }
  /*int bit = redirect(command);
  char* fname;
  if(bit == 2){
    myError();
    return;
  }
  else if(bit == 1)
  {
    // command to redirect
    command =strtok(command, ">");
    fname = strtok(NULL, ">");

    }*/
  if(!strncmp(command, "exit",4)){
    //        myPrint(command);
    sll* temp = parse_args(command);
    if(sll_length(temp)==1){
      sll_free(temp);
      exit(0);
    }
    else{
      sll_free(temp);
      myError();
      return;
    }
  }
  else if(!strncmp(command, " ",1)) {
    //separate(command, " ", execute);
    execute(removeleadingspace(command));
    return;
  }
  else if(!strncmp(command, "cd",2)) {    
    //myPrint(command);
    //myPrint("\n");
    sll* temp = parse_args(command);
    if(sll_length(temp)>2){
      myError();
      sll_free(temp);
      return;
    }
    else if(sll_length(temp) == 1 && 
      !strcmp(strtok(temp->s, "\n"),"cd")){
      chdir(getenv("HOME"));
      return;
    }
    //char* dir = strtok(command, " ");
    char*dir = temp->s;
    //    if(strtok(NULL, " ") == NULL){
    //myError();
    // return;
    //}
    if(strlen(dir)!=strlen("cd")&&strcmp(dir,"cd\n")){
      myError();
      return;
    }
    //dir = strtok(NULL, " ");
    dir = temp->next->s;
    char* dir2 = strtok(dir, "\n");
    if(dir2==NULL)
      dir2 = getenv("HOME");
    if(chdir(dir2))
      myError();
    return;
  }
  else if(!strcmp(command, "\n"))
    return;
  else{
    pid_t pid = fork();
    // child process executes command
    if(pid==0)
    {
        if(!strncmp(command, "pwd",3)){
    //        myPrint(command);
    //  myPrint("\n");
    sll* temp = parse_args(command);
    if(sll_length(temp) > 1){
      sll_free(temp);
      myError();
      exit(0);
    }
    sll_free(temp);
    char dir[514];
          //if(!bit)
    dup2(des, STDOUT_FILENO); 
            myPrint(getcwd(dir, 514));
      //else
      // outp(getcwd(dir, 514),fname);
            dup2(des, STDOUT_FILENO); 
            myPrint("\n");
      exit(0);
        }
  //        else if(!strncmp(command, " ",1)) {
  // separate(command, " ", execute);
  //}
  else{
    sll* list = parse_args(command);
    char** argz = sll_to_array(list);
    // myPrint(command);
          //myPrint("\n");
    dup2(des, STDOUT_FILENO); 
    if(execvp(argz[0], argz) == -1){
      myError();
      exit(0);
    }
    sll_free(list);
    free(argz);
  }
        //else
  //myError();
  dup2(des, STDOUT_FILENO); 
  myPrint("\n");
        exit(0);   
    }
  
  //parent process waits
    else
      {
        int ch;
    waitpid(pid, &ch, 0); 
        return;
      }
  }

}