Basic framework for recognizing Unicode encoding.
authorPeter Verthez <Peter.Verthez@advalvas.be>
Sun, 11 Nov 2001 17:39:41 +0000 (17:39 +0000)
committerPeter Verthez <Peter.Verthez@advalvas.be>
Sun, 11 Nov 2001 17:39:41 +0000 (17:39 +0000)
gedcom.h
gedcom.lex
standalone.c

index be18280b090811136bd28bbc2df59185f91f9cff..6f35d4eca12285f91fddcc9e112b7653b812b276 100644 (file)
--- a/gedcom.h
+++ b/gedcom.h
@@ -18,6 +18,13 @@ typedef enum _MECH {
   IGNORE_ERRORS
 } MECHANISM;
 
+/* Basic file encoding */
+typedef enum _ENC {
+  ONE_BYTE,
+  TWO_BYTE_HILO,
+  TWO_BYTE_LOHI
+} ENCODING;
+
 int        gedcom_error(char* s, ...);
 int        gedcom_warning(char* s, ...);
 int        gedcom_debug_print(char* s, ...);
@@ -27,3 +34,4 @@ void       gedcom_set_compat_handling(int enable_compat);
 int        gedcom_parse();
 int        gedcom_lex();
 extern int line_no;
+extern FILE *gedcom_in;
index 7d3f2e29b031901e89f50ba265462c6f4c4adaab..62fd3f6c82eca9d04426c2a2a6ea133b663ab24a 100644 (file)
@@ -301,7 +301,8 @@ else {
          }
         } 
 
-.  { gedcom_error("Unexpected character: '%s'", gedcom_text);
+.  { gedcom_error("Unexpected character: '%s' (0x%02x)",
+                 gedcom_text, gedcom_text[0]);
      return BADTOKEN;
    }
 
index 06ac82a63f8f409a157e115f9cde5468ea75d891..41c77524b3a99f9af453bd48f1c9250d401d02e9 100644 (file)
@@ -5,7 +5,8 @@
 
 void show_help ()
 {
-  printf("gedcom-parse test program for libgedcom\n");
+  printf("gedcom-parse test program for libgedcom\n\n");
+  printf("Usage:  gedcom-parse [options] file\n");
   printf("Options:\n");
   printf("  -h    Show this help text\n");
   printf("  -nc   Disable compatibility mode\n");
@@ -16,11 +17,72 @@ void show_help ()
   printf("  -da   Debug setting: libgedcom + yacc debug messages\n");
 }
 
+int determine_encoding(FILE* f)
+{
+  char first[2];
+
+  fread(first, 1, 2, f);
+  if ((first[0] == '0') && (first[1] == ' ')) {
+    gedcom_warning("One-byte encoding");
+    fseek(f, 0, 0);
+    return ONE_BYTE;
+  }
+  else if ((first[0] == '\0') && (first[1] == '0'))
+  {
+    gedcom_warning("Two-byte encoding, high-low");
+    fseek(f, 0, 0);
+    return TWO_BYTE_HILO;
+  }
+  else if ((first[0] == '\xFE') && (first[1] == '\xFF'))
+  {
+    gedcom_warning("Two-byte encoding, high-low, with BOM");
+    return TWO_BYTE_HILO;
+  }
+  else if ((first[0] == '0') && (first[1] == '\0'))
+  {
+    gedcom_warning("Two-byte encoding, low-high");
+    fseek(f, 0, 0);
+    return TWO_BYTE_LOHI;
+  }
+  else if ((first[0] == '\xFF') && (first[1] == '\xFE'))
+  {
+    gedcom_warning("Two-byte encoding, low-high, with BOM");
+    return TWO_BYTE_LOHI;
+  }
+  else {
+    gedcom_warning("Unknown encoding, falling back to one-byte");
+    fseek(f, 0, 0);
+    return ONE_BYTE;
+  }
+}
+
+int gedcom_xxx_parse(char* file_name)
+{
+  ENCODING enc;
+  FILE* file = fopen (file_name, "r");
+  if (!file) {
+    printf("Could not open file '%s'\n", file_name);
+    exit(1);
+  }
+  enc = determine_encoding(file);
+
+  if (enc == ONE_BYTE) {
+    gedcom_in = file;
+    return gedcom_parse();
+  }
+  else {
+    printf("No parser yet for encoding\n");
+    exit(1);
+  }
+}
+
 int main(int argc, char* argv[])
 {
   MECHANISM mech = IMMED_FAIL;
   int compat_enabled = 1;
   int debug_level = 0;
+  char* file_name = NULL;
+
   if (argc > 1) {
     int i;
     for (i=1; i<argc; i++) {
@@ -40,6 +102,10 @@ int main(int argc, char* argv[])
        show_help();
        exit(1);
       }
+      else if (strncmp(argv[i], "-", 1)) {
+       file_name = argv[i];
+       break;
+      }
       else {
        printf ("Unrecognized option: %s\n", argv[i]);
        show_help();
@@ -47,17 +113,25 @@ int main(int argc, char* argv[])
       }
     }
   }
+  
+  if (!file_name) {
+    printf("No file name given\n");
+    show_help();
+    exit(1);
+  }
+
   gedcom_set_debug_level(debug_level);
   gedcom_set_compat_handling(compat_enabled);
   gedcom_set_error_handling(mech);
-  if (gedcom_parse() == 0) {
+  
+  if (gedcom_xxx_parse(file_name) == 0) {
     printf("Parse succeeded\n");
     return 0;
   }
   else {
     printf("Parse failed\n");
     return 1;
-  }
+  }  
 }
 
 int gedcom_warning(char* s, ...)