}
wnext(out,'\\');
wnext(out, ch);
+ if( ch == 'n' && *bp ) {
+ wnext(out, '\"');
+ wnext(out, '\n');
+ wnext(out, '\"');
+ }
}
wnext(out, '\"');
wnext(out, 0);
return 1;
}
+static bool goog = false;
+static bool nocmts = false;
static inline bool is_nlin(unsigned ch, uint8_t *bp)
{
uint8_t *bep = bp;
unsigned bpr = 0, bch = wnext(bp);
for( ; bch!=0; bch=wnext(bp) ) {
- if( is_opnr(bch) ) ++n;
+ if( goog && is_opnr(bch) ) ++n;
bep = bp; bpr = bch;
}
+
// trim solitary opnrs on ends b
- if( n != 1 || !is_opnr(bpr) ) bep = bp;
+ if( goog && ( n != 1 || !is_opnr(bpr) ) ) bep = bp;
bp = bsp; bch = wnext(bp);
- if( n == 1 && is_opnr(bch) ) bch = wnext(bp);
+ if( goog && ( n == 1 && is_opnr(bch) ) ) bch = wnext(bp);
unsigned apr = 0, ach = wnext(ap);
apr = bpr = 0;
}
// move to % on b
while( bch != 0 && !is_per(bch) ) {
- if( is_nlin(bch, bp) ) {
- bch = '\n'; bp += 3;
- }
- else if( is_ccln(bch, bp) ) {
- wnext(cp, bch=':'); bp += 3;
- }
- else if( is_quot(bch, bp) ) {
- bch = '\"'; bp += 3;
- }
- else if( is_colon(bch) ) {
- bch = ':';
+ if( goog ) { // google xlat recoginizers
+ if( is_nlin(bch, bp) ) {
+ bch = '\n'; bp += 3;
+ }
+ else if( is_ccln(bch, bp) ) {
+ wnext(cp, bch=':'); bp += 3;
+ }
+ else if( is_quot(bch, bp) ) {
+ bch = '\"'; bp += 3;
+ }
+ else if( is_colon(bch) ) {
+ bch = ':';
+ }
}
wnext(cp,bch); bpr = bch;
bch = bp >= bep ? 0 : wnext(bp);
if( !ach || !bch ) break;
// if % on a and % on b and is fmt_spec
if( is_per(ach) && is_per(bch) && (n=fmt_spec(ap)) > 0 ) {
- if( apr != bpr ) wnext(cp,apr);
+ if( apr && apr != bpr ) wnext(cp,apr);
wnext(cp,ach); apr = ach; ach = wnext(ap);
// copy format data from a
while( ach != 0 && --n >= 0 ) {
wnext(cp, ach); apr = ach; ach = wnext(ap);
}
bpr = bch; bch = bp >= bep ? 0 : wnext(bp);
- // skip format data from b (ignore case)
- while( bch != 0 && ((bpr ^ apr) & ~('a'-'A')) ) {
+ if( apr == '%' && bch == '%' ) {
+ // copy %% format data from b
bpr = bch;
bch = bp >= bep ? 0 : wnext(bp);
}
- // hit eol and didn't find end of spec on b
- if( !bch && !((bpr ^ apr) & ~('a'-'A')) ) {
- fprintf(stderr, "line %d: missed spec: %s\n", no, (char*)asp);
- ret = false;
+ else {
+ // skip format data from b (ignore case)
+ while( bch != 0 && ((bpr ^ apr) & ~('a'-'A')) ) {
+ bpr = bch;
+ bch = bp >= bep ? 0 : wnext(bp);
+ }
+ // hit eol and didn't find end of spec on b
+ if( !bch && ((bpr ^ apr) & ~('a'-'A')) != 0 ) {
+ fprintf(stderr, "line %d: missed spec: %s\n", no, (char*)asp);
+ ret = false;
+ }
}
}
else {
while( bgets(ibfr, sizeof(ibfr), ifp) ) {
if( !prefix_is(ibfr, "msgid ") ) {
+ if( nocmts && ibfr[0] == '#' ) continue;
bputs(ibfr, ofp); ++no;
continue;
}
if( ifp != stdin ) fclose(ifp);
}
-void list_po(FILE *ifp, FILE *ofp)
+void list_po(FILE *ifp, FILE *ofp, int xeqx = 0, int nnul = 0)
{
int no = 0;
int dup = 0, nul = 0;
xlat2(&tbfr[0], str); txt.append((const char*)str);
++no;
}
- if( !txt.size() ) { ++nul; continue; }
- if( !key.compare(txt) ) { ++dup; continue; }
+ if( nnul && !txt.size() ) {
+ ++nul;
+ if( nnul > 0 ) continue;
+ }
+ else if( xeqx && !key.compare(txt) ) {
+ ++dup;
+ if( xeqx > 0 ) continue;
+ }
+ else if( nnul < 0 || xeqx < 0 ) continue;
xlat4(key.c_str(), str);
fprintf(ofp, "%s,", (char *)str);
xlat4(txt.c_str(), str);
static void usage(const char *av0)
{
- printf("test csv %s csv < data.csv\n",av0);
- printf("test po %s po < data.po\n",av0);
- printf("get strings %s key < xgettext.po\n",av0);
- printf("gen xlation %s xlat < xgettext.po xlat.csv\n",av0);
- printf("gen xlation %s xlat < xgettext.po text,xlat ...\n",av0);
+ printf("list csv %s csv < data.csv > data.po\n",av0);
+ printf("list po %s po < data.po > data.csv\n",av0);
+ printf("list po %s dups < data.po\n",av0);
+ printf("list po %s nodups < data.po\n",av0);
+ printf("get strings %s key < xgettext.po\n",av0);
+ printf("gen xlation %s xlat xgettext.po xlat.csv\n",av0);
+ printf("gen xlation %s xlat - text,xlat ... < xgettext.po\n",av0);
exit(1);
}
{
if( ac == 1 ) usage(av[0]);
+ // if to rework google xlat output
+ if( getenv("GOOG") ) goog = true;
+ if( getenv("NOCMTS") ) nocmts = true;
+
if( !strcmp(av[1],"csv") ) { // test csv
load(stdin, 0);
for( Trans::iterator it = trans.begin(); it!=trans.end(); ++it ) {
- uint8_t str[MX_STR]; xlat3(it->second.c_str(), str);
- printf("key = \"%s\", val = %s\n", it->first.c_str(), (char *)str);
+ uint8_t str1[MX_STR]; xlat3(it->first.c_str(), str1);
+ printf("msgid %s\n", (char *)str1);
+ uint8_t str2[MX_STR]; xlat3(it->second.c_str(), str2);
+ printf("msgstr %s\n\n", (char *)str2);
}
return 0;
}
+ if( !strcmp(av[1],"dups") ) { // test po
+ list_po(stdin, stdout, -1, -1);
+ return 0;
+ }
+
+ if( !strcmp(av[1],"nodups") ) { // test po
+ list_po(stdin, stdout, 1, 1);
+ return 0;
+ }
+
if( !strcmp(av[1],"po") ) { // test po
list_po(stdin, stdout);
return 0;