static void process_message(po_message_t m) { const char * msgstr = po_message_msgstr(m); const char * msgid = po_message_msgid(m); const char *p; char *q; char *fixedstr; if(msgid[0] == '\0')return; if(strlen(msgid) < 1)return; if(strlen(msgstr) < 1)return; if(msgstr[0] == '\0')return; fixedstr = strdup(msgstr); p = msgid; q = fixedstr; while(*p && *q) { while(*p && !is_valid_fmtstr(p))p++; while(*q && !is_valid_fmtstr(q))q++; if(*q && *p) { q++; p++; if(*p != *q) { char buff[200]; sprintf(buff,"Mismatched format character (%c != %c)",*p,*q); if(print_error(m,msgid,fixedstr,buff, 2)) { //fix the format string *q=*p; po_message_set_msgstr(m, fixedstr); } } } } if(*p || *q) { print_error(m,msgid,msgstr,"Mismatched number of format characters", 1); } }
static gboolean _gtr_po_load (GtrPo * po, GFile * location, GError ** error) { struct po_xerror_handler handler; po_message_iterator_t iter; po_message_t message; const gchar *msgid; gchar *filename; GtrPoPrivate *priv = gtr_po_get_instance_private (po); /* * Initialize the handler error. */ handler.xerror = &on_gettext_po_xerror; handler.xerror2 = &on_gettext_po_xerror2; if (message_error != NULL) { g_free (message_error); message_error = NULL; } filename = g_file_get_path (location); if (priv->gettext_po_file) po_file_free (priv->gettext_po_file); if (priv->header) { g_object_unref (priv->header); priv->header = NULL; } if (priv->iter) { po_message_iterator_free (priv->iter); priv->iter = NULL; } priv->gettext_po_file = po_file_read (filename, &handler); g_free (filename); if (po_file_is_empty (priv->gettext_po_file)) { g_set_error (error, GTR_PO_ERROR, GTR_PO_ERROR_FILE_EMPTY, _("The file is empty")); return FALSE; } if (!priv->gettext_po_file) { g_set_error (error, GTR_PO_ERROR, GTR_PO_ERROR_FILENAME, _("Failed opening file “%s”: %s"), filename, g_strerror (errno)); g_free (filename); return FALSE; } iter = po_message_iterator (priv->gettext_po_file, NULL); message = po_next_message (iter); msgid = po_message_msgid (message); if (*msgid == '\0') priv->header = gtr_header_new (iter, message); else { po_message_iterator_free (iter); iter = po_message_iterator (priv->gettext_po_file, NULL); message = po_message_create (); po_message_set_msgid (message, ""); po_message_set_msgstr (message, ""); po_message_insert (iter, message); priv->header = gtr_header_new (iter, message); } priv->iter = iter; return TRUE; }