Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / po / nlx.c
diff --git a/cinelerra-5.1/po/nlx.c b/cinelerra-5.1/po/nlx.c
new file mode 100644 (file)
index 0000000..fb68892
--- /dev/null
@@ -0,0 +1,243 @@
+#include <stdio.h>
+#include <string.h>
+#include <libintl.h>
+
+#define _(s) gettext(s)
+#define gettext_noop(s) s
+#define N_(s) gettext_noop(s)
+
+int lastch = 0;
+int linenum = 0;
+int start_line = 1;
+int in_quote = 0;
+
+#define BFRSZ 4096
+char bfr[BFRSZ], *bp = 0;
+char sym[BFRSZ];
+char sep[BFRSZ];
+char str[BFRSZ];
+
+FILE *ifp = 0, *ofp = 0;
+
+int ngetc()
+{
+  if( lastch < 0 ) return -1;
+  if ((lastch=getc(ifp)) == '\n') linenum++;
+  return lastch;
+}
+
+void nungetc(int c)
+{
+  if( c < 0 ) return;
+  if( c == '\n' ) --linenum;
+  ungetc(c, ifp);
+}
+
+// return uncommented char
+int cch()
+{
+  for(;;) {
+    int c = ngetc();
+    if( in_quote ||  c != '/' ) return c;
+    c = ngetc();
+    switch(c) {
+    case '*':
+      *bp++ = '/';  *bp++ = '*';
+      c = ' ';
+      for(;;) {
+        int ch = c;  c = ngetc();
+        if( c < 0 ) return c;
+        *bp++ = c;
+        if( ch == '*' && c == '/') break;
+      }
+      continue;
+    case '/':
+      *bp++ = '/';  *bp++ = '/';
+      for(;;) {
+        c = ngetc();
+        if( c < 0 ) return c;
+        *bp++ = c;
+        if( c == '\n') break;
+      }
+      continue;
+    default:
+      nungetc(c);
+      return '/';
+    }
+  }
+}
+
+// skip preprocessor lines
+int nch()
+{
+  int c = 0;
+  for(;;) {
+    int ch = c;  c = cch();
+    if( c < 0 ) return c;
+    if( !start_line || c != '#' ) break;
+    do {
+      *bp++ = c;
+      ch = c;  c = ngetc();
+      if( c < 0 ) return c;
+    } while( c != '\n' || ch == '\\' );
+    *bp++ = c;
+  }
+  start_line = c == '\n' ? 1 : 0;
+  return c;
+}
+
+int is_idch(int c)
+{
+  if( c < '0' ) return 0;
+  if( c <= '9' ) return 1;
+  if( c < 'A' ) return 0;
+  if( c <= 'Z' ) return 1;
+  if( c == '_' ) return 1;
+  if( c < 'a' ) return 0;
+  if( c <= 'z' ) return 1;
+  return 0;
+}
+
+int is_ws(int c)
+{
+  if( c <= ' ' ) return 1;
+  return 0;
+}
+
+// scan next seperator + symbol
+int nsym()
+{
+  int c = nch();
+  if( c < 0 ) return c;
+  if( c == '\"' || c == '\'' ) return c;
+  nungetc(c);
+  char *sp = sym;
+  for(;;) {
+    c = nch();
+    if( c < 0 ) return c;
+    if( c == '"' || c == '\'' ) break;
+    if( !is_idch(c) ) break;
+    *bp++ = c;
+    *sp++ = c;
+  }
+  *sp = 0;
+  nungetc(c);
+  sp = sep;
+  for(;;) {
+    c = nch();
+    if( c < 0 ) return c;
+    if( c == '\"' || c == '\'' ) break;
+    if( is_idch(c) ) break;
+    *bp++ = c;
+    if( !is_ws(c) )
+      *sp++ = c;
+  }
+  *sp = 0;
+  nungetc(c);
+  return 0;
+}
+
+// sym has preceeding symbol string
+// sep has non-ws seperator string
+// bfr has "string" in it
+int need_nl()
+{
+  if( strlen(bfr) < 2 ) return 0;
+  if( !strcmp(sym,"_") && !strcmp(sep,"(") ) return 0;
+// add protected names here
+  if( !strcmp(sym,"get") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"get_property") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"set_property") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"set_title") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"title_is") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"GET_DEFAULT") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"UPDATE_DEFAULT") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"TRACE") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"lock") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"unlock") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"lock_window") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"unlock_window") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"update") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"new_image") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"get_image") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"get_image_set") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"Mutex") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"SceneNode") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"Garbage") && !strcmp(sep,"(") ) return 0;
+  if( !strcmp(sym,"dbmsg") && !strcmp(sep,"(") ) return 0;
+  if( strstr(bfr, "::") || !strncmp(bfr, "/dev/", 5) ) return 0;
+  if( !strcmp(bfr,"toc") || !strcmp(bfr,".toc") ) return 0;
+  if( !strcmp(bfr,"idx") || !strcmp(bfr,".idx") ) return 0;
+  if( !strcmp(bfr,"ads") || !strcmp(bfr,".ads") ) return 0;
+  char *bp;
+  for( bp=bfr; *bp; ++bp ) {
+    if( is_ws(*bp) ) continue;
+    if( *bp == '\\' ) { ++bp;  continue; }
+    if( *bp != '%' ) break;
+    while( bp[1] && !strchr("diojxXeEfFgFaAcsCSpnm%",*++bp) );
+  }
+  if( !*bp ) return 0;
+  return 1;
+}
+
+int main(int ac, char **av)
+{
+  int c;
+  ifp = stdin;
+  ofp = stdout;
+  for(;;) {
+    bp = &bfr[0];  *bp = 0;
+    c = nsym();
+    *bp = 0;
+    if( c < 0 ) break;
+    fputs(bfr, ofp);
+    bp = &bfr[0];  *bp = 0;
+    if( c == '\"' ) {
+      in_quote = c;
+      while( (c=nch()) >= 0 ) {
+        if( c == in_quote ) break;
+        if( c == '\\' ) {
+          *bp++ = c;  c = nch();
+          if( c < 0 ) break;
+        }
+        *bp++ = c;
+      }
+      in_quote = 0;
+      *bp = 0;
+      if( c < 0 ) break;
+      int do_nl = need_nl();
+      if( do_nl ) {
+        fputc('_', ofp);
+        fputc('(', ofp);
+      }
+      fputc('"', ofp);
+      fputs(bfr, ofp);
+      fputc('"', ofp);
+      if( do_nl ) {
+        fputc(')', ofp);
+      }
+    }
+    else if( c == '\'' ) {
+      in_quote = c;
+      while( (c=nch()) >= 0 ) {
+        if( c == in_quote ) break;
+        if( c == '\\' ) {
+          *bp++ = c;  c = nch();
+          if( c < 0 ) break;
+        }
+        *bp++ = c;
+      }
+      in_quote = 0;
+      *bp = 0;
+      fputc('\'', ofp);
+      fputs(bfr, ofp);
+      fputc('\'', ofp);
+      if( c < 0 ) break;
+    }
+    else
+      continue;
+  }
+  fputs(bfr, ofp);
+  return 0;
+}
+