timelib_tzinfo *timelib_tzinfo_clone(timelib_tzinfo *tz) { timelib_tzinfo *tmp = timelib_tzinfo_ctor(tz->name); tmp->bit32.ttisgmtcnt = tz->bit32.ttisgmtcnt; tmp->bit32.ttisstdcnt = tz->bit32.ttisstdcnt; tmp->bit32.leapcnt = tz->bit32.leapcnt; tmp->bit32.timecnt = tz->bit32.timecnt; tmp->bit32.typecnt = tz->bit32.typecnt; tmp->bit32.charcnt = tz->bit32.charcnt; tmp->trans = (int32_t *) timelib_malloc(tz->bit32.timecnt * sizeof(int32_t)); tmp->trans_idx = (unsigned char*) timelib_malloc(tz->bit32.timecnt * sizeof(unsigned char)); memcpy(tmp->trans, tz->trans, tz->bit32.timecnt * sizeof(int32_t)); memcpy(tmp->trans_idx, tz->trans_idx, tz->bit32.timecnt * sizeof(unsigned char)); tmp->type = (ttinfo*) timelib_malloc(tz->bit32.typecnt * sizeof(struct ttinfo)); memcpy(tmp->type, tz->type, tz->bit32.typecnt * sizeof(struct ttinfo)); tmp->timezone_abbr = (char*) timelib_malloc(tz->bit32.charcnt); memcpy(tmp->timezone_abbr, tz->timezone_abbr, tz->bit32.charcnt); tmp->leap_times = (tlinfo*) timelib_malloc(tz->bit32.leapcnt * sizeof(tlinfo)); memcpy(tmp->leap_times, tz->leap_times, tz->bit32.leapcnt * sizeof(tlinfo)); return tmp; }
void timelib_strtointerval(char *s, size_t len, timelib_time **begin, timelib_time **end, timelib_rel_time **period, int *recurrences, timelib_error_container **errors) { Scanner in; int t; char *e = s + len - 1; memset(&in, 0, sizeof(in)); in.errors = timelib_malloc(sizeof(timelib_error_container)); in.errors->warning_count = 0; in.errors->warning_messages = NULL; in.errors->error_count = 0; in.errors->error_messages = NULL; if (len > 0) { while (isspace(*s) && s < e) { s++; } while (isspace(*e) && e > s) { e--; } } if (e - s < 0) { add_error(&in, "Empty string"); if (errors) { *errors = in.errors; } else { timelib_error_container_dtor(in.errors); } return; } e++; /* init cursor */ in.str = timelib_malloc((e - s) + YYMAXFILL); memset(in.str, 0, (e - s) + YYMAXFILL); memcpy(in.str, s, (e - s)); in.lim = in.str + (e - s) + YYMAXFILL; in.cur = in.str; /* init value containers */ in.begin = timelib_time_ctor(); in.begin->y = TIMELIB_UNSET; in.begin->d = TIMELIB_UNSET; in.begin->m = TIMELIB_UNSET; in.begin->h = TIMELIB_UNSET; in.begin->i = TIMELIB_UNSET; in.begin->s = TIMELIB_UNSET; in.begin->us = 0; in.begin->z = 0; in.begin->dst = 0; in.begin->is_localtime = 0; in.begin->zone_type = TIMELIB_ZONETYPE_OFFSET; in.end = timelib_time_ctor(); in.end->y = TIMELIB_UNSET; in.end->d = TIMELIB_UNSET; in.end->m = TIMELIB_UNSET; in.end->h = TIMELIB_UNSET; in.end->i = TIMELIB_UNSET; in.end->s = TIMELIB_UNSET; in.end->us = 0; in.end->z = 0; in.end->dst = 0; in.end->is_localtime = 0; in.end->zone_type = TIMELIB_ZONETYPE_OFFSET; in.period = timelib_rel_time_ctor(); in.period->y = 0; in.period->d = 0; in.period->m = 0; in.period->h = 0; in.period->i = 0; in.period->s = 0; in.period->weekday = 0; in.period->weekday_behavior = 0; in.period->first_last_day_of = 0; in.period->days = TIMELIB_UNSET; in.recurrences = 1; do { t = scan(&in); #ifdef DEBUG_PARSER printf("%d\n", t); #endif } while(t != EOI); timelib_free(in.str); if (errors) { *errors = in.errors; } else { timelib_error_container_dtor(in.errors); } if (in.have_begin_date) { *begin = in.begin; } else { timelib_time_dtor(in.begin); } if (in.have_end_date) { *end = in.end; } else { timelib_time_dtor(in.end); } if (in.have_period) { *period = in.period; } else { timelib_rel_time_dtor(in.period); } if (in.have_recurrences) { *recurrences = in.recurrences; } }