summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxhe <xw897002528@gmail.com>2017-05-30 14:18:03 +0800
committerxhe <xw897002528@gmail.com>2017-05-30 14:18:03 +0800
commitb775f1e66c5b888a1bc0e94e82046f5cc7457b8b (patch)
treedb2737ec239651a2f4cb337228c640757fb40b2f
parent6164461b7ee850da5b577b96b120e2a4b1b05a09 (diff)
downloadgettext-tiny-b775f1e66c5b888a1bc0e94e82046f5cc7457b8b.tar.gz
fix: the invalid was not deleted
since i reconstructed the code last time(switch to writemsg()/writelstr()), it wont delete the invalid msgid/str anymore, the original code doesnt make sense. here's the new code, which could work well with writemsg()/writestr().
-rw-r--r--src/msgfmt.c40
1 files changed, 19 insertions, 21 deletions
diff --git a/src/msgfmt.c b/src/msgfmt.c
index df5ed39..4673d67 100644
--- a/src/msgfmt.c
+++ b/src/msgfmt.c
@@ -248,22 +248,18 @@ static inline void writemsg(struct callbackdata *d) {
static inline void writestr(struct callbackdata *d, struct po_info *info) {
// msgid xx; msgstr ""; is widely happened, it's invalid
- if(d->curr[pe_msgstr]
- // we do not check the 1st msgid/str
- && ((d->curr[pe_msgid] - d->curr[pe_msgstr]) == 0)
- // in case curr[id] - curr[str] = 2(when sysdeps), .len == 0 is always true
- && d->translist[d->curr[pe_msgstr]-1].len == 0) {
- // str empty, invalid, set back everything, so they will be overrided
-
- d->len[pe_msgid] -= d->strlist[d->curr[pe_msgstr]-1].str.len + 1;
- d->strlist[d->curr[pe_msgstr]-1].str.len=0;
+ if(d->curr[pe_msgstr]
+ // we do not check the 1st msgid/str
+ && ((d->curr[pe_msgid] - d->curr[pe_msgstr]) == 1)
+ && !d->msc) {
+ d->curr[pe_msgid]--;
+ d->stroff[pe_msgid] -= d->strlist[d->curr[pe_msgid]].str.len;
+ d->strlist[d->curr[pe_msgid]].str.off = 0;
+ d->strlist[d->curr[pe_msgid]].str.len = 0;
d->len[pe_msgstr]--;
- d->stroff[pe_msgid] = d->strlist[d->curr[pe_msgstr]-1].str.off;
- d->stroff[pe_msgstr] = d->translist[d->curr[pe_msgstr]-1].off;
+ d->len[pe_msgid]--;
d->num[pe_msgid]--;
- d->curr[pe_msgid]--;
d->num[pe_msgstr]--;
- d->curr[pe_msgstr]--;
d->mslen1=d->mslen2=d->msc=0;
return;
}
@@ -350,14 +346,16 @@ int process_line_callback(struct po_info* info, void* user) {
} else {
writemsg(d);
// just copy, it's written down when writestr()
- if(i==0) {
- memcpy(&d->msgstrbuf1[d->mslen1], sysdeps[i], l+1);
- d->mslen1 += l+1;
- d->msc++;
- } else {
- // sysdeps exist
- memcpy(&d->msgstrbuf2[d->mslen2], sysdeps[i], l+1);
- d->mslen2 += l+1;
+ if(l) {
+ if(i==0) {
+ memcpy(&d->msgstrbuf1[d->mslen1], sysdeps[i], l+1);
+ d->mslen1 += l+1;
+ d->msc++;
+ } else {
+ // sysdeps exist
+ memcpy(&d->msgstrbuf2[d->mslen2], sysdeps[i], l+1);
+ d->mslen2 += l+1;
+ }
}
}
}