| /** |
| * @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); |
| } |