X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fcutils.c;h=7e76d3b9ea4872b6396d21ec47c23c86b03e8822;hb=ba32c8dfd9efd5a9e595e4575425d39a333057fb;hp=c31e5b5c178e76eb2ad055d6ee3f500b56fff535;hpb=f71869a4db1d20dd93cb6a37ba8ef1249812c864;p=ffmpeg diff --git a/libavformat/cutils.c b/libavformat/cutils.c index c31e5b5c178..7e76d3b9ea4 100644 --- a/libavformat/cutils.c +++ b/libavformat/cutils.c @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "avformat.h" @@ -59,7 +59,7 @@ int stristart(const char *str, const char *val, const char **ptr) p = str; q = val; while (*q != '\0') { - if (toupper(*(const unsigned char *)p) != toupper(*(const unsigned char *)q)) + if (toupper(*(const unsigned char *)p) != toupper(*(const unsigned char *)q)) return 0; p++; q++; @@ -74,7 +74,7 @@ int stristart(const char *str, const char *val, const char **ptr) * 1 then it is clamped to buf_size - 1. * NOTE: this function does what strncpy should have done to be * useful. NEVER use strncpy. - * + * * @param buf destination buffer * @param buf_size size of destination buffer * @param str source string @@ -101,7 +101,7 @@ char *pstrcat(char *buf, int buf_size, const char *s) { int len; len = strlen(buf); - if (len < buf_size) + if (len < buf_size) pstrcpy(buf + len, buf_size - len, s); return buf; } @@ -139,7 +139,7 @@ time_t mktimegm(struct tm *tm) y--; } - t = 86400 * + t = 86400 * (d + (153 * m - 457) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 719469); t += 3600 * tm->tm_hour + 60 * tm->tm_min + tm->tm_sec; @@ -147,6 +147,40 @@ time_t mktimegm(struct tm *tm) return t; } +#define ISLEAP(y) (((y) % 4 == 0) && (((y) % 100) != 0 || ((y) % 400) == 0)) +#define LEAPS_COUNT(y) ((y)/4 - (y)/100 + (y)/400) + +/* this is our own gmtime_r. it differs from its POSIX counterpart in a + couple of places, though. */ +struct tm *brktimegm(time_t secs, struct tm *tm) +{ + int days, y, ny, m; + int md[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + + days = secs / 86400; + secs %= 86400; + tm->tm_hour = secs / 3600; + tm->tm_min = (secs % 3600) / 60; + tm->tm_sec = secs % 60; + + /* oh well, may be someone some day will invent a formula for this stuff */ + y = 1970; /* start "guessing" */ + while (days >= (ISLEAP(y)?366:365)) { + ny = (y + days/366); + days -= (ny - y) * 365 + LEAPS_COUNT(ny - 1) - LEAPS_COUNT(y - 1); + y = ny; + } + md[1] = ISLEAP(y)?29:28; + for (m=0; days >= md[m]; m++) + days -= md[m]; + + tm->tm_year = y; /* unlike gmtime_r we store complete year here */ + tm->tm_mon = m+1; /* unlike gmtime_r tm_mon is from 1 to 12 */ + tm->tm_mday = days+1; + + return tm; +} + /* get a positive number between n_min and n_max, for a maximum length of len_max. Return -1 if error. */ static int date_get_num(const char **pp, @@ -174,7 +208,7 @@ static int date_get_num(const char **pp, } /* small strptime for ffmpeg */ -const char *small_strptime(const char *p, const char *fmt, +const char *small_strptime(const char *p, const char *fmt, struct tm *dt) { int c, val;