]> git.ipfire.org Git - thirdparty/cups.git/blame - locale/po2strings.c
Merge changes from CUPS 1.5svn-r9641
[thirdparty/cups.git] / locale / po2strings.c
CommitLineData
bc44d920 1/*
2e4ff8af 2 * "$Id: po2strings.c 6921 2007-09-06 13:38:37Z mike $"
bc44d920 3 *
0837b7e8 4 * Convert a GNU gettext .po file to an Apple .strings file.
71e16022
MS
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/".
bc44d920 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 *
0837b7e8 24 * main() - Convert .po file to .strings.
bc44d920 25 */
26
71e16022 27#include <cups/cups-private.h>
bc44d920 28
29
30/*
31 * The .strings file format is simple:
32 *
33 * // comment
0837b7e8 34 * "msgid" = "msgstr";
bc44d920 35 *
0837b7e8
MS
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.
bc44d920 54 */
55
bc44d920 56/*
57 * main() - Convert .po file to .strings.
58 */
59
60int /* O - Exit code */
61main(int argc, /* I - Number of command-line args */
62 char *argv[]) /* I - Command-line arguments */
63{
745129be 64 int i; /* Looping var */
0837b7e8
MS
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 */
745129be 75 int use_msgid; /* Use msgid strings for msgstr? */
bc44d920 76
77
0837b7e8
MS
78 /*
79 * Process command-line arguments...
80 */
745129be 81
0837b7e8
MS
82 pofile = NULL;
83 stringsfile = NULL;
84 use_msgid = 0;
745129be
MS
85
86 for (i = 1; i < argc; i ++)
0837b7e8 87 {
745129be
MS
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 }
0837b7e8
MS
95 else if (!pofile)
96 pofile = argv[i];
97 else if (!stringsfile)
98 stringsfile = argv[i];
745129be
MS
99 else
100 {
101 puts("Usage: po2strings [-m] filename.po filename.strings");
102 return (1);
103 }
0837b7e8 104 }
745129be 105
0837b7e8 106 if (!pofile || !stringsfile)
bc44d920 107 {
745129be 108 puts("Usage: po2strings [-m] filename.po filename.strings");
bc44d920 109 return (1);
110 }
111
112 /*
0837b7e8 113 * Read strings from the .po file and write to the .strings file...
bc44d920 114 */
115
0837b7e8 116 if ((po = cupsFileOpen(pofile, "r")) == NULL)
bc44d920 117 {
0837b7e8 118 perror(pofile);
bc44d920 119 return (1);
120 }
121
0837b7e8 122 if ((strings = cupsFileOpen(stringsfile, "w")) == NULL)
bc44d920 123 {
0837b7e8
MS
124 perror(stringsfile);
125 cupsFileClose(po);
bc44d920 126 return (1);
127 }
128
0837b7e8
MS
129 msgid = msgstr = NULL;
130
131 while (cupsFileGets(po, s, sizeof(s)) != NULL)
bc44d920 132 {
84315f46 133 if (s[0] == '#' && s[1] == '.')
0837b7e8
MS
134 {
135 /*
84315f46 136 * Copy comment string...
0837b7e8 137 */
bc44d920 138
84315f46
MS
139 if (msgid && msgstr)
140 {
141 /*
142 * First output the last localization string...
143 */
144
145 if (*msgid)
146 cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid,
147 (use_msgid || !*msgstr) ? msgid : msgstr);
148
149 free(msgid);
150 free(msgstr);
151 msgid = msgstr = NULL;
152 }
153
154 cupsFilePrintf(strings, "//%s\n", s + 2);
0837b7e8 155 }
84315f46 156 else if (s[0] == '#' || !s[0])
0837b7e8
MS
157 {
158 /*
84315f46 159 * Skip blank and file comment lines...
0837b7e8 160 */
bc44d920 161
84315f46 162 continue;
0837b7e8
MS
163 }
164 else
165 {
166 /*
167 * Strip the trailing quote...
168 */
bc44d920 169
0837b7e8
MS
170 if ((ptr = strrchr(s, '\"')) == NULL)
171 continue;
bc44d920 172
0837b7e8 173 *ptr = '\0';
bc44d920 174
0837b7e8
MS
175 /*
176 * Find start of value...
177 */
178
179 if ((ptr = strchr(s, '\"')) == NULL)
180 continue;
bc44d920 181
0837b7e8 182 ptr ++;
bc44d920 183
0837b7e8
MS
184 /*
185 * Create or add to a message...
186 */
187
188 if (!strncmp(s, "msgid", 5))
189 {
190 /*
191 * Output previous message as needed...
192 */
193
194 if (msgid && msgstr)
195 {
196 if (*msgid)
84315f46 197 cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid,
0837b7e8
MS
198 (use_msgid || !*msgstr) ? msgid : msgstr);
199
200 free(msgid);
201 free(msgstr);
202 }
203
204 msgid = strdup(ptr);
205 msgstr = NULL;
206 }
207 else if (s[0] == '\"' )
208 {
209 /*
210 * Append to current string...
211 */
212
213 length = (int)strlen(msgstr ? msgstr : msgid);
214
215 if ((temp = realloc(msgstr ? msgstr : msgid,
216 length + strlen(ptr) + 1)) == NULL)
217 {
218 perror("Unable to allocate string");
219 return (1);
220 }
221
222 if (msgstr)
223 {
224 /*
225 * Copy the new portion to the end of the msgstr string - safe
226 * to use strcpy because the buffer is allocated to the correct
227 * size...
228 */
229
230 msgstr = temp;
231
232 strcpy(msgstr + length, ptr);
233 }
234 else
235 {
236 /*
237 * Copy the new portion to the end of the msgid string - safe
238 * to use strcpy because the buffer is allocated to the correct
239 * size...
240 */
241
242 msgid = temp;
243
244 strcpy(msgid + length, ptr);
245 }
246 }
247 else if (!strncmp(s, "msgstr", 6) && msgid)
248 {
249 /*
250 * Set the string...
251 */
252
253 if ((msgstr = strdup(ptr)) == NULL)
254 {
255 perror("Unable to allocate msgstr");
256 return (1);
257 }
258 }
bc44d920 259 }
0837b7e8
MS
260 }
261
262 if (msgid && msgstr)
263 {
264 if (*msgid)
84315f46 265 cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid,
0837b7e8 266 (use_msgid || !*msgstr) ? msgid : msgstr);
bc44d920 267
0837b7e8
MS
268 free(msgid);
269 free(msgstr);
bc44d920 270 }
271
0837b7e8
MS
272 cupsFileClose(po);
273 cupsFileClose(strings);
274
275 return (0);
bc44d920 276}
277
278
279/*
2e4ff8af 280 * End of "$Id: po2strings.c 6921 2007-09-06 13:38:37Z mike $".
bc44d920 281 */