Revision 40c3fe2c libavformat/cutils.c

View differences:

libavformat/cutils.c
42 42
    *nb_ptr = nb;
43 43
}
44 44

  
45
time_t mktimegm(struct tm *tm)
46
{
47
    time_t t;
48

  
49
    int y = tm->tm_year + 1900, m = tm->tm_mon + 1, d = tm->tm_mday;
50

  
51
    if (m < 3) {
52
        m += 12;
53
        y--;
54
    }
55

  
56
    t = 86400 *
57
        (d + (153 * m - 457) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 719469);
58

  
59
    t += 3600 * tm->tm_hour + 60 * tm->tm_min + tm->tm_sec;
60

  
61
    return t;
62
}
63

  
64 45
#define ISLEAP(y) (((y) % 4 == 0) && (((y) % 100) != 0 || ((y) % 400) == 0))
65 46
#define LEAPS_COUNT(y) ((y)/4 - (y)/100 + (y)/400)
66 47

  
......
95 76

  
96 77
    return tm;
97 78
}
98

  
99
/* get a positive number between n_min and n_max, for a maximum length
100
   of len_max. Return -1 if error. */
101
static int date_get_num(const char **pp,
102
                        int n_min, int n_max, int len_max)
103
{
104
    int i, val, c;
105
    const char *p;
106

  
107
    p = *pp;
108
    val = 0;
109
    for(i = 0; i < len_max; i++) {
110
        c = *p;
111
        if (!isdigit(c))
112
            break;
113
        val = (val * 10) + c - '0';
114
        p++;
115
    }
116
    /* no number read ? */
117
    if (p == *pp)
118
        return -1;
119
    if (val < n_min || val > n_max)
120
        return -1;
121
    *pp = p;
122
    return val;
123
}
124

  
125
/* small strptime for ffmpeg */
126
const char *small_strptime(const char *p, const char *fmt,
127
                           struct tm *dt)
128
{
129
    int c, val;
130

  
131
    for(;;) {
132
        c = *fmt++;
133
        if (c == '\0') {
134
            return p;
135
        } else if (c == '%') {
136
            c = *fmt++;
137
            switch(c) {
138
            case 'H':
139
                val = date_get_num(&p, 0, 23, 2);
140
                if (val == -1)
141
                    return NULL;
142
                dt->tm_hour = val;
143
                break;
144
            case 'M':
145
                val = date_get_num(&p, 0, 59, 2);
146
                if (val == -1)
147
                    return NULL;
148
                dt->tm_min = val;
149
                break;
150
            case 'S':
151
                val = date_get_num(&p, 0, 59, 2);
152
                if (val == -1)
153
                    return NULL;
154
                dt->tm_sec = val;
155
                break;
156
            case 'Y':
157
                val = date_get_num(&p, 0, 9999, 4);
158
                if (val == -1)
159
                    return NULL;
160
                dt->tm_year = val - 1900;
161
                break;
162
            case 'm':
163
                val = date_get_num(&p, 1, 12, 2);
164
                if (val == -1)
165
                    return NULL;
166
                dt->tm_mon = val - 1;
167
                break;
168
            case 'd':
169
                val = date_get_num(&p, 1, 31, 2);
170
                if (val == -1)
171
                    return NULL;
172
                dt->tm_mday = val;
173
                break;
174
            case '%':
175
                goto match;
176
            default:
177
                return NULL;
178
            }
179
        } else {
180
        match:
181
            if (c != *p)
182
                return NULL;
183
            p++;
184
        }
185
    }
186
    return p;
187
}
188

  

Also available in: Unified diff