Merge pull request #41 from blackducksw/ubuntu_14
[ohcount] / src / parsers / vb_aspx.rl
1 /************************* Required for every parser *************************/
2 #ifndef OHCOUNT_VB_ASPX_PARSER_H
3 #define OHCOUNT_VB_ASPX_PARSER_H
4
5 #include "../parser_macros.h"
6
7 // the name of the language
8 const char *VB_ASPX_LANG = LANG_HTML;
9
10 // the languages entities
11 const char *vb_aspx_entities[] = {
12   "space", "comment", "doctype",
13   "tag", "entity", "any"
14 };
15
16 // constants associated with the entities
17 enum {
18   VB_ASPX_SPACE = 0, VB_ASPX_COMMENT, VB_ASPX_DOCTYPE,
19   VB_ASPX_TAG, VB_ASPX_ENTITY, VB_ASPX_ANY
20 };
21
22 /*****************************************************************************/
23
24 #include "css.h"
25 #include "javascript.h"
26 #include "visual_basic.h"
27
28 %%{
29   machine vb_aspx;
30   write data;
31   include common "common.rl";
32   #EMBED(css)
33   #EMBED(javascript)
34   #EMBED(visual_basic)
35
36   # Line counting machine
37
38   action vb_aspx_ccallback {
39     switch(entity) {
40     case VB_ASPX_SPACE:
41       ls
42       break;
43     case VB_ASPX_ANY:
44       code
45       break;
46     case INTERNAL_NL:
47       emb_internal_newline(VB_ASPX_LANG)
48       break;
49     case NEWLINE:
50       emb_newline(VB_ASPX_LANG)
51       break;
52     case CHECK_BLANK_ENTRY:
53       check_blank_entry(VB_ASPX_LANG)
54     }
55   }
56
57   vb_aspx_comment := (
58     newline %{ entity = INTERNAL_NL; } %vb_aspx_ccallback
59     |
60     ws
61     |
62     ^(space | [\-<]) @comment
63     |
64     '<' '%' @{ saw(VB_LANG); fcall vb_aspx_cs_line; }
65     |
66     '<' !'%'
67   )* :>> '-->' @comment @{ fgoto vb_aspx_line; };
68
69   vb_aspx_sq_str := (
70     newline %{ entity = INTERNAL_NL; } %vb_aspx_ccallback
71     |
72     ws
73     |
74     [^\r\n\f\t '\\<] @code
75     |
76     '\\' nonnewline @code
77     |
78     '<' '%' @{ saw(VB_LANG); fcall vb_aspx_cs_line; }
79     |
80     '<' !'%'
81   )* '\'' @{ fgoto vb_aspx_line; };
82   vb_aspx_dq_str := (
83     newline %{ entity = INTERNAL_NL; } %vb_aspx_ccallback
84     |
85     ws
86     |
87     [^\r\n\f\t "\\<] @code
88     |
89     '\\' nonnewline @code
90     |
91     '<' '%' @{ saw(VB_LANG); fcall vb_aspx_cs_line; }
92     |
93     '<' !'%'
94   )* '"' @{ fgoto vb_aspx_line; };
95
96   ws_or_inl = (ws | newline @{ entity = INTERNAL_NL; } %vb_aspx_ccallback);
97
98   vb_aspx_css_entry = '<' /style/i [^>]+ :>> 'text/css' [^>]+ '>' @code;
99   vb_aspx_css_outry = '</' /style/i ws_or_inl* '>' @check_blank_outry @code;
100   vb_aspx_css_line := |*
101     vb_aspx_css_outry @{ p = ts; fret; };
102     # unmodified CSS patterns
103     spaces      ${ entity = CSS_SPACE; } => css_ccallback;
104     css_comment;
105     css_string;
106     newline     ${ entity = NEWLINE;   } => css_ccallback;
107     ^space      ${ entity = CSS_ANY;   } => css_ccallback;
108   *|;
109
110   vb_aspx_js_entry = '<' /script/i [^>]+ :>> 'text/javascript' [^>]+ '>' @code;
111   vb_aspx_js_outry = '</' /script/i ws_or_inl* '>' @check_blank_outry @code;
112   vb_aspx_js_line := |*
113     vb_aspx_js_outry @{ p = ts; fret; };
114     # unmodified Javascript patterns
115     spaces     ${ entity = JS_SPACE; } => js_ccallback;
116     js_comment;
117     js_string;
118     newline    ${ entity = NEWLINE;  } => js_ccallback;
119     ^space     ${ entity = JS_ANY;   } => js_ccallback;
120   *|;
121
122   vb_aspx_cs_entry = ('<%' | '<' /script/i [^>]+ :>> 'server' [^>]+ '>') @code;
123   vb_aspx_cs_outry = ('%>' | '</' /script/i ws_or_inl* '>' @check_blank_outry) @code;
124   vb_aspx_cs_line := |*
125     vb_aspx_cs_outry @{ p = ts; fret; };
126     # unmodified VB patterns
127     spaces        ${ entity = VB_SPACE; } => vb_ccallback;
128     vb_comment;
129     vb_string;
130     newline       ${ entity = NEWLINE;    } => vb_ccallback;
131     ^space        ${ entity = VB_ANY;   } => vb_ccallback;
132   *|;
133
134   vb_aspx_line := |*
135     vb_aspx_css_entry @{ entity = CHECK_BLANK_ENTRY; } @vb_aspx_ccallback
136       @{ saw(CSS_LANG); } => { fcall vb_aspx_css_line; };
137     vb_aspx_js_entry @{ entity = CHECK_BLANK_ENTRY; } @vb_aspx_ccallback
138       @{ saw(JS_LANG); } => { fcall vb_aspx_js_line; };
139     vb_aspx_cs_entry @{ entity = CHECK_BLANK_ENTRY; } @vb_aspx_ccallback
140       @{ saw(VB_LANG); } => { fcall vb_aspx_cs_line; };
141     # standard VB_ASPX patterns
142     spaces       ${ entity = VB_ASPX_SPACE; } => vb_aspx_ccallback;
143     '<!--'       @comment                   => { fgoto vb_aspx_comment; };
144     '\''         @code                      => { fgoto vb_aspx_sq_str;  };
145     '"'          @code                      => { fgoto vb_aspx_dq_str;  };
146     newline      ${ entity = NEWLINE;     } => vb_aspx_ccallback;
147     ^space       ${ entity = VB_ASPX_ANY;   } => vb_aspx_ccallback;
148   *|;
149
150   # Entity machine
151
152   action vb_aspx_ecallback {
153     callback(VB_ASPX_LANG, vb_aspx_entities[entity], cint(ts), cint(te),
154              userdata);
155   }
156
157   vb_aspx_css_entry_entity = '<' /style/i [^>]+ :>> 'text/css' [^>]+ '>';
158   vb_aspx_css_outry_entity = '</' /style/i ws_or_inl* '>';
159   vb_aspx_css_entity := |*
160     vb_aspx_css_outry_entity @{ fret; };
161     # unmodified CSS patterns
162     space+             ${ entity = CSS_SPACE;   } => css_ecallback;
163     css_comment_entity ${ entity = CSS_COMMENT; } => css_ecallback;
164     # TODO:
165     ^space;
166   *|;
167
168   vb_aspx_js_entry_entity = '<' /script/i [^>]+ :>> 'text/javascript' [^>]+ '>';
169   vb_aspx_js_outry_entity = '</' /script/i ws_or_inl* '>';
170   vb_aspx_js_entity := |*
171     vb_aspx_js_outry_entity @{ fret; };
172     # unmodified Javascript patterns
173     space+            ${ entity = JS_SPACE;   } => js_ecallback;
174     js_comment_entity ${ entity = JS_COMMENT; } => js_ecallback;
175     # TODO:
176     ^space;
177   *|;
178
179   vb_aspx_cs_entry_entity = ('<%' | '<' /script/i [^>]+ :>> 'server' [^>]+ '>') @code;
180   vb_aspx_cs_outry_entity = ('%>' | '</' /script/i ws_or_inl* '>' @check_blank_outry) @code;
181   vb_aspx_cs_entity := |*
182     vb_aspx_cs_outry_entity @{ fret; };
183     # unmodified C patterns
184     space+              ${ entity = VB_SPACE;   } => vb_ecallback;
185     vb_comment_entity ${ entity = VB_COMMENT; } => vb_ecallback;
186     # TODO:
187     ^space;
188   *|;
189
190   vb_aspx_comment_entity = '<!--' any* :>> '-->';
191
192   vb_aspx_entity := |*
193     # TODO: vb_aspx_ecallback for vb_aspx_*_{entry,outry}_entity
194     vb_aspx_css_entry_entity  => { fcall vb_aspx_css_entity;  };
195     vb_aspx_js_entry_entity   => { fcall vb_aspx_js_entity;   };
196     vb_aspx_cs_entry_entity => { fcall vb_aspx_cs_entity; };
197     # standard VB_ASPX patterns
198     space+               ${ entity = VB_ASPX_SPACE;   } => vb_aspx_ecallback;
199     vb_aspx_comment_entity ${ entity = VB_ASPX_COMMENT; } => vb_aspx_ecallback;
200     # TODO:
201     ^space;
202   *|;
203 }%%
204
205 /************************* Required for every parser *************************/
206
207 /* Parses a string buffer with VB_ASPX markup.
208  *
209  * @param *buffer The string to parse.
210  * @param length The length of the string to parse.
211  * @param count Integer flag specifying whether or not to count lines. If yes,
212  *   uses the Ragel machine optimized for counting. Otherwise uses the Ragel
213  *   machine optimized for returning entity positions.
214  * @param *callback Callback function. If count is set, callback is called for
215  *   every line of code, comment, or blank with 'lcode', 'lcomment', and
216  *   'lblank' respectively. Otherwise callback is called for each entity found.
217  */
218 void parse_vb_aspx(char *buffer, int length, int count,
219                    void (*callback) (const char *lang, const char *entity,
220                                      int s, int e, void *udata),
221                    void *userdata
222   ) {
223   init
224
225   const char *seen = 0;
226
227   %% write init;
228   cs = (count) ? vb_aspx_en_vb_aspx_line : vb_aspx_en_vb_aspx_entity;
229   %% write exec;
230
231   // if no newline at EOF; callback contents of last line
232   if (count) { process_last_line(VB_ASPX_LANG) }
233 }
234
235 #endif
236
237 /*****************************************************************************/
238