@@ -105,10 +105,12 @@ size_t, bool); extern bool of_unicode_to_mac_roman(const of_unichar_t*, unsigned char*, size_t, bool); extern bool of_unicode_to_koi8_r(const of_unichar_t*, unsigned char*, size_t, bool); +extern bool of_unicode_to_koi8_u(const of_unichar_t*, unsigned char*, + size_t, bool); /* References for static linking */ void _references_to_categories_of_OFString(void) { @@ -166,10 +168,12 @@ encoding = OF_STRING_ENCODING_CODEPAGE_858; else if ([string isEqual: @"macintosh"] || [string isEqual: @"mac"]) encoding = OF_STRING_ENCODING_MAC_ROMAN; else if ([string isEqual: @"koi8-r"]) encoding = OF_STRING_ENCODING_KOI8_R; + else if ([string isEqual: @"koi8-u"]) + encoding = OF_STRING_ENCODING_KOI8_U; else @throw [OFInvalidEncodingException exception]; objc_autoreleasePoolPop(pool); @@ -1234,10 +1238,23 @@ cString[length] = '\0'; return length; #endif +#ifdef HAVE_KOI8_U + case OF_STRING_ENCODING_KOI8_U: + if (length + 1 > maxLength) + @throw [OFOutOfRangeException exception]; + + if (!of_unicode_to_koi8_u(characters, + (unsigned char*)cString, length, lossy)) + @throw [OFInvalidEncodingException exception]; + + cString[length] = '\0'; + + return length; +#endif default: @throw [OFNotImplementedException exceptionWithSelector: _cmd object: self]; } } @@ -1297,10 +1314,11 @@ case OF_STRING_ENCODING_CODEPAGE_437: case OF_STRING_ENCODING_CODEPAGE_850: case OF_STRING_ENCODING_CODEPAGE_858: case OF_STRING_ENCODING_MAC_ROMAN: case OF_STRING_ENCODING_KOI8_R: + case OF_STRING_ENCODING_KOI8_U: cString = [object allocMemoryWithSize: length + 1]; [self OF_getCString: cString maxLength: length + 1 encoding: encoding @@ -1367,10 +1385,11 @@ case OF_STRING_ENCODING_CODEPAGE_437: case OF_STRING_ENCODING_CODEPAGE_850: case OF_STRING_ENCODING_CODEPAGE_858: case OF_STRING_ENCODING_MAC_ROMAN: case OF_STRING_ENCODING_KOI8_R: + case OF_STRING_ENCODING_KOI8_U: return [self length]; default: @throw [OFInvalidEncodingException exception]; } }