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