gint xmms_natcmp_len (const gchar *str1, gint len1, const gchar *str2, gint len2) { gchar *tmp1, *tmp2, *tmp3, *tmp4; gint res; /* FIXME: Implement a less allocation-happy variant */ tmp1 = g_utf8_casefold (str1, len1); tmp2 = g_utf8_casefold (str2, len2); tmp3 = g_utf8_collate_key_for_filename (tmp1, -1); tmp4 = g_utf8_collate_key_for_filename (tmp2, -1); res = strcmp (tmp3, tmp4); g_free (tmp1); g_free (tmp2); g_free (tmp3); g_free (tmp4); return res; }
int main() { static char buffer[1048576]; size_t read_bytes = fread(buffer, 1, sizeof(buffer) - 1, stdin); printf("%zu\n", read_bytes); if (read_bytes < 1) { return EXIT_FAILURE; } size_t data_bytes = read_bytes; char* buffer_pointer = buffer; g_free(g_utf8_strup(buffer_pointer, data_bytes)); g_free(g_utf8_strdown(buffer_pointer, data_bytes)); g_free(g_utf8_normalize(buffer_pointer, data_bytes, G_NORMALIZE_DEFAULT)); g_free(g_utf8_collate_key(buffer_pointer, data_bytes)); g_free(g_utf8_collate_key_for_filename(buffer_pointer, data_bytes)); return EXIT_SUCCESS; }
static gboolean gtmff_asc (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { GSList **l = data; Sheet *this_sheet; char *name; gtmff_sort_t *ptr; ptr = g_new (gtmff_sort_t, 1); gtk_tree_model_get (model, iter, SHEET_POINTER, &this_sheet, SHEET_NAME, &name, -1); ptr->i = this_sheet->index_in_wb; ptr->key = g_utf8_collate_key_for_filename (name, -1); *l = g_slist_insert_sorted (*l, ptr, (GCompareFunc) gtmff_compare_func); return FALSE; }
static void get_folder_content_done_cb (GError *error, gpointer user_data) { LoadData *load_data = user_data; FrFileSelectorDialog *self = load_data->dialog; GtkListStore *list_store; GList *scan; GtkTreeIter iter; GDateTime *today; int sort_column_id; GtkSortType sort_order; GHashTable *selected_files; if (error != NULL) { if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) { GMountOperation *operation; operation = gtk_mount_operation_new (GTK_WINDOW (self)); g_file_mount_enclosing_volume (load_data->folder, G_MOUNT_MOUNT_NONE, operation, load_data->cancellable, folder_mount_enclosing_volume_ready_cb, load_data); g_object_unref (operation); return; } if (! g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) _gtk_error_dialog_run (GTK_WINDOW (self), _("Could not load the location"), "%s", error->message); if (load_data->dialog->priv->current_operation == load_data) load_data->dialog->priv->current_operation = NULL; load_data_free (load_data); return; } load_data->files = g_list_reverse (load_data->files); today = g_date_time_new_now_local (); gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (GET_WIDGET ("files_liststore")), &sort_column_id, &sort_order); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (GET_WIDGET ("files_liststore")), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, 0); selected_files = g_hash_table_new (g_file_hash, (GEqualFunc) g_file_equal); for (scan = load_data->files_to_select; scan; scan = scan->next) g_hash_table_insert(selected_files, scan->data, GINT_TO_POINTER (1)); list_store = GTK_LIST_STORE (GET_WIDGET ("files_liststore")); gtk_list_store_clear (list_store); for (scan = load_data->files; scan; scan = scan->next) { FileInfo *file_info = scan->data; GdkPixbuf *icon_pixbuf; char *size; GTimeVal timeval; GDateTime *datetime; char *modified; char *collate_key; gboolean is_folder; if (! self->priv->show_hidden && g_file_info_get_is_hidden (file_info->info)) continue; gtk_list_store_append (list_store, &iter); icon_pixbuf = gth_icon_cache_get_pixbuf (self->priv->icon_cache, g_file_info_get_icon (file_info->info)); size = g_format_size (g_file_info_get_size (file_info->info)); g_file_info_get_modification_time (file_info->info, &timeval); datetime = g_date_time_new_from_timeval_local (&timeval); modified = g_date_time_format (datetime, _g_date_time_same_day (datetime, today) ? "%X" : "%x"); collate_key = g_utf8_collate_key_for_filename (g_file_info_get_display_name (file_info->info), -1); is_folder = (g_file_info_get_file_type (file_info->info) == G_FILE_TYPE_DIRECTORY); gtk_list_store_set (list_store, &iter, FILE_LIST_COLUMN_ICON, icon_pixbuf, FILE_LIST_COLUMN_NAME, g_file_info_get_display_name (file_info->info), FILE_LIST_COLUMN_SIZE, (is_folder ? "" : size), FILE_LIST_COLUMN_MODIFIED, modified, FILE_LIST_COLUMN_FILE, file_info->file, FILE_LIST_COLUMN_NAME_ORDER, collate_key, FILE_LIST_COLUMN_SIZE_ORDER, g_file_info_get_size (file_info->info), FILE_LIST_COLUMN_MODIFIED_ORDER, timeval.tv_sec, FILE_LIST_COLUMN_IS_FOLDER, is_folder, FILE_LIST_COLUMN_IS_SELECTED, (g_hash_table_lookup (selected_files, file_info->file) != NULL), -1); g_free (collate_key); g_free (modified); g_date_time_unref (datetime); g_free (size); _g_object_unref (icon_pixbuf); } gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (GET_WIDGET ("files_liststore")), sort_column_id, sort_order); set_current_folder (self, load_data->folder); if (load_data->dialog->priv->current_operation == load_data) load_data->dialog->priv->current_operation = NULL; g_hash_table_unref (selected_files); g_date_time_unref (today); load_data_free (load_data); }
int main (int argc, char **argv) { GIOChannel *in; GError *error = NULL; GArray *line_array = g_array_new (FALSE, FALSE, sizeof(Line)); guint i; gboolean do_key = FALSE; gboolean do_file = FALSE; gchar *locale; /* FIXME: need to modify environment here, * since g_utf8_collate_key calls setlocal (LC_COLLATE, "") */ g_setenv ("LC_ALL", "en_US", TRUE); locale = setlocale (LC_ALL, ""); if (locale == NULL || strcmp (locale, "en_US") != 0) { fprintf (stderr, "No suitable locale, skipping test\n"); return 2; } if (argc != 1 && argc != 2 && argc != 3) { fprintf (stderr, "Usage: unicode-collate [--key|--file] [FILE]\n"); return 1; } i = 1; if (argc > 1) { if (strcmp (argv[1], "--key") == 0) { do_key = TRUE; i = 2; } else if (strcmp (argv[1], "--file") == 0) { do_key = TRUE; do_file = TRUE; i = 2; } } if (argc > i) { in = g_io_channel_new_file (argv[i], "r", &error); if (!in) { fprintf (stderr, "Cannot open %s: %s\n", argv[i], error->message); return 1; } } else { in = g_io_channel_unix_new (fileno (stdin)); } while (TRUE) { gsize term_pos; gchar *str; Line line; if (g_io_channel_read_line (in, &str, NULL, &term_pos, &error) != G_IO_STATUS_NORMAL) break; str[term_pos] = '\0'; if (do_file) line.key = g_utf8_collate_key_for_filename (str, -1); else line.key = g_utf8_collate_key (str, -1); line.str = str; g_array_append_val (line_array, line); } if (error) { fprintf (stderr, "Error reading test file, %s\n", error->message); return 1; } qsort (line_array->data, line_array->len, sizeof (Line), do_key ? compare_key : compare_collate); for (i = 0; i < line_array->len; i++) printf ("%s\n", g_array_index (line_array, Line, i).str); g_io_channel_unref (in); return 0; }
static void vnr_file_set_display_name(VnrFile *vnr_file, char *display_name) { vnr_file->display_name = g_strdup(display_name); vnr_file->display_name_collate = g_utf8_collate_key_for_filename(vnr_file->display_name, -1); }
/** * Creates a string that orders correctly according to the locale * * @param str The string to collate * @return A collated version of str, must be freed with g_free */ char *s4_string_collate (const char *str) { return g_utf8_collate_key_for_filename (str, -1); }