extern int _cupsLangPuts(FILE *fp, const char *message) _CUPS_PRIVATE;
extern const char *_cupsLangString(cups_lang_t *lang, const char *message) _CUPS_PRIVATE;
extern void _cupsMessageFree(cups_array_t *a) _CUPS_PRIVATE;
-extern cups_array_t *_cupsMessageLoad(const char *filename, int flags) _CUPS_PRIVATE;
+extern cups_array_t *_cupsMessageLoad(cups_array_t *a, const char *filename, int flags) _CUPS_PRIVATE;
extern const char *_cupsMessageLookup(cups_array_t *a, const char *m) _CUPS_PRIVATE;
extern cups_array_t *_cupsMessageNew(void *context) _CUPS_PRIVATE;
extern int _cupsMessageSave(const char *filename, int flags, cups_array_t *a) _CUPS_PRIVATE;
*/
cups_array_t * /* O - New message array */
-_cupsMessageLoad(const char *filename, /* I - Message catalog to load */
- int flags) /* I - Load flags */
+_cupsMessageLoad(cups_array_t *a, /* I - Existing message array */
+ const char *filename,/* I - Message catalog to load */
+ int flags) /* I - Load flags */
{
cups_file_t *fp; /* Message file */
- cups_array_t *a; /* Message array */
_cups_message_t *m; /* Current message */
char s[4096], /* String buffer */
*ptr, /* Pointer into buffer */
ptrlen; /* Length of string */
- DEBUG_printf("4_cupsMessageLoad(filename=\"%s\")", filename);
+ DEBUG_printf("4_cupsMessageLoad(a=%p, filename=\"%s\", flags=%d)", (void *)a, filename, flags);
- /*
- * Create an array to hold the messages...
- */
-
- if ((a = _cupsMessageNew(NULL)) == NULL)
+ if (!a)
{
- DEBUG_puts("5_cupsMessageLoad: Unable to allocate array!");
- return (NULL);
+ /*
+ * Create an array to hold the messages...
+ */
+
+ if ((a = _cupsMessageNew(NULL)) == NULL)
+ {
+ DEBUG_puts("5_cupsMessageLoad: Unable to allocate array!");
+ return (NULL);
+ }
}
/*
{
if (m->str && (m->str[0] || (flags & _CUPS_MESSAGE_EMPTY)))
{
- cupsArrayAdd(a, m);
+ if (cupsArrayFind(a, m))
+ cups_message_free(m, NULL);
+ else
+ cupsArrayAdd(a, m);
}
else
{
* Translation is empty, don't add it... (STR #4033)
*/
- free(m->msg);
- if (m->str)
- free(m->str);
- free(m);
+ cups_message_free(m, NULL);
}
}
}
* 'cups_message_free()' - Free a message.
*/
-static void cups_message_free(_cups_message_t *m, /* I - Message */
- void *data) /* Unused */
+static void
+cups_message_free(_cups_message_t *m, /* I - Message */
+ void *data)/* Unused */
{
(void)data;
- if (m->msg)
- free(m->msg);
-
- if (m->str)
- free(m->str);
+ free(m->msg);
+ free(m->str);
free(m);
}
* Read the strings from the file...
*/
- lang->strings = _cupsMessageLoad(filename, _CUPS_MESSAGE_UNQUOTE);
+ lang->strings = _cupsMessageLoad(NULL, filename, _CUPS_MESSAGE_UNQUOTE);
}
if (m->msg && m->str)
{
- cupsArrayAdd(a, m);
+ if (cupsArrayFind(a, m))
+ cups_message_free(m, NULL);
+ else
+ cupsArrayAdd(a, m);
}
else
{
- if (m->msg)
- free(m->msg);
-
- if (m->str)
- free(m->str);
-
- free(m);
+ cups_message_free(m, NULL);
break;
}