]> git.ipfire.org Git - thirdparty/cups.git/blob - locale/po2strings.c
Merge changes from CUPS 1.5svn-r9385.
[thirdparty/cups.git] / locale / po2strings.c
1 /*
2 * "$Id: po2strings.c 6921 2007-09-06 13:38:37Z mike $"
3 *
4 * Convert a GNU gettext .po file to an Apple .strings file.
5 *
6 * Copyright 2007-2010 by Apple Inc.
7 *
8 * These coded instructions, statements, and computer programs are the
9 * property of Apple Inc. and are protected by Federal copyright
10 * law. Distribution and use rights are outlined in the file "LICENSE.txt"
11 * which should have been included with this file. If this file is
12 * file is missing or damaged, see the license at "http://www.cups.org/".
13 *
14 * Usage:
15 *
16 * po2strings filename.strings filename.po
17 *
18 * Compile with:
19 *
20 * gcc -o po2strings po2strings.c `cups-config --libs`
21 *
22 * Contents:
23 *
24 * main() - Convert .po file to .strings.
25 */
26
27 #include <cups/cups-private.h>
28
29
30 /*
31 * The .strings file format is simple:
32 *
33 * // comment
34 * "msgid" = "msgstr";
35 *
36 * The GNU gettext .po format is also fairly simple:
37 *
38 * #. comment
39 * msgid "some text"
40 * msgstr "localized text"
41 *
42 * The comment, msgid, and msgstr text can span multiple lines using the form:
43 *
44 * #. comment
45 * #. more comments
46 * msgid ""
47 * "some long text"
48 * msgstr ""
49 * "localized text spanning "
50 * "multiple lines"
51 *
52 * Both the msgid and msgstr strings use standard C quoting for special
53 * characters like newline and the double quote character.
54 */
55
56 /*
57 * main() - Convert .po file to .strings.
58 */
59
60 int /* O - Exit code */
61 main(int argc, /* I - Number of command-line args */
62 char *argv[]) /* I - Command-line arguments */
63 {
64 int i; /* Looping var */
65 const char *pofile, /* .po filename */
66 *stringsfile; /* .strings filename */
67 cups_file_t *po, /* .po file */
68 *strings; /* .strings file */
69 char s[4096], /* String buffer */
70 *ptr, /* Pointer into buffer */
71 *temp, /* New string */
72 *msgid, /* msgid string */
73 *msgstr; /* msgstr string */
74 int length; /* Length of combined strings */
75 int use_msgid; /* Use msgid strings for msgstr? */
76
77
78 /*
79 * Process command-line arguments...
80 */
81
82 pofile = NULL;
83 stringsfile = NULL;
84 use_msgid = 0;
85
86 for (i = 1; i < argc; i ++)
87 {
88 if (!strcmp(argv[i], "-m"))
89 use_msgid = 1;
90 else if (argv[i][0] == '-')
91 {
92 puts("Usage: po2strings [-m] filename.po filename.strings");
93 return (1);
94 }
95 else if (!pofile)
96 pofile = argv[i];
97 else if (!stringsfile)
98 stringsfile = argv[i];
99 else
100 {
101 puts("Usage: po2strings [-m] filename.po filename.strings");
102 return (1);
103 }
104 }
105
106 if (!pofile || !stringsfile)
107 {
108 puts("Usage: po2strings [-m] filename.po filename.strings");
109 return (1);
110 }
111
112 /*
113 * Read strings from the .po file and write to the .strings file...
114 */
115
116 if ((po = cupsFileOpen(pofile, "r")) == NULL)
117 {
118 perror(pofile);
119 return (1);
120 }
121
122 if ((strings = cupsFileOpen(stringsfile, "w")) == NULL)
123 {
124 perror(stringsfile);
125 cupsFileClose(po);
126 return (1);
127 }
128
129 msgid = msgstr = NULL;
130
131 while (cupsFileGets(po, s, sizeof(s)) != NULL)
132 {
133 if ((s[0] == '#' && s[0] != '.') || !s[0])
134 {
135 /*
136 * Skip blank and file comment lines...
137 */
138
139 continue;
140 }
141 else if (s[0] == '#')
142 {
143 /*
144 * Copy comment string...
145 */
146
147 cupsFilePrintf(strings, "//%s\n", s + 2);
148 }
149 else
150 {
151 /*
152 * Strip the trailing quote...
153 */
154
155 if ((ptr = strrchr(s, '\"')) == NULL)
156 continue;
157
158 *ptr = '\0';
159
160 /*
161 * Find start of value...
162 */
163
164 if ((ptr = strchr(s, '\"')) == NULL)
165 continue;
166
167 ptr ++;
168
169 /*
170 * Create or add to a message...
171 */
172
173 if (!strncmp(s, "msgid", 5))
174 {
175 /*
176 * Output previous message as needed...
177 */
178
179 if (msgid && msgstr)
180 {
181 if (*msgid)
182 cupsFilePrintf(strings, "\"%s\" = \"%s\";\n\n", msgid,
183 (use_msgid || !*msgstr) ? msgid : msgstr);
184
185 free(msgid);
186 free(msgstr);
187 }
188
189 msgid = strdup(ptr);
190 msgstr = NULL;
191 }
192 else if (s[0] == '\"' )
193 {
194 /*
195 * Append to current string...
196 */
197
198 length = (int)strlen(msgstr ? msgstr : msgid);
199
200 if ((temp = realloc(msgstr ? msgstr : msgid,
201 length + strlen(ptr) + 1)) == NULL)
202 {
203 perror("Unable to allocate string");
204 return (1);
205 }
206
207 if (msgstr)
208 {
209 /*
210 * Copy the new portion to the end of the msgstr string - safe
211 * to use strcpy because the buffer is allocated to the correct
212 * size...
213 */
214
215 msgstr = temp;
216
217 strcpy(msgstr + length, ptr);
218 }
219 else
220 {
221 /*
222 * Copy the new portion to the end of the msgid string - safe
223 * to use strcpy because the buffer is allocated to the correct
224 * size...
225 */
226
227 msgid = temp;
228
229 strcpy(msgid + length, ptr);
230 }
231 }
232 else if (!strncmp(s, "msgstr", 6) && msgid)
233 {
234 /*
235 * Set the string...
236 */
237
238 if ((msgstr = strdup(ptr)) == NULL)
239 {
240 perror("Unable to allocate msgstr");
241 return (1);
242 }
243 }
244 }
245 }
246
247 if (msgid && msgstr)
248 {
249 if (*msgid)
250 cupsFilePrintf(strings, "\"%s\" = \"%s\";\n\n", msgid,
251 (use_msgid || !*msgstr) ? msgid : msgstr);
252
253 free(msgid);
254 free(msgstr);
255 }
256
257 cupsFileClose(po);
258 cupsFileClose(strings);
259
260 return (0);
261 }
262
263
264 /*
265 * End of "$Id: po2strings.c 6921 2007-09-06 13:38:37Z mike $".
266 */