/** * gnm_pop_C_locale : * @locale : #GnmLocale * * Frees the result of gnm_push_C_locale and restores the original locale. **/ void gnm_pop_C_locale (GnmLocale *locale) { /* go_setlocale restores bools to locale translation */ go_setlocale (LC_MONETARY, locale->monetary_locale); g_free (locale->monetary_locale); go_setlocale (LC_NUMERIC, locale->num_locale); g_free (locale->num_locale); g_free (locale); }
/** * gnm_push_C_locale : * * Returns the current locale, and sets the locale and the value-format * engine's locale to 'C'. The caller must call gnm_pop_C_locale to free the * result and restore the previous locale. **/ GnmLocale * gnm_push_C_locale (void) { GnmLocale *old = g_new0 (GnmLocale, 1); old->num_locale = g_strdup (go_setlocale (LC_NUMERIC, NULL)); go_setlocale (LC_NUMERIC, "C"); old->monetary_locale = g_strdup (go_setlocale (LC_MONETARY, NULL)); go_setlocale (LC_MONETARY, "C"); go_locale_untranslated_booleans (); return old; }
/** * gnm_stf_export: * @export_options: an export options struct * * Exports the sheets given in @stfe * * Return value: TRUE on success, FALSE otherwise **/ gboolean gnm_stf_export (GnmStfExport *stfe) { GSList *ptr; GsfOutput *sink; gboolean result = TRUE; char *old_locale = NULL; g_return_val_if_fail (GNM_IS_STF_EXPORT (stfe), FALSE); g_return_val_if_fail (stfe->sheet_list != NULL, FALSE); g_object_get (G_OBJECT (stfe), "sink", &sink, NULL); g_return_val_if_fail (sink != NULL, FALSE); if (stfe->charset && strcmp (stfe->charset, "UTF-8") != 0) { char *charset; GsfOutput *converter; switch (stfe->transliterate_mode) { default: case GNM_STF_TRANSLITERATE_MODE_ESCAPE: charset = g_strdup (stfe->charset); break; case GNM_STF_TRANSLITERATE_MODE_TRANS: charset = g_strconcat (stfe->charset, "//TRANSLIT", NULL); break; } converter = gsf_output_iconv_new (sink, charset, "UTF-8"); g_free (charset); if (converter) { g_object_set (G_OBJECT (stfe), "sink", converter, NULL); g_object_unref (converter); } else { g_warning ("Failed to create converter."); result = FALSE; } } if (stfe->locale) { old_locale = g_strdup (go_setlocale (LC_ALL, NULL)); go_setlocale (LC_ALL, stfe->locale); } for (ptr = stfe->sheet_list; ptr != NULL ; ptr = ptr->next) { Sheet *sheet = ptr->data; if (!stf_export_sheet (stfe, sheet)) { result = FALSE; break; } } if (old_locale) /* go_setlocale clears the cache, */ /*so we don't want to call it with NULL*/ go_setlocale (LC_ALL, old_locale); g_free (old_locale); g_object_set (G_OBJECT (stfe), "sink", sink, NULL); g_object_unref (sink); return result; }
int * gnm_sort_contents (GnmSortData *data, GOCmdContext *cc) { ColRowInfo const *cra; SortDataPerm *perm; int length, real_length, i, cur, *iperm, *real; int const first = data->top ? data->range->start.row : data->range->start.col; length = gnm_sort_data_length (data); real_length = 0; /* Discern the rows/cols to be actually sorted */ real = g_new (int, length); for (i = 0; i < length; i++) { cra = data->top ? sheet_row_get (data->sheet, first + i) : sheet_col_get (data->sheet, first + i); if (cra && !cra->visible) { real[i] = -1; } else { real[i] = i; real_length++; } } cur = 0; perm = g_new (SortDataPerm, real_length); for (i = 0; i < length; i++) { if (real[i] != -1) { perm[cur].index = i; perm[cur].data = data; cur++; } } if (real_length > 1) { if (data->locale) { char *old_locale = g_strdup (go_setlocale (LC_ALL, NULL)); go_setlocale (LC_ALL, data->locale); qsort (perm, real_length, sizeof (SortDataPerm), g_str_has_prefix (old_locale, data->locale) ? sort_qsort_compare : sort_qsort_compare_in_locale); go_setlocale (LC_ALL, old_locale); g_free (old_locale); } else qsort (perm, real_length, sizeof (SortDataPerm), sort_qsort_compare); } cur = 0; iperm = g_new (int, length); for (i = 0; i < length; i++) { if (real[i] != -1) { iperm[i] = perm[cur].index; cur++; } else { iperm[i] = i; } } g_free (perm); g_free (real); sort_permute (data, iperm, length, cc); /* Make up for the PASTE_NO_RECALC. */ sheet_region_queue_recalc (data->sheet, data->range); sheet_flag_status_update_range (data->sheet, data->range); sheet_range_calc_spans (data->sheet, data->range, data->retain_formats ? GNM_SPANCALC_RENDER : GNM_SPANCALC_RE_RENDER); sheet_redraw_all (data->sheet, FALSE); return iperm; }