From f4e39afa6adf820e02b5d95f66cf9314ca6c430d Mon Sep 17 00:00:00 2001 From: dshaligram Date: Sun, 19 Oct 2008 17:14:02 +0000 Subject: Allow continuation lines in .des files (dpeg). git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7283 c06c8d41-db1a-0410-9941-cceddc491573 --- crawl-ref/source/util/levcomp.lpp | 157 +++++++++++++++++++++++++------------- 1 file changed, 106 insertions(+), 51 deletions(-) (limited to 'crawl-ref/source/util/levcomp.lpp') diff --git a/crawl-ref/source/util/levcomp.lpp b/crawl-ref/source/util/levcomp.lpp index 6247c611ca..42297b5016 100644 --- a/crawl-ref/source/util/levcomp.lpp +++ b/crawl-ref/source/util/levcomp.lpp @@ -40,26 +40,34 @@ static void clean() alloced = false; } +// Enter a new state, first clearing yylval of junk. +#define CBEGIN(x) do { BEGIN(x); clean(); } while (0) + +static void post_proc_text(char *text, bool trim_right, int strip_trailing) +{ + char *s = NULL; + if (trim_right) + { + s = text + strlen(text) - 1; + while (s >= text && isspace(*s)) + *s-- = 0; + } + if (strip_trailing) + { + if (!s) + s = text + strlen(text) - 1; + while (s >= text && --strip_trailing >= 0) + *s-- = 0; + } +} + static char *copy_text(bool trim_right, int strip_trailing) { char *newstring = NULL; if ((yylval.text = newstring = strdup(yytext))) { alloced = true; - char *s = NULL; - if (trim_right) - { - s = newstring + strlen(newstring) - 1; - while (isspace(*s) && s >= newstring) - *s-- = 0; - } - if (strip_trailing) - { - if (!s) - s = newstring + strlen(newstring) - 1; - while (s >= newstring && --strip_trailing >= 0) - *s-- = 0; - } + post_proc_text(newstring, trim_right, strip_trailing); } return (newstring); } @@ -71,6 +79,40 @@ static void settext(bool trim_right = false, int strip_trailing = 0) yylval.text = newstring; } +static void str_check() +{ + if (!yylval.text) + { + char *buf = (char *) malloc(1); + if (buf) + { + yylval.text = buf; + *buf = 0; + alloced = true; + } + } +} + +static void cattext(bool trim_right = false, int strip_trailing = 0) +{ + if (!yylval.text) + settext(trim_right, strip_trailing); + else + { + bool was_alloced = alloced; + char *newbuf = (char*) malloc(strlen(yylval.text) + strlen(yytext) + 1); + if (!newbuf) + end(1, "Out of memory"); + alloced = true; + strcpy(newbuf, yylval.text); + strcat(newbuf, yytext); + post_proc_text(newbuf, trim_right, strip_trailing); + if (was_alloced) + free((void*) yylval.text); + yylval.text = newbuf; + } +} + %} %x MAPDEF @@ -86,6 +128,7 @@ static void settext(bool trim_right = false, int strip_trailing = 0) %option never-interactive NSPACE [^\ \t\r\n] +SPACE [\ \t\r] %% @@ -125,40 +168,52 @@ NSPACE [^\ \t\r\n] return STRING; } +{SPACE}*\\{SPACE}*\n ; [ \t]+ ; [ \t]*\r?\n { BEGIN(INITIAL); } -[^, \t\r\n][^,\r\n]*[^, \t\r\n] { - settext(); - return ITEM_INFO; +[^,\ \t\r\n][^,\r\n]*\\{SPACE}*\n { + cattext(true, 1); } -[^, \t\r\n] { - settext(); +{SPACE}*\\{SPACE}*\n ; + +[^, \t\r\n][^,\r\n]*[^, \t\r\n] { + cattext(); return ITEM_INFO; } -, return COMMA; +, { clean(); return COMMA; } [ \t]+ ; [ \t]*\r?\n { BEGIN(INITIAL); } [\ \t\r]*\n { BEGIN(INITIAL); } -[^,\ \t\r\n][^,\r\n]+[^,\ \t\r\n] { - settext(); +[^,\ \t\r\n][^,\r\n]*\\{SPACE}*\n { + cattext(true, 1); + } + +{SPACE}*\\{SPACE}*\n ; + +[^,\ \t\r\n][^,\r\n]*[^,\ \t\r\n] { + cattext(); return MONSTER_NAME; } -, return COMMA; +, { clean(); return COMMA; } [ \t\r]+ ; +{NSPACE}.*\\{SPACE}*\n { + cattext(true, 1); + } + +{SPACE}*\\{SPACE}*\n ; + {NSPACE}.*{NSPACE} { - BEGIN(INITIAL); - settext(); - return STRING; + cattext(); } -\r?\n { BEGIN(INITIAL); } +{SPACE}*$ { BEGIN(INITIAL); str_check(); return STRING; } .*\\[ \t\r]*$ { settext(true, 1); @@ -185,32 +240,32 @@ NSPACE [^\ \t\r\n] ^[ \t]*veto[ \t]*\{\{ { BEGIN(LUA); return VETO; } -NAME: { BEGIN(ARGUMENT); return NAME; } -default-depth: { BEGIN(ARGUMENT); return DEFAULT_DEPTH; } -DEPTH: { BEGIN(ARGUMENT); return DEPTH; } -ORIENT: { BEGIN(ARGUMENT); return ORIENT; } -PLACE: { BEGIN(ARGUMENT); return PLACE; } -WELCOME: { BEGIN(ARGUMENT); return WELCOME; } +NAME: { CBEGIN(ARGUMENT); return NAME; } +default-depth: { CBEGIN(ARGUMENT); return DEFAULT_DEPTH; } +DEPTH: { CBEGIN(ARGUMENT); return DEPTH; } +ORIENT: { CBEGIN(ARGUMENT); return ORIENT; } +PLACE: { CBEGIN(ARGUMENT); return PLACE; } +WELCOME: { CBEGIN(ARGUMENT); return WELCOME; } CHANCE: return CHANCE; WEIGHT: return CHANCE; -FLAGS: { BEGIN(KEYWORDS); return TAGS; } -TAGS: { BEGIN(KEYWORDS); return TAGS; } -LFLAGS: { BEGIN(ARGUMENT); return LFLAGS; } -BFLAGS: { BEGIN(ARGUMENT); return BFLAGS; } -SUBST: { BEGIN(ITEM_LIST); return SUBST; } -NSUBST: { BEGIN(ITEM_LIST); return NSUBST; } -COLOUR: { BEGIN(ITEM_LIST); return COLOUR; } -FLOORCOL: { BEGIN(ARGUMENT); return FLOORCOL; } -ROCKCOL: { BEGIN(ARGUMENT); return ROCKCOL; } -MONS: { BEGIN(MNAME); return MONS; } -ITEM: { BEGIN(ITEM_LIST); return ITEM; } -MARKER: { BEGIN(TOEOL); return MARKER; } -SHUFFLE: { BEGIN(ITEM_LIST); return SHUFFLE; } - -KFEAT: { BEGIN(ARGUMENT); return KFEAT; } -KITEM: { BEGIN(ARGUMENT); return KITEM; } -KMONS: { BEGIN(ARGUMENT); return KMONS; } -KMASK: { BEGIN(ARGUMENT); return KMASK; } +FLAGS: { CBEGIN(KEYWORDS); return TAGS; } +TAGS: { CBEGIN(KEYWORDS); return TAGS; } +LFLAGS: { CBEGIN(ARGUMENT); return LFLAGS; } +BFLAGS: { CBEGIN(ARGUMENT); return BFLAGS; } +SUBST: { CBEGIN(ITEM_LIST); return SUBST; } +NSUBST: { CBEGIN(ITEM_LIST); return NSUBST; } +COLOUR: { CBEGIN(ITEM_LIST); return COLOUR; } +FLOORCOL: { CBEGIN(ARGUMENT); return FLOORCOL; } +ROCKCOL: { CBEGIN(ARGUMENT); return ROCKCOL; } +MONS: { CBEGIN(MNAME); return MONS; } +ITEM: { CBEGIN(ITEM_LIST); return ITEM; } +MARKER: { CBEGIN(TOEOL); return MARKER; } +SHUFFLE: { CBEGIN(ITEM_LIST); return SHUFFLE; } + +KFEAT: { CBEGIN(ARGUMENT); return KFEAT; } +KITEM: { CBEGIN(ARGUMENT); return KITEM; } +KMONS: { CBEGIN(ARGUMENT); return KMONS; } +KMASK: { CBEGIN(ARGUMENT); return KMASK; } , return COMMA; -- cgit v1.2.3-54-g00ecf