AUDIT: r17459 - gnucash/trunk/src/gnome-utils - Bug #545722: Get the GNCDateEdit control working on Win32 again. Don't assume that the content returned by localtime() will not be changed out from under you.

Derek Atkins warlord at MIT.EDU
Mon Aug 3 10:14:59 EDT 2009


That looks right.

-derek

Charles Day <cedayiv at gmail.com> writes:

> Sure, why the heck not? Why didn't I think of that? So this instead, right?
>
> tm_returned = localtime_r(&current_time, &mtm);
> g_return_if_fail(tm_returned != NULL);
>
> And get rid of the next line: mtm = *tm_returned;
>
> On Fri, Jul 31, 2009 at 2:37 PM, Derek Atkins <warlord at mit.edu> wrote:
>
>     Hi,
>    
>     As I said in my last message, I'm catching up on lots of changesets.
>     Is there any reason not to use localtime_r() here?  We already make
>     sure it exists by using AC_REPLACE_FUNCS().
>    
>     -derek
>    
>     Charles Day <cedayiv at cvs.gnucash.org> writes:
>    
>     > Author: cedayiv
>     > Date: 2008-08-08 19:38:45 -0400 (Fri, 08 Aug 2008)
>     > New Revision: 17459
>     > Trac: http://svn.gnucash.org/trac/changeset/17459
>     >
>     > Modified:
>     >    gnucash/trunk/src/gnome-utils/gnc-date-edit.c
>     > Log:
>     > Bug #545722: Get the GNCDateEdit control working on Win32 again. Don't
>     assume that the content returned by localtime() will not be changed out
>     from under you.
>     > BP
>     >
>     >
>     > Modified: gnucash/trunk/src/gnome-utils/gnc-date-edit.c
>     > ===================================================================
>     > --- gnucash/trunk/src/gnome-utils/gnc-date-edit.c     2008-08-08
>     21:36:48 UTC (rev 17458)
>     > +++ gnucash/trunk/src/gnome-utils/gnc-date-edit.c     2008-08-08
>     23:38:45 UTC (rev 17459)
>     > @@ -307,7 +307,8 @@
>     >  fill_time_popup (GtkWidget *widget, GNCDateEdit *gde)
>     >  {
>     >       GtkWidget *menu;
>     > -     struct tm *mtm;
>     > +     struct tm *tm_returned;
>     > +     struct tm mtm;
>     >       time_t current_time;
>     >       int i, j;
>     >
>     > @@ -318,21 +319,25 @@
>     >       gtk_option_menu_set_menu (GTK_OPTION_MENU (gde->time_popup),
>     menu);
>     >
>     >       time (&current_time);
>     > -     mtm = localtime (&current_time);
>     > +     tm_returned = localtime (&current_time);
>     > +     g_return_if_fail(tm_returned != NULL);
>     > +        /* The return value points to statically allocated, shared
>     memory.
>     > +         * Copy the contents so we don't risk unexpected changes. */
>     > +        mtm = *tm_returned;
>     >
>     >       for (i = gde->lower_hour; i <= gde->upper_hour; i++){
>     >               GtkWidget *item, *submenu;
>     >               hour_info_t *hit;
>     >               char buffer [40];
>     >
>     > -             mtm->tm_hour = i;
>     > -             mtm->tm_min  = 0;
>     > +             mtm.tm_hour = i;
>     > +             mtm.tm_min  = 0;
>     >               hit = g_new (hour_info_t, 1);
>     >
>     >               if (gde->flags & GNC_DATE_EDIT_24_HR)
>     > -                     qof_strftime (buffer, sizeof (buffer), "%H:00",
>     mtm);
>     > +                     qof_strftime (buffer, sizeof (buffer), "%H:00", &
>     mtm);
>     >               else
>     > -                     qof_strftime (buffer, sizeof (buffer), "%I:00 %p
>     ", mtm);
>     > +                     qof_strftime (buffer, sizeof (buffer), "%I:00 %p
>     ", &mtm);
>     >               hit->hour = g_strdup (buffer);
>     >               hit->gde  = gde;
>     >
>     > @@ -351,14 +356,14 @@
>     >               for (j = 0; j < 60; j += 15){
>     >                       GtkWidget *mins;
>     >
>     > -                     mtm->tm_min = j;
>     > +                     mtm.tm_min = j;
>     >                       hit = g_new (hour_info_t, 1);
>     >                       if (gde->flags & GNC_DATE_EDIT_24_HR)
>     >                               qof_strftime (buffer, sizeof (buffer),
>     > -                                           "%H:%M", mtm);
>     > +                                           "%H:%M", &mtm);
>     >                       else
>     >                               qof_strftime (buffer, sizeof (buffer),
>     > -                                           "%I:%M %p", mtm);
>     > +                                           "%I:%M %p", &mtm);
>     >                       hit->hour = g_strdup (buffer);
>     >                       hit->gde  = gde;
>     >
>     > @@ -529,7 +534,8 @@
>     >  void
>     >  gnc_date_edit_set_time (GNCDateEdit *gde, time_t the_time)
>     >  {
>     > -     struct tm *mytm;
>     > +     struct tm *tm_returned;
>     > +     struct tm tm_to_set;
>     >
>     >       g_return_if_fail (gde != NULL);
>     >          g_return_if_fail (GNC_IS_DATE_EDIT (gde));
>     > @@ -545,8 +551,14 @@
>     >          else
>     >            gde->initial_time = the_time;
>     >
>     > -     mytm = localtime (&the_time);
>     > -     gnc_date_edit_set_time_tm(gde, mytm);
>     > +        /* Convert time_t to tm. */
>     > +     tm_returned = localtime (&the_time);
>     > +     g_return_if_fail(tm_returned != NULL);
>     > +        /* The return value points to statically allocated, shared
>     memory.
>     > +         * Copy the contents so we don't risk unexpected changes. */
>     > +        tm_to_set = *tm_returned;
>     > +
>     > +     gnc_date_edit_set_time_tm(gde, &tm_to_set);
>     >  }
>     >
>     >  void
>     >
>     > _______________________________________________
>     > gnucash-changes mailing list
>     > gnucash-changes at gnucash.org
>     > https://lists.gnucash.org/mailman/listinfo/gnucash-changes
>     >
>     >
>    
>     --
>           Derek Atkins, SB '93 MIT EE, SM '95 MIT Media Laboratory
>           Member, MIT Student Information Processing Board  (SIPB)
>           URL: http://web.mit.edu/warlord/    PP-ASEL-IA     N1NWH
>           warlord at MIT.EDU                        PGP key available
>     _______________________________________________
>     gnucash-devel mailing list
>     gnucash-devel at gnucash.org
>     https://lists.gnucash.org/mailman/listinfo/gnucash-devel
>

-- 
       Derek Atkins, SB '93 MIT EE, SM '95 MIT Media Laboratory
       Member, MIT Student Information Processing Board  (SIPB)
       URL: http://web.mit.edu/warlord/    PP-ASEL-IA     N1NWH
       warlord at MIT.EDU                        PGP key available


More information about the gnucash-devel mailing list