Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4680 right-hear 1
/* cmapdump.c -- parse a CMap file and dump it as a c-struct */
2
 
3
#include 
4
#include 
5
 
6
#include "fitz.h"
7
#include "mupdf.h"
8
 
9
#include "../fitz/base_error.c"
10
#include "../fitz/base_memory.c"
11
#include "../fitz/base_string.c"
12
#include "../fitz/stm_buffer.c"
13
#include "../fitz/stm_open.c"
14
#include "../fitz/stm_read.c"
15
 
16
#include "../pdf/pdf_lex.c"
17
#include "../pdf/pdf_cmap.c"
18
#include "../pdf/pdf_cmap_parse.c"
19
 
20
static void
21
clean(char *p)
22
{
23
	while (*p)
24
	{
25
		if ((*p == '/') || (*p == '.') || (*p == '\\') || (*p == '-'))
26
			*p = '_';
27
		p ++;
28
	}
29
}
30
 
31
int
32
main(int argc, char **argv)
33
{
34
	pdf_cmap *cmap;
35
	fz_error error;
36
	fz_stream *fi;
37
	FILE *fo;
38
	char name[256];
39
	char *realname;
40
	int i, k;
41
 
42
	if (argc < 3)
43
	{
44
		fprintf(stderr, "usage: cmapdump output.c lots of cmap files\n");
45
		return 1;
46
	}
47
 
48
	fo = fopen(argv[1], "wb");
49
	if (!fo)
50
	{
51
		fprintf(stderr, "cmapdump: could not open output file '%s'\n", argv[1]);
52
		return 1;
53
	}
54
 
55
	fprintf(fo, "/* This is an automatically generated file. Do not edit. */\n");
56
 
57
	for (i = 2; i < argc; i++)
58
	{
59
		realname = strrchr(argv[i], '/');
60
		if (!realname)
61
			realname = strrchr(argv[i], '\\');
62
		if (realname)
63
			realname ++;
64
		else
65
			realname = argv[i];
66
 
67
		if (strlen(realname) > (sizeof name - 1))
68
		{
69
			fprintf(stderr, "cmapdump: file name too long\n");
70
			return 1;
71
		}
72
 
73
		strcpy(name, realname);
74
		clean(name);
75
 
76
		fi = fz_open_file(argv[i]);
77
		if (!fi)
78
			fz_throw("cmapdump: could not open input file '%s'\n", argv[i]);
79
 
80
		error = pdf_parse_cmap(&cmap, fi);
81
		if (error)
82
		{
83
			fz_catch(error, "cmapdump: could not parse input cmap '%s'\n", argv[i]);
84
			return 1;
85
		}
86
 
87
		fprintf(fo, "\n/* %s */\n\n", cmap->cmap_name);
88
 
89
		fprintf(fo, "static const pdf_range cmap_%s_ranges[] = {", name);
90
		if (cmap->rlen == 0)
91
		{
92
			fprintf(fo, " {0,%d,0}", PDF_CMAP_RANGE);
93
		}
94
		for (k = 0; k < cmap->rlen; k++)
95
		{
96
			if (k % 4 == 0)
97
				fprintf(fo, "\n");
98
			fprintf(fo, "{%d,%d,%d},",
99
				cmap->ranges[k].low, cmap->ranges[k].extent_flags, cmap->ranges[k].offset);
100
		}
101
		fprintf(fo, "\n};\n\n");
102
 
103
		if (cmap->tlen == 0)
104
		{
105
			fprintf(fo, "static const unsigned short cmap_%s_table[] = { 0 };\n\n", name);
106
		}
107
		else
108
		{
109
			fprintf(fo, "static const unsigned short cmap_%s_table[%d] = {",
110
				name, cmap->tlen);
111
			for (k = 0; k < cmap->tlen; k++)
112
			{
113
				if (k % 12 == 0)
114
					fprintf(fo, "\n");
115
				fprintf(fo, "%d,", cmap->table[k]);
116
			}
117
			fprintf(fo, "\n};\n\n");
118
		}
119
 
120
		fprintf(fo, "static pdf_cmap cmap_%s = {\n", name);
121
		fprintf(fo, "\t-1, ");
122
		fprintf(fo, "\"%s\", ", cmap->cmap_name);
123
		fprintf(fo, "\"%s\", 0, ", cmap->usecmap_name);
124
		fprintf(fo, "%d, ", cmap->wmode);
125
		fprintf(fo, "%d,\n\t{ ", cmap->codespace_len);
126
		if (cmap->codespace_len == 0)
127
		{
128
			fprintf(fo, "{0,0,0},");
129
		}
130
		for (k = 0; k < cmap->codespace_len; k++)
131
		{
132
			fprintf(fo, "{%d,%d,%d},",
133
				cmap->codespace[k].n, cmap->codespace[k].low, cmap->codespace[k].high);
134
		}
135
		fprintf(fo, " },\n");
136
 
137
		fprintf(fo, "\t%d, %d, (pdf_range*) cmap_%s_ranges,\n",
138
			cmap->rlen, cmap->rlen, name);
139
 
140
		fprintf(fo, "\t%d, %d, (unsigned short*) cmap_%s_table,\n",
141
			cmap->tlen, cmap->tlen, name);
142
 
143
		fprintf(fo, "};\n");
144
 
145
		printf("\t{\"%s\",&cmap_%s},\n", cmap->cmap_name, name);
146
 
147
		fz_close(fi);
148
	}
149
 
150
	if (fclose(fo))
151
	{
152
		fprintf(stderr, "cmapdump: could not close output file '%s'\n", argv[1]);
153
		return 1;
154
	}
155
 
156
	return 0;
157
}