99
1010#define DATE_GET (d , field ) ((d)[TOMLDATE_##field])
1111
12- static inline void date_zero (TomlDate * date ) {
12+ static inline void date_zero (TomlDate date ) {
1313 memset (date , 0 , sizeof (TomlDate ));
1414}
1515static inline int digits_in_int (int value ) {
@@ -23,11 +23,11 @@ static inline int digits_in_int(int value) {
2323 return digits ;
2424}
2525
26- bool buf_push_toml_date (str_buf * buf , TomlDate * date ) {
26+ bool buf_push_toml_date (str_buf * buf , TomlDate date ) {
2727 char tmp [64 ];
2828 int n ;
2929
30- int normed_frac = DATE_GET (* date , FRACTIONAL );
30+ int normed_frac = DATE_GET (date , FRACTIONAL );
3131 {
3232 int digits = digits_in_int (normed_frac );
3333 while (digits < 6 ) {
@@ -36,20 +36,20 @@ bool buf_push_toml_date(str_buf *buf, TomlDate *date) {
3636 }
3737 }
3838
39- switch (( * date )[ TOMLDATE_TOML_TYPE ] ) {
39+ switch (DATE_GET ( date , TOML_TYPE ) ) {
4040 case TOML_LOCAL_DATE :
4141 n = snprintf (tmp , sizeof (tmp ), "%04d-%02d-%02d" ,
42- DATE_GET (* date , YEAR ), DATE_GET (* date , MONTH ), DATE_GET (* date , DAY ));
42+ DATE_GET (date , YEAR ), DATE_GET (date , MONTH ), DATE_GET (date , DAY ));
4343 if (n < 0 || (size_t )n >= sizeof (tmp )) return false;
4444 return buf_push_str (buf , tmp , (size_t )n );
4545
4646 case TOML_LOCAL_TIME :
4747 n = snprintf (tmp , sizeof (tmp ), "%02d:%02d:%02d" ,
48- DATE_GET (* date , HOUR ), DATE_GET (* date , MINUTE ), DATE_GET (* date , SECOND ));
48+ DATE_GET (date , HOUR ), DATE_GET (date , MINUTE ), DATE_GET (date , SECOND ));
4949 if (n < 0 || (size_t )n >= sizeof (tmp )) return false;
5050 if (!buf_push_str (buf , tmp , (size_t )n )) return false;
5151
52- if (DATE_GET (* date , FRACTIONAL ) > 0 ) {
52+ if (DATE_GET (date , FRACTIONAL ) > 0 ) {
5353 n = snprintf (tmp , sizeof (tmp ), ".%d" , normed_frac );
5454 if (n < 0 || (size_t )n >= sizeof (tmp )) return false;
5555 if (!buf_push_str (buf , tmp , (size_t )n )) return false;
@@ -58,12 +58,12 @@ bool buf_push_toml_date(str_buf *buf, TomlDate *date) {
5858
5959 case TOML_LOCAL_DATETIME :
6060 n = snprintf (tmp , sizeof (tmp ), "%04d-%02d-%02dT%02d:%02d:%02d" ,
61- DATE_GET (* date , YEAR ), DATE_GET (* date , MONTH ), DATE_GET (* date , DAY ),
62- DATE_GET (* date , HOUR ), DATE_GET (* date , MINUTE ), DATE_GET (* date , SECOND ));
61+ DATE_GET (date , YEAR ), DATE_GET (date , MONTH ), DATE_GET (date , DAY ),
62+ DATE_GET (date , HOUR ), DATE_GET (date , MINUTE ), DATE_GET (date , SECOND ));
6363 if (n < 0 || (size_t )n >= sizeof (tmp )) return false;
6464 if (!buf_push_str (buf , tmp , (size_t )n )) return false;
6565
66- if (DATE_GET (* date , FRACTIONAL ) > 0 ) {
66+ if (DATE_GET (date , FRACTIONAL ) > 0 ) {
6767 n = snprintf (tmp , sizeof (tmp ), ".%d" , normed_frac );
6868 if (n < 0 || (size_t )n >= sizeof (tmp )) return false;
6969 if (!buf_push_str (buf , tmp , (size_t )n )) return false;
@@ -72,23 +72,23 @@ bool buf_push_toml_date(str_buf *buf, TomlDate *date) {
7272
7373 case TOML_OFFSET_DATETIME :
7474 n = snprintf (tmp , sizeof (tmp ), "%04d-%02d-%02dT%02d:%02d:%02d" ,
75- DATE_GET (* date , YEAR ), DATE_GET (* date , MONTH ), DATE_GET (* date , DAY ),
76- DATE_GET (* date , HOUR ), DATE_GET (* date , MINUTE ), DATE_GET (* date , SECOND ));
75+ DATE_GET (date , YEAR ), DATE_GET (date , MONTH ), DATE_GET (date , DAY ),
76+ DATE_GET (date , HOUR ), DATE_GET (date , MINUTE ), DATE_GET (date , SECOND ));
7777 if (n < 0 || (size_t )n >= sizeof (tmp )) return false;
7878 if (!buf_push_str (buf , tmp , (size_t )n )) return false;
7979
80- if (DATE_GET (* date , FRACTIONAL ) > 0 ) {
80+ if (DATE_GET (date , FRACTIONAL ) > 0 ) {
8181 n = snprintf (tmp , sizeof (tmp ), ".%d" , normed_frac );
8282 if (n < 0 || (size_t )n >= sizeof (tmp )) return false;
8383 if (!buf_push_str (buf , tmp , (size_t )n )) return false;
8484 }
8585
86- if (DATE_GET (* date , OFFSET_HOUR ) == 0 && DATE_GET (* date , OFFSET_MINUTE ) == 0 ) {
86+ if (DATE_GET (date , OFFSET_HOUR ) == 0 && DATE_GET (date , OFFSET_MINUTE ) == 0 ) {
8787 if (!buf_push (buf , 'Z' )) return false;
8888 } else {
89- char sign = (DATE_GET (* date , OFFSET_HOUR ) < 0 || DATE_GET (* date , OFFSET_MINUTE ) < 0 ) ? '-' : '+' ;
90- int oh = DATE_GET (* date , OFFSET_HOUR ) < 0 ? - DATE_GET (* date , OFFSET_HOUR ) : DATE_GET (* date , OFFSET_HOUR );
91- int om = DATE_GET (* date , OFFSET_MINUTE ) < 0 ? - DATE_GET (* date , OFFSET_MINUTE ) : DATE_GET (* date , OFFSET_MINUTE );
89+ char sign = (DATE_GET (date , OFFSET_HOUR ) < 0 || DATE_GET (date , OFFSET_MINUTE ) < 0 ) ? '-' : '+' ;
90+ int oh = DATE_GET (date , OFFSET_HOUR ) < 0 ? - DATE_GET (date , OFFSET_HOUR ) : DATE_GET (date , OFFSET_HOUR );
91+ int om = DATE_GET (date , OFFSET_MINUTE ) < 0 ? - DATE_GET (date , OFFSET_MINUTE ) : DATE_GET (date , OFFSET_MINUTE );
9292
9393 n = snprintf (tmp , sizeof (tmp ), "%c%02d:%02d" , sign , oh , om );
9494 if (n < 0 || (size_t )n >= sizeof (tmp )) return false;
@@ -122,12 +122,12 @@ static inline bool expect_char(str_iter *iter, char c) {
122122 return r .ok && r .v == c ;
123123}
124124
125- static bool parse_time (str_iter * src , TomlDate * date ) {
126- if (!parse_number (src , 2 , & DATE_GET (* date , HOUR ))) return false;
125+ static bool parse_time (str_iter * src , TomlDate date ) {
126+ if (!parse_number (src , 2 , & DATE_GET (date , HOUR ))) return false;
127127 if (!expect_char (src , ':' )) return false;
128- if (!parse_number (src , 2 , & DATE_GET (* date , MINUTE ))) return false;
128+ if (!parse_number (src , 2 , & DATE_GET (date , MINUTE ))) return false;
129129 if (!expect_char (src , ':' )) return false;
130- if (!parse_number (src , 2 , & DATE_GET (* date , SECOND ))) return false;
130+ if (!parse_number (src , 2 , & DATE_GET (date , SECOND ))) return false;
131131
132132 iter_result dot = iter_peek (src );
133133 if (dot .ok && dot .v == '.' ) {
@@ -143,35 +143,35 @@ static bool parse_time(str_iter *src, TomlDate *date) {
143143 iter_skip (src );
144144 cur = iter_peek (src );
145145 }
146- DATE_GET (* date , FRACTIONAL ) = val ;
146+ DATE_GET (date , FRACTIONAL ) = val ;
147147 }
148148 return true;
149149}
150150
151- bool parse_toml_date (str_iter * src , TomlDate * date ) {
151+ bool parse_toml_date (str_iter * src , TomlDate date ) {
152152 // Reset struct
153153 date_zero (date );
154154
155155 // Parse YYYY-MM-DD
156- if (!parse_number (src , 4 , & DATE_GET (* date , YEAR ))) {
156+ if (!parse_number (src , 4 , & DATE_GET (date , YEAR ))) {
157157 if (!parse_time (src , date )) return false;
158- DATE_GET (* date , TOML_TYPE ) = TOML_LOCAL_TIME ;
158+ DATE_GET (date , TOML_TYPE ) = TOML_LOCAL_TIME ;
159159 return true;
160160 }
161161 if (!expect_char (src , '-' )) return false;
162- if (!parse_number (src , 2 , & DATE_GET (* date , MONTH ))) return false;
162+ if (!parse_number (src , 2 , & DATE_GET (date , MONTH ))) return false;
163163 if (!expect_char (src , '-' )) return false;
164- if (!parse_number (src , 2 , & DATE_GET (* date , DAY ))) return false;
164+ if (!parse_number (src , 2 , & DATE_GET (date , DAY ))) return false;
165165
166166 iter_result sep = iter_peek (src );
167167 if (!sep .ok ) {
168- DATE_GET (* date , TOML_TYPE ) = TOML_LOCAL_DATE ; // just a date, no time
168+ DATE_GET (date , TOML_TYPE ) = TOML_LOCAL_DATE ; // just a date, no time
169169 return true;
170170 }
171171
172172 // Optional 'T' or space separator
173173 if (sep .v != 'T' && sep .v != ' ' ) {
174- DATE_GET (* date , TOML_TYPE ) = TOML_LOCAL_DATE ; // just a date, no time
174+ DATE_GET (date , TOML_TYPE ) = TOML_LOCAL_DATE ; // just a date, no time
175175 return true;
176176 }
177177 iter_skip (src ); // consume separator
@@ -182,10 +182,10 @@ bool parse_toml_date(str_iter *src, TomlDate *date) {
182182 iter_result off = iter_peek (src );
183183 if (off .ok && (off .v == 'Z' || off .v == '+' || off .v == '-' )) {
184184 if (off .v == 'Z' ) {
185- DATE_GET (* date , OFFSET_HOUR ) = 0 ;
186- DATE_GET (* date , OFFSET_MINUTE ) = 0 ;
185+ DATE_GET (date , OFFSET_HOUR ) = 0 ;
186+ DATE_GET (date , OFFSET_MINUTE ) = 0 ;
187187 iter_skip (src );
188- DATE_GET (* date , TOML_TYPE ) = TOML_OFFSET_DATETIME ; // just a date, no time
188+ DATE_GET (date , TOML_TYPE ) = TOML_OFFSET_DATETIME ; // just a date, no time
189189 return true;
190190 } else {
191191 int sign = (off .v == '-' ) ? -1 : 1 ;
@@ -194,14 +194,14 @@ bool parse_toml_date(str_iter *src, TomlDate *date) {
194194 if (!parse_number (src , 2 , & oh )) return false;
195195 if (!expect_char (src , ':' )) return false;
196196 if (!parse_number (src , 2 , & om )) return false;
197- DATE_GET (* date , OFFSET_HOUR ) = sign * oh ;
198- DATE_GET (* date , OFFSET_MINUTE ) = sign * om ;
199- DATE_GET (* date , TOML_TYPE ) = TOML_OFFSET_DATETIME ; // just a date, no time
197+ DATE_GET (date , OFFSET_HOUR ) = sign * oh ;
198+ DATE_GET (date , OFFSET_MINUTE ) = sign * om ;
199+ DATE_GET (date , TOML_TYPE ) = TOML_OFFSET_DATETIME ; // just a date, no time
200200 return true;
201201 }
202202 }
203203
204- DATE_GET (* date , TOML_TYPE ) = TOML_LOCAL_DATETIME ;
204+ DATE_GET (date , TOML_TYPE ) = TOML_LOCAL_DATETIME ;
205205 return true;
206206}
207207
@@ -237,14 +237,14 @@ static uint64_t days_since_year0(int year, int month, int day) {
237237}
238238
239239// Convert TomlDate to a uint64_t "timestamp" in microseconds since 0000-01-01T00:00:00 UTC
240- static uint64_t tomldate_to_utc_timestamp (const TomlDate * d ) {
241- int y = DATE_GET (* d , YEAR );
242- int m = DATE_GET (* d , MONTH );
243- int day = DATE_GET (* d , DAY );
244- int hour = DATE_GET (* d , HOUR ) - DATE_GET (* d , OFFSET_HOUR );
245- int minute = DATE_GET (* d , MINUTE ) - DATE_GET (* d , OFFSET_MINUTE );
246- int second = DATE_GET (* d , SECOND );
247- int frac = DATE_GET (* d , FRACTIONAL );
240+ static uint64_t tomldate_to_utc_timestamp (const TomlDate d ) {
241+ int y = DATE_GET (d , YEAR );
242+ int m = DATE_GET (d , MONTH );
243+ int day = DATE_GET (d , DAY );
244+ int hour = DATE_GET (d , HOUR ) - DATE_GET (d , OFFSET_HOUR );
245+ int minute = DATE_GET (d , MINUTE ) - DATE_GET (d , OFFSET_MINUTE );
246+ int second = DATE_GET (d , SECOND );
247+ int frac = DATE_GET (d , FRACTIONAL );
248248
249249 // Normalize minutes/hours/days
250250 minute += hour * 60 ;
@@ -279,22 +279,22 @@ static uint64_t tomldate_to_utc_timestamp(const TomlDate *d) {
279279 return timestamp ;
280280}
281281
282- static void utc_timestamp_to_tomldate (uint64_t timestamp , TomlDate * date ) {
282+ static void utc_timestamp_to_tomldate (uint64_t timestamp , TomlDate date ) {
283283 // Reset the date
284284 date_zero (date );
285- DATE_GET (* date , TOML_TYPE ) = TOML_LOCAL_DATETIME ;
285+ DATE_GET (date , TOML_TYPE ) = TOML_LOCAL_DATETIME ;
286286
287287 // Split timestamp into seconds and microseconds
288288 uint64_t total_seconds = timestamp / 1000000ULL ;
289289 int microseconds = timestamp % 1000000ULL ;
290- DATE_GET (* date , FRACTIONAL ) = microseconds ;
290+ DATE_GET (date , FRACTIONAL ) = microseconds ;
291291
292292 // Extract hour, minute, second
293- DATE_GET (* date , SECOND ) = total_seconds % 60 ;
293+ DATE_GET (date , SECOND ) = total_seconds % 60 ;
294294 total_seconds /= 60 ;
295- DATE_GET (* date , MINUTE ) = total_seconds % 60 ;
295+ DATE_GET (date , MINUTE ) = total_seconds % 60 ;
296296 total_seconds /= 60 ;
297- DATE_GET (* date , HOUR ) = total_seconds % 24 ;
297+ DATE_GET (date , HOUR ) = total_seconds % 24 ;
298298 uint64_t total_days = total_seconds / 24 ;
299299
300300 // Compute year
@@ -308,7 +308,7 @@ static void utc_timestamp_to_tomldate(uint64_t timestamp, TomlDate *date) {
308308 break ;
309309 }
310310 }
311- DATE_GET (* date , YEAR ) = y ;
311+ DATE_GET (date , YEAR ) = y ;
312312
313313 // Compute month
314314 int m = 1 ;
@@ -321,17 +321,17 @@ static void utc_timestamp_to_tomldate(uint64_t timestamp, TomlDate *date) {
321321 break ;
322322 }
323323 }
324- DATE_GET (* date , MONTH ) = m ;
324+ DATE_GET (date , MONTH ) = m ;
325325
326326 // Remaining days
327- DATE_GET (* date , DAY ) = (int )total_days + 1 ; // days are 1-based
327+ DATE_GET (date , DAY ) = (int )total_days + 1 ; // days are 1-based
328328
329329 // No offset by default
330- DATE_GET (* date , OFFSET_HOUR ) = 0 ;
331- DATE_GET (* date , OFFSET_MINUTE ) = 0 ;
330+ DATE_GET (date , OFFSET_HOUR ) = 0 ;
331+ DATE_GET (date , OFFSET_MINUTE ) = 0 ;
332332}
333333
334- static int compare_dates (const TomlDate * a , const TomlDate * b ) {
334+ static int compare_dates (const TomlDate a , const TomlDate b ) {
335335 uint64_t ts_a = tomldate_to_utc_timestamp (a );
336336 uint64_t ts_b = tomldate_to_utc_timestamp (b );
337337
@@ -344,30 +344,30 @@ static int compare_dates(const TomlDate *a, const TomlDate *b) {
344344static int ldate_eq (lua_State * L ) {
345345 TomlDate * a = (TomlDate * )lua_touserdata (L , 1 );
346346 TomlDate * b = (TomlDate * )lua_touserdata (L , 2 );
347- lua_pushboolean (L , compare_dates (a , b ) == 0 );
347+ lua_pushboolean (L , compare_dates (* a , * b ) == 0 );
348348 return 1 ;
349349}
350350
351351// Less than: return true if a < b
352352static int ldate_lt (lua_State * L ) {
353353 TomlDate * a = (TomlDate * )lua_touserdata (L , 1 );
354354 TomlDate * b = (TomlDate * )lua_touserdata (L , 2 );
355- lua_pushboolean (L , compare_dates (a , b ) < 0 );
355+ lua_pushboolean (L , compare_dates (* a , * b ) < 0 );
356356 return 1 ;
357357}
358358
359359// Less than or equal: return true if a <= b
360360static int ldate_le (lua_State * L ) {
361361 TomlDate * a = (TomlDate * )lua_touserdata (L , 1 );
362362 TomlDate * b = (TomlDate * )lua_touserdata (L , 2 );
363- lua_pushboolean (L , compare_dates (a , b ) <= 0 );
363+ lua_pushboolean (L , compare_dates (* a , * b ) <= 0 );
364364 return 1 ;
365365}
366366
367367static int ldate_tostring (lua_State * L ) {
368368 TomlDate * date = (TomlDate * )lua_touserdata (L , 1 );
369369 str_buf res = {0 };
370- if (!buf_push_toml_date (& res , date )) {
370+ if (!buf_push_toml_date (& res , * date )) {
371371 free_str_buf (& res );
372372 return luaL_error (L , "could not format and store toml date object!" );
373373 }
@@ -541,21 +541,21 @@ static int ldate_call(lua_State *L) {
541541 switch (lua_type (L , 2 )) {
542542 case LUA_TNUMBER : {
543543 // if arg is an integer, set the current TomlDate from the timestamp
544- utc_timestamp_to_tomldate (lua_tonumber (L , 2 ), date );
544+ utc_timestamp_to_tomldate (lua_tonumber (L , 2 ), * date );
545545 lua_settop (L , 1 );
546546 return 1 ;
547547 } break ;
548548 case LUA_TSTRING : {
549549 // if arg is a string, set the current TomlDate from the string
550550 str_iter iter = lua_str_to_iter (L , 2 );
551- if (iter .buf == NULL || !parse_toml_date (& iter , date )) {
551+ if (iter .buf == NULL || !parse_toml_date (& iter , * date )) {
552552 return luaL_error (L , "invalid TOML date string" );
553553 }
554554 lua_settop (L , 1 );
555555 return 1 ;
556556 } break ;
557557 case LUA_TTABLE : {
558- date_zero (date );
558+ date_zero (* date );
559559 DATE_GET (* date , TOML_TYPE ) = TOML_OFFSET_DATETIME ;
560560 lua_pushnil (L );
561561 while (lua_next (L , 2 ) != 0 ) {
@@ -597,7 +597,7 @@ static int ldate_call(lua_State *L) {
597597 }
598598 default : {
599599 // else, return date as an integer utc timestamp
600- uint64_t ts = tomldate_to_utc_timestamp (date );
600+ uint64_t ts = tomldate_to_utc_timestamp (* date );
601601#if LUA_VERSION_NUM >= 503
602602 lua_pushinteger (L , (lua_Integer )ts );
603603#else
0 commit comments