summaryrefslogtreecommitdiff
path: root/src/xutf8/utils/create_table.c
blob: 5bc7029522b56eb30f2737e58c95a1c0377c92df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <wchar.h>
#include <stdio.h>
char buffer[1000000];

/*** you can try to modifie this value to have better performences **/
#define MAX_DELTA 0x80

int main(int argc, char **argv)
{
	char buf[80];
	int len;
	unsigned int i = 0;
	unsigned char *ptr;
	size_t nb;
	int nbb = 0;
	len = fread(buffer, 1, 1000000, stdin);

	buffer[len] = '\0';
	ptr = (unsigned char *)buffer;
	while (*ptr != '\n') ptr++;
	ptr++;
	while (*ptr != '\n') {
		if (*ptr == ',') nbb++;
		ptr++;
	}
	ptr = (unsigned char *)buffer;
	printf("/* %s */\n", argv[1]);
	while (len > 0) {
		unsigned int ucs = 0;
		char *p = ptr;
		char pp[20];
		nb = 0;
		pp[0] = '\0';
		while (*p != 'U') p++;
		strncat(pp, p, 6);
		*pp = '0';
		*(pp+1) = 'x';
		ucs = (unsigned int)strtoul(pp, NULL, 16);;
		if (ucs < 1) {
			printf("ERROR %d %d\n", len, ucs);
			abort();
		}
		if (i != ucs - 1 || !i) {
			if ((ucs - i) > MAX_DELTA || !i) {
				if (i) {
					printf("};\n");
					fprintf(stderr, "\t/* end: U+%04X */\n",
						i);
				}
				if (strcmp(argv[1], "spacing")) {
					printf("\nstatic const char"
						" unicode_to_%s_%db_%04X[]"
						" = {\n", argv[1], nbb, ucs);
					fprintf(stderr, 
						"unicode_to_%s_%db_%04X[]; ", 
						argv[1], nbb, ucs);
				} else  {
					printf("\nstatic const unsigned short"
						" ucs_table_%04X[]"
						" = {\n", ucs);
					fprintf(stderr, 
						"ucs_table_%04X[]; ", 
						ucs);
				}
			} else {
				while (i < ucs - 1) {
					i++;
					if (nbb == 1) {
						printf("0x00,\n");
					} else {
						printf("0x00, 0x00,\n");
					}
				};
			}
		}
		i = ucs;
		while (*ptr != '\n') {
			printf("%c", *ptr);
			ptr++;
			len--;
		}
		printf("\n");
		ptr++;
		len--;
	}
	printf("};\n");
	fprintf(stderr, "\t/* end: U+%04X */\n", i);
	return 0;
}