summaryrefslogtreecommitdiff
path: root/src/msgfmt.c
diff options
context:
space:
mode:
authorxhe <xw897002528@gmail.com>2018-12-07 18:42:45 +0800
committerrofl0r <retnyg@gmx.net>2019-01-16 02:38:18 +0000
commiteaf42fc91d9d1753ad43c7d808358094765a90c0 (patch)
tree288e282e3750b9a25d6e5351cf551a5fa5987708 /src/msgfmt.c
parentfbbf226f6f13bd983351608b5e3e9acae067e0e3 (diff)
downloadgettext-tiny-eaf42fc91d9d1753ad43c7d808358094765a90c0.tar.gz
poparser: a more easy-to-understand sysdep()
as rofl0r said, maybe the previous sysdep(), is a bit confusing. so, i modified a new version. this time, msg->sysdep[] became a bit flag msg->sysdep_flag. it can tell which kind of sysdep string occurs. using this infomation, you can tell the total num of cases on your own. assuming that num is X, you can use new sysdep() to deal with every case simply by invoking the function X times with a third argument from 0 to X-1. and you get X different expanded strings.
Diffstat (limited to 'src/msgfmt.c')
-rw-r--r--src/msgfmt.c70
1 files changed, 31 insertions, 39 deletions
diff --git a/src/msgfmt.c b/src/msgfmt.c
index c32d075..58fd855 100644
--- a/src/msgfmt.c
+++ b/src/msgfmt.c
@@ -77,36 +77,48 @@ int process_line_callback(po_message_t msg, void* user) {
struct callbackdata *d = (struct callbackdata *) user;
struct strtbl *str, *trans;
size_t m;
- int cnt[st_max] = {0};
- int i, k;
+ int i, j, k;
if (msg->flags & PO_FUZZY) return 0;
if (msg->strlen[0] == 0) return 0;
- switch(d->stage) {
- case ps_size:
+ // PO_SYSDEP_PRIUMAX == 0, it has no effects to our codes
+ switch (msg->sysdep_flag) {
+ case PO_SYSDEP_PRIU32:
+ case PO_SYSDEP_PRIU64:
+ k = 2;
+ break;
+ case PO_SYSDEP_PRIU32|PO_SYSDEP_PRIU64:
+ k = 3;
+ break;
+ default:
k = 1;
- for (i=0; i < st_max; i++)
- if (msg->sysdep[i])
- k *= msg->sysdep[i];
+ break;
+ }
- d->len[0] += (msg->id_len + 1)*k;
+ switch(d->stage) {
+ case ps_size:
+ m = 0;
+ m += msg->id_len + 1;
if (msg->plural_len)
- d->len[0] += (msg->plural_len + 1)*k;
+ m = msg->plural_len + 1;
if (msg->ctxt_len)
- d->len[0] += (msg->ctxt_len + 1)*k;
+ m += msg->ctxt_len + 1;
- for (i=0; msg->strlen[i]; i++)
- d->len[1] += (msg->strlen[i] + 1)*k;
+ d->len[0] += m * k;
+
+ m = 0;
+ for (i=0; msg->strlen[i]; i++) {
+ m += msg->strlen[i] + 1;
+ }
+ d->len[1] += m * k;
d->cnt += k;
break;
case ps_parse:
- for (k=1; k; d->cnt++) {
- k = 0;
-
+ for (j=0; j < k; j++) {
str = &d->list[d->cnt].str;
trans = &d->list[d->cnt].trans;
@@ -114,18 +126,18 @@ int process_line_callback(po_message_t msg, void* user) {
str->len = 0;
if (msg->ctxt_len) {
- m = poparser_sysdep(msg->ctxt, &d->buf[0][d->len[0]], cnt);
+ m = poparser_sysdep(msg->ctxt, &d->buf[0][d->len[0]], j);
str->len += m;
d->buf[0][d->len[0]+m-1] = 0x4;
d->len[0] += m;
}
- m = poparser_sysdep(msg->id, &d->buf[0][d->len[0]], cnt);
+ m = poparser_sysdep(msg->id, &d->buf[0][d->len[0]], j);
str->len += m;
d->len[0] += m;
if (msg->plural_len) {
- m = poparser_sysdep(msg->plural, &d->buf[0][d->len[0]], cnt);
+ m = poparser_sysdep(msg->plural, &d->buf[0][d->len[0]], j);
str->len += m;
d->len[0] += m;
}
@@ -133,30 +145,10 @@ int process_line_callback(po_message_t msg, void* user) {
trans->off = d->len[1];
trans->len = 0;
for (i=0; msg->strlen[i]; i++) {
- m = poparser_sysdep(msg->str[i], &d->buf[1][d->len[1]], cnt);
+ m = poparser_sysdep(msg->str[i], &d->buf[1][d->len[1]], j);
trans->len += m;
d->len[1] += m;
}
-
- for (i=0; i < st_max; i++) {
- if (cnt[i] < msg->sysdep[i]) {
- cnt[i]++;
-
- // we have a carry
- if (cnt[i] == msg->sysdep[i]) {
- cnt[i] = 0;
- continue;
- }
-
- if (cnt[0] == 1 && cnt[1] == 0) {
- i--;
- continue;
- }
-
- k = 1;
- break;
- }
- }
}
break;