diff --git a/libav/utils.c b/libav/utils.c index 1de22c05f1e4c5b2b34cca8c67be54f92b05d914..a314ec4e2752d7cda78e876202a828fb2140cdeb 100644 --- a/libav/utils.c +++ b/libav/utils.c @@ -880,55 +880,45 @@ INT64 parse_date(const char *datestr, int duration) { const char *p; INT64 t; - int sec; + struct tm dt; + + memset(&dt, 0, sizeof(dt)); p = datestr; if (!duration) { - static const UINT8 months[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - int year, month, day, i; - if (strlen(p) >= 5 && p[4] == '-') { - - year = strtol(p, (char **)&p, 10); + dt.tm_year = strtol(p, (char **)&p, 10); if (*p) p++; - month = strtol(p, (char **)&p, 10) - 1; + dt.tm_mon = strtol(p, (char **)&p, 10) - 1; if (*p) p++; - day = strtol(p, (char **)&p, 10) - 1; + dt.tm_mday = strtol(p, (char **)&p, 10) - 1; if (*p) p++; - day += (year - 1970) * 365; - /* if >= March, take February of current year into account too */ - if (month >= 2) - year++; - for(i=1970;i<year;i++) { - if ((i % 100) == 0) { - if ((i % 400) == 0) day++; - } else if ((i % 4) == 0) { - day++; - } - } - for(i=0;i<month;i++) - day += months[i]; } else { - day = (time(NULL) / (3600 * 24)); + time_t now = time(0); + dt = *localtime(&now); + dt.tm_hour = 0; + dt.tm_min = 0; + dt.tm_sec = 0; } - t = day * (3600 * 24); - } else { - t = 0; } - sec = 0; - for(;;) { - int val; - val = strtol(p, (char **)&p, 10); - sec = sec * 60 + val; - if (*p != ':') - break; + dt.tm_hour = strtol(p, (char **)&p, 10); + if (*p) + p++; + dt.tm_min = strtol(p, (char **)&p, 10); + if (*p) p++; + dt.tm_sec = strtol(p, (char **)&p, 10); + + if (duration) { + t = (INT64) 1000000 * (dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec); + } else { + t = (INT64) 1000000 * mktime(&dt); } - t = (t + sec) * 1000000; + if (*p == '.') { int val, n; p++; @@ -945,7 +935,7 @@ INT64 parse_date(const char *datestr, int duration) return t; } -/* syntax: '?tag1=val1&tag2=val2...'. No URL decoding is done. Return +/* syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. Return 1 if found */ int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info) { @@ -967,8 +957,12 @@ int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info) if (*p == '=') { p++; while (*p != '&' && *p != '\0') { - if ((q - arg) < arg_size - 1) - *q++ = *p; + if ((q - arg) < arg_size - 1) { + if (*p == '+') + *q++ = ' '; + else + *q++ = *p; + } p++; } *q = '\0';