123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- // {$include <glib/gquark.h>}
- { GDate
- Date calculations (not time for now, to be resolved). These are a
- mutant combination of Steffen Beyer's DateCalc routines
- (http://www.perl.com/CPAN/authors/id/STBEY/) and Jon Trowbridge's
- date routines (written for in-house software). Written by Havoc
- Pennington <[email protected]>
- }
- type
- PGTime = ^TGTime;
- TGTime = gint32;
- PGDateYear = ^TGDateYear;
- TGDateYear = guint16;
- PGDateDay = ^TGDateDay;
- TGDateDay = guint8; // day of the month
- { day of the month }
- { make struct tm known without having to include time.h }
- { from time.h }
- Ptm = ^Ttm;
- Ttm = record
- tm_sec : gint; // Seconds. [0-60] (1 leap second)
- tm_min : gint; // Minutes. [0-59]
- tm_hour : gint; // Hours. [0-23]
- tm_mday : gint; // Day. [1-31]
- tm_mon : gint; // Month. [0-11]
- tm_year : gint; // Year - 1900.
- tm_wday : gint; // Day of week. [0-6]
- tm_yday : gint; // Days in year.[0-365]
- tm_isdst : gint; // DST. [-1/0/1]
- tm_gmtoff: glong; // Seconds east of UTC.
- tm_zone : pgchar; // Timezone abbreviation.
- end;
- { enum used to specify order of appearance in parsed date strings }
- type
- PGDateDMY = ^TGDateDMY;
- TGDateDMY = integer;
- const G_DATE_DAY = 0;
- G_DATE_MONTH = 1;
- G_DATE_YEAR = 2;
- { actual week and month values }
- type
- PGDateWeekday = ^TGDateWeekday;
- TGDateWeekday = integer;
- const G_DATE_BAD_WEEKDAY = 0;
- G_DATE_MONDAY = 1;
- G_DATE_TUESDAY = 2;
- G_DATE_WEDNESDAY = 3;
- G_DATE_THURSDAY = 4;
- G_DATE_FRIDAY = 5;
- G_DATE_SATURDAY = 6;
- G_DATE_SUNDAY = 7;
- type
- PGDateMonth = ^TGDateMonth;
- TGDateMonth = integer;
- const
- G_DATE_BAD_MONTH = 0;
- G_DATE_JANUARY = 1;
- G_DATE_FEBRUARY = 2;
- G_DATE_MARCH = 3;
- G_DATE_APRIL = 4;
- G_DATE_MAY = 5;
- G_DATE_JUNE = 6;
- G_DATE_JULY = 7;
- G_DATE_AUGUST = 8;
- G_DATE_SEPTEMBER = 9;
- G_DATE_OCTOBER = 10;
- G_DATE_NOVEMBER = 11;
- G_DATE_DECEMBER = 12;
- const
- G_DATE_BAD_JULIAN = 0;
- G_DATE_BAD_DAY = 0;
- G_DATE_BAD_YEAR = 0;
- { Note: directly manipulating structs is generally a bad idea, but
- in this case it's an incredibly bad idea, because all or part
- of this struct can be invalid at any given time. Use the functions,
- or you will get hosed, I promise.
- }
- { julian days representation - we use a
- bitfield hoping that 64 bit platforms
- will pack this whole struct in one big
- int
- }
- { julian is valid }
- { dmy is valid }
- { DMY representation }
- type
- PGDate = ^TGDate;
- TGDate = record
- flag0 : longint;
- flag1 : longint;
- end;
- { g_date_new() returns an invalid date, you then have to _set() stuff
- to get a usable anObject. You can also allocate a GDate statically,
- then call g_date_clear() to initialize.
- }
- function g_date_new:PGDate; cdecl;external gliblib name 'g_date_new';
- function g_date_new_dmy(day:TGDateDay; month:TGDateMonth; year:TGDateYear):PGDate;cdecl;external gliblib name 'g_date_new_dmy';
- function g_date_new_julian(julian_day:guint32):PGDate;cdecl;external gliblib name 'g_date_new_julian';
- procedure g_date_free(date:PGDate);cdecl;external gliblib name 'g_date_free';
- { check g_date_valid() after doing an operation that might fail, like
- _parse. Almost all g_date operations are undefined on invalid
- dates (the exceptions are the mutators, since you need those to
- return to validity).
- }
- function g_date_valid (date:PGDate): gboolean;cdecl;external gliblib name 'g_date_valid';
- function g_date_valid_month (month:TGDateMonth):gboolean;cdecl;external gliblib name 'g_date_valid_month';
- function g_date_valid_year (year:TGDateYear): gboolean;cdecl;external gliblib name 'g_date_valid_year';
- function g_date_valid_weekday (weekday:TGDateWeekday): gboolean;cdecl;external gliblib name 'g_date_valid_weekday';
- function g_date_valid_julian (julian_date:guint32): gboolean;cdecl;external gliblib name 'g_date_valid_julian';
- function g_date_get_weekday(date:PGDate):TGDateWeekday;cdecl;external gliblib name 'g_date_get_weekday';
- function g_date_get_month(date:PGDate):TGDateMonth;cdecl;external gliblib name 'g_date_get_month';
- function g_date_get_year(date:PGDate):TGDateYear;cdecl;external gliblib name 'g_date_get_year';
- function g_date_get_day(date:PGDate):TGDateDay;cdecl;external gliblib name 'g_date_get_day';
- function g_date_get_julian(date:PGDate):guint32;cdecl;external gliblib name 'g_date_get_julian';
- function g_date_get_day_of_year(date:PGDate):guint;cdecl;external gliblib name 'g_date_get_day_of_year';
- { First monday/sunday is the start of week 1; if we haven't reached
- that day, return 0. These are not ISO weeks of the year; that
- routine needs to be added.
- these functions return the number of weeks, starting on the
- corrsponding day
- }
- function g_date_get_monday_week_of_year(date:PGDate):guint;cdecl;external gliblib name 'g_date_get_monday_week_of_year';
- function g_date_get_sunday_week_of_year(date:PGDate):guint;cdecl;external gliblib name 'g_date_get_sunday_week_of_year';
- { If you create a static date struct you need to clear it to get it
- in a sane state before use. You can clear a whole array at
- once with the ndates argument.
- }
- procedure g_date_clear(date:PGDate; n_dates:guint);cdecl;external gliblib name 'g_date_clear';
- { The parse routine is meant for dates typed in by a user, so it
- permits many formats but tries to catch common typos. If your data
- needs to be strictly validated, it is not an appropriate function.
- }
- procedure g_date_set_parse(date:PGDate; str:Pgchar);cdecl;external gliblib name 'g_date_set_parse';
- procedure g_date_set_time(date:PGDate; time:TGTime);cdecl;external gliblib name 'g_date_set_time';
- procedure g_date_set_month(date:PGDate; month:TGDateMonth);cdecl;external gliblib name 'g_date_set_month';
- procedure g_date_set_day(date:PGDate; day:TGDateDay);cdecl;external gliblib name 'g_date_set_day';
- procedure g_date_set_year(date:PGDate; year:TGDateYear);cdecl;external gliblib name 'g_date_set_year';
- procedure g_date_set_dmy(date:PGDate; day:TGDateDay; month:TGDateMonth; y:TGDateYear);cdecl;external gliblib name 'g_date_set_dmy';
- procedure g_date_set_julian(date:PGDate; julian_date:guint32);cdecl;external gliblib name 'g_date_set_julian';
- function g_date_is_first_of_month(date:PGDate):gboolean;cdecl;external gliblib name 'g_date_is_first_of_month';
- function g_date_is_last_of_month(date:PGDate):gboolean;cdecl;external gliblib name 'g_date_is_last_of_month';
- { To go forward by some number of weeks just go forward weeks 7 days }
- procedure g_date_add_days(date:PGDate; n_days:guint);cdecl;external gliblib name 'g_date_add_days';
- procedure g_date_subtract_days(date:PGDate; n_days:guint);cdecl;external gliblib name 'g_date_subtract_days';
- { If you add/sub months while day > 28, the day might change }
- procedure g_date_add_months(date:PGDate; n_months:guint);cdecl;external gliblib name 'g_date_add_months';
- procedure g_date_subtract_months(date:PGDate; n_months:guint);cdecl;external gliblib name 'g_date_subtract_months';
- { If it's feb 29, changing years can move you to the 28th }
- procedure g_date_add_years(date:PGDate; n_years:guint);cdecl;external gliblib name 'g_date_add_years';
- procedure g_date_subtract_years(date:PGDate; n_years:guint);cdecl;external gliblib name 'g_date_subtract_years';
- function g_date_is_leap_year (year:TGDateYear): gboolean; cdecl;external gliblib name 'g_date_is_leap_year';
- function g_date_get_days_in_month (month: TGDateMonth; year: TGDateYear):guint8;cdecl;external gliblib name 'g_date_get_days_in_month';
- function g_date_get_monday_weeks_in_year (year:TGDateYear): guint8; cdecl;external gliblib name 'g_date_get_monday_weeks_in_year';
- function g_date_get_sunday_weeks_in_year (year:TGDateYear): guint8; cdecl;external gliblib name 'g_date_get_sunday_weeks_in_year';
- { Returns the number of days between the two dates. If date2 comes
- before date1, a negative value is return. }
- function g_date_days_between(date1:PGDate; date2:PGDate):gint;cdecl;external gliblib name 'g_date_days_between';
- { qsort-friendly (with a cast...) }
- function g_date_compare(lhs:PGDate; rhs:PGDate):gint;cdecl;external gliblib name 'g_date_compare';
- procedure g_date_to_struct_tm(date:PGDate; tm:Ptm);cdecl;external gliblib name 'g_date_to_struct_tm';
- procedure g_date_clamp(date:PGDate; min_date:PGDate; max_date:PGDate);cdecl;external gliblib name 'g_date_clamp';
- { Swap date1 and date2's values if date1 > date2. }
- procedure g_date_order(date1:PGDate; date2:PGDate);cdecl;external gliblib name 'g_date_order';
- { Just like strftime() except you can only use date-related formats.
- Using a time format is undefined.
- }
- function g_date_strftime(s:Pgchar; slen:gsize; format:Pgchar; date:PGDate):gsize;cdecl;external gliblib name 'g_date_strftime';
- { DEPRECATED functions are maped to their newer versions as the arguments and the return value are the same}
- { DEPRECATED functions are disabled because a
- name conflict with G_DATE_MONTH, G_DATE_YEAR and G_DATE_DAY
- function g_date_weekday(date:PGDate):TGDateWeekday;cdecl;external gliblib name 'g_date_get_weekday';
- function g_date_month(date:PGDate):TGDateMonth;cdecl;external gliblib name 'g_date_get_month';
- function g_date_year(date:PGDate):TGDateYear;cdecl;external gliblib name 'g_date_get_year';
- function g_date_day(date:PGDate):TGDateDay;cdecl;external gliblib name 'g_date_get_day';
- function g_date_julian(date:PGDate):guint32;cdecl;external gliblib name 'g_date_get_julian';
- function g_date_day_of_year(date:PGDate):guint;cdecl;external gliblib name 'g_date_get_day_of_year';
- function g_date_monday_week_of_year(date:PGDate):guint;cdecl;external gliblib name 'g_date_get_monday_week_of_year';
- function g_date_sunday_week_of_year(date:PGDate):guint;cdecl;external gliblib name 'g_date_get_sunday_week_of_year';
- function g_date_days_in_month (month: TGDateMonth; year: TGDateYear):guint8;cdecl;external gliblib name 'g_date_get_days_in_month';
- function g_date_monday_weeks_in_year (year:TGDateYear): guint8; cdecl;external gliblib name 'g_date_get_monday_weeks_in_year';
- function g_date_sunday_weeks_in_year (year:TGDateYear): guint8; cdecl;external gliblib name 'g_date_get_sunday_weeks_in_year';
- }
|