#include "wikitext_ragel.h"
#define IN(type) ary_includes(parser->scope, type)
+#define IN_EITHER_OF(type1, type2) ary_includes2(parser->scope, type1, type2)
+#define IN_ANY_OF(type1, type2, type3) ary_includes3(parser->scope, type1, type2, type3)
// poor man's object orientation in C:
// instead of parsing around multiple parameters between functions in the parser
switch (type)
{
case PRE:
- if (IN(NO_WIKI_START) || IN(PRE_START))
+ if (IN_EITHER_OF(NO_WIKI_START, PRE_START))
{
str_append(parser->output, space, sizeof(space) - 1);
break;
break;
case PRE_START:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, escaped_pre_start, sizeof(escaped_pre_start) - 1);
break;
case PRE_END:
- if (IN(NO_WIKI_START) || IN(PRE))
+ if (IN_EITHER_OF(NO_WIKI_START, PRE))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, escaped_pre_end, sizeof(escaped_pre_end) - 1);
break;
case BLOCKQUOTE:
- if (IN(NO_WIKI_START) || IN(PRE_START))
+ if (IN_EITHER_OF(NO_WIKI_START, PRE_START))
// no need to check for <pre>; can never appear inside it
str_append(parser->output, escaped_blockquote, TOKEN_LEN(token) + 3); // will either emit ">" or "> "
else if (IN(BLOCKQUOTE_START))
break;
case BLOCKQUOTE_START:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, escaped_blockquote_start, sizeof(escaped_blockquote_start) - 1);
break;
case BLOCKQUOTE_END:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, escaped_blockquote_end, sizeof(escaped_blockquote_end) - 1);
break;
case NO_WIKI_START:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, escaped_no_wiki_start, sizeof(escaped_no_wiki_start) - 1);
break;
case STRONG_EM:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, literal_strong_em, sizeof(literal_strong_em) - 1);
break;
case STRONG:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, literal_strong, sizeof(literal_strong) - 1);
break;
case STRONG_START:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, escaped_strong_start, sizeof(escaped_strong_start) - 1);
else
{
output = parser->capture ? parser->capture : parser->output;
- if (IN(STRONG_START) || IN(STRONG))
+ if (IN_EITHER_OF(STRONG_START, STRONG))
str_append(output, escaped_strong_start, sizeof(escaped_strong_start) - 1);
else
{
break;
case STRONG_END:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, escaped_strong_end, sizeof(escaped_strong_end) - 1);
break;
case EM:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, literal_em, sizeof(literal_em) - 1);
break;
case EM_START:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, escaped_em_start, sizeof(escaped_em_start) - 1);
else
{
output = parser->capture ? parser->capture : parser->output;
- if (IN(EM_START) || IN(EM))
+ if (IN_EITHER_OF(EM_START, EM))
str_append(output, escaped_em_start, sizeof(escaped_em_start) - 1);
else
{
break;
case EM_END:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, escaped_em_end, sizeof(escaped_em_end) - 1);
break;
case TT:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, backtick, sizeof(backtick) - 1);
break;
case TT_START:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, escaped_tt_start, sizeof(escaped_tt_start) - 1);
else
{
output = parser->capture ? parser->capture : parser->output;
- if (IN(TT_START) || IN(TT))
+ if (IN_EITHER_OF(TT_START, TT))
str_append(output, escaped_tt_start, sizeof(escaped_tt_start) - 1);
else
{
break;
case TT_END:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, escaped_tt_end, sizeof(escaped_tt_end) - 1);
case OL:
case UL:
- if (IN(NO_WIKI_START) || IN(PRE_START))
+ if (IN_EITHER_OF(NO_WIKI_START, PRE_START))
{
// no need to check for PRE; can never appear inside it
str_append(parser->output, token->start, TOKEN_LEN(token));
case H3_START:
case H2_START:
case H1_START:
- if (IN(NO_WIKI_START) || IN(PRE_START))
+ if (IN_EITHER_OF(NO_WIKI_START, PRE_START))
{
// no need to check for PRE; can never appear inside it
str_append(parser->output, token->start, TOKEN_LEN(token));
case H3_END:
case H2_END:
case H1_END:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, token->start, TOKEN_LEN(token));
break;
case MAIL:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, token->start, TOKEN_LEN(token));
break;
case PATH:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
str_append(parser->output, token->start, TOKEN_LEN(token));
else if (IN(EXT_LINK_START))
{
// everything else will be rejected
case LINK_START:
output = parser->capture ? parser->capture : parser->output;
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(output, link_start, sizeof(link_start) - 1);
case LINK_END:
output = parser->capture ? parser->capture : parser->output;
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(output, link_end, sizeof(link_end) - 1);
// he was very angery [sic] about the turn of events
case EXT_LINK_START:
output = parser->capture ? parser->capture : parser->output;
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(output, ext_link_start, sizeof(ext_link_start) - 1);
case EXT_LINK_END:
output = parser->capture ? parser->capture : parser->output;
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(output, ext_link_end, sizeof(ext_link_end) - 1);
case SPACE:
output = parser->capture ? parser->capture : parser->output;
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(output, token->start, TOKEN_LEN(token));
break;
case IMG_START:
- if (IN(NO_WIKI_START) || IN(PRE) || IN(PRE_START))
+ if (IN_ANY_OF(NO_WIKI_START, PRE, PRE_START))
{
wiki_emit_pending_crlf_if_necessary(parser);
str_append(parser->output, token->start, TOKEN_LEN(token));
i = parser->pending_crlf;
parser->pending_crlf = false;
wiki_rollback_failed_link(parser); // if any
- if (IN(NO_WIKI_START) || IN(PRE_START))
+ if (IN_EITHER_OF(NO_WIKI_START, PRE_START))
{
ary_clear(parser->line_buffer);
str_append_str(parser->output, parser->line_ending);