Branch data Line data Source code
1 : : // Copyright 2019-2026 David Robillard <d@drobilla.net>
2 : : // SPDX-License-Identifier: ISC
3 : :
4 : : #include "date_utils.h"
5 : : #include "number_utils.h"
6 : : #include "read_utils.h"
7 : : #include "result.h"
8 : : #include "timezone.h"
9 : : #include "write_utils.h"
10 : : #include "year.h"
11 : :
12 : : #include <exess/exess.h>
13 : :
14 : : #include <string.h>
15 : :
16 : : EXESS_NONBLOCKING ExessOrder
17 : 68 : exess_compare_date(const ExessDate lhs, const ExessDate rhs)
18 : : {
19 : 68 : const ExessDateTime lhs_datetime = {
20 : 68 : lhs.year, lhs.month, lhs.day, lhs.zone, 0, 0, 0, 0};
21 : :
22 : 68 : const ExessDateTime rhs_datetime = {
23 : 68 : rhs.year, rhs.month, rhs.day, rhs.zone, 0, 0, 0, 0};
24 : :
25 : 68 : return exess_compare_date_time(lhs_datetime, rhs_datetime);
26 : : }
27 : :
28 : : EXESS_NONBLOCKING ExessResult
29 : 127 : exess_read_date(const char* const str, ExessDate* const out)
30 : : {
31 : 127 : memset(out, 0, sizeof(*out));
32 : :
33 : : // Read YYYY-MM-DD numbers
34 : 127 : size_t i = skip_whitespace(str);
35 : 127 : ExessResult r = read_date_numbers(out, str + i);
36 : :
37 : 127 : i += r.count;
38 : :
39 : : // Read timezone if present
40 [ + + ]: 127 : if (!r.status) {
41 : 99 : r = read_optional_timezone(&out->zone, str + i);
42 : 99 : i += r.count;
43 : : }
44 : :
45 : 127 : return RESULT(r.status, i);
46 : : }
47 : :
48 : : EXESS_NONBLOCKING ExessResult
49 : 151 : exess_write_date(const ExessDate value, const size_t buf_size, char* const buf)
50 : : {
51 [ + + + + : 151 : if (value.month < 1 || value.month > 12 || value.day < 1 || value.day > 31) {
+ + + + ]
52 : 4 : return end_write(EXESS_BAD_VALUE, buf_size, buf, 0);
53 : : }
54 : :
55 : 147 : const ExessResult yr = write_year_number(value.year, buf_size, buf);
56 : 147 : size_t o = yr.count;
57 : :
58 : 147 : o += write_char('-', buf_size, buf, o);
59 : 147 : o += write_two_digit_number(value.month, buf_size, buf, o);
60 : 147 : o += write_char('-', buf_size, buf, o);
61 : 147 : o += write_two_digit_number(value.day, buf_size, buf, o);
62 : :
63 : 147 : const ExessResult tr = write_timezone(value.zone, buf_size, buf, o);
64 : 147 : return end_write(
65 [ + + ]: 147 : yr.status ? yr.status : tr.status, buf_size, buf, o + tr.count);
66 : : }
|