blob: 4792bef8e6acbb340cf772a1da95143b4589674a [file] [log] [blame]
/**
* @file punctuators.cpp
* Manages the table of punctutators.
*
* @author Ben Gardner
* @license GPL v2+
*/
#include "uncrustify_types.h"
#include <cstring>
/**
*
* The file "punctuators.h" was generated by punc.py from this file.
* If you change one of the below symbol tables, re-run punc.py.
* $ python scripts/punc.py > src/punctuators.h
*
* NOTE: the tables below do not need to be sorted.
*/
/* 4-char symbols */
static const chunk_tag_t symbols4[] =
{
{ "!<>=", CT_COMPARE, LANG_D },
{ ">>>=", CT_ASSIGN, LANG_D | LANG_JAVA | LANG_PAWN },
{ "%:%:", CT_PP, LANG_CPP }, // digraph ##
};
/* 3-char symbols */
static const chunk_tag_t symbols3[] =
{
{ "!<=", CT_COMPARE, LANG_D },
{ "!<>", CT_COMPARE, LANG_D },
{ "!==", CT_COMPARE, LANG_D },
{ "!>=", CT_COMPARE, LANG_D },
{ "->*", CT_MEMBER, LANG_C | LANG_CPP | LANG_D },
{ "...", CT_ELLIPSIS, LANG_C | LANG_CPP | LANG_D | LANG_PAWN | LANG_JAVA },
{ "<<=", CT_ASSIGN, LANG_ALL },
{ "<>=", CT_COMPARE, LANG_D },
{ "===", CT_COMPARE, LANG_D },
{ ">>=", CT_ASSIGN, LANG_ALL },
{ ">>>", CT_ARITH, LANG_D | LANG_JAVA | LANG_PAWN },
};
/* 2-char symbols */
static const chunk_tag_t symbols2[] =
{
{ "!<", CT_COMPARE, LANG_D },
{ "!=", CT_COMPARE, LANG_ALL },
{ "!>", CT_COMPARE, LANG_D },
{ "!~", CT_COMPARE, LANG_D },
{ "##", CT_PP, LANG_C | LANG_CPP | LANG_OC },
{ "#@", CT_POUND, LANG_C | LANG_CPP | LANG_OC }, /* MS extension */
{ "%=", CT_ASSIGN, LANG_ALL },
{ "&&", CT_BOOL, LANG_ALL },
{ "&=", CT_ASSIGN, LANG_ALL },
{ "*=", CT_ASSIGN, LANG_ALL },
{ "++", CT_INCDEC_AFTER, LANG_ALL },
{ "+=", CT_ASSIGN, LANG_ALL },
{ "--", CT_INCDEC_AFTER, LANG_ALL },
{ "-=", CT_ASSIGN, LANG_ALL },
{ "->", CT_MEMBER, LANG_C | LANG_CPP | LANG_CS | LANG_OC | LANG_D | LANG_VALA },
{ ".*", CT_MEMBER, LANG_C | LANG_CPP | LANG_D },
{ "..", CT_RANGE, LANG_D },
{ "/=", CT_ASSIGN, LANG_ALL },
{ "::", CT_DC_MEMBER, LANG_C | LANG_CPP | LANG_CS | LANG_D | LANG_VALA },
{ "<<", CT_ARITH, LANG_ALL },
{ "<=", CT_COMPARE, LANG_ALL },
{ "<>", CT_COMPARE, LANG_D },
{ "==", CT_COMPARE, LANG_ALL },
{ ">=", CT_COMPARE, LANG_ALL },
{ ">>", CT_ARITH, LANG_ALL },
{ "[]", CT_TSQUARE, LANG_ALL },
{ "^=", CT_ASSIGN, LANG_ALL },
{ "|=", CT_ASSIGN, LANG_ALL },
{ "||", CT_BOOL, LANG_ALL },
{ "~=", CT_COMPARE, LANG_D },
{ "~~", CT_COMPARE, LANG_D },
{ "=>", CT_LAMBDA, LANG_VALA | LANG_CS | LANG_D },
{ "??", CT_COMPARE, LANG_CS | LANG_VALA },
{ "<%", CT_BRACE_OPEN, LANG_C | LANG_CPP }, // digraph {
{ "%>", CT_BRACE_CLOSE, LANG_C | LANG_CPP }, // digraph }
{ "<:", CT_SQUARE_OPEN, LANG_C | LANG_CPP }, // digraph [
{ ":>", CT_SQUARE_CLOSE, LANG_C | LANG_CPP }, // digraph ]
{ "%:", CT_POUND, LANG_C | LANG_CPP }, // digraph #
};
/* 1-char symbols */
static const chunk_tag_t symbols1[] =
{
{ "!", CT_NOT, LANG_ALL },
{ "#", CT_POUND, LANG_ALL & ~(LANG_JAVA | LANG_ECMA) },
{ "$", CT_COMPARE, LANG_D },
{ "%", CT_ARITH, LANG_ALL },
{ "&", CT_AMP, LANG_ALL },
{ "(", CT_PAREN_OPEN, LANG_ALL },
{ ")", CT_PAREN_CLOSE, LANG_ALL },
{ "*", CT_STAR, LANG_ALL },
{ "+", CT_PLUS, LANG_ALL },
{ ",", CT_COMMA, LANG_ALL },
{ "-", CT_MINUS, LANG_ALL },
{ ".", CT_DOT, LANG_ALL },
{ "/", CT_ARITH, LANG_ALL },
{ ":", CT_COLON, LANG_ALL },
{ ";", CT_SEMICOLON, LANG_ALL },
{ "<", CT_ANGLE_OPEN, LANG_ALL },
{ "=", CT_ASSIGN, LANG_ALL },
{ ">", CT_ANGLE_CLOSE, LANG_ALL },
{ "@", CT_OC_AT, LANG_OC },
{ "?", CT_QUESTION, LANG_ALL },
{ "[", CT_SQUARE_OPEN, LANG_ALL },
{ "]", CT_SQUARE_CLOSE, LANG_ALL },
{ "^", CT_CARET, LANG_ALL },
{ "{", CT_BRACE_OPEN, LANG_ALL },
{ "|", CT_ARITH, LANG_ALL },
{ "}", CT_BRACE_CLOSE, LANG_ALL },
{ "~", CT_INV, LANG_ALL },
};
#include "punctuators.h"
const chunk_tag_t *find_punctuator(const char *str, int lang_flags)
{
const chunk_tag_t *p_match = NULL;
const lookup_entry_t *p_tab = punc_table;
int ch_idx = 0;
/*REVISIT: it might be faster to do a bsearch() on the first char.
* the rest of the group have at most 5 entries, so it wouldn't help
*/
while (ch_idx < 4)
{
if (p_tab->ch == str[ch_idx])
{
/* Match */
if ((p_tab->tag != NULL) &&
((p_tab->tag->lang_flags & lang_flags) != 0))
{
p_match = p_tab->tag;
}
if (p_tab->next_idx == 0)
{
/* This is the end of the chain */
break;
}
p_tab = &punc_table[p_tab->next_idx];
ch_idx++;
}
else if (p_tab->left_in_group == 0)
{
/* The last entry in this group didn't match */
break;
}
else
{
p_tab++;
}
}
return(p_match);
}