int strcmp_ex(const char* p1,t_size n1,const char* p2,t_size n2) throw() { n1 = strlen_max(p1,n1); n2 = strlen_max(p2,n2); return strcmp_nc(p1, n1, p2, n2); }
int parse_server_string ( const char *str ) { assert(str); if(bool_option("show_all_server_strings")) cio_out(str); current_server_string = str; size_t i; char **argv; int argc; char *buf = NULL; server_string_t *si; server_string_list_t *sl; /* make a buffer */ buf = copy_string(str); assert(buf != NULL); buf[strlen(buf) - 1] = 0; if(strlen(buf) == 0) { return -1; } make_argv(&argc, &argv, buf); assert(argc != 0); // we want a consistent format regardless of whether or not a prefix // was sent, so if one wasn't we fake it if(argv[0][0] != ':') { // no prefix was found char **tmp = malloc(sizeof(char *) * (argc + 1)); tmp[0] = malloc(strlen(irc_pick_server()) + 2); tmp[0][0] = ':'; strcpy(&tmp[0][1], irc_pick_server()); for(i = 0; i < argc; i++) { tmp[i + 1] = copy_string(argv[i]); } free_argv(argc, argv); argc++; argv = tmp; } // run hooks rcv_hook_t *rcvp = &hook_head; for(list_next(rcvp); rcvp != &hook_head; list_next(rcvp)) { rcvp->func(argc, argv); } // find a function to run sl = (server_string_list_t *)(head.head.next); find_next_string_handler: for( ; (list_t *)sl != (list_t *)&head; list_next(sl)) { si = sl->strings; while(si->keystring != NULL) { if(strcmp_nc(argv[1], si->keystring) == 0) { goto found_string_handler; } si++; } } // nothing was found if(bool_option("verbose") || bool_option("show_unhandled_msgs")) { cio_out("unhandled string sent from server: %s\n", str); } free_argv(argc, argv); free(buf); return -1; found_string_handler: free_argv(argc, argv); if(buf[0] == ':') { make_max_argv(&argc, &argv, buf, si->argc); } else { make_max_argv(&argc, &argv, buf, si->argc - 1); char **tmp = malloc(sizeof(char *) * (argc + 1)); //tmp[0] = copy_string(irc_pick_server()); tmp[0] = malloc(strlen(irc_pick_server()) + 2); tmp[0][0] = ':'; strcpy(&tmp[0][1], irc_pick_server()); //add_char_to_str(tmp[0], 0, ':'); for(i = 0; i < argc; i++) { tmp[i + 1] = copy_string(argv[i]); } free_argv(argc, argv); argc++; argv = tmp; } if(si->strip_colon && strlen(argv[argc - 1]) != 0 && argv[argc - 1][0] == ':') { remove_char_from_str(argv[argc - 1], 0); } /********************************************** * make sure argc is correct, so that the * callbacks don't get any suprises **********************************************/ assert(!(argc > si->argc)); if(argc < si->argc) { char **tmp = argv; argv = malloc(sizeof(char *) * si->argc); for(i = 0; i < argc; i++) { argv[i] = tmp[i]; } for(i = argc; i < si->argc; i++) { argv[i] = malloc(1); argv[i][0] = 0; } argc = si->argc; } int retval = si->hook(argc, argv); if(retval) { list_next(sl); goto find_next_string_handler; } free_argv(argc, argv); current_server_string = NULL; return retval; }