#include <cups/cups-private.h>
int
main(int argc,
char *argv[])
{
int i;
const char *pofile,
*stringsfile;
cups_file_t *po,
*strings;
char s[4096],
*ptr,
*temp,
*msgid,
*msgstr;
int length;
int use_msgid;
pofile = NULL;
stringsfile = NULL;
use_msgid = 0;
for (i = 1; i < argc; i ++)
{
if (!strcmp(argv[i], "-m"))
use_msgid = 1;
else if (argv[i][0] == '-')
{
puts("Usage: po2strings [-m] filename.po filename.strings");
return (1);
}
else if (!pofile)
pofile = argv[i];
else if (!stringsfile)
stringsfile = argv[i];
else
{
puts("Usage: po2strings [-m] filename.po filename.strings");
return (1);
}
}
if (!pofile || !stringsfile)
{
puts("Usage: po2strings [-m] filename.po filename.strings");
return (1);
}
if ((po = cupsFileOpen(pofile, "r")) == NULL)
{
perror(pofile);
return (1);
}
if ((strings = cupsFileOpen(stringsfile, "w")) == NULL)
{
perror(stringsfile);
cupsFileClose(po);
return (1);
}
msgid = msgstr = NULL;
while (cupsFileGets(po, s, sizeof(s)) != NULL)
{
if (s[0] == '#' && s[1] == '.')
{
if (msgid && msgstr)
{
if (*msgid)
cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid,
(use_msgid || !*msgstr) ? msgid : msgstr);
free(msgid);
free(msgstr);
msgid = msgstr = NULL;
}
cupsFilePrintf(strings, "//%s\n", s + 2);
}
else if (s[0] == '#' || !s[0])
{
continue;
}
else
{
if ((ptr = strrchr(s, '\"')) == NULL)
continue;
*ptr = '\0';
if ((ptr = strchr(s, '\"')) == NULL)
continue;
ptr ++;
if (!strncmp(s, "msgid", 5))
{
if (msgid && msgstr)
{
if (*msgid)
cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid,
(use_msgid || !*msgstr) ? msgid : msgstr);
}
if (msgid)
free(msgid);
if (msgstr)
free(msgstr);
msgid = strdup(ptr);
msgstr = NULL;
}
else if (s[0] == '\"' && (msgid || msgstr))
{
length = (int)strlen(msgstr ? msgstr : msgid);
if ((temp = realloc(msgstr ? msgstr : msgid,
length + strlen(ptr) + 1)) == NULL)
{
free(msgid);
if (msgstr)
free(msgstr);
perror("Unable to allocate string");
return (1);
}
if (msgstr)
{
msgstr = temp;
strcpy(msgstr + length, ptr);
}
else
{
msgid = temp;
strcpy(msgid + length, ptr);
}
}
else if (!strncmp(s, "msgstr", 6) && msgid)
{
if (msgstr)
free(msgstr);
if ((msgstr = strdup(ptr)) == NULL)
{
free(msgid);
perror("Unable to allocate msgstr");
return (1);
}
}
}
}
if (msgid && msgstr)
{
if (*msgid)
cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid,
(use_msgid || !*msgstr) ? msgid : msgstr);
}
if (msgid)
free(msgid);
if (msgstr)
free(msgstr);
cupsFileClose(po);
cupsFileClose(strings);
return (0);
}