static void gtk_dateentry_tokens(GtkWidget *gtkentry, gpointer user_data) { GtkDateEntry *dateentry = user_data; const gchar *str; GDateParseTokens pt; str = gtk_entry_get_text (GTK_ENTRY (dateentry->entry)); g_date_fill_parse_tokens(str, &pt); DB( g_print(" -> parsetoken return is %d values :%d %d %d\n", pt.num_ints, pt.n[0], pt.n[1], pt.n[2]) ); // initialize with today's date g_date_set_time_t(dateentry->date, time(NULL)); switch( pt.num_ints ) { case 1: DB( g_print(" -> seizured 1 number\n") ); if(g_date_valid_day(pt.n[0])) g_date_set_day(dateentry->date, pt.n[0]); break; case 2: DB( g_print(" -> seizured 2 numbers\n") ); if( dmy_order[0] != G_DATE_YEAR ) { if( dmy_order[0] == G_DATE_DAY ) { if(g_date_valid_day(pt.n[0])) g_date_set_day(dateentry->date, pt.n[0]); if(g_date_valid_month(pt.n[1])) g_date_set_month(dateentry->date, pt.n[1]); } else { if(g_date_valid_day(pt.n[1])) g_date_set_day(dateentry->date, pt.n[1]); if(g_date_valid_month(pt.n[0])) g_date_set_month(dateentry->date, pt.n[0]); } } break; } }
static void g_date_determine_dmy(void) { GDate d; gchar buf[128]; GDateParseTokens testpt; gint i; DB( g_print(" (dateentry) determine dmy\n") ); g_date_clear (&d, 1); /* clear for scratch use */ /* had to pick a random day - don't change this, some strftimes * are broken on some days, and this one is good so far. */ g_date_set_dmy (&d, 4, 7, 1976); g_date_strftime (buf, 127, "%x", &d); g_date_fill_parse_tokens (buf, &testpt); i = 0; while (i < testpt.num_ints) { switch (testpt.n[i]) { case 7: dmy_order[i] = G_DATE_MONTH; break; case 4: dmy_order[i] = G_DATE_DAY; break; //case 76: //using_twodigit_years = TRUE; /* FALL THRU */ case 1976: dmy_order[2] = G_DATE_YEAR; break; } ++i; } DB( g_print(" dmy legend: 0=day, 1=month, 2=year\n") ); DB( g_print(" dmy is: %d %d %d\n", dmy_order[0], dmy_order[1], dmy_order[2]) ); }
/* HOLDS: g_date_global_lock */ static void g_date_prepare_to_parse (const gchar *str, GDateParseTokens *pt) { const gchar *locale = setlocale (LC_TIME, NULL); gboolean recompute_localeinfo = FALSE; GDate d; g_return_if_fail (locale != NULL); /* should not happen */ g_date_clear (&d, 1); /* clear for scratch use */ if ( (current_locale == NULL) || (strcmp (locale, current_locale) != 0) ) recompute_localeinfo = TRUE; /* Uh, there used to be a reason for the temporary */ if (recompute_localeinfo) { int i = 1; GDateParseTokens testpt; gchar buf[128]; g_free (current_locale); /* still works if current_locale == NULL */ current_locale = g_strdup (locale); short_month_names[0] = "Error"; long_month_names[0] = "Error"; while (i < 13) { gchar *casefold; g_date_set_dmy (&d, 1, i, 1); g_return_if_fail (g_date_valid (&d)); g_date_strftime (buf, 127, "%b", &d); casefold = g_utf8_casefold (buf, -1); g_free (short_month_names[i]); short_month_names[i] = g_utf8_normalize (casefold, -1, G_NORMALIZE_ALL); g_free (casefold); g_date_strftime (buf, 127, "%B", &d); casefold = g_utf8_casefold (buf, -1); g_free (long_month_names[i]); long_month_names[i] = g_utf8_normalize (casefold, -1, G_NORMALIZE_ALL); g_free (casefold); ++i; } /* Determine DMY order */ /* had to pick a random day - don't change this, some strftimes * are broken on some days, and this one is good so far. */ g_date_set_dmy (&d, 4, 7, 1976); g_date_strftime (buf, 127, "%x", &d); g_date_fill_parse_tokens (buf, &testpt); i = 0; while (i < testpt.num_ints) { switch (testpt.n[i]) { case 7: dmy_order[i] = G_DATE_MONTH; break; case 4: dmy_order[i] = G_DATE_DAY; break; case 76: using_twodigit_years = TRUE; /* FALL THRU */ case 1976: dmy_order[i] = G_DATE_YEAR; break; default: /* assume locale era */ locale_era_adjust = 1976 - testpt.n[i]; dmy_order[i] = G_DATE_YEAR; break; } ++i; } #ifdef G_ENABLE_DEBUG DEBUG_MSG (("**GDate prepared a new set of locale-specific parse rules.")); i = 1; while (i < 13) { DEBUG_MSG ((" %s %s", long_month_names[i], short_month_names[i])); ++i; } if (using_twodigit_years) DEBUG_MSG (("**Using twodigit years with cutoff year: %u", twodigit_start_year)); { gchar *strings[3]; i = 0; while (i < 3) { switch (dmy_order[i]) { case G_DATE_MONTH: strings[i] = "Month"; break; case G_DATE_YEAR: strings[i] = "Year"; break; case G_DATE_DAY: strings[i] = "Day"; break; default: strings[i] = NULL; break; } ++i; } DEBUG_MSG (("**Order: %s, %s, %s", strings[0], strings[1], strings[2])); DEBUG_MSG (("**Sample date in this locale: `%s'", buf)); } #endif } g_date_fill_parse_tokens (str, pt); }