TEST(String, Shared) { const char *str1, *str2, *str3; int count; count = string_hashtable_shared->items_count; str1 = string_shared_get ("this is a test"); CHECK(str1); LONGS_EQUAL(count + 1, string_hashtable_shared->items_count); str2 = string_shared_get ("this is a test"); CHECK(str2); POINTERS_EQUAL(str1, str2); LONGS_EQUAL(count + 1, string_hashtable_shared->items_count); str3 = string_shared_get ("this is another test"); CHECK(str3); CHECK(str1 != str3); CHECK(str2 != str3); LONGS_EQUAL(count + 2, string_hashtable_shared->items_count); string_shared_free (str1); LONGS_EQUAL(count + 2, string_hashtable_shared->items_count); string_shared_free (str2); LONGS_EQUAL(count + 1, string_hashtable_shared->items_count); string_shared_free (str3); LONGS_EQUAL(count + 0, string_hashtable_shared->items_count); }
void gui_nicklist_remove_nick (struct t_gui_buffer *buffer, struct t_gui_nick *nick) { char *nick_removed; if (!buffer || !nick) return; nick_removed = (nick->name) ? strdup (nick->name) : NULL; gui_nicklist_send_signal ("nicklist_nick_removing", buffer, nick_removed); gui_nicklist_send_hsignal ("nicklist_nick_removing", buffer, NULL, nick); /* remove nick from list */ if (nick->prev_nick) (nick->prev_nick)->next_nick = nick->next_nick; if (nick->next_nick) (nick->next_nick)->prev_nick = nick->prev_nick; if ((nick->group)->nicks == nick) (nick->group)->nicks = nick->next_nick; if ((nick->group)->last_nick == nick) (nick->group)->last_nick = nick->prev_nick; /* free data */ if (nick->name) string_shared_free (nick->name); if (nick->color) string_shared_free (nick->color); if (nick->prefix) string_shared_free (nick->prefix); if (nick->prefix_color) string_shared_free (nick->prefix_color); buffer->nicklist_count--; buffer->nicklist_nicks_count--; if (nick->visible) { if (buffer->nicklist_visible_count > 0) buffer->nicklist_visible_count--; } free (nick); if (CONFIG_BOOLEAN(config_look_color_nick_offline)) gui_buffer_ask_chat_refresh (buffer, 1); gui_nicklist_send_signal ("nicklist_nick_removed", buffer, nick_removed); if (nick_removed) free (nick_removed); }
void gui_nicklist_nick_set (struct t_gui_buffer *buffer, struct t_gui_nick *nick, const char *property, const char *value) { long number; char *error; int nick_changed; if (!buffer || !nick || !property || !value) return; nick_changed = 0; if (string_strcasecmp (property, "color") == 0) { if (nick->color) string_shared_free (nick->color); nick->color = (value[0]) ? (char *)string_shared_get (value) : NULL; nick_changed = 1; } else if (string_strcasecmp (property, "prefix") == 0) { if (nick->prefix) string_shared_free (nick->prefix); nick->prefix = (value[0]) ? (char *)string_shared_get (value) : NULL; nick_changed = 1; } else if (string_strcasecmp (property, "prefix_color") == 0) { if (nick->prefix_color) string_shared_free (nick->prefix_color); nick->prefix_color = (value[0]) ? (char *)string_shared_get (value) : NULL; nick_changed = 1; } else if (string_strcasecmp (property, "visible") == 0) { error = NULL; number = strtol (value, &error, 10); if (error && !error[0]) nick->visible = (number) ? 1 : 0; nick_changed = 1; } if (nick_changed) { gui_nicklist_send_signal ("nicklist_nick_changed", buffer, nick->name); gui_nicklist_send_hsignal ("nicklist_nick_changed", buffer, NULL, nick); } }
void gui_line_clear (struct t_gui_line *line) { if (line->data->prefix) string_shared_free (line->data->prefix); line->data->prefix = (char *)string_shared_get (""); if (line->data->message) free (line->data->message); line->data->message = strdup (""); }
void gui_nicklist_group_set (struct t_gui_buffer *buffer, struct t_gui_nick_group *group, const char *property, const char *value) { long number; char *error; int group_changed; if (!buffer || !group || !property || !value) return; group_changed = 0; if (string_strcasecmp (property, "color") == 0) { if (group->color) string_shared_free (group->color); group->color = (value[0]) ? (char *)string_shared_get (value) : NULL; group_changed = 1; } else if (string_strcasecmp (property, "visible") == 0) { error = NULL; number = strtol (value, &error, 10); if (error && !error[0]) group->visible = (number) ? 1 : 0; group_changed = 1; } if (group_changed) { gui_nicklist_send_signal ("nicklist_group_changed", buffer, group->name); gui_nicklist_send_hsignal ("nicklist_group_changed", buffer, group, NULL); } }
void gui_nicklist_remove_group (struct t_gui_buffer *buffer, struct t_gui_nick_group *group) { char *group_removed; if (!buffer || !group) return; group_removed = (group->name) ? strdup (group->name) : NULL; /* remove children first */ while (group->children) { gui_nicklist_remove_group (buffer, group->children); } /* remove nicks from group */ while (group->nicks) { gui_nicklist_remove_nick (buffer, group->nicks); } gui_nicklist_send_signal ("nicklist_group_removing", buffer, group_removed); gui_nicklist_send_hsignal ("nicklist_group_removing", buffer, group, NULL); if (group->parent) { /* remove group from list */ if (group->prev_group) (group->prev_group)->next_group = group->next_group; if (group->next_group) (group->next_group)->prev_group = group->prev_group; if ((group->parent)->children == group) (group->parent)->children = group->next_group; if ((group->parent)->last_child == group) (group->parent)->last_child = group->prev_group; buffer->nicklist_count--; buffer->nicklist_groups_count--; } else { buffer->nicklist_root = NULL; } /* free data */ if (group->name) string_shared_free (group->name); if (group->color) string_shared_free (group->color); if (group->visible) { if (buffer->nicklist_display_groups && (buffer->nicklist_visible_count > 0)) buffer->nicklist_visible_count--; } free (group); gui_nicklist_send_signal ("nicklist_group_removed", buffer, group_removed); if (group_removed) free (group_removed); }
void gui_line_remove_from_list (struct t_gui_buffer *buffer, struct t_gui_lines *lines, struct t_gui_line *line, int free_data) { struct t_gui_window *ptr_win; struct t_gui_window_scroll *ptr_scroll; int prefix_length, prefix_is_nick; for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) { /* reset scroll for any window scroll starting with this line */ for (ptr_scroll = ptr_win->scroll; ptr_scroll; ptr_scroll = ptr_scroll->next_scroll) { if (ptr_scroll->start_line == line) { ptr_scroll->start_line = ptr_scroll->start_line->next_line; ptr_scroll->start_line_pos = 0; gui_buffer_ask_chat_refresh (buffer, 2); } } /* remove line from coords */ gui_window_coords_remove_line (ptr_win, line); } gui_line_get_prefix_for_display (line, NULL, &prefix_length, NULL, &prefix_is_nick); if (prefix_is_nick) prefix_length += config_length_nick_prefix_suffix; if (prefix_length == lines->prefix_max_length) lines->prefix_max_length_refresh = 1; /* move read marker if it was on line we are removing */ if (lines->last_read_line == line) { lines->last_read_line = lines->last_read_line->prev_line; lines->first_line_not_read = (lines->last_read_line) ? 0 : 1; gui_buffer_ask_chat_refresh (buffer, 1); } /* free data */ if (free_data) { if (line->data->str_time) free (line->data->str_time); gui_line_tags_free (line->data); if (line->data->prefix) string_shared_free (line->data->prefix); if (line->data->message) free (line->data->message); free (line->data); } /* remove line from list */ if (line->prev_line) (line->prev_line)->next_line = line->next_line; if (line->next_line) (line->next_line)->prev_line = line->prev_line; if (lines->first_line == line) lines->first_line = line->next_line; if (lines->last_line == line) lines->last_line = line->prev_line; lines->lines_count--; free (line); }
int hdata_set (struct t_hdata *hdata, void *pointer, const char *name, const char *value) { struct t_hdata_var *var; char **ptr_string, *error; long number; long unsigned int ptr; int rc; if (!hdata->update_pending) return 0; var = hashtable_get (hdata->hash_var, name); if (!var) return 0; if (!var->update_allowed) return 0; switch (var->type) { case DOGECHAT_HDATA_OTHER: break; case DOGECHAT_HDATA_CHAR: *((char *)(pointer + var->offset)) = (value) ? value[0] : '\0'; return 1; break; case DOGECHAT_HDATA_INTEGER: error = NULL; number = strtol (value, &error, 10); if (error && !error[0]) { *((int *)(pointer + var->offset)) = (int)number; return 1; } break; case DOGECHAT_HDATA_LONG: error = NULL; number = strtol (value, &error, 10); if (error && !error[0]) { *((long *)(pointer + var->offset)) = number; return 1; } break; case DOGECHAT_HDATA_STRING: ptr_string = (char **)(pointer + var->offset); if (*ptr_string) free (*ptr_string); *ptr_string = (value) ? strdup (value) : NULL; return 1; break; case DOGECHAT_HDATA_SHARED_STRING: ptr_string = (char **)(pointer + var->offset); if (*ptr_string) string_shared_free (*ptr_string); *ptr_string = (value) ? (char *)string_shared_get (value) : NULL; return 1; break; case DOGECHAT_HDATA_POINTER: rc = sscanf (value, "%lx", &ptr); if ((rc != EOF) && (rc != 0)) { *((void **)(pointer + var->offset)) = (void *)ptr; return 1; } break; case DOGECHAT_HDATA_TIME: error = NULL; number = strtol (value, &error, 10); if (error && !error[0]) { *((time_t *)(pointer + var->offset)) = (time_t)number; return 1; } break; case DOGECHAT_HDATA_HASHTABLE: break; } return 0; }