1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 *******************************************************************************
5 *
6 *   Copyright (C) 2005-2012, International Business Machines
7 *   Corporation and others.  All Rights Reserved.
8 *
9 *******************************************************************************
10 *   file name:  writesrc.h
11 *   encoding:   UTF-8
12 *   tab size:   8 (not used)
13 *   indentation:4
14 *
15 *   created on: 2005apr23
16 *   created by: Markus W. Scherer
17 *
18 *   Helper functions for writing source code for data.
19 */
20 
21 #ifndef __WRITESRC_H__
22 #define __WRITESRC_H__
23 
24 #include <stdio.h>
25 #include "unicode/utypes.h"
26 #include "unicode/ucpmap.h"
27 #include "unicode/ucptrie.h"
28 #include "unicode/umutablecptrie.h"
29 #include "unicode/uset.h"
30 #include "utrie2.h"
31 
32 /**
33  * An input to some of the functions in this file specifying whether to write data
34  * as C/C++ code initializers or as TOML.
35  */
36 typedef enum UTargetSyntax {
37     UPRV_TARGET_SYNTAX_CCODE = 0,
38     UPRV_TARGET_SYNTAX_TOML = 1,
39 } UTargetSyntax;
40 
41 /**
42  * Creates a source text file and writes a header comment with the ICU copyright.
43  * Writes a C/Java-style comment with the generator name.
44  */
45 U_CAPI FILE * U_EXPORT2
46 usrc_create(const char *path, const char *filename, int32_t copyrightYear, const char *generator);
47 
48 /**
49  * Creates a source text file and writes a header comment with the ICU copyright.
50  * Writes the comment with # lines, as used in scripts and text data.
51  */
52 U_CAPI FILE * U_EXPORT2
53 usrc_createTextData(const char *path, const char *filename, int32_t copyrightYear, const char *generator);
54 
55 /**
56  * Writes the ICU copyright to a file stream, with configurable year and comment style.
57  */
58 U_CAPI void U_EXPORT2
59 usrc_writeCopyrightHeader(FILE *f, const char *prefix, int32_t copyrightYear);
60 
61 /**
62  * Writes information about the file being machine-generated.
63  */
64 U_CAPI void U_EXPORT2
65 usrc_writeFileNameGeneratedBy(
66         FILE *f,
67         const char *prefix,
68         const char *filename,
69         const char *generator);
70 
71 /**
72  * Writes the contents of an array of 8/16/32-bit words.
73  * The prefix and postfix are optional (can be NULL) and are written first/last.
74  * The prefix may contain a %ld or similar field for the array length.
75  * The {} and declaration etc. need to be included in prefix/postfix or
76  * printed before and after the array contents.
77  */
78 U_CAPI void U_EXPORT2
79 usrc_writeArray(FILE *f,
80                 const char *prefix,
81                 const void *p, int32_t width, int32_t length,
82                 const char *indent,
83                 const char *postfix);
84 
85 /**
86  * Calls usrc_writeArray() for the index and data arrays of a frozen UTrie2.
87  * Only the index array is written for a 16-bit UTrie2. In this case, dataPrefix
88  * is ignored and can be NULL.
89  */
90 U_CAPI void U_EXPORT2
91 usrc_writeUTrie2Arrays(FILE *f,
92                        const char *indexPrefix, const char *dataPrefix,
93                        const UTrie2 *pTrie,
94                        const char *postfix);
95 
96 /**
97  * Writes the UTrie2 struct values.
98  * The {} and declaration etc. need to be included in prefix/postfix or
99  * printed before and after the array contents.
100  */
101 U_CAPI void U_EXPORT2
102 usrc_writeUTrie2Struct(FILE *f,
103                        const char *prefix,
104                        const UTrie2 *pTrie,
105                        const char *indexName, const char *dataName,
106                        const char *postfix);
107 
108 /**
109  * Calls usrc_writeArray() for the index and data arrays of a UCPTrie.
110  */
111 U_CAPI void U_EXPORT2
112 usrc_writeUCPTrieArrays(FILE *f,
113                         const char *indexPrefix, const char *dataPrefix,
114                         const UCPTrie *pTrie,
115                         const char *postfix,
116                         UTargetSyntax syntax);
117 
118 /**
119  * Writes the UCPTrie struct values.
120  * The {} and declaration etc. need to be included in prefix/postfix or
121  * printed before and after the array contents.
122  */
123 U_CAPI void U_EXPORT2
124 usrc_writeUCPTrieStruct(FILE *f,
125                         const char *prefix,
126                         const UCPTrie *pTrie,
127                         const char *indexName, const char *dataName,
128                         const char *postfix,
129                         UTargetSyntax syntax);
130 
131 /**
132  * Writes the UCPTrie arrays and struct values.
133  */
134 U_CAPI void U_EXPORT2
135 usrc_writeUCPTrie(FILE *f, const char *name, const UCPTrie *pTrie, UTargetSyntax syntax);
136 
137 /**
138  * Writes the UnicodeSet range and string lists.
139  */
140 U_CAPI void U_EXPORT2
141 usrc_writeUnicodeSet(
142     FILE *f,
143     const USet *pSet,
144     UTargetSyntax syntax);
145 
146 #ifdef __cplusplus
147 
148 U_NAMESPACE_BEGIN
149 
150 class U_TOOLUTIL_API ValueNameGetter {
151 public:
152     virtual ~ValueNameGetter();
153     virtual const char *getName(uint32_t value) = 0;
154 };
155 
156 U_NAMESPACE_END
157 
158 /**
159  * Writes the UCPMap ranges list.
160  *
161  * The "valueNameGetter" argument is optional; ignored if nullptr.
162  * If present, it will be used to look up value name strings.
163  */
164 U_CAPI void U_EXPORT2
165 usrc_writeUCPMap(
166     FILE *f,
167     const UCPMap *pMap,
168     icu::ValueNameGetter *valueNameGetter,
169     UTargetSyntax syntax);
170 
171 #endif  // __cplusplus
172 
173 /**
174  * Writes the contents of an array of mostly invariant characters.
175  * Characters 0..0x1f are printed as numbers,
176  * others as characters with single quotes: '%c'.
177  *
178  * The prefix and postfix are optional (can be NULL) and are written first/last.
179  * The prefix may contain a %ld or similar field for the array length.
180  * The {} and declaration etc. need to be included in prefix/postfix or
181  * printed before and after the array contents.
182  */
183 U_CAPI void U_EXPORT2
184 usrc_writeArrayOfMostlyInvChars(FILE *f,
185                                 const char *prefix,
186                                 const char *p, int32_t length,
187                                 const char *postfix);
188 
189 /**
190  * Writes a syntactically valid Unicode string in all ASCII, escaping quotes
191  * and non-ASCII characters.
192  */
193 U_CAPI void U_EXPORT2
194 usrc_writeStringAsASCII(FILE *f,
195                         const UChar* ptr, int32_t length,
196                         UTargetSyntax syntax);
197 
198 #endif
199