int accept_buddy_console_command(const char *name) { if (!queue_isempty(buddy_request_queue)) { node_t *node = queue_front_node(buddy_request_queue); /* Search for the node in the queue */ while(node != NULL) { if(strcasecmp(name, node->data) == 0) { /* This is the node we're looking for, delete it */ queue_delete_node(buddy_request_queue, node); return 1; } node = node->next; } } return 0; }
int command_accept_buddy(char *text, int len) { /* This command is here to make sure the requests queue is up to date */ text = getparams(text); /* Make sure a name is given */ if(*text && !queue_isempty(buddy_request_queue)) { node_t *node = queue_front_node(buddy_request_queue); /* Search for the node in the queue */ while(node != NULL) { if(strcasecmp(text, node->data) == 0) { /* This is the node we're looking for, delete it */ queue_delete_node(buddy_request_queue, node); break; } node = node->next; } } return 0; }
struct compl_str tab_complete(const text_message *input, unsigned int cursor_pos) { static char last_complete[48] = {0}; static int have_last_complete = 0; static int last_str_count = -1; static enum compl_type last_type = NAME; struct compl_str return_value = {NULL, 0}; if(input != NULL && input->len > 0 ) { const char *input_string = (char*)input->data; int count; short retries; node_t *step; if(!have_last_complete) { if(cursor_pos > 0 && strmrchr(input_string, input_string+cursor_pos-1, ' ') != NULL) { /* If we have a space in the input string, we're pretty certain * it's not a PM-name, command or channel name. */ return_value.type = NAME; } else if(*input_string == '/' || *input_string == *char_slash_str) { return_value.type = NAME_PM; } else if (*input_string == '@' || *input_string == *char_at_str) { return_value.type = CHANNEL; } else if(*input_string == '#' || *input_string == *char_cmd_str) { return_value.type = COMMAND; } else { return_value.type = NAME; } } else { return_value.type = last_type; } switch(return_value.type) { case CHANNEL: input_string++; /* No break, increment twice for channel */ case NAME_PM: case COMMAND: input_string++; break; case NAME: { const char *last_space = strmrchr(input_string, input_string+cursor_pos, ' '); if(last_space != NULL) { /* Update the cursor position to be relative to last_complete */ cursor_pos -= last_space+1-input_string; input_string = last_space+1; } } break; } if(!have_last_complete || (*input_string && strncasecmp(input_string, last_complete, strlen(last_complete)) != 0)) { /* New input string, start over */ size_t i; last_str_count = -1; /* Isolate the word we're currently typing (and completing) */ for(i = 0; i < sizeof(last_complete) && input_string[i] && i < cursor_pos && !isspace((unsigned char)input_string[i]); i++) { last_complete[i] = input_string[i]; } last_complete[i] = '\0'; have_last_complete = 1; } /* Look through the list */ for(retries = 0; retries < 2 && !return_value.str; retries++) { size_t i; switch(return_value.type) { case NAME: case NAME_PM: for(i = 0, count = 0; i < name_count; i++) { if(strncasecmp(name_list[i], last_complete, strlen(last_complete)) == 0) { /* We have a match! */ if(count > last_str_count) { /* This hasn't been returned yet, let's return it */ last_str_count = count++; return_value.str = name_list[i]; break; } count++; } } break; case CHANNEL: for(step = queue_front_node(chan_name_queue), count = 0; step->next != NULL; step = step->next) { if(strncasecmp(((chan_name*)(step->data))->name, last_complete, strlen(last_complete)) == 0) { /* Yay! The chan-name begins with the string we're searching for. */ if(count > last_str_count) { /* We found something we haven't returned earlier, let's return it. */ last_str_count = count++; return_value.str = ((chan_name*)(step->data))->name; break; } count++; } } break; case COMMAND: default: for(i = 0, count = 0; i < command_count; i++) { if(strncasecmp(commands[i].command, last_complete, strlen(last_complete)) == 0) { /* Yay! The command begins with the string we're searching for. */ if(count > last_str_count) { /* We found something we haven't returned earlier, let's return it. */ last_str_count = count++; return_value.str = commands[i].command; break; } count++; } } break; } if(!return_value.str && count) { /* We checked the whole list and found something, but not * anything we haven't returned earlier. Let's start from the beginning again. */ last_str_count = -1; } } last_type = return_value.type; } else { have_last_complete = 0; *last_complete = '\0'; last_str_count = -1; } return return_value; }