ADDED generators/CaseFoldingGenerator.h Index: generators/CaseFoldingGenerator.h ================================================================== --- generators/CaseFoldingGenerator.h +++ generators/CaseFoldingGenerator.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2008 - 2009 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of libobjfw. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE included in + * the packaging of this file. + */ + +#import "OFString.h" + +@interface CaseFoldingGenerator: OFObject +{ + of_unichar_t table[0x110000]; + size_t size; +} + +- (void)fillTableFromFile: (OFString*)file; +- (void)writeTableToFile: (OFString*)file; +- (void)appendHeaderToFile: (OFString*)file; +@end ADDED generators/CaseFoldingGenerator.m Index: generators/CaseFoldingGenerator.m ================================================================== --- generators/CaseFoldingGenerator.m +++ generators/CaseFoldingGenerator.m @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2008 - 2009 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of libobjfw. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE included in + * the packaging of this file. + */ + +#include "config.h" + +#include +#include +#include + +#import "OFFile.h" +#import "OFAutoreleasePool.h" + +#import "CaseFoldingGenerator.h" +#import "copyright.h" + +@implementation CaseFoldingGenerator +- (void)fillTableFromFile: (OFString*)file; +{ + OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init], *pool2; + OFFile *src = [OFFile fileWithPath: file + mode: @"rb"]; + OFString *line; + + pool2 = [[OFAutoreleasePool alloc] init]; + while ((line = [src readLine])) { + OFArray *splitted; + OFString **splitted_carray; + of_unichar_t codep; + + if ([line characterAtIndex: 0] == '#') + continue; + + splitted = [line splitWithDelimiter: @"; "]; + if ([splitted count] != 4) { + fprintf(stderr, "Invalid line: %s\n", [line cString]); + exit(1); + } + splitted_carray = [splitted cArray]; + + if (![splitted_carray[1] isEqual: @"S"] && + ![splitted_carray[1] isEqual: @"C"]) + continue; + + codep = [splitted_carray[0] hexadecimalValueAsInteger]; + table[codep] = [splitted_carray[2] hexadecimalValueAsInteger]; + + [pool2 releaseObjects]; + } + + [pool release]; +} + +- (void)writeTableToFile: (OFString*)file +{ + OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; + OFAutoreleasePool *pool2; + OFFile *f = [OFFile fileWithPath: file + mode: @"wb"]; + + of_unichar_t i, j; + size_t last_used = SIZE_MAX; + BOOL table_used[0x1100]; + + memset(table_used, NO, 0x1100); + + [f writeString: COPYRIGHT + @"#include \"config.h\"\n" + @"\n" + @"#import \"OFString.h\"\n\n"]; + + [f writeString: @"static const of_unichar_t nop_page[0x100] = {};" + @"\n\n"]; + + for (i = 0; i < 0x110000; i += 0x100) { + BOOL empty; + + empty = YES; + + for (j = i; j < i + 0x100; j++) { + if (table[j] != 0) { + empty = NO; + last_used = i >> 8; + table_used[last_used] = YES; + } + } + + if (!empty) { + pool2 = [[OFAutoreleasePool alloc] init]; + + [f writeString: [OFString stringWithFormat: + @"static const of_unichar_t page_%d[0x100] = " + @"{\n", i >> 8]]; + + for (j = i; j < i + 0x100; j += 4) { + [f writeString: [OFString stringWithFormat: + @"\t0x%06X, 0x%06X, 0x%06X, 0x%06X,\n", + table[j], table[j + 1], table[j + 2], + table[j + 3]]]; + + [pool2 releaseObjects]; + } + + [f writeString: @"};\n\n"]; + + [pool2 release]; + } + } + + last_used++; + + [f writeString: [OFString stringWithFormat: + @"const of_unichar_t* const of_unicode_titlecase_table[0x%X] = " + @"{\n\t", last_used]]; + + pool2 = [[OFAutoreleasePool alloc] init]; + for (i = 0; i < last_used; i++) { + if (table_used[i]) + [f writeString: [OFString stringWithFormat: @"page_%d", + i]]; + else + [f writeString: @"nop_page"]; + + if ((i + 1) % 4 == 0) + [f writeString: @",\n\t"]; + else if (i + 1 < last_used) + [f writeString: @", "]; + + [pool2 releaseObjects]; + } + + [f writeString: @"\n};\n"]; + + size = last_used; + + [pool release]; +} + +- (void)appendHeaderToFile: (OFString*)file +{ + OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; + OFFile *f = [OFFile fileWithPath: file + mode: @"ab"]; + + [f writeString: [OFString stringWithFormat: + @"\n#define OF_UNICODE_CASEFOLDING_TABLE_SIZE 0x%X\n\n", size]]; + + [f writeString: + @"extern const of_unichar_t* const\n" + @" of_unicode_casefolding_table[" + @"OF_UNICODE_CASEFOLDING_TABLE_SIZE];\n"]; + + [pool release]; +} +@end Index: generators/Makefile ================================================================== --- generators/Makefile +++ generators/Makefile @@ -1,8 +1,9 @@ PROG_NOINST = gen_tables${PROG_SUFFIX} SRCS = main.o \ - UpperLowerGenerator.m + UpperLowerGenerator.m \ + CaseFoldingGenerator.m .PHONY: run run: all UnicodeData.txt CaseFolding.txt rm -f libobjfw.so.0 libobjfw.so.0.1 libobjfw.dll libobjfw.dylib if test -f ../src/libobjfw.so; then \ Index: generators/UpperLowerGenerator.h ================================================================== --- generators/UpperLowerGenerator.h +++ generators/UpperLowerGenerator.h @@ -13,17 +13,17 @@ @interface UpperLowerGenerator: OFObject { of_unichar_t upper[0x110000]; of_unichar_t lower[0x110000]; + size_t upper_size; + size_t lower_size; } - (void)fillTablesFromFile: (OFString*)file; - (size_t)writeTable: (of_unichar_t*)table withName: (OFString*)name toFile: (OFString*)file; -- (size_t)writeUpperTableToFile: (OFString*)file; -- (size_t)writeLowerTableToFile: (OFString*)file; -- (void)writeHeaderToFile: (OFString*)file - withUpperTableSize: (size_t)upper_size - lowerTableSize: (size_t)lower_size; +- (void)writeUpperTableToFile: (OFString*)file; +- (void)writeLowerTableToFile: (OFString*)file; +- (void)writeHeaderToFile: (OFString*)file; @end Index: generators/UpperLowerGenerator.m ================================================================== --- generators/UpperLowerGenerator.m +++ generators/UpperLowerGenerator.m @@ -135,27 +135,25 @@ [pool release]; return last_used; } -- (size_t)writeUpperTableToFile: (OFString*)file +- (void)writeUpperTableToFile: (OFString*)file { - return [self writeTable: upper - withName: @"upper" - toFile: file]; + upper_size = [self writeTable: upper + withName: @"upper" + toFile: file]; } -- (size_t)writeLowerTableToFile: (OFString*)file +- (void)writeLowerTableToFile: (OFString*)file { - return [self writeTable: lower - withName: @"lower" - toFile: file]; + lower_size = [self writeTable: lower + withName: @"lower" + toFile: file]; } - (void)writeHeaderToFile: (OFString*)file - withUpperTableSize: (size_t)upper_size - lowerTableSize: (size_t)lower_size { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFFile *f = [OFFile fileWithPath: file mode: @"wb"]; Index: generators/main.m ================================================================== --- generators/main.m +++ generators/main.m @@ -12,25 +12,29 @@ #include "config.h" #import "OFAutoreleasePool.h" #import "UpperLowerGenerator.h" +#import "CaseFoldingGenerator.h" int main() { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; - UpperLowerGenerator *tgen; - size_t upper_size, lower_size; - - tgen = [[[UpperLowerGenerator alloc] init] autorelease]; - [tgen fillTablesFromFile: @"UnicodeData.txt"]; - upper_size = [tgen writeUpperTableToFile: @"../src/unicode_upper.m"]; - lower_size = [tgen writeLowerTableToFile: @"../src/unicode_lower.m"]; - [tgen writeHeaderToFile: @"../src/unicode.h" - withUpperTableSize: upper_size - lowerTableSize: lower_size]; + UpperLowerGenerator *ulgen; + CaseFoldingGenerator *cfgen; + + ulgen = [[[UpperLowerGenerator alloc] init] autorelease]; + [ulgen fillTablesFromFile: @"UnicodeData.txt"]; + [ulgen writeUpperTableToFile: @"../src/unicode_upper.m"]; + [ulgen writeLowerTableToFile: @"../src/unicode_lower.m"]; + [ulgen writeHeaderToFile: @"../src/unicode.h"]; + + cfgen = [[[CaseFoldingGenerator alloc] init] autorelease]; + [cfgen fillTableFromFile: @"CaseFolding.txt"]; + [cfgen writeTableToFile: @"../src/unicode_casefolding.m"]; + [cfgen appendHeaderToFile: @"../src/unicode.h"]; [pool release]; return 0; }