Skip to content

Commit 9f29832

Browse files
author
BirdeeHub
committed
fix(opts): fix fail from adding overflow errors
1 parent 2055817 commit 9f29832

File tree

6 files changed

+97
-95
lines changed

6 files changed

+97
-95
lines changed

src/dates.c

Lines changed: 64 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
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
}
1515
static 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) {
344344
static 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
352352
static 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
360360
static 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

367367
static 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

src/dates.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ static TOMLDATE_FIELDS string_2_date_field_idx(const char *str) {
5050
return TOMLDATE_DATE_LENGTH;
5151
}
5252

53-
bool parse_toml_date(str_iter *src, TomlDate *date);
53+
bool parse_toml_date(str_iter *src, TomlDate date);
5454
bool push_new_toml_date(lua_State *L, TomlDate date);
55-
bool buf_push_toml_date(str_buf *buf, TomlDate *date);
55+
bool buf_push_toml_date(str_buf *buf, TomlDate date);
5656
// NOTE: for lua
5757
int lnew_date(lua_State *L);
5858

0 commit comments

Comments
 (0)