1 /*
2 *******************************************************************************
3 *
4 * Copyright (C) 2005-2010, International Business Machines
5 * Corporation and others. All Rights Reserved.
6 *
7 *******************************************************************************
8 * file name: writesrc.c
9 * encoding: US-ASCII
10 * tab size: 8 (not used)
11 * indentation:4
12 *
13 * created on: 2005apr23
14 * created by: Markus W. Scherer
15 *
16 * Helper functions for writing source code for data.
17 */
18
19 #include <stdio.h>
20 #include <time.h>
21 #include "unicode/utypes.h"
22 #include "unicode/putil.h"
23 #include "utrie2.h"
24 #include "cstring.h"
25 #include "writesrc.h"
26
27 static FILE *
usrc_createWithHeader(const char * path,const char * filename,const char * header)28 usrc_createWithHeader(const char *path, const char *filename, const char *header) {
29 char buffer[1024];
30 const char *p;
31 char *q;
32 FILE *f;
33 char c;
34
35 if(path==NULL) {
36 p=filename;
37 } else {
38 /* concatenate path and filename, with U_FILE_SEP_CHAR in between if necessary */
39 uprv_strcpy(buffer, path);
40 q=buffer+uprv_strlen(buffer);
41 if(q>buffer && (c=*(q-1))!=U_FILE_SEP_CHAR && c!=U_FILE_ALT_SEP_CHAR) {
42 *q++=U_FILE_SEP_CHAR;
43 }
44 uprv_strcpy(q, filename);
45 p=buffer;
46 }
47
48 f=fopen(p, "w");
49 if(f!=NULL) {
50 char year[8];
51 const struct tm *lt;
52 time_t t;
53
54 time(&t);
55 lt=localtime(&t);
56 strftime(year, sizeof(year), "%Y", lt);
57 strftime(buffer, sizeof(buffer), "%Y-%m-%d", lt);
58 fprintf(f, header, year, filename, buffer);
59 } else {
60 fprintf(
61 stderr,
62 "usrc_create(%s, %s): unable to create file\n",
63 path!=NULL ? path : "", filename);
64 }
65 return f;
66 }
67
68 U_CAPI FILE * U_EXPORT2
usrc_create(const char * path,const char * filename)69 usrc_create(const char *path, const char *filename) {
70 const char *header=
71 "/*\n"
72 " * Copyright (C) 1999-%s, International Business Machines\n"
73 " * Corporation and others. All Rights Reserved.\n"
74 " *\n"
75 " * file name: %s\n"
76 " *\n"
77 " * machine-generated on: %s\n"
78 " */\n\n";
79 return usrc_createWithHeader(path, filename, header);
80 }
81
82 U_CAPI FILE * U_EXPORT2
usrc_createTextData(const char * path,const char * filename)83 usrc_createTextData(const char *path, const char *filename) {
84 const char *header=
85 "# Copyright (C) 1999-%s, International Business Machines\n"
86 "# Corporation and others. All Rights Reserved.\n"
87 "#\n"
88 "# file name: %s\n"
89 "#\n"
90 "# machine-generated on: %s\n"
91 "#\n\n";
92 return usrc_createWithHeader(path, filename, header);
93 }
94
95 U_CAPI void U_EXPORT2
usrc_writeArray(FILE * f,const char * prefix,const void * p,int32_t width,int32_t length,const char * postfix)96 usrc_writeArray(FILE *f,
97 const char *prefix,
98 const void *p, int32_t width, int32_t length,
99 const char *postfix) {
100 const uint8_t *p8;
101 const uint16_t *p16;
102 const uint32_t *p32;
103 uint32_t value;
104 int32_t i, col;
105
106 p8=NULL;
107 p16=NULL;
108 p32=NULL;
109 switch(width) {
110 case 8:
111 p8=(const uint8_t *)p;
112 break;
113 case 16:
114 p16=(const uint16_t *)p;
115 break;
116 case 32:
117 p32=(const uint32_t *)p;
118 break;
119 default:
120 fprintf(stderr, "usrc_writeArray(width=%ld) unrecognized width\n", (long)width);
121 return;
122 }
123 if(prefix!=NULL) {
124 fprintf(f, prefix, (long)length);
125 }
126 for(i=col=0; i<length; ++i, ++col) {
127 if(i>0) {
128 if(col<16) {
129 fputc(',', f);
130 } else {
131 fputs(",\n", f);
132 col=0;
133 }
134 }
135 switch(width) {
136 case 8:
137 value=p8[i];
138 break;
139 case 16:
140 value=p16[i];
141 break;
142 case 32:
143 value=p32[i];
144 break;
145 default:
146 value=0; /* unreachable */
147 break;
148 }
149 fprintf(f, value<=9 ? "%lu" : "0x%lx", (unsigned long)value);
150 }
151 if(postfix!=NULL) {
152 fputs(postfix, f);
153 }
154 }
155
156 U_CAPI void U_EXPORT2
usrc_writeUTrie2Arrays(FILE * f,const char * indexPrefix,const char * data32Prefix,const UTrie2 * pTrie,const char * postfix)157 usrc_writeUTrie2Arrays(FILE *f,
158 const char *indexPrefix, const char *data32Prefix,
159 const UTrie2 *pTrie,
160 const char *postfix) {
161 if(pTrie->data32==NULL) {
162 /* 16-bit trie */
163 usrc_writeArray(f, indexPrefix, pTrie->index, 16, pTrie->indexLength+pTrie->dataLength, postfix);
164 } else {
165 /* 32-bit trie */
166 usrc_writeArray(f, indexPrefix, pTrie->index, 16, pTrie->indexLength, postfix);
167 usrc_writeArray(f, data32Prefix, pTrie->data32, 32, pTrie->dataLength, postfix);
168 }
169 }
170
171 U_CAPI void U_EXPORT2
usrc_writeUTrie2Struct(FILE * f,const char * prefix,const UTrie2 * pTrie,const char * indexName,const char * data32Name,const char * postfix)172 usrc_writeUTrie2Struct(FILE *f,
173 const char *prefix,
174 const UTrie2 *pTrie,
175 const char *indexName, const char *data32Name,
176 const char *postfix) {
177 if(prefix!=NULL) {
178 fputs(prefix, f);
179 }
180 if(pTrie->data32==NULL) {
181 /* 16-bit trie */
182 fprintf(
183 f,
184 " %s,\n" /* index */
185 " %s+%ld,\n" /* data16 */
186 " NULL,\n", /* data32 */
187 indexName,
188 indexName,
189 (long)pTrie->indexLength);
190 } else {
191 /* 32-bit trie */
192 fprintf(
193 f,
194 " %s,\n" /* index */
195 " NULL,\n" /* data16 */
196 " %s,\n", /* data32 */
197 indexName,
198 data32Name);
199 }
200 fprintf(
201 f,
202 " %ld,\n" /* indexLength */
203 " %ld,\n" /* dataLength */
204 " 0x%hx,\n" /* index2NullOffset */
205 " 0x%hx,\n" /* dataNullOffset */
206 " 0x%lx,\n" /* initialValue */
207 " 0x%lx,\n" /* errorValue */
208 " 0x%lx,\n" /* highStart */
209 " 0x%lx,\n" /* highValueIndex */
210 " NULL, 0, FALSE, FALSE, 0, NULL\n",
211 (long)pTrie->indexLength, (long)pTrie->dataLength,
212 (short)pTrie->index2NullOffset, (short)pTrie->dataNullOffset,
213 (long)pTrie->initialValue, (long)pTrie->errorValue,
214 (long)pTrie->highStart, (long)pTrie->highValueIndex);
215 if(postfix!=NULL) {
216 fputs(postfix, f);
217 }
218 }
219