Index: src/OFINIFile.m ================================================================== --- src/OFINIFile.m +++ src/OFINIFile.m @@ -37,21 +37,13 @@ isWhitespaceLine(OFString *line) { const char *cString = [line UTF8String]; size_t length = [line UTF8StringLength]; - for (size_t i = 0; i < length; i++) { - switch (cString[i]) { - case ' ': - case '\t': - case '\n': - case '\r': - continue; - default: + for (size_t i = 0; i < length; i++) + if (!of_ascii_isspace(cString[i])) return false; - } - } return true; } @implementation OFINIFile Index: src/OFMutableString.m ================================================================== --- src/OFMutableString.m +++ src/OFMutableString.m @@ -263,21 +263,11 @@ if (c >> 8 < tableSize && table[c >> 8][c & 0xFF]) [self setCharacter: table[c >> 8][c & 0xFF] atIndex: i]; - switch (c) { - case ' ': - case '\t': - case '\n': - case '\r': - isStart = true; - break; - default: - isStart = false; - break; - } + isStart = of_ascii_isspace(c); } objc_autoreleasePoolPop(pool); } #else @@ -296,21 +286,11 @@ if (c <= 0x7F) [self setCharacter: (int)function(c) atIndex: i]; - switch (c) { - case ' ': - case '\t': - case '\n': - case '\r': - isStart = true; - break; - default: - isStart = false; - break; - } + isStart = of_ascii_isspace(c); } objc_autoreleasePoolPop(pool); } #endif @@ -568,12 +548,11 @@ size_t i, length = [self length]; for (i = 0; i < length; i++) { of_unichar_t c = characters[i]; - if (c != ' ' && c != '\t' && c != '\n' && c != '\r' && - c != '\f') + if (!of_ascii_isspace(c)) break; } objc_autoreleasePoolPop(pool); @@ -594,12 +573,11 @@ pool = objc_autoreleasePoolPush(); characters = [self characters]; d = 0; for (p = characters + length - 1; p >= characters; p--) { - if (*p != ' ' && *p != '\t' && *p != '\n' && *p != '\r' && - *p != '\f') + if (!of_ascii_isspace(*p)) break; d++; } Index: src/OFMutableString_UTF8.m ================================================================== --- src/OFMutableString_UTF8.m +++ src/OFMutableString_UTF8.m @@ -77,21 +77,11 @@ if (isStart) table = startTable; else table = middleTable; - switch (_s->cString[i]) { - case ' ': - case '\t': - case '\n': - case '\r': - isStart = true; - break; - default: - isStart = false; - break; - } + isStart = of_ascii_isspace(_s->cString[i]); if ((t = table[0][(uint8_t)_s->cString[i]]) != 0) _s->cString[i] = t; } @@ -125,21 +115,11 @@ if (cLen <= 0 || c > 0x10FFFF) { [self freeMemory: unicodeString]; @throw [OFInvalidEncodingException exception]; } - switch (c) { - case ' ': - case '\t': - case '\n': - case '\r': - isStart = true; - break; - default: - isStart = false; - break; - } + isStart = of_ascii_isspace(c); if (c >> 8 < tableSize) { of_unichar_t tc = table[c >> 8][c & 0xFF]; if (tc) @@ -746,13 +726,11 @@ - (void)deleteLeadingWhitespaces { size_t i; for (i = 0; i < _s->cStringLength; i++) - if (_s->cString[i] != ' ' && _s->cString[i] != '\t' && - _s->cString[i] != '\n' && _s->cString[i] != '\r' && - _s->cString[i] != '\f') + if (!of_ascii_isspace(_s->cString[i])) break; _s->hashed = false; _s->cStringLength -= i; _s->length -= i; @@ -775,12 +753,11 @@ _s->hashed = false; d = 0; for (p = _s->cString + _s->cStringLength - 1; p >= _s->cString; p--) { - if (*p != ' ' && *p != '\t' && *p != '\n' && *p != '\r' && - *p != '\f') + if (!of_ascii_isspace(*p)) break; *p = '\0'; d++; } @@ -803,12 +780,11 @@ _s->hashed = false; d = 0; for (p = _s->cString + _s->cStringLength - 1; p >= _s->cString; p--) { - if (*p != ' ' && *p != '\t' && *p != '\n' && *p != '\r' && - *p != '\f') + if (!of_ascii_isspace(*p)) break; *p = '\0'; d++; } @@ -815,13 +791,11 @@ _s->cStringLength -= d; _s->length -= d; for (i = 0; i < _s->cStringLength; i++) - if (_s->cString[i] != ' ' && _s->cString[i] != '\t' && - _s->cString[i] != '\n' && _s->cString[i] != '\r' && - _s->cString[i] != '\f') + if (!of_ascii_isspace(_s->cString[i])) break; _s->cStringLength -= i; _s->length -= i; Index: src/OFString.m ================================================================== --- src/OFString.m +++ src/OFString.m @@ -2350,13 +2350,11 @@ const of_unichar_t *characters = [self characters]; size_t i = 0, length = [self length]; intmax_t value = 0; bool expectWhitespace = false; - while (length > 0 && (*characters == ' ' || *characters == '\t' || - *characters == '\n' || *characters == '\r' || - *characters == '\f')) { + while (length > 0 && of_ascii_isspace(*characters)) { characters++; length--; } if (length == 0) { @@ -2367,26 +2365,23 @@ if (characters[0] == '-' || characters[0] == '+') i++; for (; i < length; i++) { if (expectWhitespace) { - if (characters[i] != ' ' && characters[i] != '\t' && - characters[i] != '\n' && characters[i] != '\r' && - characters[i] != '\f') - @throw [OFInvalidFormatException exception]; - continue; + if (of_ascii_isspace(characters[i])) + continue; + + @throw [OFInvalidFormatException exception]; } if (characters[i] >= '0' && characters[i] <= '9') { if (INTMAX_MAX / 10 < value || INTMAX_MAX - value * 10 < characters[i] - '0') @throw [OFOutOfRangeException exception]; value = (value * 10) + (characters[i] - '0'); - } else if (characters[i] == ' ' || characters[i] == '\t' || - characters[i] == '\n' || characters[i] == '\r' || - characters[i] == '\f') + } else if (of_ascii_isspace(characters[i])) expectWhitespace = true; else @throw [OFInvalidFormatException exception]; } @@ -2404,13 +2399,11 @@ const of_unichar_t *characters = [self characters]; size_t i = 0, length = [self length]; uintmax_t value = 0; bool expectWhitespace = false, foundValue = false; - while (length > 0 && (*characters == ' ' || *characters == '\t' || - *characters == '\n' || *characters == '\r' || - *characters == '\f')) { + while (length > 0 && of_ascii_isspace(*characters)) { characters++; length--; } if (length == 0) { @@ -2425,15 +2418,14 @@ for (; i < length; i++) { uintmax_t newValue; if (expectWhitespace) { - if (characters[i] != ' ' && characters[i] != '\t' && - characters[i] != '\n' && characters[i] != '\r' && - characters[i] != '\f') - @throw [OFInvalidFormatException exception]; - continue; + if (of_ascii_isspace(characters[i])) + continue; + + @throw [OFInvalidFormatException exception]; } if (characters[i] >= '0' && characters[i] <= '9') { newValue = (value << 4) | (characters[i] - '0'); foundValue = true; @@ -2441,13 +2433,12 @@ newValue = (value << 4) | (characters[i] - 'A' + 10); foundValue = true; } else if (characters[i] >= 'a' && characters[i] <= 'f') { newValue = (value << 4) | (characters[i] - 'a' + 10); foundValue = true; - } else if (characters[i] == 'h' || characters[i] == ' ' || - characters[i] == '\t' || characters[i] == '\n' || - characters[i] == '\r' || characters[i] == '\f') { + } else if (characters[i] == 'h' || + of_ascii_isspace(characters[i])) { expectWhitespace = true; continue; } else @throw [OFInvalidFormatException exception]; @@ -2471,13 +2462,11 @@ const of_unichar_t *characters = [self characters]; size_t i = 0, length = [self length]; uintmax_t value = 0; bool expectWhitespace = false; - while (length > 0 && (*characters == ' ' || *characters == '\t' || - *characters == '\n' || *characters == '\r' || - *characters == '\f')) { + while (length > 0 && of_ascii_isspace(*characters)) { characters++; length--; } if (length == 0) { @@ -2487,22 +2476,19 @@ for (; i < length; i++) { uintmax_t newValue; if (expectWhitespace) { - if (characters[i] != ' ' && characters[i] != '\t' && - characters[i] != '\n' && characters[i] != '\r' && - characters[i] != '\f') - @throw [OFInvalidFormatException exception]; - continue; + if (of_ascii_isspace(characters[i])) + continue; + + @throw [OFInvalidFormatException exception]; } if (characters[i] >= '0' && characters[i] <= '7') newValue = (value << 3) | (characters[i] - '0'); - else if (characters[i] == ' ' || characters[i] == '\t' || - characters[i] == '\n' || characters[i] == '\r' || - characters[i] == '\f') { + else if (of_ascii_isspace(characters[i])) { expectWhitespace = true; continue; } else @throw [OFInvalidFormatException exception]; @@ -2545,12 +2531,11 @@ withString: decimalPoint] UTF8String]; #endif char *endPointer = NULL; float value; - while (*UTF8String == ' ' || *UTF8String == '\t' || - *UTF8String == '\n' || *UTF8String == '\r' || *UTF8String == '\f') + while (of_ascii_isspace(*UTF8String)) UTF8String++; #ifdef HAVE_STRTOF_L value = strtof_l(UTF8String, &endPointer, cLocale); #else @@ -2558,13 +2543,11 @@ #endif /* Check if there are any invalid chars left */ if (endPointer != NULL) for (; *endPointer != '\0'; endPointer++) - if (*endPointer != ' ' && *endPointer != '\t' && - *endPointer != '\n' && *endPointer != '\r' && - *endPointer != '\f') + if (!of_ascii_isspace(*endPointer)) @throw [OFInvalidFormatException exception]; objc_autoreleasePoolPop(pool); return value; @@ -2598,12 +2581,11 @@ withString: decimalPoint] UTF8String]; #endif char *endPointer = NULL; double value; - while (*UTF8String == ' ' || *UTF8String == '\t' || - *UTF8String == '\n' || *UTF8String == '\r' || *UTF8String == '\f') + while (of_ascii_isspace(*UTF8String)) UTF8String++; #ifdef HAVE_STRTOD_L value = strtod_l(UTF8String, &endPointer, cLocale); #else @@ -2611,13 +2593,11 @@ #endif /* Check if there are any invalid chars left */ if (endPointer != NULL) for (; *endPointer != '\0'; endPointer++) - if (*endPointer != ' ' && *endPointer != '\t' && - *endPointer != '\n' && *endPointer != '\r' && - *endPointer != '\f') + if (!of_ascii_isspace(*endPointer)) @throw [OFInvalidFormatException exception]; objc_autoreleasePoolPop(pool); return value; Index: src/macros.h ================================================================== --- src/macros.h +++ src/macros.h @@ -649,10 +649,17 @@ static OF_INLINE bool of_ascii_isalnum(char c) { return (of_ascii_isalpha(c) || (c >= '0' && c <= '9')); } + +static OF_INLINE bool +of_ascii_isspace(char c) +{ + return (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || + c == '\v'); +} static OF_INLINE char of_ascii_toupper(char c) { return (c >= 'a' && c <= 'z' ? 'A' + (c - 'a') : c); Index: src/of_strptime.m ================================================================== --- src/of_strptime.m +++ src/of_strptime.m @@ -211,17 +211,16 @@ 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') + if (buffer[j++] != '\n') return NULL; - - j++; + break; + case 't': + if (buffer[j++] != '\t') + return NULL; break; } state = SEARCH_CONVERSION_SPECIFIER;