// converts string (with opn/cls attached) to c string
static void xlat2(uint8_t *in, uint8_t *out)
{
- uint8_t *obp = out;
- unsigned lch = 0, ch = gch(in);
- if( ch ) {
- if( !is_opnr(ch) ) wnext(out, ch);
- while( (ch=gch(in)) != 0 ) {
- lch = ch; obp = out;
- wnext(out, ch);
+ unsigned lch = gch(in), rch = 1, ch = 0;
+ if( lch ) {
+ if( is_opnr(lch) ) {
+ for( uint8_t *ip=in; (ch=gch(ip))!=0; rch=ch );
+ if( lch == rch ) { lch = gch(in); rch = 0; }
}
- if( lch && is_opnr(lch) ) out = obp;
+ while( (ch=gch(in)) != 0 ) { wnext(out, lch); lch = ch; }
+ if( rch ) wnext(out, lch);
}
*out = 0;
}
+int brkput = 0;
+
// converts c++ string to c string text
static void xlat3(const char *cp, uint8_t *out)
{
}
wnext(out,'\\');
wnext(out, ch);
- if( ch == 'n' && *bp ) {
+ if( brkput && ch == 'n' && *bp ) {
wnext(out, '\"');
wnext(out, '\n');
wnext(out, '\"');
if( !fp ) return 0;
fputs((const char*)bp, fp);
fputc('\n',fp);
- return 1;
+ int n = 1;
+ while( *bp ) if( *bp++ == '\n' ) ++n;
+ return n;
}
static inline int bput(uint8_t *bp, FILE *fp)
{
while( bgets(ibfr, sizeof(ibfr), ifp) ) {
if( !prefix_is(ibfr, "msgid ") ) {
if( nocmts && ibfr[0] == '#' ) continue;
- bputs(ibfr, ofp); ++no;
+ no += bputs(ibfr, ofp);
continue;
}
uint8_t str[MX_STR]; xlat2(&ibfr[6], str);
fprintf(stderr, "file truncated line %d: %s", no, ibfr);
exit(1);
}
- bputs(ibfr, ofp); ++no;
+ no += bputs(ibfr, ofp);
while( tbfr[0] == '"' ) {
- bputs(tbfr, ofp); ++no;
+ no += bputs(tbfr, ofp);
xlat2(&tbfr[0], str); key.append((const char*)str);
if( !bgets(tbfr, sizeof(tbfr), ifp) ) {
fprintf(stderr, "file truncated line %d: %s", no, ibfr);
if( it == trans.end() || it->first.compare(key) ) {
fprintf(stderr, "no trans line %d: %s\n", no, ibfr);
xlat3(key.c_str(), &tbfr[7]);
- bputs(tbfr, ofp); ++no;
- bputs((uint8_t*)"#msgstr \"\"", ofp); ++no;
+ no += bputs(tbfr, ofp);
+ no += bputs((uint8_t*)"#msgstr \"\"", ofp);
}
- else if( !it->second.ok ) {
+ else if( 0 && !it->second.ok ) {
fprintf(stderr, "bad fmt line %d: %s\n", no, ibfr);
xlat3(it->first.c_str(), &tbfr[7]);
- bputs(tbfr, ofp); ++no;
+ no += bputs(tbfr, ofp);
xlat3(it->second.c_str(), str);
bput((uint8_t*)"#msgstr ", ofp);
- bputs(str, ofp); ++no;
+ no += bputs(str, ofp);
}
else {
xlat3(it->second.c_str(), &tbfr[7]);
- bputs(tbfr, ofp); ++no;
+ no += bputs(tbfr, ofp);
}
}
if( ifp != stdin ) fclose(ifp);
return 1;
}
+ brkput = 1;
for( int i=3; i<ac; ++i ) { // create trans mapping
fprintf(stderr,"*** load %s\n", av[i]);
char fn[MX_STR*2];