9.13 Writing your own programs that process PO files ==================================================== For the tasks for which a combination of ‘msgattrib’, ‘msgcat’ etc. is not sufficient, a set of C functions is provided in a library, to make it possible to process PO files in your own programs. When you use this library, you don’t need to write routines to parse the PO file; instead, you retrieve a pointer in memory to each of messages contained in the PO file. Functions for writing those memory structures to a file after working with them are provided too. The functions are declared in the header file ‘<gettext-po.h>’, and are defined in a library called ‘libgettextpo’.
· Error Handling Error handling functions · po_file_t API File management · po_message_iterator_t API Message iteration · po_message_t API The basic units of the file · PO Header Entry API Meta information of the file · po_filepos_t API References to the sources · Format Type API Supported format types · Checking API Enforcing constraints The following example shows code how these functions can be used. Error handling code is omitted, as its implementation is delegated to the user provided functions. struct po_xerror_handler handler = { .xerror = ..., .xerror2 = ... }; const char *filename = ...; /* Read the file into memory. */ po_file_t file = po_file_read (filename, &handler); { const char * const *domains = po_file_domains (file); const char * const *domainp; /* Iterate the domains contained in the file. */ for (domainp = domains; *domainp; domainp++) { po_message_t *message; const char *domain = *domainp; po_message_iterator_t iterator = po_message_iterator (file, domain); /* Iterate each message inside the domain. */ while ((message = po_next_message (iterator)) != NULL) { /* Read data from the message ... */ const char *msgid = po_message_msgid (message); const char *msgstr = po_message_msgstr (message); ... /* Modify its contents ... */ if (perform_some_tests (msgid, msgstr)) po_message_set_fuzzy (message, 1); ... } /* Always release returned po_message_iterator_t. */ po_message_iterator_free (iterator); } /* Write back the result. */ po_file_t result = po_file_write (file, filename, &handler); } /* Always release the returned po_file_t. */ po_file_free (file);