/* frees all the elements of a sll */ void sll_free(sll *ss) { if(ss == NULL){ return; } else { sll_free(ss->next); free(ss->next); } }
void lsll_free(struct lsortedll_st* lsll) { if (lsll) { pthread_mutex_destroy(&lsll->lock); sll_free(lsll->sll); free(lsll); } }
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); }
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; }
// // 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; }
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; } } }