git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7283 c06c8d41-db1a-0410-9941-cceddc491573
RZHJQU3Y6KKMNJKGL6P4IXBJTKWFO4YARAQSWYCETXXNSZG4BN7QC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
OXPTBYASN6QO2YOIVXNSRHD66PMLQEORLUK7AEEEMHKOOYRNEL2AC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
7Y5HSDFKA5TPLS2TWTRFMQVX6UXUDHXU5MUMXQSDFAIY4THQ3BIQC
W52PCSHX72WAMWKG6L4BPUBVMO6E72KYYBNKAA7554KNOTY6V7WQC
34C4U6EQWERY75GZJKUCM5KVGU2OUICETS5LGZF6RMKMZT4R5SQAC
AUYQDKLMOG4FGH2T3LACX4TH632DPKVXBNV5VU6PIVUEWSIO4LQQC
ZJLJGSB2XSBQU42OFQMXL3EG4CXAQGOYAU6YTV2SAWZEJIPFH2CAC
TLO257LZSB6ZO36STDUEWJBO2LETXFKTFGXELA6Y4BZBVAEIIINAC
ED62QWGKBPORWVKDFOQRKJXEIWZVNGR3O4KWQBDSRNPT36AYOQYAC
2ZZD6EYMSPVCXZTICL4VGYGGQRRWDLZ24KBCDBVIYC54OZ4C6GGAC
JT672SIJK4BOIUAGL2WQ6NR2NF4PSWP3BT6Q4HMNRF25UN6JQ2MAC
TLA5UN6LZPXGKERI27EFY4HKIIU3VU5Y7ZU54WXL6ANBUV2VOTMQC
JQFQX7IWSJ4TYWVUVXAFMCPSAN67PRMNECDQI5WMON2JFMQVVUEQC
IVVTHLTTLOP5TSULXJWUSSXHOKYWVU3OWKYVK45A7RIB6V34MYQAC
JDM27QE4HR52AYFSQE763BFF57ANOTF5MXKMO377PP5EXMN7SAOAC
ZI6K4LOBYQJKSMHZ766HTJS66AL2KB6IYSBUYPETTKPOKW4ZNK7AC
H3552BCIAVBLKAYKE4DHFLBLFW5RGRMYBMRRYHYEB5IPIJRUVU5QC
WE3JT43OR4L6675GINGU4B3YDBMURJZHDDYY3VLHUJEBAKH2HYEAC
R6XS2HO5QX2FJUGL5UQQRNETKCMYWTUFPHPPS5SYWK3OQA4UDUQQC
// 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;
}
}
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);
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;
}
}
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; }
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; }
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: { BEGIN(ARGUMENT); return KFEAT; }
KITEM: { BEGIN(ARGUMENT); return KITEM; }
KMONS: { BEGIN(ARGUMENT); return KMONS; }
KMASK: { BEGIN(ARGUMENT); return KMASK; }
KFEAT: { CBEGIN(ARGUMENT); return KFEAT; }
KITEM: { CBEGIN(ARGUMENT); return KITEM; }
KMONS: { CBEGIN(ARGUMENT); return KMONS; }
KMASK: { CBEGIN(ARGUMENT); return KMASK; }
MONS: gnoll ; potion of healing | potion of heal wounds . whip ego:reaching |whip good_item no_uniq | spear ego:reaching | glaive . scale mail | chain mail
MONS: gnoll ; potion of healing | potion of heal wounds \
. whip ego:reaching |whip good_item no_uniq | spear ego:reaching \
| glaive \
. scale mail | chain mail
For most map headers, you can split long lines by ending the line that
will be continued on the next line with \ as:
KMONS: * = orc ; katana | quick blade . chain mail | scale mail / \
goblin ; dagger
If you're using continuation lines for comma-separated lists of items
or monsters, split your line after the comma, not before. For example:
Wrong:
ITEM: potion of healing \
, potion of speed
Right:
ITEM: potion of healing, \
potion of speed