cYmd
Overview
Types and Definitions
cYmd
struct cYmd { int32_t year; c_Month month; int8_t day; }; typedef struct cYmd cYmd;
A cYmd struct represents a date via a year, month and day value.
Generated
cYmdSlice
struct cYmdSlice { int64_t s; cYmd const* v; }; typedef struct cYmd cYmd;
Via the macros SLICE_DEF_C_ and SLICE_IMPL_C_ declared and implemented struct. The macros declare and implement also the following functions.
/* init */ cYmdSlice ymd_slice_c( int64_t s, cYmd const* v ); cYmdSlice make_ymd_slice_c( cYmd const* beg, cYmd const* end ); cYmdSlice empty_ymd_slice_c( void ); /* sub */ cYmdSlice left_ymd_slice_c( cYmdSlice slice, int64_t maxLen ); cYmdSlice mid_ymd_slice_c( cYmdSlice slice, int64_t index ); cYmdSlice right_ymd_slice_c( cYmdSlice slice, int64_t maxLen ); cYmdSlice sub_ymd_slice_c( cYmdSlice slice, int64_t begIdx, int64_t endIdx );
cVarYmdSlice
struct cVarYmdSlice { int64_t s; cYmd* v; }; typedef struct cVarYmdSlice cVarYmdSlice;
Via the macros SLICE_DEF_C_ and SLICE_IMPL_C_ declared and implemented struct. The macros declare and implement also the following functions.
/* init */ cVarYmdSlice var_ymd_slice_c( int64_t s, cYmd* v ); cVarYmdSlice make_var_ymd_slice_c( cYmd* beg, cYmd* end ); cVarYmdSlice empty_var_ymd_slice_c( void ); /* sub */ cVarYmdSlice left_var_ymd_slice_c( cVarYmdSlice slice, int64_t maxLen ); cVarYmdSlice mid_var_ymd_slice_c( cVarYmdSlice slice, int64_t index ); cVarYmdSlice right_var_ymd_slcie_c( cVarYmdSlice slice, int64_t maxLen ); cVarYmdSlice sub_var_ymd_slice_c( cVarYmdSlice slice, int64_t begIdx, int64_t endIdx ); /* var slice */ cYmdSlice as_ymd_slice_c( cVarYmdSlice slice ); cVarYmdSlice cast_ymd_slice_c( cVarYmdSlice slice, cYmdSlice sub ); int64_t set_ymd_slice_c( cVarYmdSlice dst, cYmdSlice src );
Functions
overall
cmp_ymd_c
int cmp_ymd_c( cYmd a, cYmd b );
Compares two cYmd values and returns the three possible results:
- <0
-
if a is earlier as b
- 0
-
if both dates are equal
- >0
-
if a is later as b
#include "clingo/lang/expect.h" #include "clingo/time/cYmd.h" int main( void ) { init_tap_c_(); cYmd ymd = ymd_c( 2013, c_Apr, 1 ); cYmd bef = ymd_c( 2013, c_Feb, 18 ); cYmd aft = ymd_c( 2013, c_Apr, 2 ); expect_eq_c_( cmp_ymd_c( ymd, ymd ) ); expect_gt_c_( cmp_ymd_c( ymd, bef ) ); expect_lt_c_( cmp_ymd_c( ymd, aft ) ); return finish_tap_c_(); }
ymd_c
cYmd ymd_c( int64_t year, int64_t month, int64_t day );
Initialise a ymd with year, month and day. If the specified date is invalid, the date is not set and ymd_is_valid_c returns false.
ymd_is_valid_c
bool ymd_is_valid_c( cYmd ymd );
Returns true if the specified cYmd value is valid, otherwise false.
#include "clingo/lang/expect.h" #include "clingo/time/cYmd.h" int main( void ) { init_tap_c_(); expect_c_( ymd_is_valid_c( ymd_c( 2018, c_Jul, 8 ) ) ); expect_c_( !ymd_is_valid_c( ymd_c( 1983, c_Dec, 64 ) ) ); return finish_tap_c_(); }
io
The functions read_ymd_c and write_ymd_c are using the following format:
D |
The day as a number without a leading character |
1 to 31 |
_D |
The day as a number with a leading space |
1 to 31 |
DD |
The day as a number with a leading zero |
01 to 31 |
M |
The month as a number without a leading character |
1 to 12 |
_M |
The month as a number with a leading space |
1 to 12 |
MM |
The month as a number with a leading zero |
01 to 12 |
MMM |
The abbreviated localized month name |
Jan' to Dec |
MMMM |
The localized month name |
January to December |
YY |
The year as a two digit number |
00 to 99 |
YYYY |
The year as a four digit number |
like 1878 |
read_ymd_c
#define read_ymd_c_( Sca, Ymd ) \ read_ymd_c( (Sca), (Ymd), "" ) bool read_ymd_c( cScanner sca[static 1], cYmd ymd[static 1], char const fmt[static 1] );
Reads a cYmd value from a text with a scanner. The function will use C_IsoDate( "YYYY-MM-DD" ) as default format.
#include "clingo/io/read.h" #include "clingo/lang/expect.h" #include "clingo/time/cYmd.h" TEMP_SLICE_DEF_C_( test, { char const* inp; char const* fmt; cYmd exp; } ) #define t_( ... ) ((test){__VA_ARGS__}) int main( void ) { init_tap_c_(); testSlice tests = slice_c_( test, t_( "20130401", "YYYYMMDD", ymd_c( 2013, 4, 1 ) ), t_( "5-7-2001", "D-M-YYYY", ymd_c( 2001, 7, 5 ) ) ); for_each_c_( test const*, t, tests ) { cScanner* sca = &cstr_scanner_c_( t->inp ); cYmd ymd = ymd_c( 1970, 1, 1 ); bool res = read_ymd_c( sca, &ymd, t->fmt ); res &= eq_c( cmp_ymd_c( ymd, t->exp ) ); cRecorder* rec = &recorder_c_( 32 ); write_ymd_c_( rec, ymd ); tap_descf_c( res, "%s -> %s", t->fmt, turn_into_cstr_c( rec ) ); } return finish_tap_c_(); }
write_ymd_c
#define write_ymd_c_( Rec, Ymd ) \ write_ymd_c( (Rec), (Ymd), "" ) bool write_ymd_c( cRecorder rec[static 1], cYmd ymd, char const fmt[static 1] );
Writes a cYmd value into the recorder. The function will use C_IsoDate( "YYYY-MM-DD" ) as default format.
#include "clingo/io/write.h" #include "clingo/lang/expect.h" #include "clingo/lang/locale.h" #include "clingo/time/cYmd.h" TEMP_SLICE_DEF_C_( test, { cYmd ymd; char const* fmt; char const* exp; } ) #define t_( ... ) ((test){__VA_ARGS__}) int main( void ) { init_tap_c_(); set_locale_c( LC_TIME, "C" ); // For every system the same output cYmd ymd = ymd_c( 2013, c_Apr, 1 ); testSlice tests = slice_c_( test, t_( ymd, "YYYYMMDD", "20130401" ), t_( ymd, "YY-M-D", "13-4-1" ) ); for_each_c_( test const*, t, tests ) { cRecorder* rec = &recorder_c_( 32 ); bool res = write_ymd_c( rec, t->ymd, t->fmt ); res &= recorded_is_c( rec, t->exp ); tap_descf_c( res, "test: %s -> %s", t->fmt, t->exp ); } return finish_tap_c_(); }