Fix for line numbering bug (bug 613480).
[gedcom-parse.git] / gedcom / gedcom_lex_common.c
index d0d329cab5e031d81a20bcab027e8bed6384ada1..753df118e615e123a26d319c7b9b813010ecae0c 100644 (file)
@@ -136,10 +136,14 @@ static void error_unexpected_character(const char* str, char ch)
   gedcom_error(_("Unexpected character: '%s' (0x%02x)"), str, ch);
 }
 
+/* This is to bypass the iconv conversion (if the input is UTF-8 coming
+   from the program) */
+static int dummy_conv = 0;
+
 #elif LEX_SECTION == 2
 
 #define TO_INTERNAL(STR,OUTBUF) \
-  to_internal(STR, yyleng, OUTBUF, sizeof(OUTBUF))
+  (dummy_conv ? STR : to_internal(STR, yyleng, OUTBUF, sizeof(OUTBUF)))
 
 #define INIT_LINE_LEN \
   line_len = 0;
@@ -160,6 +164,7 @@ static void error_unexpected_character(const char* str, char ch)
     gedcom_lval.tag.string = TO_INTERNAL(yytext, tag_buf);                   \
     gedcom_lval.tag.value  = TAG_##THETAG;                                   \
     BEGIN(NORMAL);                                                           \
+    line_no++;                                                               \
     return TAG_##THETAG;                                                     \
   }
 
@@ -256,12 +261,14 @@ static void error_unexpected_character(const char* str, char ch)
 #define ACTION_ALPHANUM                                                       \
    { if (strlen(yytext) > MAXGEDCTAGLEN * encoding_width) {                   \
        error_tag_too_long(yytext);                                            \
+       line_no++;                                                             \
        return BADTOKEN;                                                       \
      }                                                                        \
      CHECK_LINE_LEN;                                                          \
      gedcom_lval.tag.string = TO_INTERNAL(yytext, tag_buf);                   \
      gedcom_lval.tag.value  = USERTAG;                                        \
      BEGIN(NORMAL);                                                           \
+     line_no++;                                                               \
      return USERTAG;                                                          \
    }
 
@@ -323,7 +330,6 @@ static void error_unexpected_character(const char* str, char ch)
 #define ACTION_TERMINATOR                                                     \
   { CHECK_LINE_LEN;                                                           \
     INIT_LINE_LEN;                                                            \
-    line_no++;                                                                \
     BEGIN(INITIAL);                                                           \
   }
 
@@ -398,6 +404,7 @@ void yymyinit(FILE *f)
   /* Reset our state */
   current_level = -1;
   level_diff = MAXGEDCLEVEL;
+  BEGIN(INITIAL);
 }
 
 #endif