28#define TIME_BUF_SIZE 21
43 memset(&t, 0,
sizeof(
struct tm));
44 if (!icalgmtime_r(&now, &t)) {
48 tt.year = t.tm_year + 1900;
49 tt.month = t.tm_mon + 1;
76 return (t.
day != -1 && t.
hour != -1);
95 }
else if (year <= 1752) {
96 return (year % 4 == 0);
98 return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
102static const int days_in_month[] =
103 {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
109 if (t.
year > 3000 || t.
day == 0 ||
124 if (t.
year != -1 && t.
day != -1) {
140 days = days_in_month[t.
month];
151#pragma GCC diagnostic push
152#pragma GCC diagnostic ignored "-Wformat-nonliteral"
153static int sprintf_date(
const vcardtimetype t,
unsigned flags,
154 char *buf,
size_t size)
165 return snprintf(buf, size,
"%04d%02d%02d",
169 }
else if (t.
year != -1) {
172 }
else if (t.
day == -1) {
175 fmt =
"%04d%02d%02d";
179 return snprintf(buf, size, fmt, t.
year, t.
month, t.
day);
180 }
else if (t.
month != -1) {
188 return snprintf(buf, size, fmt, t.
month, t.
day);
190 return snprintf(buf, size,
"---%02d", t.
day);
194static int sprintf_time(
const vcardtimetype t,
unsigned flags,
195 char *buf,
size_t size)
206 strncat(buf,
"T", size);
212 n = snprintf(buf, size,
"%02d%02d%02d",
216 }
else if (t.
hour != -1) {
221 }
else if (t.
second == -1) {
226 fmt =
"%02d%02d%02d";
231 }
else if (t.
minute != -1) {
245 return snprintf(buf, size,
"--%02d", t.
second);
254 strncpy(buf,
"Z", size);
257 n += snprintf(buf, size,
"%+03d%02d",
264#pragma GCC diagnostic pop
274 int n = sprintf_date(t, flags, ptr, size);
279 (void)sprintf_time(t, flags, ptr, size);
294#define num_digits(s) strspn(s, "0123456789")
312 }
else if (!strncmp(
str,
"--", 2)) {
319 sscanf(
str,
"---%2u%n", (
unsigned *)&t->
day, &nchar);
325 sscanf(
str,
"--%2u%2u%n",
326 (
unsigned *)&t->
month, (
unsigned *)&t->
day, &nchar);
327 }
else if (ndig == 2) {
328 sscanf(
str,
"--%2u%n", (
unsigned *)&t->
month, &nchar);
335 sscanf(
str,
"%4u%2u%2u%n",
336 (
unsigned *)&t->
year, (
unsigned *)&t->
month,
337 (
unsigned *)&t->
day, &nchar);
338 }
else if (ndig == 4) {
342 sscanf(
str,
"%4u%n", (
unsigned *)&t->
year, &nchar);
343 }
else if (*month ==
'-') {
347 if (month[2] ==
'-') {
348 sscanf(
str,
"%4u-%2u-%2u%n",
349 (
unsigned *)&t->
year, (
unsigned *)&t->
month,
350 (
unsigned *)&t->
day, &nchar);
352 sscanf(
str,
"%4u-%2u%n",
353 (
unsigned *)&t->
year, (
unsigned *)&t->
month,
366 newstr = (
char *)
str + nchar;
376 unsigned offset_h = 0, offset_m = 0;
384 }
else if (*
str ==
'Z') {
386 }
else if (strchr(
"+-", *
str)) {
390 sscanf(
str,
"%1[+-]%2u%2u%n", sign, &offset_h, &offset_m, &nchar);
391 }
else if (ndig == 2) {
392 sscanf(
str,
"%1[+-]%2u%n", sign, &offset_h, &nchar);
401 t->
utcoffset = (int)(60 * offset_h + offset_m);
406 newstr = (
char *)
str + nchar;
425 }
else if (*
str ==
'-') {
430 sscanf(
str,
"--%2u%n", (
unsigned *)&t->
second, &nchar);
436 sscanf(
str,
"-%2u%2u%n",
437 (
unsigned *)&t->
minute, (
unsigned *)&t->
second, &nchar);
438 }
else if (ndig == 2) {
439 sscanf(
str,
"-%2u%n", (
unsigned *)&t->
minute, &nchar);
447 sscanf(
str,
"%2u%2u%2u%n",
449 (
unsigned *)&t->
second, &nchar);
450 }
else if (ndig == 4) {
451 sscanf(
str,
"%2u%2u%n",
452 (
unsigned *)&t->
hour, (
unsigned *)&t->
minute, &nchar);
454 }
else if (ndig == 2) {
456 if (strlen(
str) > 8 &&
str[8] ==
'.') {
457 sscanf(
str,
"%2u:%2u:%2u.%u%n",
459 (
unsigned *)&t->
second, (
unsigned *)&secfrac, &nchar);
461 sscanf(
str,
"%2u:%2u:%2u%n",
463 (
unsigned *)&t->
second, &nchar);
466 sscanf(
str,
"%2u%n", (
unsigned *)&t->
hour, &nchar);
479 str = sscanf_zone(
str, t);
489 if (!is_bare_time &&
str && *
str !=
'T') {
490 str = sscanf_date(
str, &t);
496 str = sscanf_time(
str, &t);
void * icalmemory_new_buffer(size_t size)
Creates new buffer with the specified size.
void icalmemory_add_tmp_buffer(void *buf)
Adds an externally allocated buffer to the ring.
Common memory management routines.
Defines the data structure for representing date-times.
vcardtimetype vcardtime_current_utc_time(void)
bool vcardtime_is_timestamp(const vcardtimetype t)
bool vcardtime_is_date(const vcardtimetype t)
vcardtimetype vcardtime_from_string(const char *str, int is_bare_time)
bool vcardtime_is_valid_time(const struct vcardtimetype t)
bool vcardtime_is_null_datetime(const vcardtimetype t)
const char * vcardtime_as_vcard_string(const vcardtimetype t, unsigned flags)
bool vcardtime_is_time(const vcardtimetype t)
vcardtimetype vcardtime_null_datetime(void)
bool vcardtime_is_datetime(const vcardtimetype t)
char * vcardtime_as_vcard_string_r(const vcardtimetype t, unsigned flags)
bool vcardtime_is_utc(const vcardtimetype t)
bool vcardtime_is_leap_year(const int year)
Defines the data structure representing vCard date-times.
#define VCARDTIME_BARE_TIME