Release 0.3
authorPeter Verthez <Peter.Verthez@advalvas.be>
Sun, 4 Nov 2001 13:36:40 +0000 (13:36 +0000)
committerPeter Verthez <Peter.Verthez@advalvas.be>
Sun, 4 Nov 2001 13:36:40 +0000 (13:36 +0000)
ChangeLog
Makefile
gedcom.h
gedcom.lex
standalone.c

index ec928dd20bbe49d012661c9a1855af146ba48bc1..7ed52124ee561d509c402d37490ebbfd18a24d82 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2001-11-04  Peter Verthez  <Peter.Verthez@advalvas.be>
+
+       * release 0.3
+
+       * Compatibility mode implemented.
+
 2001-11-01  Peter Verthez  <Peter.Verthez@advalvas.be>
 
        * release 0.2
index 737ba42c068430686d1eb522196773136b0d8875..a0ca68a43b05f52a477724d01a50b41ddb55e4a0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,8 @@
 # $Id$
 # $Name$
 
+CFLAGS=-Wall -pedantic
+
 gedcom_parse:  standalone.o lex.gedcom_.o gedcom.tab.o
        cc standalone.o lex.gedcom_.o gedcom.tab.o -o gedcom_parse
 
index 742473c09eba5640ce9b3c9049345a464f8d2097..2dc43b6e25ab1737d592ada11af0743ad4ab55b9 100644 (file)
--- a/gedcom.h
+++ b/gedcom.h
@@ -3,8 +3,11 @@
 #include <stdarg.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
 
-#define MAXGEDCOMLEVEL 99
+#define MAXGEDCLEVEL 99
+#define MAXGEDCLINELEN 256
+#define MAXGEDCTAGLEN 31
 #define MAXSTDTAGLENGTH 4
 #define GEDCOMTAGOFFSET 257
 
@@ -16,7 +19,11 @@ typedef enum _MECH {
 } MECHANISM;
 
 int        gedcom_error(char* s, ...);
+int        gedcom_warning(char* s, ...);
+int        gedcom_debug_print(char* s, ...);
 void       gedcom_enable_debug();
 void       gedcom_set_error_handling(MECHANISM mechanism);
+void       gedcom_set_compat_handling(int enable_compat);
 int        gedcom_parse();
+int        gedcom_lex();
 extern int line_no;
index 76bce78db446f9c7e87830610a42581a08ecd087..7d3f2e29b031901e89f50ba265462c6f4c4adaab 100644 (file)
@@ -29,7 +29,7 @@ pointer      @{alphanum}{non_at}+@
 
 %{
 int current_level=-1;
-int level_diff=MAXGEDCOMLEVEL;
+int level_diff=MAXGEDCLEVEL;
 int line_no=1;
 %} 
 
@@ -71,6 +71,8 @@ int line_no=1;
        that returns "pending" tokens. */
 
 %{
+char string_buf[MAXGEDCLINELEN+1];
 if (level_diff < 1) {
   level_diff++;
   return CLOSE;
@@ -82,10 +84,12 @@ else if (level_diff == 1) {
 else {
   /* out of brackets... */
 }
-#define MKTAGACTION(tag)  { gedcom_lval.string = gedcom_text; \
-                            BEGIN(NORMAL); \
-                            return TAG_##tag; } 
+
+#define MKTAGACTION(tag) \
+  { gedcom_lval.string = gedcom_text; \
+    BEGIN(NORMAL); \
+    return TAG_##tag; }
+
 %}
 
 <INITIAL>{gen_delim}* /* ignore leading whitespace (also tabs) */
@@ -95,9 +99,9 @@ else {
                    }
 
 <INITIAL>{digit}+ { int level = atoi(gedcom_text);
-                    if ((level < 0) || (level > MAXGEDCOMLEVEL)) {
+                    if ((level < 0) || (level > MAXGEDCLEVEL)) {
                      gedcom_error ("Level number out of range [0..%d]",
-                                   MAXGEDCOMLEVEL);
+                                   MAXGEDCLEVEL);
                      return BADTOKEN;
                    }
                     level_diff = level - current_level;
@@ -250,8 +254,13 @@ else {
 <EXPECT_TAG>WIFE  MKTAGACTION(WIFE)
 <EXPECT_TAG>WILL  MKTAGACTION(WILL)
      
-<EXPECT_TAG>{alphanum}+ { gedcom_lval.string = gedcom_text;
-                          BEGIN(NORMAL);
+<EXPECT_TAG>{alphanum}+ { if (strlen(gedcom_text) > MAXGEDCTAGLEN) {
+                            gedcom_error("Tag '%s' too long, max %d chars");
+                            return BADTOKEN;
+                          }
+                          strncpy(string_buf, gedcom_text, MAXGEDCTAGLEN+1);
+                         gedcom_lval.string = string_buf;
+                         BEGIN(NORMAL);
                          return USERTAG;
                         }
 
index 7e9abc451fec0ab839365821c44012765047a740..c54d46debb53d3a4c9e8624d6120c9a9e9c104f3 100644 (file)
@@ -6,6 +6,7 @@
 int main(int argc, char* argv[])
 {
   MECHANISM mech = IMMED_FAIL;
+  int compat_enabled = 1;
   if (argc > 1) {
     int i;
     for (i=1; i<argc; i++) {
@@ -17,21 +18,54 @@ int main(int argc, char* argv[])
        mech = DEFER_FAIL;
       else if (!strncmp(argv[i], "-fn", 3))
        mech = IGNORE_ERRORS;
+      else if (!strncmp(argv[i], "-nc", 3))
+       compat_enabled = 0;
       else {
        printf ("Unrecognized option: %s\n", argv[i]);
        exit(1);
       }
     }
   }
+  gedcom_set_compat_handling(compat_enabled);
   gedcom_set_error_handling(mech);
   if (gedcom_parse() == 0) {
     printf("Parse succeeded\n");
+    return 0;
   }
   else {
     printf("Parse failed\n");
+    return 1;
   }
 }
 
+int gedcom_debug_print(char* s, ...)
+{
+  int res;
+#if YYDEBUG != 0
+  if (gedcom_debug) {
+    va_list ap;
+    va_start(ap, s);
+    res = vfprintf(stderr, s, ap);
+    va_end(ap);
+  }
+#endif
+  return(res);
+}
+
+int gedcom_warning(char* s, ...)
+{
+  int res;
+  va_list ap;
+
+  va_start(ap, s);
+  fprintf(stderr, "Warning on line %d: ", line_no);
+  res = vfprintf(stderr, s, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+  
+  return res;
+}
+
 int gedcom_error(char* s, ...)
 {
   int res;