diff options
Diffstat (limited to 'src/poparser.h')
-rw-r--r-- | src/poparser.h | 100 |
1 files changed, 78 insertions, 22 deletions
diff --git a/src/poparser.h b/src/poparser.h index 29b7b16..1e4a589 100644 --- a/src/poparser.h +++ b/src/poparser.h @@ -1,41 +1,97 @@ #ifndef POPARSER_H #define POPARSER_H -#include <unistd.h> -enum po_entry { - pe_msgid = 0, - pe_plural, - pe_ctxt, - pe_msgstr, - pe_maxstr, - pe_str = pe_maxstr, - pe_invalid, - pe_max, +#include <iconv.h> +#include <stdbool.h> +#include <stdlib.h> + +#define MAX_NPLURALS 6 + +enum sysdep_types { + st_priu32 = 0, + st_priu64, + st_priumax, + st_max }; -struct po_info { - enum po_entry type; - char *text; +// make sure out has equal or more space than in +size_t poparser_sysdep(const char *in, char *out, int cnt[]); + +struct po_header { char charset[12]; - unsigned int nplurals; - size_t textlen; + unsigned nplurals; + // maybe parse the header later +}; + +#define PO_FUZZY 1u + +struct po_message { + char *ctxt; + char *id; + char *plural; + char* str[MAX_NPLURALS]; + + int sysdep[st_max]; + size_t ctxt_len; + size_t id_len; + size_t plural_len; + size_t strlen[MAX_NPLURALS]; + // h.......1.0 + // |-------|a| + // |.......|a| + int flags; }; +typedef struct po_message *po_message_t; -typedef int (*poparser_callback)(struct po_info* info, void* user); +typedef int (*poparser_callback)(po_message_t msg, void* user); + +enum po_stage { + // collect size of every msg + ps_size = 0, + // parse + ps_parse, + ps_max = ps_parse, +}; + +enum po_entry { + po_ctxt = 0, + po_id, + po_plural, + po_str, +}; struct po_parser { - struct po_info info; + struct po_header hdr; + struct po_message msg; + enum po_stage stage; + + // private parts + bool first; + iconv_t cd; + enum po_entry previous; + int strcnt; + size_t max_ctxt_len; + size_t max_id_len; + size_t max_plural_len; + size_t max_strlen[MAX_NPLURALS]; char *buf; size_t bufsize; - enum po_entry prev_type; - enum po_entry prev_rtype; - unsigned curr_len; poparser_callback cb; void *cbdata; }; +enum po_error { + po_success = 0, + po_unsupported_charset, + po_failed_iconv, + po_excepted_token, + po_plurals_overflow, + po_invalid_entry, + po_internal, +}; + void poparser_init(struct po_parser *p, char* workbuf, size_t bufsize, poparser_callback cb, void* cbdata); -int poparser_feed_line(struct po_parser *p, char* line, size_t buflen); -int poparser_finish(struct po_parser *p); +enum po_error poparser_feed_line(struct po_parser *p, char* line, size_t buflen); +enum po_error poparser_finish(struct po_parser *p); #endif |