summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/util/levcomp.lpp
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2008-10-19 17:14:02 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2008-10-19 17:14:02 +0000
commitf4e39afa6adf820e02b5d95f66cf9314ca6c430d (patch)
treea7f46dea67db0f51ef151ccc486b77def621631b /crawl-ref/source/util/levcomp.lpp
parentbb9906c98711a8824bf041eaa79797d607cac60b (diff)
downloadcrawl-ref-f4e39afa6adf820e02b5d95f66cf9314ca6c430d.tar.gz
crawl-ref-f4e39afa6adf820e02b5d95f66cf9314ca6c430d.zip
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
Diffstat (limited to 'crawl-ref/source/util/levcomp.lpp')
-rw-r--r--crawl-ref/source/util/levcomp.lpp157
1 files changed, 106 insertions, 51 deletions
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;
}
+<KEYWORDS>{SPACE}*\\{SPACE}*\n ;
<KEYWORDS>[ \t]+ ;
<KEYWORDS>[ \t]*\r?\n { BEGIN(INITIAL); }
-<ITEM_LIST>[^, \t\r\n][^,\r\n]*[^, \t\r\n] {
- settext();
- return ITEM_INFO;
+<ITEM_LIST>[^,\ \t\r\n][^,\r\n]*\\{SPACE}*\n {
+ cattext(true, 1);
}
-<ITEM_LIST>[^, \t\r\n] {
- settext();
+<ITEM_LIST>{SPACE}*\\{SPACE}*\n ;
+
+<ITEM_LIST>[^, \t\r\n][^,\r\n]*[^, \t\r\n] {
+ cattext();
return ITEM_INFO;
}
-<ITEM_LIST>, return COMMA;
+<ITEM_LIST>, { clean(); return COMMA; }
<ITEM_LIST>[ \t]+ ;
<ITEM_LIST>[ \t]*\r?\n { BEGIN(INITIAL); }
<MNAME>[\ \t\r]*\n { BEGIN(INITIAL); }
-<MNAME>[^,\ \t\r\n][^,\r\n]+[^,\ \t\r\n] {
- settext();
+<MNAME>[^,\ \t\r\n][^,\r\n]*\\{SPACE}*\n {
+ cattext(true, 1);
+ }
+
+<MNAME>{SPACE}*\\{SPACE}*\n ;
+
+<MNAME>[^,\ \t\r\n][^,\r\n]*[^,\ \t\r\n] {
+ cattext();
return MONSTER_NAME;
}
-<MNAME>, return COMMA;
+<MNAME>, { clean(); return COMMA; }
<MNAME>[ \t\r]+ ;
+<ARGUMENT>{NSPACE}.*\\{SPACE}*\n {
+ cattext(true, 1);
+ }
+
+<ARGUMENT>{SPACE}*\\{SPACE}*\n ;
+
<ARGUMENT>{NSPACE}.*{NSPACE} {
- BEGIN(INITIAL);
- settext();
- return STRING;
+ cattext();
}
-<ARGUMENT>\r?\n { BEGIN(INITIAL); }
+<ARGUMENT>{SPACE}*$ { BEGIN(INITIAL); str_check(); return STRING; }
<TOEOL>.*\\[ \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;