]> git.wincent.com - wikitext.git/blob - ext/token.c
Various fixes for Ruby 2.0.0 compatibility
[wikitext.git] / ext / token.c
1 // Copyright 2008-2009 Wincent Colaiuta. All rights reserved.
2 //
3 // Redistribution and use in source and binary forms, with or without
4 // modification, are permitted provided that the following conditions are met:
5 //
6 // 1. Redistributions of source code must retain the above copyright notice,
7 //    this list of conditions and the following disclaimer.
8 // 2. Redistributions in binary form must reproduce the above copyright notice,
9 //    this list of conditions and the following disclaimer in the documentation
10 //    and/or other materials provided with the distribution.
11 //
12 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
13 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
16 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
17 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
18 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
19 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
20 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
21 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
22 // POSSIBILITY OF SUCH DAMAGE.
23
24 #include "token.h"
25 #include "wikitext.h"
26
27 // return a hash of token types
28 // we make this available for unit testing purposes
29
30 VALUE Wikitext_parser_token_types(VALUE self)
31 {
32     VALUE hash = rb_hash_new();
33
34 #define SET_TOKEN_TYPE(identifier)  (void)rb_hash_aset(hash, INT2FIX(identifier), \
35     rb_funcall(rb_funcall(rb_str_new2(#identifier), rb_intern("downcase"), 0), rb_intern("to_sym"), 0))
36
37     SET_TOKEN_TYPE(NO_TOKEN);
38     SET_TOKEN_TYPE(P);
39     SET_TOKEN_TYPE(LI);
40     SET_TOKEN_TYPE(NESTED_LIST);
41     SET_TOKEN_TYPE(PRE);
42     SET_TOKEN_TYPE(PRE_START);
43     SET_TOKEN_TYPE(PRE_END);
44     SET_TOKEN_TYPE(NO_WIKI_START);
45     SET_TOKEN_TYPE(NO_WIKI_END);
46     SET_TOKEN_TYPE(BLOCKQUOTE);
47     SET_TOKEN_TYPE(BLOCKQUOTE_START);
48     SET_TOKEN_TYPE(BLOCKQUOTE_END);
49     SET_TOKEN_TYPE(STRONG_EM);
50     SET_TOKEN_TYPE(STRONG_START);
51     SET_TOKEN_TYPE(STRONG_END);
52     SET_TOKEN_TYPE(STRONG);
53     SET_TOKEN_TYPE(EM_START);
54     SET_TOKEN_TYPE(EM_END);
55     SET_TOKEN_TYPE(EM);
56     SET_TOKEN_TYPE(TT_START);
57     SET_TOKEN_TYPE(TT_END);
58     SET_TOKEN_TYPE(TT);
59     SET_TOKEN_TYPE(OL);
60     SET_TOKEN_TYPE(UL);
61     SET_TOKEN_TYPE(H1_START);
62     SET_TOKEN_TYPE(H2_START);
63     SET_TOKEN_TYPE(H3_START);
64     SET_TOKEN_TYPE(H4_START);
65     SET_TOKEN_TYPE(H5_START);
66     SET_TOKEN_TYPE(H6_START);
67     SET_TOKEN_TYPE(H1_END);
68     SET_TOKEN_TYPE(H2_END);
69     SET_TOKEN_TYPE(H3_END);
70     SET_TOKEN_TYPE(H4_END);
71     SET_TOKEN_TYPE(H5_END);
72     SET_TOKEN_TYPE(H6_END);
73     SET_TOKEN_TYPE(URI);
74     SET_TOKEN_TYPE(MAIL);
75     SET_TOKEN_TYPE(PATH);
76     SET_TOKEN_TYPE(LINK_START);
77     SET_TOKEN_TYPE(LINK_END);
78     SET_TOKEN_TYPE(EXT_LINK_START);
79     SET_TOKEN_TYPE(EXT_LINK_END);
80     SET_TOKEN_TYPE(SEPARATOR);
81     SET_TOKEN_TYPE(SPACE);
82     SET_TOKEN_TYPE(QUOT_ENTITY);
83     SET_TOKEN_TYPE(AMP_ENTITY);
84     SET_TOKEN_TYPE(NAMED_ENTITY);
85     SET_TOKEN_TYPE(HEX_ENTITY);
86     SET_TOKEN_TYPE(DECIMAL_ENTITY);
87     SET_TOKEN_TYPE(QUOT);
88     SET_TOKEN_TYPE(AMP);
89     SET_TOKEN_TYPE(LESS);
90     SET_TOKEN_TYPE(GREATER);
91     SET_TOKEN_TYPE(IMG_START);
92     SET_TOKEN_TYPE(IMG_END);
93     SET_TOKEN_TYPE(LEFT_CURLY);
94     SET_TOKEN_TYPE(RIGHT_CURLY);
95     SET_TOKEN_TYPE(CRLF);
96     SET_TOKEN_TYPE(SPECIAL_URI_CHARS);
97     SET_TOKEN_TYPE(PRINTABLE);
98     SET_TOKEN_TYPE(ALNUM);
99     SET_TOKEN_TYPE(DEFAULT);
100     SET_TOKEN_TYPE(END_OF_FILE);
101
102 #undef SET_TOKEN_TYPE
103
104     return hash;
105 }
106
107 // for testing and debugging only
108 VALUE wiki_token(token_t *token)
109 {
110     VALUE object = rb_class_new_instance(0, NULL, cWikitextParserToken);
111     (void)rb_iv_set(object, "@start",           LONG2NUM((long)token->start));
112     (void)rb_iv_set(object, "@stop",            LONG2NUM((long)token->stop));
113     (void)rb_iv_set(object, "@line_start",      LONG2NUM(token->line_start));
114     (void)rb_iv_set(object, "@line_stop",       LONG2NUM(token->line_stop));
115     (void)rb_iv_set(object, "@column_start",    LONG2NUM(token->column_start));
116     (void)rb_iv_set(object, "@column_stop",     LONG2NUM(token->column_stop));
117     (void)rb_iv_set(object, "@code_point",      INT2NUM(token->code_point));
118
119     // look-up the token type
120     VALUE types = Wikitext_parser_token_types(Qnil);
121     VALUE type  = rb_hash_aref(types, INT2FIX(token->type));
122     (void)rb_iv_set(object, "@token_type",      type);
123     (void)rb_iv_set(object, "@string_value",    rb_str_new(token->start, token->stop - token->start));
124     return object;
125 }