@@ -146,18 +146,17 @@ char delimiter = **pointer; if (++(*pointer) + 1 >= stop) return nil; - if ((buffer = malloc(stop - *pointer)) == NULL) - return nil; + buffer = of_malloc(1, stop - *pointer); while (*pointer < stop) { /* Parse escape codes */ if (**pointer == '\\') { if (++(*pointer) >= stop) { - free(buffer); + of_free(buffer); return nil; } switch (**pointer) { case '"': @@ -192,26 +191,26 @@ of_unichar_t c; size_t l; c1 = parseUnicodeEscape(*pointer - 1, stop); if (c1 == 0xFFFF) { - free(buffer); + of_free(buffer); return nil; } /* Low surrogate */ if ((c1 & 0xFC00) == 0xDC00) { - free(buffer); + of_free(buffer); return nil; } /* Normal character */ if ((c1 & 0xFC00) != 0xD800) { l = of_string_utf8_encode(c1, buffer + i); if (l == 0) { - free(buffer); + of_free(buffer); return nil; } i += l; *pointer += 5; @@ -224,20 +223,20 @@ * surrogate and now need to get the other one * in order to produce UTF-8 and not CESU-8. */ c2 = parseUnicodeEscape(*pointer + 5, stop); if (c2 == 0xFFFF) { - free(buffer); + of_free(buffer); return nil; } c = (((c1 & 0x3FF) << 10) | (c2 & 0x3FF)) + 0x10000; l = of_string_utf8_encode(c, buffer + i); if (l == 0) { - free(buffer); + of_free(buffer); return nil; } i += l; *pointer += 11; @@ -255,11 +254,11 @@ case '\n': (*pointer)++; (*line)++; break; default: - free(buffer); + of_free(buffer); return nil; } /* End of string found */ } else if (**pointer == delimiter) { OFString *ret; @@ -266,39 +265,38 @@ @try { ret = [OFString stringWithUTF8String: buffer length: i]; } @finally { - free(buffer); + of_free(buffer); } (*pointer)++; return ret; /* Newlines in strings are disallowed */ } else if (**pointer == '\n' || **pointer == '\r') { (*line)++; - free(buffer); + of_free(buffer); return nil; } else { buffer[i++] = **pointer; (*pointer)++; } } - free(buffer); + of_free(buffer); return nil; } static inline OFString * parseIdentifier(const char **pointer, const char *stop) { char *buffer; size_t i = 0; - if ((buffer = malloc(stop - *pointer)) == NULL) - return nil; + buffer = of_malloc(1, stop - *pointer); while (*pointer < stop) { if ((**pointer >= 'a' && **pointer <= 'z') || (**pointer >= 'A' && **pointer <= 'Z') || (**pointer >= '0' && **pointer <= '9') || @@ -310,31 +308,31 @@ of_char16_t c1, c2; of_unichar_t c; size_t l; if (++(*pointer) >= stop || **pointer != 'u') { - free(buffer); + of_free(buffer); return nil; } c1 = parseUnicodeEscape(*pointer - 1, stop); if (c1 == 0xFFFF) { - free(buffer); + of_free(buffer); return nil; } /* Low surrogate */ if ((c1 & 0xFC00) == 0xDC00) { - free(buffer); + of_free(buffer); return nil; } /* Normal character */ if ((c1 & 0xFC00) != 0xD800) { l = of_string_utf8_encode(c1, buffer + i); if (l == 0) { - free(buffer); + of_free(buffer); return nil; } i += l; *pointer += 5; @@ -347,37 +345,37 @@ * surrogate and now need to get the other one in order * to produce UTF-8 and not CESU-8. */ c2 = parseUnicodeEscape(*pointer + 5, stop); if (c2 == 0xFFFF) { - free(buffer); + of_free(buffer); return nil; } c = (((c1 & 0x3FF) << 10) | (c2 & 0x3FF)) + 0x10000; l = of_string_utf8_encode(c, buffer + i); if (l == 0) { - free(buffer); + of_free(buffer); return nil; } i += l; *pointer += 11; } else { OFString *ret; if (i == 0 || (buffer[0] >= '0' && buffer[0] <= '9')) { - free(buffer); + of_free(buffer); return nil; } @try { ret = [OFString stringWithUTF8String: buffer length: i]; } @finally { - free(buffer); + of_free(buffer); } return ret; } } @@ -384,10 +382,11 @@ /* * It is never possible to end with an identifier, thus we should never * reach stop. */ + of_free(buffer); return nil; } static inline OFMutableArray * parseArray(const char **pointer, const char *stop, size_t *line,