add xlat.C dups options, change csv to list
[goodguy/history.git] / cinelerra-5.1 / po / xlat.C
index 67701bb9875ee155e9fc67bf3a1a95adb36f16c2..716dfc968ea02cbdf5dc0a6ea3a822abff49cc62 100644 (file)
@@ -141,6 +141,11 @@ static void xlat3(const char *cp, uint8_t *out)
     }
     wnext(out,'\\');
     wnext(out, ch);
+    if( ch == 'n' && *bp ) {
+      wnext(out, '\"');
+      wnext(out, '\n');
+      wnext(out, '\"');
+    }
   }
   wnext(out, '\"');
   wnext(out, 0);
@@ -215,6 +220,8 @@ static inline int bput(uint8_t *bp, FILE *fp)
   return 1;
 }
 
+static bool goog = false;
+static bool nocmts = false;
 
 static inline bool is_nlin(unsigned ch, uint8_t *bp)
 {
@@ -320,13 +327,14 @@ static bool chkfmt(int no, uint8_t *ap, uint8_t *bp, uint8_t *cp)
   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;
@@ -337,17 +345,19 @@ static bool chkfmt(int no, uint8_t *ap, uint8_t *bp, uint8_t *cp)
     }
     // 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);
@@ -355,22 +365,29 @@ static bool chkfmt(int no, uint8_t *ap, uint8_t *bp, uint8_t *cp)
     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 {
@@ -437,6 +454,7 @@ void scan_po(FILE *ifp, FILE *ofp)
 
   while( bgets(ibfr, sizeof(ibfr), ifp) ) {
     if( !prefix_is(ibfr, "msgid ") ) {
+      if( nocmts && ibfr[0] == '#' ) continue;
       bputs(ibfr, ofp);  ++no;
       continue;
     }
@@ -491,7 +509,7 @@ void scan_po(FILE *ifp, FILE *ofp)
   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;
@@ -528,8 +546,15 @@ void list_po(FILE *ifp, FILE *ofp)
       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);
@@ -540,11 +565,13 @@ void list_po(FILE *ifp, FILE *ofp)
 
 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);
 }
 
@@ -552,15 +579,31 @@ int main(int ac, char **av)
 {
   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;