/* * Remove a reset command from a list. Takes a pointer to the list * so that it may play with the memory locations. */ void remove_cmd_from_list(struct reset_com **list, int pos) { int count, i, l; struct reset_com *newlist; /* * Count number of commands (not including terminator) */ count = count_commands(*list); /* * Value is 'count' because we didn't include the terminator above * but since we're deleting one thing anyway we want one less. */ CREATE(newlist, struct reset_com, count); /* * Even tighter loop to copy old list and skip unwanted command. */ for (i = 0, l = 0; i < count; i++) { if (i != pos) { newlist[l++] = (*list)[i]; } } /* * Add the terminator, then insert the new list. */ newlist[count - 1].command = 'S'; free(*list); *list = newlist; }
/* * Adds a new reset command into a list. Takes a pointer to the list * so that it may play with the memory locations. */ void add_cmd_to_list(struct reset_com **list, struct reset_com *newcmd, int pos) { int count, i, l; struct reset_com *newlist; /* * Count number of commands (not including terminator). */ count = count_commands(*list); /* * Value is +2 for the terminator and new field to add. */ CREATE(newlist, struct reset_com, count + 2); /* * Even tighter loop to copy the old list and insert a new command. */ for (i = 0, l = 0; i <= count; i++) { newlist[i] = ((i == pos) ? *newcmd : (*list)[l++]); } /* * Add terminator, then insert new list. */ newlist[count + 1].command = 'S'; free(*list); *list = newlist; }
void bltin_completion(t_prompt *prompt, char **env) { int count; int ret; if ((prompt->offset = get_offset(prompt->line, prompt->count_char, &ret)) == -1) return ; if (ret == 0 && (count = count_commands(prompt, env))) print_commands(prompt, env, count); else print_files(prompt); }