1edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project/*  $OpenBSD: strptime.c,v 1.11 2005/08/08 08:05:38 espie Exp $ */
2edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project/*  $NetBSD: strptime.c,v 1.12 1998/01/20 21:39:40 mycroft Exp $    */
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*-
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved.
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This code was contributed to The NetBSD Foundation by Klaus Klein.
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met:
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    documentation and/or other materials provided with the distribution.
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 3. All advertising materials mentioning features or use of this software
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    must display the following acknowledgement:
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *        This product includes software developed by the NetBSD
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *        Foundation, Inc. and its contributors.
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 4. Neither the name of The NetBSD Foundation nor the names of its
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    contributors may be used to endorse or promote products derived
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    from this software without specific prior written permission.
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * POSSIBILITY OF SUCH DAMAGE.
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project//#include <sys/localedef.h>
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <ctype.h>
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <locale.h>
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <string.h>
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <time.h>
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "tzfile.h"
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const struct {
47edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *abday[7];
48edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *day[7];
49edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *abmon[12];
50edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *mon[12];
51edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *am_pm[2];
52edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *d_t_fmt;
53edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *d_fmt;
54edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *t_fmt;
55edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *t_fmt_ampm;
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} _DefaultTimeLocale = {
57edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    {
58edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Sun","Mon","Tue","Wed","Thu","Fri","Sat",
59edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    },
60edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    {
61edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
62edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Friday", "Saturday"
63edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    },
64edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    {
65edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
66edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
67edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    },
68edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    {
69edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "January", "February", "March", "April", "May", "June", "July",
70edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "August", "September", "October", "November", "December"
71edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    },
72edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    {
73edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "AM", "PM"
74edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    },
75edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "%a %b %d %H:%M:%S %Y",
76edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "%m/%d/%y",
77edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "%H:%M:%S",
78edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "%I:%M:%S %p"
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project};
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
81edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define _ctloc(x) (_DefaultTimeLocale.x)
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * We do not implement alternate representations. However, we always
851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * check whether a given modifier is allowed for a certain conversion.
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
87edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define _ALT_E          0x01
88edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define _ALT_O          0x02
89edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define _LEGAL_ALT(x)       { if (alt_format & ~(x)) return (0); }
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
92b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kastenstruct century_relyear {
93b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten    int century;
94b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten    int relyear;
95b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten};
96edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic  int _conv_num(const unsigned char **, int *, int, int);
97b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kastenstatic  unsigned char *_strptime(const unsigned char *, const char *, struct tm *,
98b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten        struct century_relyear *);
991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar *
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstrptime(const char *buf, const char *fmt, struct tm *tm)
1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
104b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten    struct century_relyear cr;
105b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten    cr.century = TM_YEAR_BASE;
106b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten    cr.relyear = -1;
107b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten    return (char*)(_strptime((const unsigned char*)buf, fmt, tm, &cr));
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
110edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic unsigned char *
111b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten_strptime(const unsigned char *buf, const char *fmt, struct tm *tm, struct century_relyear *cr)
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
113edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    unsigned char c;
114edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const unsigned char *bp;
115edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    size_t len = 0;
116edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    int alt_format, i;
117edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
118edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    bp = (unsigned char *)buf;
119edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    while ((c = *fmt) != '\0') {
120edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        /* Clear `alternate' modifier prior to new conversion. */
121edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        alt_format = 0;
122edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
123edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        /* Eat up white-space. */
124edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        if (isspace(c)) {
125edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            while (isspace(*bp))
126edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                bp++;
127edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
128edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            fmt++;
129edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            continue;
130edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        }
131edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
132edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        if ((c = *fmt++) != '%')
133edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            goto literal;
134edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
135edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
136edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectagain:      switch (c = *fmt++) {
137edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case '%':   /* "%%" is converted to "%". */
1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectliteral:
139edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        if (c != *bp++)
140edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            return (NULL);
141edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
142edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        break;
143edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
144edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        /*
145edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project         * "Alternative" modifiers. Just set the appropriate flag
146edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project         * and start over again.
147edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project         */
148edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'E':   /* "%E?" alternative conversion modifier. */
149edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(0);
150edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            alt_format |= _ALT_E;
151edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            goto again;
152edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
153edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'O':   /* "%O?" alternative conversion modifier. */
154edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(0);
155edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            alt_format |= _ALT_O;
156edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            goto again;
157edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
158edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        /*
159edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project         * "Complex" conversion rules, implemented through recursion.
160edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project         */
161edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'c':   /* Date and time, using the locale's format. */
162edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_E);
163b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten            if (!(bp = _strptime(bp, _ctloc(d_t_fmt), tm, cr)))
164edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
165edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
166edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
167edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'D':   /* The date as "%m/%d/%y". */
168edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(0);
169b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten            if (!(bp = _strptime(bp, "%m/%d/%y", tm, cr)))
170edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
171edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
172edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
173edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'R':   /* The time as "%H:%M". */
174edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(0);
175b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten            if (!(bp = _strptime(bp, "%H:%M", tm, cr)))
176edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
177edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
178edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
179edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'r':   /* The time as "%I:%M:%S %p". */
180edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(0);
181b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten            if (!(bp = _strptime(bp, "%I:%M:%S %p", tm, cr)))
182edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
183edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
184edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
185edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'T':   /* The time as "%H:%M:%S". */
186edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(0);
187b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten            if (!(bp = _strptime(bp, "%H:%M:%S", tm, cr)))
188edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
189edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
190edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
191edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'X':   /* The time, using the locale's format. */
192edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_E);
193b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten            if (!(bp = _strptime(bp, _ctloc(t_fmt), tm, cr)))
194edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
195edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
196edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
197edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'x':   /* The date, using the locale's format. */
198edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_E);
199b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten            if (!(bp = _strptime(bp, _ctloc(d_fmt), tm, cr)))
200edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
201edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
202edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
203edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        /*
204edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project         * "Elementary" conversion rules.
205edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project         */
206edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'A':   /* The day of week, using the locale's form. */
207edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'a':
208edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(0);
209edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            for (i = 0; i < 7; i++) {
210edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /* Full name. */
211edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                len = strlen(_ctloc(day[i]));
212edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (strncasecmp(_ctloc(day[i]), (const char*)bp, len) == 0)
213edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    break;
214edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
215edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /* Abbreviated name. */
216edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                len = strlen(_ctloc(abday[i]));
217edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (strncasecmp(_ctloc(abday[i]), (const char*)bp, len) == 0)
218edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    break;
219edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            }
220edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
221edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            /* Nothing matched. */
222edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (i == 7)
223edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
224edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
225edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            tm->tm_wday = i;
226edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            bp += len;
227edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
228edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
229edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'B':   /* The month, using the locale's form. */
230edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'b':
231edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'h':
232edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(0);
233edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            for (i = 0; i < 12; i++) {
234edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /* Full name. */
235edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                len = strlen(_ctloc(mon[i]));
236edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (strncasecmp(_ctloc(mon[i]), (const char*)bp, len) == 0)
237edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    break;
238edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
239edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /* Abbreviated name. */
240edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                len = strlen(_ctloc(abmon[i]));
241edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (strncasecmp(_ctloc(abmon[i]), (const char*)bp, len) == 0)
242edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    break;
243edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            }
244edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
245edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            /* Nothing matched. */
246edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (i == 12)
247edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
248edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
249edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            tm->tm_mon = i;
250edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            bp += len;
251edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
252edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
253edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'C':   /* The century number. */
254edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_E);
255edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (!(_conv_num(&bp, &i, 0, 99)))
256edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
257edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
258b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten            cr->century = i * 100;
259edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
260edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
261edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'd':   /* The day of month. */
262edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'e':
263edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_O);
264edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (!(_conv_num(&bp, &tm->tm_mday, 1, 31)))
265edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
266edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
267edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
268edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'k':   /* The hour (24-hour clock representation). */
269edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(0);
270edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            /* FALLTHROUGH */
271edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'H':
272edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_O);
273edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (!(_conv_num(&bp, &tm->tm_hour, 0, 23)))
274edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
275edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
276edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
277edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'l':   /* The hour (12-hour clock representation). */
278edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(0);
279edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            /* FALLTHROUGH */
280edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'I':
281edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_O);
282edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (!(_conv_num(&bp, &tm->tm_hour, 1, 12)))
283edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
284edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
285edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
286edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'j':   /* The day of year. */
287edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(0);
288edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (!(_conv_num(&bp, &tm->tm_yday, 1, 366)))
289edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
290edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            tm->tm_yday--;
291edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
292edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
293edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'M':   /* The minute. */
294edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_O);
295edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (!(_conv_num(&bp, &tm->tm_min, 0, 59)))
296edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
297edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
298edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
299edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'm':   /* The month. */
300edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_O);
301edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (!(_conv_num(&bp, &tm->tm_mon, 1, 12)))
302edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
303edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            tm->tm_mon--;
304edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
305edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
306edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'p':   /* The locale's equivalent of AM/PM. */
307edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(0);
308edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            /* AM? */
309edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            len = strlen(_ctloc(am_pm[0]));
310edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (strncasecmp(_ctloc(am_pm[0]), (const char*)bp, len) == 0) {
311edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (tm->tm_hour > 12)   /* i.e., 13:00 AM ?! */
312edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    return (NULL);
313edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                else if (tm->tm_hour == 12)
314edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    tm->tm_hour = 0;
315edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
316edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                bp += len;
317edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                break;
318edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            }
319edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            /* PM? */
320edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            len = strlen(_ctloc(am_pm[1]));
321edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (strncasecmp(_ctloc(am_pm[1]), (const char*)bp, len) == 0) {
322edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (tm->tm_hour > 12)   /* i.e., 13:00 PM ?! */
323edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    return (NULL);
324edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                else if (tm->tm_hour < 12)
325edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    tm->tm_hour += 12;
326edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
327edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                bp += len;
328edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                break;
329edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            }
330edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
331edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            /* Nothing matched. */
332edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            return (NULL);
333edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
334edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'S':   /* The seconds. */
335edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_O);
336edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (!(_conv_num(&bp, &tm->tm_sec, 0, 61)))
337edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
338edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
339edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
340edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'U':   /* The week of year, beginning on sunday. */
341edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'W':   /* The week of year, beginning on monday. */
342edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_O);
343edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            /*
344edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project             * XXX This is bogus, as we can not assume any valid
345edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project             * information present in the tm structure at this
346edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project             * point to calculate a real value, so just check the
347edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project             * range for now.
348edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project             */
349edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project             if (!(_conv_num(&bp, &i, 0, 53)))
350edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
351edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project             break;
352edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
353edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'w':   /* The day of week, beginning on sunday. */
354edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_O);
355edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (!(_conv_num(&bp, &tm->tm_wday, 0, 6)))
356edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
357edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
358edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
359edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'Y':   /* The year. */
360edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_E);
361edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            if (!(_conv_num(&bp, &i, 0, 9999)))
362edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
363edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
364b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten            cr->relyear = -1;
365edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            tm->tm_year = i - TM_YEAR_BASE;
366edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
367edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
368edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'y':   /* The year within the century (2 digits). */
369edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(_ALT_E | _ALT_O);
370b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten            if (!(_conv_num(&bp, &cr->relyear, 0, 99)))
371edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                return (NULL);
372edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
373edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
374edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        /*
375edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project         * Miscellaneous conversions.
376edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project         */
377edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 'n':   /* Any kind of white-space. */
378edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        case 't':
379edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            _LEGAL_ALT(0);
380edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            while (isspace(*bp))
381edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                bp++;
382edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
383edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
384edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
385edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        default:    /* Unknown/unsupported conversion. */
386edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            return (NULL);
387edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        }
388edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
389edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
390edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }
391edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
392edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /*
393edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project     * We need to evaluate the two digit year spec (%y)
394edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project     * last as we can get a century spec (%C) at any time.
395edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project     */
396b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten    if (cr->relyear != -1) {
397b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten        if (cr->century == TM_YEAR_BASE) {
398b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten            if (cr->relyear <= 68)
399b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten                tm->tm_year = cr->relyear + 2000 - TM_YEAR_BASE;
400edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            else
401b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten                tm->tm_year = cr->relyear + 1900 - TM_YEAR_BASE;
402edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        } else {
403b138e4f90ffec34b4cc903cffbe18f9ea2d903d4Glenn Kasten            tm->tm_year = cr->relyear + cr->century - TM_YEAR_BASE;
404edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        }
405edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }
406edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
407edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return (unsigned char*)bp;
4081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
4091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int
4121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project_conv_num(const unsigned char **buf, int *dest, int llim, int ulim)
4131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
414edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    int result = 0;
415edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    int rulim = ulim;
4161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
417edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    if (**buf < '0' || **buf > '9')
418edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        return (0);
4191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
420edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /* we use rulim to break out of the loop when we run out of digits */
421edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    do {
422edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        result *= 10;
423edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        result += *(*buf)++ - '0';
424edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        rulim /= 10;
425edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    } while ((result * 10 <= ulim) && rulim && **buf >= '0' && **buf <= '9');
4261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
427edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    if (result < llim || result > ulim)
428edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        return (0);
4291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
430edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    *dest = result;
431edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return (1);
4321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
433