Overview
Comment: | Add an implementation of strptime. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
bfdf9135d36c98119d59cef2bd0787b4 |
User & Date: | js on 2011-11-23 00:21:05 |
Other Links: | manifest | tags |
Context
2011-11-23
| ||
00:26 | Make use of \warning in documentation. check-in: a49eec5be4 user: js tags: trunk | |
00:21 | Add an implementation of strptime. check-in: bfdf9135d3 user: js tags: trunk | |
2011-11-21
| ||
16:47 | Implement -[OFString_UTF8 hash] for better performance. check-in: 855de7c3a7 user: js tags: trunk | |
Changes
Modified src/Makefile from [20adf089e6] to [42a0ccaa90].
︙ | ︙ | |||
61 62 63 64 65 66 67 68 69 70 71 72 73 74 | OFXMLElement.m \ OFXMLElement+Serialization.m \ OFXMLElementBuilder.m \ OFXMLNode.m \ OFXMLParser.m \ base64.m \ of_asprintf.m \ unicode.m INCLUDES := ${SRCS:.m=.h} \ OFCollection.h \ OFSerialization.h \ ObjFW.h \ asprintf.h \ | > | 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | OFXMLElement.m \ OFXMLElement+Serialization.m \ OFXMLElementBuilder.m \ OFXMLNode.m \ OFXMLParser.m \ base64.m \ of_asprintf.m \ of_strptime.m \ unicode.m INCLUDES := ${SRCS:.m=.h} \ OFCollection.h \ OFSerialization.h \ ObjFW.h \ asprintf.h \ |
︙ | ︙ |
Modified src/OFDate.h from [39834a73b3] to [b7bf140a82].
︙ | ︙ | |||
56 57 58 59 60 61 62 | * \brief Creates a new OFDate with the specified string in the specified * format. * * The time zone used is UTC. If a time zone is specified anyway, an * OFInvalidFormatException is thrown. See +[dateWithLocalDateString:format:] * if you want to specify a time zone. * | | > > > | > > > | 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | * \brief Creates a new OFDate with the specified string in the specified * format. * * The time zone used is UTC. If a time zone is specified anyway, an * OFInvalidFormatException is thrown. See +[dateWithLocalDateString:format:] * if you want to specify a time zone. * * See the manpage for strftime for information on the format. * * WARNING: The format is currently limited to the following format specifiers: * %d, %e, %H, %m, %M, %S, %y, %Y, %%, %n and %t. * * \param string The string describing the date * \param format The format of the string describing the date * \return A new, autoreleased OFDate with the specified date and time */ + dateWithDateString: (OFString*)string format: (OFString*)format; /** * \brief Creates a new OFDate with the specified string in the specified * format. * * If no time zone is specified, local time is assumed. * * See the manpage for strftime for information on the format. * * WARNING: The format is currently limited to the following format specifiers: * %d, %e, %H, %m, %M, %S, %y, %Y, %%, %n and %t. * * \param string The string describing the date * \param format The format of the string describing the date * \return A new, autoreleased OFDate with the specified date and time */ + dateWithLocalDateString: (OFString*)string format: (OFString*)format; |
︙ | ︙ | |||
124 125 126 127 128 129 130 | * \brief Initializes an already allocated OFDate with the specified string in * the specified format. * * The time zone used is UTC. If a time zone is specified anyway, an * OFInvalidFormatException is thrown. See -[initWithLocalDateString:format:] * if you want to specify a time zone. * | | > > > | > > > | 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | * \brief Initializes an already allocated OFDate with the specified string in * the specified format. * * The time zone used is UTC. If a time zone is specified anyway, an * OFInvalidFormatException is thrown. See -[initWithLocalDateString:format:] * if you want to specify a time zone. * * See the manpage for strftime for information on the format. * * WARNING: The format is currently limited to the following format specifiers: * %d, %e, %H, %m, %M, %S, %y, %Y, %%, %n and %t. * * \param string The string describing the date * \param format The format of the string describing the date * \return An initialized OFDate with the specified date and time */ - initWithDateString: (OFString*)string format: (OFString*)format; /** * \brief Initializes an already allocated OFDate with the specified string in * the specified format. * * If no time zone is specified, local time is assumed. * * See the manpage for strftime for information on the format. * * WARNING: The format is currently limited to the following format specifiers: * %d, %e, %H, %m, %M, %S, %y, %Y, %%, %n and %t. * * \param string The string describing the date * \param format The format of the string describing the date * \return An initialized OFDate with the specified date and time */ - initWithLocalDateString: (OFString*)string format: (OFString*)format; |
︙ | ︙ |
Modified src/OFDate.m from [7dd968f934] to [fb1894f71c].
︙ | ︙ | |||
37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #import "OFInitializationFailedException.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" #import "macros.h" #if (!defined(HAVE_GMTIME_R) || !defined(HAVE_LOCALTIME_R)) && \ defined(OF_THREADS) static OFMutex *mutex; #endif #ifdef HAVE_GMTIME_R | > | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #import "OFInitializationFailedException.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" #import "macros.h" #import "of_strptime.h" #if (!defined(HAVE_GMTIME_R) || !defined(HAVE_LOCALTIME_R)) && \ defined(OF_THREADS) static OFMutex *mutex; #endif #ifdef HAVE_GMTIME_R |
︙ | ︙ | |||
240 241 242 243 244 245 246 | self = [super init]; @try { struct tm tm = {}; tm.tm_isdst = -1; | | | 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 | self = [super init]; @try { struct tm tm = {}; tm.tm_isdst = -1; if (of_strptime([string UTF8String], [format UTF8String], &tm) == NULL) @throw [OFInvalidFormatException exceptionWithClass: isa]; #ifdef STRUCT_TM_HAS_TM_GMTOFF if (tm.tm_gmtoff != 0) @throw [OFInvalidFormatException |
︙ | ︙ | |||
293 294 295 296 297 298 299 | self = [super init]; @try { struct tm tm = {}; tm.tm_isdst = -1; | | | 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 | self = [super init]; @try { struct tm tm = {}; tm.tm_isdst = -1; if (of_strptime([string UTF8String], [format UTF8String], &tm) == NULL) @throw [OFInvalidFormatException exceptionWithClass: isa]; if ((seconds = mktime(&tm)) == -1) @throw [OFInvalidFormatException exceptionWithClass: isa]; |
︙ | ︙ |
Modified src/ObjFW.h from [ec3eaa6f1a] to [9489a60f19].
︙ | ︙ | |||
139 140 141 142 143 144 145 | # import "OFThread.h" # import "threading.h" #endif #import "asprintf.h" #import "base64.h" #import "of_asprintf.h" | > | 139 140 141 142 143 144 145 146 | # import "OFThread.h" # import "threading.h" #endif #import "asprintf.h" #import "base64.h" #import "of_asprintf.h" #import "of_strptime.h" |
Added src/of_strptime.h version [6114c33c82].
> > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /* * Copyright (c) 2008, 2009, 2010, 2011 * Jonathan Schleifer <js@webkeks.org> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include <time.h> #ifdef __cplusplus extern "C" { #endif extern const char* of_strptime(const char*, const char*, struct tm *tm); #ifdef __cplusplus } #endif |
Added src/of_strptime.m version [b3617998c4].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | /* * Copyright (c) 2008, 2009, 2010, 2011 * Jonathan Schleifer <js@webkeks.org> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #include <string.h> #include <time.h> const char* of_strptime(const char *buffer, const char *format, struct tm *tm) { size_t i, j, bufferLength, formatLength; enum { SEARCH_CONVERSION_SPECIFIER, IN_CONVERSION_SPECIFIER } state = SEARCH_CONVERSION_SPECIFIER; bufferLength = strlen(buffer); formatLength = strlen(format); for (i = j = 0; i < formatLength; i++) { if (j >= bufferLength) return NULL; switch (state) { case SEARCH_CONVERSION_SPECIFIER: if (format[i] == '%') state = IN_CONVERSION_SPECIFIER; else if (format[i] != buffer[j++]) return NULL; break; case IN_CONVERSION_SPECIFIER:; int k, maxLength, number = 0; switch (format[i]) { case 'd': case 'e': case 'H': case 'm': case 'M': case 'S': case 'y': maxLength = 2; break; case 'Y': maxLength = 4; break; case '%': case 'n': case 't': maxLength = 0; break; default: return NULL; } if (maxLength > 0 && (buffer[j] < '0' || buffer[j] > '9')) return NULL; for (k = 0; k < maxLength && j < bufferLength && buffer[j] >= '0' && buffer[j] <= '9'; k++, j++) { number *= 10; number += buffer[j] - '0'; } switch (format[i]) { case 'd': case 'e': tm->tm_mday = number; break; case 'H': tm->tm_hour = number; break; case 'm': tm->tm_mon = number - 1; break; case 'M': tm->tm_min = number; break; case 'S': tm->tm_sec = number; break; case 'y': if (number <= 68) number += 100; tm->tm_year = number; break; case 'Y': if (number < 1900) return NULL; tm->tm_year = number - 1900; break; case '%': if (buffer[j++] != '%') return NULL; break; case 'n': case 't': if (buffer[j] != ' ' && buffer[j] != '\r' && buffer[j] != '\n' && buffer[j] != '\t' && buffer[j] != '\f') return NULL; j++; break; } state = SEARCH_CONVERSION_SPECIFIER; break; } } return buffer + j; } |
Modified tests/OFDateTests.m from [ee5c9af1b5] to [b66971e5bb].
︙ | ︙ | |||
29 30 31 32 33 34 35 | { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFDate *d1, *d2; TEST(@"+[dateWithTimeIntervalSince1970:]", (d1 = [OFDate dateWithTimeIntervalSince1970: 0])) | | > > > > > | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFDate *d1, *d2; TEST(@"+[dateWithTimeIntervalSince1970:]", (d1 = [OFDate dateWithTimeIntervalSince1970: 0])) TEST(@"-[dateByAddingTimeInterval:]", (d2 = [d1 dateByAddingTimeInterval: 3600 * 25 + 5.000001])) TEST(@"-[description]", [[d1 description] isEqual: @"1970-01-01T00:00:00Z"] && [[d2 description] isEqual: @"1970-01-02T01:00:05Z"]) TEST(@"+[dateWithDateString:format:]", [[[OFDate dateWithDateString: @"2000-06-20T12:34:56Z" format: @"%Y-%m-%dT%H:%M:%SZ"] description] isEqual: @"2000-06-20T12:34:56Z"]); TEST(@"-[isEqual:]", [d1 isEqual: [OFDate dateWithTimeIntervalSince1970: 0]] && ![d1 isEqual: [OFDate dateWithTimeIntervalSince1970: 0.0000001]]) TEST(@"-[compare:]", [d1 compare: d2] == OF_ORDERED_ASCENDING) TEST(@"-[second]", [d1 second] == 0 && [d2 second] == 5) |
︙ | ︙ |