dlugolecki.net.pl
Dziennik
Polecane
Software
projects
/
gedcom-parse.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Basic framework for recognizing Unicode encoding.
[gedcom-parse.git]
/
gedcom.lex
diff --git
a/gedcom.lex
b/gedcom.lex
index 76bce78db446f9c7e87830610a42581a08ecd087..62fd3f6c82eca9d04426c2a2a6ea133b663ab24a 100644
(file)
--- a/
gedcom.lex
+++ b/
gedcom.lex
@@
-29,7
+29,7
@@
pointer @{alphanum}{non_at}+@
%{
int current_level=-1;
%{
int current_level=-1;
-int level_diff=MAXGEDC
OM
LEVEL;
+int level_diff=MAXGEDCLEVEL;
int line_no=1;
%}
int line_no=1;
%}
@@
-71,6
+71,8
@@
int line_no=1;
that returns "pending" tokens. */
%{
that returns "pending" tokens. */
%{
+char string_buf[MAXGEDCLINELEN+1];
+
if (level_diff < 1) {
level_diff++;
return CLOSE;
if (level_diff < 1) {
level_diff++;
return CLOSE;
@@
-82,10
+84,12
@@
else if (level_diff == 1) {
else {
/* out of brackets... */
}
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) */
%}
<INITIAL>{gen_delim}* /* ignore leading whitespace (also tabs) */
@@
-95,9
+99,9
@@
else {
}
<INITIAL>{digit}+ { int level = atoi(gedcom_text);
}
<INITIAL>{digit}+ { int level = atoi(gedcom_text);
- if ((level < 0) || (level > MAXGEDC
OM
LEVEL)) {
+ if ((level < 0) || (level > MAXGEDCLEVEL)) {
gedcom_error ("Level number out of range [0..%d]",
gedcom_error ("Level number out of range [0..%d]",
- MAXGEDC
OM
LEVEL);
+ MAXGEDCLEVEL);
return BADTOKEN;
}
level_diff = level - current_level;
return BADTOKEN;
}
level_diff = level - current_level;
@@
-250,8
+254,13
@@
else {
<EXPECT_TAG>WIFE MKTAGACTION(WIFE)
<EXPECT_TAG>WILL MKTAGACTION(WILL)
<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;
}
return USERTAG;
}
@@
-292,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;
}
return BADTOKEN;
}