mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-27 22:46:15 +01:00
datetime: Clean up macros and unused variables
The most complex macros should be converted to inlined functions, instead, to guarantee some type safety.
This commit is contained in:
parent
0f87f09397
commit
9a39b1d705
147
glib/gdatetime.c
147
glib/gdatetime.c
@ -1,6 +1,8 @@
|
|||||||
/* gdatetime.c
|
/* gdatetime.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009-2010 Christian Hergert <chris@dronelabs.com>
|
* Copyright (C) 2009-2010 Christian Hergert <chris@dronelabs.com>
|
||||||
|
* Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
|
||||||
|
* Copyright (C) 2010 Emmanuele Bassi <ebassi@linux.intel.com>
|
||||||
*
|
*
|
||||||
* This is free software; you can redistribute it and/or
|
* This is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
@ -88,35 +90,6 @@
|
|||||||
#define JULIAN_YEAR(d) ((d)->julian / 365.25)
|
#define JULIAN_YEAR(d) ((d)->julian / 365.25)
|
||||||
#define DAYS_PER_PERIOD (G_GINT64_CONSTANT (2914695))
|
#define DAYS_PER_PERIOD (G_GINT64_CONSTANT (2914695))
|
||||||
|
|
||||||
#define ADD_DAYS(d,n) G_STMT_START { \
|
|
||||||
gint __day = d->julian + (n); \
|
|
||||||
if (__day < 1) \
|
|
||||||
{ \
|
|
||||||
d->period += -1 + (__day / DAYS_PER_PERIOD); \
|
|
||||||
d->period += DAYS_PER_PERIOD + (__day % DAYS_PER_PERIOD); \
|
|
||||||
} \
|
|
||||||
else if (__day > DAYS_PER_PERIOD) \
|
|
||||||
{ \
|
|
||||||
d->period += (d->julian + (n)) / DAYS_PER_PERIOD; \
|
|
||||||
d->julian = (d->julian + (n)) % DAYS_PER_PERIOD; \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
d->julian += n; } G_STMT_END
|
|
||||||
|
|
||||||
#define ADD_USEC(d,n) G_STMT_START { \
|
|
||||||
gint64 __usec; \
|
|
||||||
gint __days; \
|
|
||||||
__usec = (d)->usec + (n); \
|
|
||||||
__days = __usec / USEC_PER_DAY; \
|
|
||||||
if (__usec < 0) \
|
|
||||||
__days -= 1; \
|
|
||||||
if (__days != 0) \
|
|
||||||
ADD_DAYS ((d), __days); \
|
|
||||||
if (__usec < 0) \
|
|
||||||
d->usec = USEC_PER_DAY + (__usec % USEC_PER_DAY); \
|
|
||||||
else \
|
|
||||||
d->usec = __usec % USEC_PER_DAY; } G_STMT_END
|
|
||||||
|
|
||||||
#define GET_AMPM(d,l) ((g_date_time_get_hour (d) < 12) \
|
#define GET_AMPM(d,l) ((g_date_time_get_hour (d) < 12) \
|
||||||
? (l ? C_("GDateTime", "am") : C_("GDateTime", "AM")) \
|
? (l ? C_("GDateTime", "am") : C_("GDateTime", "AM")) \
|
||||||
: (l ? C_("GDateTime", "pm") : C_("GDateTime", "PM")))
|
: (l ? C_("GDateTime", "pm") : C_("GDateTime", "PM")))
|
||||||
@ -135,6 +108,35 @@
|
|||||||
|
|
||||||
typedef struct _GTimeZone GTimeZone;
|
typedef struct _GTimeZone GTimeZone;
|
||||||
|
|
||||||
|
struct _GDateTime
|
||||||
|
{
|
||||||
|
/* Julian Period, 0 is Initial Epoch */
|
||||||
|
gint period : 3;
|
||||||
|
|
||||||
|
/* Day within Julian Period */
|
||||||
|
guint julian : 22;
|
||||||
|
|
||||||
|
/* Microsecond timekeeping within Day */
|
||||||
|
guint64 usec : 37;
|
||||||
|
|
||||||
|
gint reserved : 2;
|
||||||
|
|
||||||
|
/* TimeZone information, NULL is UTC */
|
||||||
|
GTimeZone *tz;
|
||||||
|
|
||||||
|
volatile gint ref_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _GTimeZone
|
||||||
|
{
|
||||||
|
/* TZ abbreviation (e.g. PST) */
|
||||||
|
gchar *name;
|
||||||
|
|
||||||
|
gint64 offset;
|
||||||
|
|
||||||
|
guint is_dst : 1;
|
||||||
|
};
|
||||||
|
|
||||||
static const guint16 days_in_months[2][13] =
|
static const guint16 days_in_months[2][13] =
|
||||||
{
|
{
|
||||||
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
|
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
|
||||||
@ -275,34 +277,43 @@ get_weekday_name_abbr (gint day)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct _GDateTime
|
static inline void
|
||||||
|
g_date_time_add_days_internal (GDateTime *datetime,
|
||||||
|
gint64 days)
|
||||||
{
|
{
|
||||||
/* Julian Period, 0 is Initial Epoch */
|
gint __day = datetime->julian + days;
|
||||||
gint period : 3;
|
if (__day < 1)
|
||||||
|
{
|
||||||
|
datetime->period += -1 + (__day / DAYS_PER_PERIOD);
|
||||||
|
datetime->period += DAYS_PER_PERIOD + (__day % DAYS_PER_PERIOD);
|
||||||
|
}
|
||||||
|
else if (__day > DAYS_PER_PERIOD)
|
||||||
|
{
|
||||||
|
datetime->period += (datetime->julian + days) / DAYS_PER_PERIOD;
|
||||||
|
datetime->julian = (datetime->julian + days) % DAYS_PER_PERIOD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
datetime->julian += days;
|
||||||
|
}
|
||||||
|
|
||||||
/* Day within Julian Period */
|
static inline void
|
||||||
guint julian : 22;
|
g_date_time_add_usec (GDateTime *datetime,
|
||||||
|
gint64 usecs)
|
||||||
/* Microsecond timekeeping within Day */
|
|
||||||
guint64 usec : 37;
|
|
||||||
|
|
||||||
gint reserved : 2;
|
|
||||||
|
|
||||||
/* TimeZone information, NULL is UTC */
|
|
||||||
GTimeZone *tz;
|
|
||||||
|
|
||||||
volatile gint ref_count;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GTimeZone
|
|
||||||
{
|
{
|
||||||
/* TZ abbreviation (e.g. PST) */
|
gint64 __usec = datetime->usec + usecs;
|
||||||
gchar *name;
|
gint __days = __usec / USEC_PER_DAY;
|
||||||
|
|
||||||
gint64 offset;
|
if (__usec < 0)
|
||||||
|
__days -= 1;
|
||||||
|
|
||||||
guint is_dst : 1;
|
if (__days != 0)
|
||||||
};
|
g_date_time_add_days_internal (datetime, __days);
|
||||||
|
|
||||||
|
if (__usec < 0)
|
||||||
|
datetime->usec = USEC_PER_DAY + (__usec % USEC_PER_DAY);
|
||||||
|
else
|
||||||
|
datetime->usec = __usec % USEC_PER_DAY;
|
||||||
|
}
|
||||||
|
|
||||||
#define ZONEINFO_DIR "zoneinfo"
|
#define ZONEINFO_DIR "zoneinfo"
|
||||||
#define TZ_MAGIC "TZif"
|
#define TZ_MAGIC "TZif"
|
||||||
@ -670,7 +681,7 @@ g_date_time_add (const GDateTime *datetime,
|
|||||||
g_return_val_if_fail (datetime != NULL, NULL);
|
g_return_val_if_fail (datetime != NULL, NULL);
|
||||||
|
|
||||||
dt = g_date_time_copy (datetime);
|
dt = g_date_time_copy (datetime);
|
||||||
ADD_USEC (dt, timespan);
|
g_date_time_add_usec (dt, timespan);
|
||||||
|
|
||||||
return dt;
|
return dt;
|
||||||
}
|
}
|
||||||
@ -816,7 +827,7 @@ g_date_time_add_days (const GDateTime *datetime,
|
|||||||
g_return_val_if_fail (datetime != NULL, NULL);
|
g_return_val_if_fail (datetime != NULL, NULL);
|
||||||
|
|
||||||
dt = g_date_time_copy (datetime);
|
dt = g_date_time_copy (datetime);
|
||||||
ADD_DAYS (dt, days);
|
g_date_time_add_days_internal (dt, days);
|
||||||
|
|
||||||
return dt;
|
return dt;
|
||||||
}
|
}
|
||||||
@ -838,13 +849,11 @@ g_date_time_add_hours (const GDateTime *datetime,
|
|||||||
gint hours)
|
gint hours)
|
||||||
{
|
{
|
||||||
GDateTime *dt;
|
GDateTime *dt;
|
||||||
gint64 usec;
|
|
||||||
|
|
||||||
g_return_val_if_fail (datetime != NULL, NULL);
|
g_return_val_if_fail (datetime != NULL, NULL);
|
||||||
|
|
||||||
usec = hours * USEC_PER_HOUR;
|
|
||||||
dt = g_date_time_copy (datetime);
|
dt = g_date_time_copy (datetime);
|
||||||
ADD_USEC (dt, usec);
|
g_date_time_add_usec (dt, (gint64) hours * USEC_PER_HOUR);
|
||||||
|
|
||||||
return dt;
|
return dt;
|
||||||
}
|
}
|
||||||
@ -866,13 +875,11 @@ g_date_time_add_seconds (const GDateTime *datetime,
|
|||||||
gint seconds)
|
gint seconds)
|
||||||
{
|
{
|
||||||
GDateTime *dt;
|
GDateTime *dt;
|
||||||
gint64 usec;
|
|
||||||
|
|
||||||
g_return_val_if_fail (datetime != NULL, NULL);
|
g_return_val_if_fail (datetime != NULL, NULL);
|
||||||
|
|
||||||
dt = g_date_time_copy (datetime);
|
dt = g_date_time_copy (datetime);
|
||||||
usec = seconds * USEC_PER_SECOND;
|
g_date_time_add_usec (dt, (gint64) seconds * USEC_PER_SECOND);
|
||||||
ADD_USEC (dt, usec);
|
|
||||||
|
|
||||||
return dt;
|
return dt;
|
||||||
}
|
}
|
||||||
@ -894,13 +901,11 @@ g_date_time_add_milliseconds (const GDateTime *datetime,
|
|||||||
gint milliseconds)
|
gint milliseconds)
|
||||||
{
|
{
|
||||||
GDateTime *dt;
|
GDateTime *dt;
|
||||||
guint64 usec;
|
|
||||||
|
|
||||||
g_return_val_if_fail (datetime != NULL, NULL);
|
g_return_val_if_fail (datetime != NULL, NULL);
|
||||||
|
|
||||||
dt = g_date_time_copy (datetime);
|
dt = g_date_time_copy (datetime);
|
||||||
usec = milliseconds * USEC_PER_MILLISECOND;
|
g_date_time_add_usec (dt, (gint64) milliseconds * USEC_PER_MILLISECOND);
|
||||||
ADD_USEC (dt, usec);
|
|
||||||
|
|
||||||
return dt;
|
return dt;
|
||||||
}
|
}
|
||||||
@ -926,7 +931,7 @@ g_date_time_add_minutes (const GDateTime *datetime,
|
|||||||
g_return_val_if_fail (datetime != NULL, NULL);
|
g_return_val_if_fail (datetime != NULL, NULL);
|
||||||
|
|
||||||
dt = g_date_time_copy (datetime);
|
dt = g_date_time_copy (datetime);
|
||||||
ADD_USEC (dt, minutes * USEC_PER_MINUTE);
|
g_date_time_add_usec (dt, (gint64) minutes * USEC_PER_MINUTE);
|
||||||
|
|
||||||
return dt;
|
return dt;
|
||||||
}
|
}
|
||||||
@ -2066,23 +2071,17 @@ GDateTime *
|
|||||||
g_date_time_to_local (const GDateTime *datetime)
|
g_date_time_to_local (const GDateTime *datetime)
|
||||||
{
|
{
|
||||||
GDateTime *dt;
|
GDateTime *dt;
|
||||||
gint offset,
|
|
||||||
year;
|
|
||||||
gint64 usec;
|
|
||||||
|
|
||||||
g_return_val_if_fail (datetime != NULL, NULL);
|
g_return_val_if_fail (datetime != NULL, NULL);
|
||||||
|
|
||||||
dt = g_date_time_copy (datetime);
|
dt = g_date_time_copy (datetime);
|
||||||
|
if (dt->tz == NULL)
|
||||||
if (!dt->tz)
|
|
||||||
{
|
{
|
||||||
year = g_date_time_get_year (dt);
|
|
||||||
dt->tz = g_date_time_create_time_zone (dt, NULL);
|
dt->tz = g_date_time_create_time_zone (dt, NULL);
|
||||||
|
if (dt->tz == NULL)
|
||||||
|
return dt;
|
||||||
|
|
||||||
offset = dt->tz->offset;
|
g_date_time_add_usec (dt, dt->tz->offset * USEC_PER_SECOND);
|
||||||
|
|
||||||
usec = offset * USEC_PER_SECOND;
|
|
||||||
ADD_USEC (dt, usec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return dt;
|
return dt;
|
||||||
|
Loading…
Reference in New Issue
Block a user