Index: generators/Makefile ================================================================== --- generators/Makefile +++ generators/Makefile @@ -1,10 +1,11 @@ PROG_NOINST = gen_tables${PROG_SUFFIX} -SRCS = gen_tables.m +SRCS = main.o \ + UpperLowerGenerator.m .PHONY: run -run: all UnicodeData.txt +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 \ ln -s ../src/libobjfw.so libobjfw.so.0; \ ln -s ../src/libobjfw.so libobjfw.so.0.1; \ elif test -f ../src/libobjfw.so.0.1; then \ @@ -24,9 +25,12 @@ exit $$EXIT UnicodeData.txt: wget http://unicode.org/Public/UNIDATA/UnicodeData.txt +CaseFolding.txt: + wget http://www.unicode.org/Public/UNIDATA/CaseFolding.txt + include ../buildsys.mk CPPFLAGS += -I../src -I.. LIBS := -L../src -lobjfw ${LIBS} ADDED generators/UpperLowerGenerator.h Index: generators/UpperLowerGenerator.h ================================================================== --- generators/UpperLowerGenerator.h +++ generators/UpperLowerGenerator.h @@ -0,0 +1,29 @@ +/* + * 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 UpperLowerGenerator: OFObject +{ + of_unichar_t upper[0x110000]; + of_unichar_t lower[0x110000]; +} + +- (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; +@end ADDED generators/UpperLowerGenerator.m Index: generators/UpperLowerGenerator.m ================================================================== --- generators/UpperLowerGenerator.m +++ generators/UpperLowerGenerator.m @@ -0,0 +1,178 @@ +/* + * 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 "UpperLowerGenerator.h" +#import "copyright.h" + +@implementation UpperLowerGenerator +- (void)fillTablesFromFile: (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; + + splitted = [line splitWithDelimiter: @";"]; + if ([splitted count] != 15) { + fprintf(stderr, "Invalid line: %s\n", [line cString]); + exit(1); + } + splitted_carray = [splitted cArray]; + + codep = [splitted_carray[0] hexadecimalValueAsInteger]; + upper[codep] = [splitted_carray[12] hexadecimalValueAsInteger]; + lower[codep] = [splitted_carray[13] hexadecimalValueAsInteger]; + + [pool2 releaseObjects]; + } + + [pool release]; +} + +- (size_t)writeTable: (of_unichar_t*)table + withName: (OFString*)name + toFile: (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_%s_table[0x%X] = {\n\t", + [name cString], 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"]; + + [pool release]; + return last_used; +} + +- (size_t)writeUpperTableToFile: (OFString*)file +{ + return [self writeTable: upper + withName: @"upper" + toFile: file]; +} + +- (size_t)writeLowerTableToFile: (OFString*)file +{ + return [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"]; + + [f writeString: COPYRIGHT + @"#import \"OFString.h\"\n\n"]; + + [f writeString: [OFString stringWithFormat: + @"#define OF_UNICODE_UPPER_TABLE_SIZE 0x%X\n" + @"#define OF_UNICODE_LOWER_TABLE_SIZE 0x%X\n\n", + upper_size, lower_size]]; + + [f writeString: + @"extern const of_unichar_t* const\n" + @" of_unicode_upper_table[OF_UNICODE_UPPER_TABLE_SIZE];\n" + @"extern const of_unichar_t* const\n" + @" of_unicode_lower_table[OF_UNICODE_LOWER_TABLE_SIZE];\n"]; + + [pool release]; +} +@end ADDED generators/copyright.h Index: generators/copyright.h ================================================================== --- generators/copyright.h +++ generators/copyright.h @@ -0,0 +1,27 @@ +/* + * 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" + +#define COPYRIGHT \ + @"/*\n" \ + @" * Copyright (c) 2008 - 2009\n" \ + @" * Jonathan Schleifer \n" \ + @" *\n" \ + @" * All rights reserved.\n" \ + @" *\n" \ + @" * This file is part of libobjfw. It may be distributed under the " \ + @"terms of the\n" \ + @" * Q Public License 1.0, which can be found in the file LICENSE " \ + @"included in\n" \ + @" * the packaging of this file.\n" \ + @" */\n" \ + @"\n" DELETED generators/gen_tables.m Index: generators/gen_tables.m ================================================================== --- generators/gen_tables.m +++ generators/gen_tables.m @@ -1,227 +0,0 @@ -/* - * 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 "OFString.h" -#import "OFFile.h" -#import "OFAutoreleasePool.h" - -#define COPYRIGHT \ - @"/*\n" \ - @" * Copyright (c) 2008 - 2009\n" \ - @" * Jonathan Schleifer \n" \ - @" *\n" \ - @" * All rights reserved.\n" \ - @" *\n" \ - @" * This file is part of libobjfw. It may be distributed under the " \ - @"terms of the\n" \ - @" * Q Public License 1.0, which can be found in the file LICENSE " \ - @"included in\n" \ - @" * the packaging of this file.\n" \ - @" */\n" \ - @"\n" - -@interface TableGenerator: OFObject -{ - of_unichar_t upper[0x110000]; - of_unichar_t lower[0x110000]; -} - -- (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; -@end - -@implementation TableGenerator -- (void)fillTablesFromFile: (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; - - splitted = [line splitWithDelimiter: @";"]; - if ([splitted count] != 15) { - fprintf(stderr, "Invalid line: %s\n", [line cString]); - exit(1); - } - splitted_carray = [splitted cArray]; - - codep = [splitted_carray[0] hexadecimalValueAsInteger]; - upper[codep] = [splitted_carray[12] hexadecimalValueAsInteger]; - lower[codep] = [splitted_carray[13] hexadecimalValueAsInteger]; - - [pool2 releaseObjects]; - } - - [pool release]; -} - -- (size_t)writeTable: (of_unichar_t*)table - withName: (OFString*)name - toFile: (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_%s_table[0x%X] = {\n\t", - [name cString], 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"]; - - [pool release]; - return last_used; -} - -- (size_t)writeUpperTableToFile: (OFString*)file -{ - return [self writeTable: upper - withName: @"upper" - toFile: file]; -} - -- (size_t)writeLowerTableToFile: (OFString*)file -{ - return [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"]; - - [f writeString: COPYRIGHT - @"#import \"OFString.h\"\n\n"]; - - [f writeString: [OFString stringWithFormat: - @"#define OF_UNICODE_UPPER_TABLE_SIZE 0x%X\n" - @"#define OF_UNICODE_LOWER_TABLE_SIZE 0x%X\n\n", - upper_size, lower_size]]; - - [f writeString: - @"extern const of_unichar_t* const\n" - @" of_unicode_upper_table[OF_UNICODE_UPPER_TABLE_SIZE];\n" - @"extern const of_unichar_t* const\n" - @" of_unicode_lower_table[OF_UNICODE_LOWER_TABLE_SIZE];\n"]; - - [pool release]; -} -@end - -int -main() -{ - OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; - TableGenerator *tgen = [[[TableGenerator alloc] init] autorelease]; - size_t upper_size, lower_size; - - [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]; - - [pool release]; - - return 0; -} ADDED generators/main.m Index: generators/main.m ================================================================== --- generators/main.m +++ generators/main.m @@ -0,0 +1,36 @@ +/* + * 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" + +#import "OFAutoreleasePool.h" + +#import "UpperLowerGenerator.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]; + + [pool release]; + + return 0; +}