summaryrefslogtreecommitdiff
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
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.
-rw-r--r--src/msgfmt.c70
-rw-r--r--src/poparser.c27
-rw-r--r--src/poparser.h8
3 files changed, 52 insertions, 53 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;
diff --git a/src/poparser.c b/src/poparser.c
index 49ee0ee..484071e 100644
--- a/src/poparser.c
+++ b/src/poparser.c
@@ -14,9 +14,15 @@ static const char* sysdep_str[st_max]={
};
static const char* sysdep_repl[st_max][3]={
- [st_priu32] = {"\x2", "u", "lu"},
- [st_priu64] = {"\x2", "lu", "llu"},
- [st_priumax] = {"\x1", "ju"},
+ [st_priu32] = {"u", "lu", "u"},
+ [st_priu64] = {"lu", "llu", "llu"},
+ [st_priumax] = {"ju", "ju", "ju"},
+};
+
+static const int sysdep_flag[st_max]={
+ [st_priu32] = PO_SYSDEP_PRIU32,
+ [st_priu64] = PO_SYSDEP_PRIU64,
+ [st_priumax] = PO_SYSDEP_PRIUMAX,
};
void poparser_init(struct po_parser *p, char* workbuf, size_t bufsize, poparser_callback cb, void* cbdata) {
@@ -66,7 +72,6 @@ static inline enum po_error poparser_feed_hdr(struct po_parser *p, po_message_t
static inline enum po_error poparser_clean(struct po_parser *p, po_message_t msg) {
enum po_error t;
- int i;
if (p->strcnt) {
msg->strlen[p->strcnt] = 0;
@@ -79,9 +84,7 @@ static inline enum po_error poparser_clean(struct po_parser *p, po_message_t msg
if (p->cb)
p->cb(msg, p->cbdata);
- for (i=0; i < st_max; i++)
- msg->sysdep[i] = 0;
-
+ msg->sysdep_flag = 0;
msg->ctxt_len = 0;
msg->id_len = 0;
msg->plural_len = 0;
@@ -144,7 +147,7 @@ enum po_error poparser_feed_line(struct po_parser *p, char* in, size_t in_len) {
for (cnt = 0; cnt < st_max; cnt++) {
if (strstr(x, sysdep_str[cnt])) {
- msg->sysdep[cnt] = sysdep_repl[cnt][0][0];
+ msg->sysdep_flag |= sysdep_flag[cnt];
}
}
@@ -211,7 +214,7 @@ enum po_error poparser_feed_line(struct po_parser *p, char* in, size_t in_len) {
for (cnt = 0; cnt < st_max; cnt++) {
if (strstr(x, sysdep_str[cnt])) {
- msg->sysdep[cnt] = sysdep_repl[cnt][0][0];
+ msg->sysdep_flag |= sysdep_flag[cnt];
}
}
@@ -234,7 +237,7 @@ enum po_error poparser_feed_line(struct po_parser *p, char* in, size_t in_len) {
for (cnt = 0; cnt < st_max; cnt++) {
if (strstr(x, sysdep_str[cnt])) {
- msg->sysdep[cnt] = sysdep_repl[cnt][0][0];
+ msg->sysdep_flag |= sysdep_flag[cnt];
}
}
@@ -352,7 +355,7 @@ enum po_error poparser_finish(struct po_parser *p) {
return po_success;
}
-size_t poparser_sysdep(const char *in, char *out, int cnt[]) {
+size_t poparser_sysdep(const char *in, char *out, int num) {
const char *x, *y, *outs;
size_t m;
int n;
@@ -371,7 +374,7 @@ size_t poparser_sysdep(const char *in, char *out, int cnt[]) {
if (!strncmp(y, sysdep_str[n], m)) {
x = y + m;
- y = sysdep_repl[n][cnt[n]+1];
+ y = sysdep_repl[n][num];
m = strlen(y);
if (outs)
memcpy(out, y, m);
diff --git a/src/poparser.h b/src/poparser.h
index 1e4a589..79c3775 100644
--- a/src/poparser.h
+++ b/src/poparser.h
@@ -15,7 +15,7 @@ enum sysdep_types {
};
// make sure out has equal or more space than in
-size_t poparser_sysdep(const char *in, char *out, int cnt[]);
+size_t poparser_sysdep(const char *in, char *out, int num);
struct po_header {
char charset[12];
@@ -24,6 +24,10 @@ struct po_header {
};
#define PO_FUZZY 1u
+#define PO_SYSDEP_PRIU32 (1 << st_priu32)
+#define PO_SYSDEP_PRIU64 (1 << st_priu64)
+// for complement, no usage
+#define PO_SYSDEP_PRIUMAX 0
struct po_message {
char *ctxt;
@@ -31,7 +35,7 @@ struct po_message {
char *plural;
char* str[MAX_NPLURALS];
- int sysdep[st_max];
+ int sysdep_flag;
size_t ctxt_len;
size_t id_len;
size_t plural_len;