summaryrefslogtreecommitdiff
path: root/package/gettext-tiny/src/src/poparser.c
diff options
context:
space:
mode:
Diffstat (limited to 'package/gettext-tiny/src/src/poparser.c')
-rw-r--r--package/gettext-tiny/src/src/poparser.c144
1 files changed, 0 insertions, 144 deletions
diff --git a/package/gettext-tiny/src/src/poparser.c b/package/gettext-tiny/src/src/poparser.c
deleted file mode 100644
index e67761305..000000000
--- a/package/gettext-tiny/src/src/poparser.c
+++ /dev/null
@@ -1,144 +0,0 @@
-#include <ctype.h>
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include "poparser.h"
-#include "StringEscape.h"
-
-#define streq(A, B) (!strcmp(A, B))
-#define strstarts(S, W) (memcmp(S, W, sizeof(W) - 1) ? NULL : (S + (sizeof(W) - 1)))
-
-static enum po_entry get_type_and_start(char* lp, char* end, size_t *stringstart) {
- enum po_entry result_type;
- char *x, *y;
- size_t start = (size_t) lp;
- while(isspace(*lp) && lp < end) lp++;
- if(lp[0] == '#') {
- inv:
- *stringstart = 0;
- return pe_invalid;
- }
- if((y = strstarts(lp, "msg"))) {
- if((x = strstarts(y, "id")) && (isspace(*x) || ((x = strstarts(x, "_plural")) && isspace(*x))))
- result_type = pe_msgid;
- else if ((x = strstarts(y, "str")) && (isspace(*x) ||
- (x[0] == '[' && (x[1] == '0' || x[1] == '1') && x[2] == ']' && (x += 3) && isspace(*x))))
- result_type = pe_msgstr;
- else
- goto inv;
- while(isspace(*x) && x < end) x++;
- if(*x != '"') abort();
- conv:
- *stringstart = ((size_t) x - start) + 1;
- } else if(*lp == '"') {
- result_type = pe_str;
- x = lp;
- goto conv;
- } else {
- goto inv;
- }
- return result_type;
-}
-
-/* expects a pointer to the first char after a opening " in a string,
- * converts the string into convbuf, and returns the length of that string */
-static size_t get_length_and_convert(char* x, char* end, char* convbuf, size_t convbuflen) {
- size_t result = 0;
- char* e = x + strlen(x);
- assert(e > x && e < end && *e == 0);
- e--;
- while(isspace(*e)) e--;
- if(*e != '"') abort();
- *e = 0;
- result = unescape(x, convbuf, convbuflen);
- return result;
-}
-
-
-void poparser_init(struct po_parser *p, char* workbuf, size_t bufsize, poparser_callback cb, void* cbdata) {
- p->buf = workbuf;
- p->bufsize = bufsize;
- p->cb = cb;
- p->prev_type = pe_invalid;
- p->curr_len = 0;
- p->cbdata = cbdata;
-}
-
-enum lineactions {
- la_incr,
- la_proc,
- la_abort,
- la_nop,
- la_max,
-};
-
-/* return 0 on success */
-int poparser_feed_line(struct po_parser *p, char* line, size_t buflen) {
- char *convbuf = p->buf;
- size_t convbuflen = p->bufsize;
- size_t strstart;
-
- static const enum lineactions action_tbl[pe_max][pe_max] = {
- // pe_str will never be set as curr_type
- [pe_str] = {
- [pe_str] = la_abort,
- [pe_msgid] = la_abort,
- [pe_msgstr] = la_abort,
- [pe_invalid] = la_abort,
- },
- [pe_msgid] = {
- [pe_str] = la_incr,
- [pe_msgid] = la_proc,
- [pe_msgstr] = la_proc,
- [pe_invalid] = la_proc,
- },
- [pe_msgstr] = {
- [pe_str] = la_incr,
- [pe_msgid] = la_proc,
- [pe_msgstr] = la_proc,
- [pe_invalid] = la_proc,
- },
- [pe_invalid] = {
- [pe_str] = la_nop, // this can happen when we have msgstr[2] "" ... "foo", since we only parse msgstr[0] and [1]
- [pe_msgid] = la_incr,
- [pe_msgstr] = la_incr,
- [pe_invalid] = la_nop,
- },
- };
-
- enum po_entry type;
-
- type = get_type_and_start(line, line + buflen, &strstart);
- switch(action_tbl[p->prev_type][type]) {
- case la_incr:
- assert(type == pe_msgid || type == pe_msgstr || type == pe_str);
- p->curr_len += get_length_and_convert(line + strstart, line + buflen, convbuf + p->curr_len, convbuflen - p->curr_len);
- break;
- case la_proc:
- assert(p->prev_type == pe_msgid || p->prev_type == pe_msgstr);
- p->info.text = convbuf;
- p->info.textlen = p->curr_len;
- p->info.type = p->prev_type;
- p->cb(&p->info, p->cbdata);
- if(type != pe_invalid)
- p->curr_len = get_length_and_convert(line + strstart, line + buflen, convbuf, convbuflen);
- else
- p->curr_len = 0;
- break;
- case la_nop:
- break;
- case la_abort:
- default:
- abort();
- // todo : return error code
- }
- if(type != pe_str) {
- p->prev_type = type;
- }
- return 0;
-}
-
-int poparser_finish(struct po_parser *p) {
- char empty[4] = "";
- return poparser_feed_line(p, empty, sizeof(empty));
-}