mongrel_esi 0.5.2 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (200) hide show
  1. data/ext/esi/esi_parser.c +1 -0
  2. data/ext/esi/extconf.rb +2 -0
  3. data/ext/esi/parser.c +2 -2
  4. data/ext/esi/parser.h +2 -0
  5. data/ext/esi/parser.rl +2 -2
  6. data/ext/esi/test/common.rl +46 -0
  7. data/ext/esi/test/parser.c +1901 -0
  8. data/ext/esi/test/parser.h +127 -0
  9. data/ext/esi/test/parser.rl +611 -0
  10. data/ext/esi/test/test.c +2 -2
  11. data/lib/esi/cache.rb +1 -1
  12. data/lib/esi/version.rb +1 -1
  13. data/test/benchmarks/perf-trunk-n1000-c1.csv +100 -100
  14. data/test/benchmarks/perf-trunk-n1000-c2.csv +100 -100
  15. data/test/benchmarks/perf-trunk-n1000-c3.csv +100 -100
  16. data/test/benchmarks/perf-trunk-n1000-c4.csv +100 -100
  17. data/test/benchmarks/perf-trunk-n1000-c5.csv +100 -100
  18. data/test/integration/docs/large-no-cache.html +688 -0
  19. data/test/integration/handler_test.rb +7 -2
  20. data/test/load_test_ab.rb +1 -1
  21. metadata +7 -222
  22. data/doc/rdoc/classes/ESI/CParser.html +0 -122
  23. data/doc/rdoc/classes/ESI/Cache.html +0 -178
  24. data/doc/rdoc/classes/ESI/Cache.src/M000087.html +0 -17
  25. data/doc/rdoc/classes/ESI/Cache.src/M000088.html +0 -20
  26. data/doc/rdoc/classes/ESI/Config.html +0 -314
  27. data/doc/rdoc/classes/ESI/Config.src/M000049.html +0 -18
  28. data/doc/rdoc/classes/ESI/Config.src/M000050.html +0 -18
  29. data/doc/rdoc/classes/ESI/Config.src/M000051.html +0 -35
  30. data/doc/rdoc/classes/ESI/Config.src/M000052.html +0 -40
  31. data/doc/rdoc/classes/ESI/Config.src/M000053.html +0 -23
  32. data/doc/rdoc/classes/ESI/Config.src/M000054.html +0 -18
  33. data/doc/rdoc/classes/ESI/Config.src/M000055.html +0 -20
  34. data/doc/rdoc/classes/ESI/Config.src/M000056.html +0 -24
  35. data/doc/rdoc/classes/ESI/Config/CacheConfig.html +0 -212
  36. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000060.html +0 -19
  37. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000061.html +0 -19
  38. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000062.html +0 -18
  39. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000063.html +0 -18
  40. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000064.html +0 -18
  41. data/doc/rdoc/classes/ESI/Config/ConfigRouter.html +0 -187
  42. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000057.html +0 -19
  43. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000058.html +0 -21
  44. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000059.html +0 -21
  45. data/doc/rdoc/classes/ESI/Dispatcher.html +0 -174
  46. data/doc/rdoc/classes/ESI/Dispatcher.src/M000092.html +0 -19
  47. data/doc/rdoc/classes/ESI/Dispatcher.src/M000093.html +0 -27
  48. data/doc/rdoc/classes/ESI/Fragment.html +0 -218
  49. data/doc/rdoc/classes/ESI/Fragment.src/M000111.html +0 -20
  50. data/doc/rdoc/classes/ESI/Fragment.src/M000112.html +0 -18
  51. data/doc/rdoc/classes/ESI/Fragment.src/M000113.html +0 -18
  52. data/doc/rdoc/classes/ESI/Invalidator.html +0 -131
  53. data/doc/rdoc/classes/ESI/Invalidator.src/M000004.html +0 -41
  54. data/doc/rdoc/classes/ESI/Log.html +0 -221
  55. data/doc/rdoc/classes/ESI/Log.src/M000030.html +0 -18
  56. data/doc/rdoc/classes/ESI/Log.src/M000031.html +0 -18
  57. data/doc/rdoc/classes/ESI/Log.src/M000032.html +0 -18
  58. data/doc/rdoc/classes/ESI/Log.src/M000033.html +0 -18
  59. data/doc/rdoc/classes/ESI/Log.src/M000034.html +0 -18
  60. data/doc/rdoc/classes/ESI/Log.src/M000035.html +0 -18
  61. data/doc/rdoc/classes/ESI/Log.src/M000036.html +0 -18
  62. data/doc/rdoc/classes/ESI/MemcachedCache.html +0 -314
  63. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000037.html +0 -24
  64. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000038.html +0 -22
  65. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000039.html +0 -19
  66. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000040.html +0 -23
  67. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000041.html +0 -18
  68. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000042.html +0 -19
  69. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000043.html +0 -18
  70. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000044.html +0 -18
  71. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000045.html +0 -17
  72. data/doc/rdoc/classes/ESI/OutputAdapter.html +0 -204
  73. data/doc/rdoc/classes/ESI/OutputAdapter.src/M000094.html +0 -37
  74. data/doc/rdoc/classes/ESI/OutputAdapter.src/M000095.html +0 -18
  75. data/doc/rdoc/classes/ESI/OutputAdapter.src/M000096.html +0 -18
  76. data/doc/rdoc/classes/ESI/OutputAdapter.src/M000097.html +0 -18
  77. data/doc/rdoc/classes/ESI/Parser.html +0 -184
  78. data/doc/rdoc/classes/ESI/Parser.src/M000065.html +0 -51
  79. data/doc/rdoc/classes/ESI/Parser.src/M000066.html +0 -39
  80. data/doc/rdoc/classes/ESI/Parser.src/M000067.html +0 -19
  81. data/doc/rdoc/classes/ESI/Processor.html +0 -194
  82. data/doc/rdoc/classes/ESI/Processor.src/M000046.html +0 -26
  83. data/doc/rdoc/classes/ESI/Processor.src/M000047.html +0 -44
  84. data/doc/rdoc/classes/ESI/Processor.src/M000048.html +0 -26
  85. data/doc/rdoc/classes/ESI/Proxy.html +0 -304
  86. data/doc/rdoc/classes/ESI/Proxy.src/M000071.html +0 -20
  87. data/doc/rdoc/classes/ESI/Proxy.src/M000072.html +0 -63
  88. data/doc/rdoc/classes/ESI/Proxy.src/M000073.html +0 -62
  89. data/doc/rdoc/classes/ESI/Proxy.src/M000074.html +0 -24
  90. data/doc/rdoc/classes/ESI/Proxy.src/M000075.html +0 -19
  91. data/doc/rdoc/classes/ESI/Proxy.src/M000076.html +0 -22
  92. data/doc/rdoc/classes/ESI/Proxy.src/M000077.html +0 -18
  93. data/doc/rdoc/classes/ESI/Proxy.src/M000078.html +0 -28
  94. data/doc/rdoc/classes/ESI/Proxy.src/M000079.html +0 -29
  95. data/doc/rdoc/classes/ESI/RackAdapter.html +0 -214
  96. data/doc/rdoc/classes/ESI/RackAdapter.src/M000068.html +0 -18
  97. data/doc/rdoc/classes/ESI/RackAdapter.src/M000069.html +0 -34
  98. data/doc/rdoc/classes/ESI/RackAdapter.src/M000070.html +0 -17
  99. data/doc/rdoc/classes/ESI/RackConfig.html +0 -173
  100. data/doc/rdoc/classes/ESI/RackConfig.src/M000089.html +0 -28
  101. data/doc/rdoc/classes/ESI/RackConfig.src/M000090.html +0 -18
  102. data/doc/rdoc/classes/ESI/RackConfig.src/M000091.html +0 -20
  103. data/doc/rdoc/classes/ESI/Request.html +0 -158
  104. data/doc/rdoc/classes/ESI/Request.src/M000098.html +0 -18
  105. data/doc/rdoc/classes/ESI/Request.src/M000099.html +0 -18
  106. data/doc/rdoc/classes/ESI/Response.html +0 -250
  107. data/doc/rdoc/classes/ESI/Response.src/M000080.html +0 -23
  108. data/doc/rdoc/classes/ESI/Response.src/M000081.html +0 -18
  109. data/doc/rdoc/classes/ESI/Response.src/M000082.html +0 -21
  110. data/doc/rdoc/classes/ESI/Response.src/M000083.html +0 -20
  111. data/doc/rdoc/classes/ESI/Response.src/M000084.html +0 -25
  112. data/doc/rdoc/classes/ESI/Response.src/M000085.html +0 -18
  113. data/doc/rdoc/classes/ESI/Response.src/M000086.html +0 -33
  114. data/doc/rdoc/classes/ESI/Router.html +0 -212
  115. data/doc/rdoc/classes/ESI/Router.src/M000109.html +0 -36
  116. data/doc/rdoc/classes/ESI/Router.src/M000110.html +0 -25
  117. data/doc/rdoc/classes/ESI/RubyCache.html +0 -278
  118. data/doc/rdoc/classes/ESI/RubyCache.src/M000100.html +0 -20
  119. data/doc/rdoc/classes/ESI/RubyCache.src/M000101.html +0 -20
  120. data/doc/rdoc/classes/ESI/RubyCache.src/M000102.html +0 -20
  121. data/doc/rdoc/classes/ESI/RubyCache.src/M000103.html +0 -22
  122. data/doc/rdoc/classes/ESI/RubyCache.src/M000104.html +0 -18
  123. data/doc/rdoc/classes/ESI/RubyCache.src/M000105.html +0 -22
  124. data/doc/rdoc/classes/ESI/RubyCache.src/M000106.html +0 -18
  125. data/doc/rdoc/classes/ESI/RubyCache.src/M000107.html +0 -18
  126. data/doc/rdoc/classes/ESI/RubyCache.src/M000108.html +0 -18
  127. data/doc/rdoc/classes/ESI/Tag.html +0 -141
  128. data/doc/rdoc/classes/ESI/Tag/Attempt.html +0 -113
  129. data/doc/rdoc/classes/ESI/Tag/Base.html +0 -237
  130. data/doc/rdoc/classes/ESI/Tag/Base.src/M000026.html +0 -23
  131. data/doc/rdoc/classes/ESI/Tag/Base.src/M000027.html +0 -22
  132. data/doc/rdoc/classes/ESI/Tag/Base.src/M000028.html +0 -22
  133. data/doc/rdoc/classes/ESI/Tag/Base.src/M000029.html +0 -17
  134. data/doc/rdoc/classes/ESI/Tag/Container.html +0 -206
  135. data/doc/rdoc/classes/ESI/Tag/Container.src/M000015.html +0 -20
  136. data/doc/rdoc/classes/ESI/Tag/Container.src/M000016.html +0 -22
  137. data/doc/rdoc/classes/ESI/Tag/Container.src/M000017.html +0 -25
  138. data/doc/rdoc/classes/ESI/Tag/Except.html +0 -184
  139. data/doc/rdoc/classes/ESI/Tag/Except.src/M000018.html +0 -21
  140. data/doc/rdoc/classes/ESI/Tag/Except.src/M000019.html +0 -20
  141. data/doc/rdoc/classes/ESI/Tag/Except.src/M000020.html +0 -18
  142. data/doc/rdoc/classes/ESI/Tag/Include.html +0 -257
  143. data/doc/rdoc/classes/ESI/Tag/Include.src/M000005.html +0 -20
  144. data/doc/rdoc/classes/ESI/Tag/Include.src/M000006.html +0 -18
  145. data/doc/rdoc/classes/ESI/Tag/Include.src/M000007.html +0 -34
  146. data/doc/rdoc/classes/ESI/Tag/Include.src/M000008.html +0 -22
  147. data/doc/rdoc/classes/ESI/Tag/Include.src/M000009.html +0 -27
  148. data/doc/rdoc/classes/ESI/Tag/Include.src/M000010.html +0 -30
  149. data/doc/rdoc/classes/ESI/Tag/Include.src/M000011.html +0 -51
  150. data/doc/rdoc/classes/ESI/Tag/Include/Request.html +0 -199
  151. data/doc/rdoc/classes/ESI/Tag/Include/Request.src/M000012.html +0 -18
  152. data/doc/rdoc/classes/ESI/Tag/Include/Request.src/M000013.html +0 -44
  153. data/doc/rdoc/classes/ESI/Tag/Include/Request/Error.html +0 -155
  154. data/doc/rdoc/classes/ESI/Tag/Include/Request/Error.src/M000014.html +0 -19
  155. data/doc/rdoc/classes/ESI/Tag/Invalidate.html +0 -171
  156. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000023.html +0 -19
  157. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000024.html +0 -51
  158. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000025.html +0 -19
  159. data/doc/rdoc/classes/ESI/Tag/Try.html +0 -154
  160. data/doc/rdoc/classes/ESI/Tag/Try.src/M000021.html +0 -38
  161. data/doc/rdoc/classes/ESI/Tag/Try.src/M000022.html +0 -18
  162. data/doc/rdoc/classes/MultiDirHandler.html +0 -198
  163. data/doc/rdoc/classes/MultiDirHandler.src/M000001.html +0 -20
  164. data/doc/rdoc/classes/MultiDirHandler.src/M000002.html +0 -28
  165. data/doc/rdoc/classes/MultiDirHandler.src/M000003.html +0 -22
  166. data/doc/rdoc/created.rid +0 -1
  167. data/doc/rdoc/files/COPYING.html +0 -167
  168. data/doc/rdoc/files/LICENSE.html +0 -605
  169. data/doc/rdoc/files/README.html +0 -361
  170. data/doc/rdoc/files/ext/esi/common_rl.html +0 -160
  171. data/doc/rdoc/files/ext/esi/esi_parser_c.html +0 -101
  172. data/doc/rdoc/files/ext/esi/parser_c.html +0 -101
  173. data/doc/rdoc/files/ext/esi/parser_h.html +0 -101
  174. data/doc/rdoc/files/ext/esi/parser_rl.html +0 -867
  175. data/doc/rdoc/files/ext/esi/test/test_c.html +0 -101
  176. data/doc/rdoc/files/lib/esi/cache_rb.html +0 -120
  177. data/doc/rdoc/files/lib/esi/config_rb.html +0 -115
  178. data/doc/rdoc/files/lib/esi/dispatcher_rb.html +0 -110
  179. data/doc/rdoc/files/lib/esi/invalidator_rb.html +0 -114
  180. data/doc/rdoc/files/lib/esi/logger_rb.html +0 -108
  181. data/doc/rdoc/files/lib/esi/parser_rb.html +0 -120
  182. data/doc/rdoc/files/lib/esi/processor_rb.html +0 -115
  183. data/doc/rdoc/files/lib/esi/proxy_rb.html +0 -123
  184. data/doc/rdoc/files/lib/esi/rack_adapter_rb.html +0 -117
  185. data/doc/rdoc/files/lib/esi/response_rb.html +0 -116
  186. data/doc/rdoc/files/lib/esi/router_rb.html +0 -107
  187. data/doc/rdoc/files/lib/esi/tag/attempt_rb.html +0 -114
  188. data/doc/rdoc/files/lib/esi/tag/base_rb.html +0 -114
  189. data/doc/rdoc/files/lib/esi/tag/container_rb.html +0 -115
  190. data/doc/rdoc/files/lib/esi/tag/except_rb.html +0 -114
  191. data/doc/rdoc/files/lib/esi/tag/include_rb.html +0 -116
  192. data/doc/rdoc/files/lib/esi/tag/invalidate_rb.html +0 -115
  193. data/doc/rdoc/files/lib/esi/tag/try_rb.html +0 -115
  194. data/doc/rdoc/files/lib/esi/version_rb.html +0 -101
  195. data/doc/rdoc/files/lib/multi_dirhandler_rb.html +0 -109
  196. data/doc/rdoc/fr_class_index.html +0 -57
  197. data/doc/rdoc/fr_file_index.html +0 -55
  198. data/doc/rdoc/fr_method_index.html +0 -139
  199. data/doc/rdoc/index.html +0 -24
  200. data/doc/rdoc/rdoc-style.css +0 -208
@@ -143,6 +143,7 @@ esi_parser_default_output_cp( const void *data, size_t length, void *user_data )
143
143
  //if( length > 0 ) {
144
144
  VALUE rbstr = rb_str_new( data, length );
145
145
  //printf( "data length: %d\n", length );
146
+ //rb_thread_schedule();
146
147
  send_output( output, esi_tag, rbstr );
147
148
  /*}else {
148
149
  printf( "rb_thread_schedule\n" );
@@ -1,5 +1,7 @@
1
1
  require 'mkmf'
2
2
 
3
+ $CPPFLAGS="-Wall"
4
+
3
5
  dir_config("esi")
4
6
  have_library("c", "main")
5
7
 
@@ -46,7 +46,7 @@ esi_parser_default_output_cp(const void *data,
46
46
  /*
47
47
  * flush output buffer
48
48
  */
49
- static void esi_parser_flush_output( ESIParser *parser )
49
+ void esi_parser_flush_output( ESIParser *parser )
50
50
  {
51
51
  if( parser->output_buffer_size > 0 ) {
52
52
  //debug_string( "esi_parser_flush_output:", parser->output_buffer, parser->output_buffer_size );
@@ -115,7 +115,7 @@ static void esi_parser_concat_to_echobuffer( ESIParser *parser, char ch )
115
115
  /* double the echobuffer size
116
116
  * we're getting some crazy input if this case ever happens
117
117
  */
118
- printf( "increase echobuffer: %d, %s\n", parser->echobuffer_allocated, parser->echobuffer );
118
+ printf( "increase echobuffer: %lu, %s\n", (long)parser->echobuffer_allocated, parser->echobuffer );
119
119
  parser->echobuffer_allocated *= 2;
120
120
  parser->echobuffer = (char*)realloc( parser->echobuffer, parser->echobuffer_allocated );
121
121
  }
@@ -121,5 +121,7 @@ void esi_parser_end_tag_handler( ESIParser *parser, end_tag_cb callback );
121
121
  /* setup a callback to recieve data ready for output */
122
122
  void esi_parser_output_handler( ESIParser *parser, output_cb output_handler );
123
123
 
124
+ void esi_parser_flush_output( ESIParser *parser );
125
+
124
126
 
125
127
  #endif
@@ -45,7 +45,7 @@ esi_parser_default_output_cp(const void *data,
45
45
  /*
46
46
  * flush output buffer
47
47
  */
48
- static void esi_parser_flush_output( ESIParser *parser )
48
+ void esi_parser_flush_output( ESIParser *parser )
49
49
  {
50
50
  if( parser->output_buffer_size > 0 ) {
51
51
  //debug_string( "esi_parser_flush_output:", parser->output_buffer, parser->output_buffer_size );
@@ -114,7 +114,7 @@ static void esi_parser_concat_to_echobuffer( ESIParser *parser, char ch )
114
114
  /* double the echobuffer size
115
115
  * we're getting some crazy input if this case ever happens
116
116
  */
117
- printf( "increase echobuffer: %d, %s\n", parser->echobuffer_allocated, parser->echobuffer );
117
+ printf( "increase echobuffer: %lu, %s\n", (long)parser->echobuffer_allocated, parser->echobuffer );
118
118
  parser->echobuffer_allocated *= 2;
119
119
  parser->echobuffer = (char*)realloc( parser->echobuffer, parser->echobuffer_allocated );
120
120
  }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Copyright (c) 2008 Todd A. Fisher
3
+ * see LICENSE
4
+ */
5
+ %%{
6
+ machine esi_common_parser;
7
+
8
+ # valid attribute key characters
9
+ attr_key = [a-zA-Z_\-]+ [a-zA-Z_\-0-9]*;
10
+
11
+ # attribute values can be contained within either double or single quotes, when single quoted then double quotes are valid
12
+ # when double quoted then single quotes are valid
13
+ attr_valueq1 = ('"' ("\\\""| [^"])* '"');
14
+ attr_valueq2 = ("'" ("\\\'"| [^'])* "'");
15
+
16
+ # an attribute value is either single or double quoted
17
+ attr_value = ( attr_valueq1 | attr_valueq2 );
18
+
19
+ # inline tags e.g. <esi:comment text='some useless text'/> or <esi:include src='/foo/'/>, etc...
20
+ # block tags e.g. <esi:try><esi:attempt></esi:attempt></esi:try>
21
+ # NOTE: not verifying the tag nesting
22
+ esi_tags = (
23
+ start: (
24
+ # first match block start tag with no attributes
25
+ '<esi:' [a-z]+ '>' @block_start_tag -> final |
26
+ # next match either an inline or block tag with attributes
27
+ '<esi:' [a-z]+ space @see_start_tag -> start_attribute |
28
+ # finally match a closing block tag
29
+ '</esi:' [a-z]+ '>' @block_end_tag
30
+ ),
31
+ start_attribute: (
32
+ # match the attribute key up to the begining = allowing for arbitrary whitespace before the start of the key
33
+ space* attr_key '=' @see_attribute_key -> end_attribute |
34
+ # match the end of an inline tag, triggers start and end callbacks
35
+ space* '/>' @see_end_tag -> final |
36
+ # matching the end of a block tag, triggers start callback
37
+ '>' @see_block_start_with_attributes -> final
38
+ ),
39
+ end_attribute: (
40
+ # match the attribute value and return to matching attribute start
41
+ space* attr_value @see_attribute_value -> start_attribute
42
+ )
43
+ ) >begin %finish;
44
+
45
+ main := ((/.*/)? @echo (esi_tags) )*;
46
+ }%%
@@ -0,0 +1,1901 @@
1
+ #line 1 "parser.rl"
2
+ /**
3
+ * Copyright (c) 2008 Todd A. Fisher
4
+ * see LICENSE
5
+ */
6
+ #include <stdio.h>
7
+ #include <stdlib.h>
8
+ #include <string.h>
9
+ #include <ctype.h>
10
+ #include "parser.h"
11
+
12
+ #ifdef DEBUG
13
+ static void debug_string( const char *msg, const char *str, size_t len )
14
+ {
15
+ char *pstr = esi_strndup( str, len );
16
+ printf( "%s :'%s'\n", msg, pstr );
17
+ free( pstr );
18
+ }
19
+ #else
20
+ #define debug_string(m,s,l)
21
+ #endif
22
+
23
+ /* define default callbacks */
24
+ static void
25
+ esi_parser_default_start_cb( const void *data,
26
+ const char *name_start,
27
+ size_t name_length,
28
+ ESIAttribute *attributes,
29
+ void *user_data )
30
+ {
31
+ }
32
+ static void
33
+ esi_parser_default_end_cb( const void *data,
34
+ const char *name_start,
35
+ size_t name_length,
36
+ void *user_data )
37
+ {
38
+ }
39
+ static void
40
+ esi_parser_default_output_cp(const void *data,
41
+ size_t length,
42
+ void *user_data)
43
+ {
44
+ }
45
+
46
+ /*
47
+ * flush output buffer
48
+ */
49
+ void esi_parser_flush_output( ESIParser *parser )
50
+ {
51
+ if( parser->output_buffer_size > 0 ) {
52
+ //debug_string( "esi_parser_flush_output:", parser->output_buffer, parser->output_buffer_size );
53
+ parser->output_handler( (void*)parser->output_buffer, parser->output_buffer_size, parser->user_data );
54
+ parser->output_buffer_size = 0;
55
+ }
56
+ }
57
+ /* send the character to the output handler marking it
58
+ * as ready for consumption, e.g. not an esi tag
59
+ */
60
+ static void esi_parser_echo_char( ESIParser *parser, char ch )
61
+ {
62
+ parser->output_buffer[parser->output_buffer_size++] = ch;
63
+ if( parser->output_buffer_size == ESI_OUTPUT_BUFFER_SIZE ) {
64
+ // flush the buffer to the consumer
65
+ esi_parser_flush_output( parser );
66
+ }
67
+ }
68
+ static void esi_parser_send_buffer( ESIParser *parser, const char *seq, size_t len )
69
+ {
70
+ const char *nseq = seq + len;
71
+ size_t nlen = parser->output_buffer_size + len;
72
+
73
+ if( nlen < ESI_OUTPUT_BUFFER_SIZE ) {
74
+ memcpy( parser->output_buffer + parser->output_buffer_size, seq, len );
75
+ parser->output_buffer_size += len;
76
+ }
77
+ else if( nlen > ESI_OUTPUT_BUFFER_SIZE ) {
78
+ while( seq != nseq ) {
79
+ esi_parser_echo_char( parser, *seq++ );
80
+ }
81
+ }
82
+ }
83
+ /* send any buffered characters to the output handler.
84
+ * This happens when we enter a case such as <em> where the
85
+ * first two characters < and e match the <esi: expression
86
+ */
87
+ static void esi_parser_echo_buffer( ESIParser *parser )
88
+ {
89
+ size_t i = 0, len = parser->echobuffer_index + 1;;
90
+ //debug_string( "echobuffer", parser->echobuffer, parser->echobuffer_index+1 );
91
+ //parser->output_handler( parser->echobuffer, parser->echobuffer_index+1, parser->user_data );
92
+ for( ; i < len; ++i ) {
93
+ esi_parser_echo_char( parser, parser->echobuffer[i] );
94
+ }
95
+ }
96
+ /*
97
+ * clear the buffer, no buffered characters should be emitted .
98
+ * e.g. we matched an esi tag completely and all buffered characters can be tossed out
99
+ */
100
+ static void esi_parser_echobuffer_clear( ESIParser *parser )
101
+ {
102
+ parser->echobuffer_index = -1;
103
+ }
104
+
105
+ /*
106
+ * add a character to the echobuffer.
107
+ * this happens when we can't determine if the character is allowed to be sent to the client device
108
+ * e.g. matching <e it's not yet determined if these characters are safe to send or not
109
+ */
110
+ static void esi_parser_concat_to_echobuffer( ESIParser *parser, char ch )
111
+ {
112
+ parser->echobuffer_index++;
113
+
114
+ if( parser->echobuffer_allocated <= parser->echobuffer_index ) {
115
+ /* double the echobuffer size
116
+ * we're getting some crazy input if this case ever happens
117
+ */
118
+ printf( "increase echobuffer: %lu, %s\n", (long)parser->echobuffer_allocated, parser->echobuffer );
119
+ parser->echobuffer_allocated *= 2;
120
+ parser->echobuffer = (char*)realloc( parser->echobuffer, parser->echobuffer_allocated );
121
+ }
122
+ parser->echobuffer[parser->echobuffer_index] = ch;
123
+ // debug_string( "echo buffer", parser->echobuffer, parser->echobuffer_index+1 );
124
+ }
125
+ /*
126
+ * the mark boundary is not always going to be exactly on the attribute or tag name boundary
127
+ * this trims characters from the left to right, advancing *ptr and reducing *len
128
+ */
129
+ static void ltrim_pointer( const char **ptr, const char *bounds, size_t *len )
130
+ {
131
+ // remove any spaces or = at the before the value
132
+ while( (isspace( **ptr ) ||
133
+ **ptr == '=' ||
134
+ **ptr == '"' ||
135
+ **ptr == '<' ||
136
+ **ptr == '\'' ) && (*len > 0) && (*ptr != bounds) ) {
137
+ (*ptr)++;
138
+ (*len)--;
139
+ }
140
+ }
141
+ /*
142
+ * similar to ltrim_pointer, this walks from bounds to *ptr, reducing *len
143
+ */
144
+ static void rtrim_pointer( const char **ptr, const char *bounds, size_t *len )
145
+ {
146
+ bounds = (*ptr+(*len-1));
147
+ // remove any spaces or = at the before the value
148
+ while( (isspace( *bounds ) ||
149
+ *bounds == '=' ||
150
+ *bounds == '"' ||
151
+ *bounds == '>' ||
152
+ *bounds == '\'') && (*len > 0) && (*ptr != bounds) ){
153
+ bounds--;
154
+ (*len)--;
155
+ }
156
+ }
157
+
158
+ #line 321 "parser.rl"
159
+
160
+
161
+
162
+ #line 163 "parser.c"
163
+ static const char _esi_eof_actions[] = {
164
+ 0, 0, 0, 0, 0, 0, 0, 0,
165
+ 0, 0, 0, 0, 0, 0, 0, 0,
166
+ 0, 0, 0, 0, 0, 0, 0, 0,
167
+ 0, 0, 0, 0, 0, 0, 0, 0,
168
+ 0, 0, 0, 0, 0, 0, 0, 0,
169
+ 0, 0, 0, 0, 0, 0, 0, 0,
170
+ 0, 0, 0, 0, 0, 0, 0, 0,
171
+ 0, 0, 0, 0, 0, 0, 0, 0,
172
+ 0, 0, 0, 0, 0, 0, 0, 0,
173
+ 0, 0, 0, 0, 10, 10, 10, 10
174
+ };
175
+
176
+ static const int esi_start = 75;
177
+ static const int esi_first_final = 75;
178
+ static const int esi_error = -1;
179
+
180
+ static const int esi_en_main = 75;
181
+
182
+ #line 324 "parser.rl"
183
+
184
+ /* dup the string up to len */
185
+ char *esi_strndup( const char *str, size_t len )
186
+ {
187
+ char *s = (char*)malloc(sizeof(char)*(len+1));
188
+ memcpy( s, str, len );
189
+ s[len] = '\0';
190
+ return s;
191
+ }
192
+
193
+ ESIAttribute *esi_attribute_new( const char *name, size_t name_length, const char *value, size_t value_length )
194
+ {
195
+ ESIAttribute *attr = (ESIAttribute*)malloc(sizeof(ESIAttribute));
196
+ attr->name = name;//esi_strndup(name, name_length);
197
+ attr->value = value;//esi_strndup(value, value_length);
198
+ attr->name_length = name_length;
199
+ attr->value_length = value_length;
200
+ attr->next = NULL;
201
+ return attr;
202
+ }
203
+
204
+ ESIAttribute *esi_attribute_copy( ESIAttribute *attribute )
205
+ {
206
+ ESIAttribute *head, *nattr;
207
+ if( !attribute ){ return NULL; }
208
+
209
+ // copy the first attribute
210
+ nattr = esi_attribute_new( attribute->name, attribute->name_length,
211
+ attribute->value, attribute->value_length );
212
+ // save a pointer for return
213
+ head = nattr;
214
+ // copy next attributes
215
+ attribute = attribute->next;
216
+ while( attribute ) {
217
+ // set the next attribute
218
+ nattr->next = esi_attribute_new( attribute->name, attribute->name_length,
219
+ attribute->value, attribute->value_length );
220
+ // next attribute
221
+ nattr = nattr->next;
222
+ attribute = attribute->next;
223
+ }
224
+ return head;
225
+ }
226
+
227
+ void esi_attribute_free( ESIAttribute *attribute )
228
+ {
229
+ ESIAttribute *ptr;
230
+ while( attribute ){
231
+ // free( attribute->name );
232
+ // free( attribute->value );
233
+ ptr = attribute->next;
234
+ free( attribute );
235
+ attribute = ptr;
236
+ }
237
+ }
238
+
239
+ ESIParser *esi_parser_new()
240
+ {
241
+ ESIParser *parser = (ESIParser*)malloc(sizeof(ESIParser));
242
+ parser->cs = esi_start;
243
+ parser->mark = NULL;
244
+ parser->tag_text = NULL;
245
+ parser->attr_key = NULL;
246
+ parser->attr_value = NULL;
247
+ parser->overflow_data_size = 0;
248
+ parser->overflow_data = NULL;
249
+ parser->overflow_data_allocated = 0;
250
+ parser->using_overflow = 0;
251
+
252
+ /* allocate ESI_OUTPUT_BUFFER_SIZE bytes for the echobuffer */
253
+ parser->echobuffer_allocated = ESI_ECHOBUFFER_SIZE;
254
+ parser->echobuffer_index = -1;
255
+ parser->echobuffer = (char*)malloc(sizeof(char)*parser->echobuffer_allocated);
256
+
257
+ parser->attributes = NULL;
258
+ parser->last = NULL;
259
+
260
+ parser->start_tag_handler = esi_parser_default_start_cb;
261
+ parser->end_tag_handler = esi_parser_default_end_cb;
262
+ parser->output_handler = esi_parser_default_output_cp;
263
+
264
+ parser->output_buffer_size = 0;
265
+ memset( parser->output_buffer, 0, ESI_OUTPUT_BUFFER_SIZE );
266
+
267
+ return parser;
268
+ }
269
+ void esi_parser_free( ESIParser *parser )
270
+ {
271
+ if( parser->overflow_data ){ free( parser->overflow_data ); }
272
+
273
+ free( parser->echobuffer );
274
+
275
+ esi_attribute_free( parser->attributes );
276
+
277
+ free( parser );
278
+ }
279
+
280
+ void esi_parser_output_handler( ESIParser *parser, output_cb output_handler )
281
+ {
282
+ parser->output_handler = output_handler;
283
+ }
284
+
285
+ int esi_parser_init( ESIParser *parser )
286
+ {
287
+ int cs;
288
+
289
+ #line 290 "parser.c"
290
+ {
291
+ cs = esi_start;
292
+ }
293
+ #line 430 "parser.rl"
294
+ parser->prev_state = parser->cs = cs;
295
+ return 0;
296
+ }
297
+
298
+ static int compute_offset( const char *mark, const char *data )
299
+ {
300
+ if( mark ) {
301
+ return mark - data;
302
+ }
303
+ return -1;
304
+ }
305
+
306
+ /*
307
+ * scans the data buffer for a start sequence /<$/, /<e$/, /<es$/, /<esi$/, /<esi:$/
308
+ * returns index of if start sequence found else returns -1
309
+ */
310
+ static int
311
+ esi_parser_scan_for_start( ESIParser *parser, const char *data, size_t length )
312
+ {
313
+ size_t i, f = -2, s = -2;
314
+ char ch;
315
+
316
+ for( i = 0; i < length; ++i ) {
317
+ ch = data[i];
318
+ switch( ch ) {
319
+ case '<':
320
+ f = s = i;
321
+ break;
322
+ case '/':
323
+ if( s == (i-1) && f != -2 ) { s = i; }
324
+ break;
325
+ case 'e':
326
+ if( s == (i-1) && f != -2 ) { s = i; }
327
+ break;
328
+ case 's':
329
+ if( s == (i-1) && f != -2 ) { s = i; }
330
+ break;
331
+ case 'i':
332
+ if( s == (i-1) && f != -2 ) { s = i; }
333
+ break;
334
+ case ':':
335
+ if( s == (i-1) && f != -2 ) { s = i; return f; }
336
+ break;
337
+ default:
338
+ f = s = -2;
339
+ break;
340
+ }
341
+ }
342
+
343
+ // if s and f are still valid at end of input return f
344
+ if( f != -2 && s != -2 ) {
345
+ return f;
346
+ }
347
+ else {
348
+ return -1;
349
+ }
350
+ }
351
+
352
+ static void
353
+ esi_parser_append_data_to_overflow_data( ESIParser *parser, const char *data, size_t length )
354
+ {
355
+ int mark_offset = 0;
356
+ int tag_text_offset = 0;
357
+ int attr_key_offset = 0;
358
+ int attr_value_offset = 0;
359
+
360
+ if( parser->using_overflow ) {
361
+ // recompute mark, tag_text, attr_key, and attr_value as they all exist within overflow_data
362
+ mark_offset = compute_offset( parser->mark, parser->overflow_data );
363
+ tag_text_offset = compute_offset( parser->tag_text, parser->overflow_data );
364
+ attr_key_offset = compute_offset( parser->attr_key, parser->overflow_data );
365
+ attr_value_offset = compute_offset( parser->attr_value, parser->overflow_data );
366
+ }
367
+ else {
368
+ // recompute mark, tag_text, attr_key, and attr_value as they all exist within data
369
+ mark_offset = compute_offset( parser->mark, data );
370
+ tag_text_offset = compute_offset( parser->tag_text, data );
371
+ attr_key_offset = compute_offset( parser->attr_key, data );
372
+ attr_value_offset = compute_offset( parser->attr_value, data );
373
+ }
374
+
375
+ if( parser->overflow_data ) {
376
+ // check if we need to resize or grow the buffer
377
+ if( (parser->overflow_data_size + length) > parser->overflow_data_allocated ) {
378
+ parser->overflow_data_allocated += length;
379
+ // printf( "realloc: %d bytes, using %d\n", (int)parser->overflow_data_allocated, (int)(parser->overflow_data_size+length) );
380
+ parser->overflow_data = (char*)realloc( parser->overflow_data, sizeof(char)*(parser->overflow_data_allocated) );
381
+ }
382
+ memcpy( parser->overflow_data+parser->overflow_data_size, data, length );
383
+ parser->overflow_data_size += length;
384
+ }
385
+ else {
386
+ parser->overflow_data_allocated = ESI_OUTPUT_BUFFER_SIZE > length ? ESI_OUTPUT_BUFFER_SIZE : length;
387
+ parser->overflow_data = (char*)malloc( sizeof( char ) * parser->overflow_data_allocated );
388
+ memcpy( parser->overflow_data, data, length );
389
+ parser->overflow_data_size = length;
390
+ // printf( "malloc: %d for %d bytes\n", (int)parser->overflow_data_allocated, (int)length );
391
+ }
392
+
393
+ // in our new memory space mark will now be
394
+ parser->mark = ( mark_offset >= 0 ) ? parser->overflow_data + mark_offset : NULL;
395
+ parser->tag_text = ( tag_text_offset >= 0 ) ? parser->overflow_data + tag_text_offset : NULL;
396
+ parser->attr_key = ( attr_key_offset >= 0 ) ? parser->overflow_data + attr_key_offset : NULL;
397
+ parser->attr_value = ( attr_value_offset >= 0 ) ? parser->overflow_data + attr_value_offset : NULL;
398
+ }
399
+
400
+ /* accept an arbitrary length string buffer
401
+ * when this methods exits it determines if an end state was reached
402
+ * if no end state was reached it saves the full input into an internal buffer
403
+ * when invoked next, it reuses that internable buffer copying all pointers into the
404
+ * newly allocated buffer. if it exits in a terminal state, e.g. 0 then it will dump these buffers
405
+ */
406
+ int esi_parser_execute( ESIParser *parser, const char *data, size_t length )
407
+ {
408
+ int cs = parser->cs;
409
+ const char *p = data;
410
+ const char *eof = NULL; // ragel 6.x compat
411
+ const char *pe = data + length;
412
+ int pindex;
413
+
414
+ if( length == 0 ){ return cs; }
415
+
416
+ /* scan data for any '<esi:' start sequences, /<$/, /<e$/, /<es$/, /<esi$/, /<esi:$/ */
417
+ if( cs == esi_start || cs == 0 ) {
418
+ pindex = esi_parser_scan_for_start( parser, data, length );
419
+ if( pindex == -1 ) { /* this means there are no start sequences in the buffer we recieved */
420
+ esi_parser_send_buffer( parser, data, length );
421
+ return cs; /* no esi start sequences send it all out and break out early */
422
+ }
423
+ }
424
+
425
+ /* there's an existing overflow buffer and it's being used, append the new data */
426
+ //if( parser->overflow_data && parser->overflow_data_size > 0 ) {
427
+ if( parser->using_overflow ) {
428
+ int prev_overflow_size = parser->overflow_data_size; // save the current overflow size
429
+ esi_parser_append_data_to_overflow_data( parser, data, length );
430
+
431
+ /* set parser variables */
432
+ p = parser->overflow_data + prev_overflow_size;
433
+ data = parser->overflow_data;
434
+ length = parser->overflow_data_size;
435
+ pe = data + length;
436
+ }
437
+
438
+ if( !parser->mark ) {
439
+ parser->mark = p;
440
+ }
441
+
442
+
443
+ #line 444 "parser.c"
444
+ {
445
+ if ( p == pe )
446
+ goto _test_eof;
447
+ _resume:
448
+ switch ( cs ) {
449
+ case 75:
450
+ if ( (*p) == 60 )
451
+ goto tr1;
452
+ goto tr0;
453
+ case 0:
454
+ if ( (*p) == 60 )
455
+ goto tr1;
456
+ goto tr0;
457
+ case 1:
458
+ switch( (*p) ) {
459
+ case 47: goto tr2;
460
+ case 60: goto tr1;
461
+ case 101: goto tr3;
462
+ }
463
+ goto tr0;
464
+ case 2:
465
+ switch( (*p) ) {
466
+ case 60: goto tr1;
467
+ case 101: goto tr4;
468
+ }
469
+ goto tr0;
470
+ case 3:
471
+ switch( (*p) ) {
472
+ case 60: goto tr1;
473
+ case 115: goto tr5;
474
+ }
475
+ goto tr0;
476
+ case 4:
477
+ switch( (*p) ) {
478
+ case 60: goto tr1;
479
+ case 105: goto tr6;
480
+ }
481
+ goto tr0;
482
+ case 5:
483
+ switch( (*p) ) {
484
+ case 58: goto tr7;
485
+ case 60: goto tr1;
486
+ }
487
+ goto tr0;
488
+ case 6:
489
+ if ( (*p) == 60 )
490
+ goto tr1;
491
+ if ( 97 <= (*p) && (*p) <= 122 )
492
+ goto tr8;
493
+ goto tr0;
494
+ case 7:
495
+ switch( (*p) ) {
496
+ case 60: goto tr1;
497
+ case 62: goto tr9;
498
+ }
499
+ if ( 97 <= (*p) && (*p) <= 122 )
500
+ goto tr8;
501
+ goto tr0;
502
+ case 8:
503
+ switch( (*p) ) {
504
+ case 60: goto tr1;
505
+ case 115: goto tr10;
506
+ }
507
+ goto tr0;
508
+ case 9:
509
+ switch( (*p) ) {
510
+ case 60: goto tr1;
511
+ case 105: goto tr11;
512
+ }
513
+ goto tr0;
514
+ case 10:
515
+ switch( (*p) ) {
516
+ case 58: goto tr12;
517
+ case 60: goto tr1;
518
+ }
519
+ goto tr0;
520
+ case 11:
521
+ if ( (*p) == 60 )
522
+ goto tr1;
523
+ if ( 97 <= (*p) && (*p) <= 122 )
524
+ goto tr13;
525
+ goto tr0;
526
+ case 12:
527
+ switch( (*p) ) {
528
+ case 32: goto tr14;
529
+ case 60: goto tr1;
530
+ case 62: goto tr15;
531
+ }
532
+ if ( (*p) > 13 ) {
533
+ if ( 97 <= (*p) && (*p) <= 122 )
534
+ goto tr13;
535
+ } else if ( (*p) >= 9 )
536
+ goto tr14;
537
+ goto tr0;
538
+ case 13:
539
+ switch( (*p) ) {
540
+ case 32: goto tr16;
541
+ case 45: goto tr17;
542
+ case 47: goto tr18;
543
+ case 60: goto tr1;
544
+ case 62: goto tr19;
545
+ case 95: goto tr17;
546
+ }
547
+ if ( (*p) < 65 ) {
548
+ if ( 9 <= (*p) && (*p) <= 13 )
549
+ goto tr16;
550
+ } else if ( (*p) > 90 ) {
551
+ if ( 97 <= (*p) && (*p) <= 122 )
552
+ goto tr17;
553
+ } else
554
+ goto tr17;
555
+ goto tr0;
556
+ case 14:
557
+ switch( (*p) ) {
558
+ case 32: goto tr16;
559
+ case 45: goto tr17;
560
+ case 47: goto tr18;
561
+ case 60: goto tr1;
562
+ case 95: goto tr17;
563
+ }
564
+ if ( (*p) < 65 ) {
565
+ if ( 9 <= (*p) && (*p) <= 13 )
566
+ goto tr16;
567
+ } else if ( (*p) > 90 ) {
568
+ if ( 97 <= (*p) && (*p) <= 122 )
569
+ goto tr17;
570
+ } else
571
+ goto tr17;
572
+ goto tr0;
573
+ case 15:
574
+ switch( (*p) ) {
575
+ case 45: goto tr17;
576
+ case 60: goto tr1;
577
+ case 61: goto tr20;
578
+ case 95: goto tr17;
579
+ }
580
+ if ( (*p) < 65 ) {
581
+ if ( 48 <= (*p) && (*p) <= 57 )
582
+ goto tr17;
583
+ } else if ( (*p) > 90 ) {
584
+ if ( 97 <= (*p) && (*p) <= 122 )
585
+ goto tr17;
586
+ } else
587
+ goto tr17;
588
+ goto tr0;
589
+ case 16:
590
+ switch( (*p) ) {
591
+ case 32: goto tr21;
592
+ case 34: goto tr22;
593
+ case 39: goto tr23;
594
+ case 60: goto tr1;
595
+ }
596
+ if ( 9 <= (*p) && (*p) <= 13 )
597
+ goto tr21;
598
+ goto tr0;
599
+ case 17:
600
+ switch( (*p) ) {
601
+ case 34: goto tr24;
602
+ case 60: goto tr25;
603
+ case 92: goto tr26;
604
+ }
605
+ goto tr22;
606
+ case 18:
607
+ switch( (*p) ) {
608
+ case 34: goto tr24;
609
+ case 47: goto tr27;
610
+ case 60: goto tr25;
611
+ case 92: goto tr26;
612
+ case 101: goto tr28;
613
+ }
614
+ goto tr22;
615
+ case 19:
616
+ switch( (*p) ) {
617
+ case 34: goto tr24;
618
+ case 60: goto tr25;
619
+ case 92: goto tr26;
620
+ case 101: goto tr29;
621
+ }
622
+ goto tr22;
623
+ case 20:
624
+ switch( (*p) ) {
625
+ case 34: goto tr30;
626
+ case 60: goto tr25;
627
+ case 92: goto tr26;
628
+ }
629
+ goto tr22;
630
+ case 21:
631
+ switch( (*p) ) {
632
+ case 32: goto tr31;
633
+ case 34: goto tr24;
634
+ case 45: goto tr32;
635
+ case 47: goto tr33;
636
+ case 60: goto tr25;
637
+ case 62: goto tr34;
638
+ case 92: goto tr26;
639
+ case 95: goto tr32;
640
+ }
641
+ if ( (*p) < 65 ) {
642
+ if ( 9 <= (*p) && (*p) <= 13 )
643
+ goto tr31;
644
+ } else if ( (*p) > 90 ) {
645
+ if ( 97 <= (*p) && (*p) <= 122 )
646
+ goto tr32;
647
+ } else
648
+ goto tr32;
649
+ goto tr22;
650
+ case 22:
651
+ switch( (*p) ) {
652
+ case 32: goto tr31;
653
+ case 34: goto tr24;
654
+ case 45: goto tr32;
655
+ case 47: goto tr33;
656
+ case 60: goto tr25;
657
+ case 92: goto tr26;
658
+ case 95: goto tr32;
659
+ }
660
+ if ( (*p) < 65 ) {
661
+ if ( 9 <= (*p) && (*p) <= 13 )
662
+ goto tr31;
663
+ } else if ( (*p) > 90 ) {
664
+ if ( 97 <= (*p) && (*p) <= 122 )
665
+ goto tr32;
666
+ } else
667
+ goto tr32;
668
+ goto tr22;
669
+ case 23:
670
+ switch( (*p) ) {
671
+ case 34: goto tr24;
672
+ case 45: goto tr32;
673
+ case 60: goto tr25;
674
+ case 61: goto tr35;
675
+ case 92: goto tr26;
676
+ case 95: goto tr32;
677
+ }
678
+ if ( (*p) < 65 ) {
679
+ if ( 48 <= (*p) && (*p) <= 57 )
680
+ goto tr32;
681
+ } else if ( (*p) > 90 ) {
682
+ if ( 97 <= (*p) && (*p) <= 122 )
683
+ goto tr32;
684
+ } else
685
+ goto tr32;
686
+ goto tr22;
687
+ case 24:
688
+ switch( (*p) ) {
689
+ case 32: goto tr36;
690
+ case 34: goto tr30;
691
+ case 39: goto tr37;
692
+ case 60: goto tr25;
693
+ case 92: goto tr26;
694
+ }
695
+ if ( 9 <= (*p) && (*p) <= 13 )
696
+ goto tr36;
697
+ goto tr22;
698
+ case 25:
699
+ switch( (*p) ) {
700
+ case 34: goto tr38;
701
+ case 39: goto tr30;
702
+ case 60: goto tr39;
703
+ case 92: goto tr40;
704
+ }
705
+ goto tr37;
706
+ case 26:
707
+ switch( (*p) ) {
708
+ case 32: goto tr41;
709
+ case 39: goto tr24;
710
+ case 45: goto tr42;
711
+ case 47: goto tr43;
712
+ case 60: goto tr44;
713
+ case 62: goto tr45;
714
+ case 92: goto tr46;
715
+ case 95: goto tr42;
716
+ }
717
+ if ( (*p) < 65 ) {
718
+ if ( 9 <= (*p) && (*p) <= 13 )
719
+ goto tr41;
720
+ } else if ( (*p) > 90 ) {
721
+ if ( 97 <= (*p) && (*p) <= 122 )
722
+ goto tr42;
723
+ } else
724
+ goto tr42;
725
+ goto tr23;
726
+ case 27:
727
+ switch( (*p) ) {
728
+ case 39: goto tr24;
729
+ case 60: goto tr44;
730
+ case 92: goto tr46;
731
+ }
732
+ goto tr23;
733
+ case 28:
734
+ switch( (*p) ) {
735
+ case 39: goto tr24;
736
+ case 47: goto tr47;
737
+ case 60: goto tr44;
738
+ case 92: goto tr46;
739
+ case 101: goto tr48;
740
+ }
741
+ goto tr23;
742
+ case 29:
743
+ switch( (*p) ) {
744
+ case 39: goto tr24;
745
+ case 60: goto tr44;
746
+ case 92: goto tr46;
747
+ case 101: goto tr49;
748
+ }
749
+ goto tr23;
750
+ case 30:
751
+ switch( (*p) ) {
752
+ case 39: goto tr38;
753
+ case 60: goto tr44;
754
+ case 92: goto tr46;
755
+ }
756
+ goto tr23;
757
+ case 31:
758
+ switch( (*p) ) {
759
+ case 39: goto tr24;
760
+ case 60: goto tr44;
761
+ case 92: goto tr46;
762
+ case 115: goto tr50;
763
+ }
764
+ goto tr23;
765
+ case 32:
766
+ switch( (*p) ) {
767
+ case 39: goto tr24;
768
+ case 60: goto tr44;
769
+ case 92: goto tr46;
770
+ case 105: goto tr51;
771
+ }
772
+ goto tr23;
773
+ case 33:
774
+ switch( (*p) ) {
775
+ case 39: goto tr24;
776
+ case 58: goto tr52;
777
+ case 60: goto tr44;
778
+ case 92: goto tr46;
779
+ }
780
+ goto tr23;
781
+ case 34:
782
+ switch( (*p) ) {
783
+ case 39: goto tr24;
784
+ case 60: goto tr44;
785
+ case 92: goto tr46;
786
+ }
787
+ if ( 97 <= (*p) && (*p) <= 122 )
788
+ goto tr53;
789
+ goto tr23;
790
+ case 35:
791
+ switch( (*p) ) {
792
+ case 39: goto tr24;
793
+ case 60: goto tr44;
794
+ case 62: goto tr54;
795
+ case 92: goto tr46;
796
+ }
797
+ if ( 97 <= (*p) && (*p) <= 122 )
798
+ goto tr53;
799
+ goto tr23;
800
+ case 36:
801
+ switch( (*p) ) {
802
+ case 39: goto tr24;
803
+ case 60: goto tr44;
804
+ case 92: goto tr46;
805
+ case 115: goto tr55;
806
+ }
807
+ goto tr23;
808
+ case 37:
809
+ switch( (*p) ) {
810
+ case 39: goto tr24;
811
+ case 60: goto tr44;
812
+ case 92: goto tr46;
813
+ case 105: goto tr56;
814
+ }
815
+ goto tr23;
816
+ case 38:
817
+ switch( (*p) ) {
818
+ case 39: goto tr24;
819
+ case 58: goto tr57;
820
+ case 60: goto tr44;
821
+ case 92: goto tr46;
822
+ }
823
+ goto tr23;
824
+ case 39:
825
+ switch( (*p) ) {
826
+ case 39: goto tr24;
827
+ case 60: goto tr44;
828
+ case 92: goto tr46;
829
+ }
830
+ if ( 97 <= (*p) && (*p) <= 122 )
831
+ goto tr58;
832
+ goto tr23;
833
+ case 40:
834
+ switch( (*p) ) {
835
+ case 32: goto tr59;
836
+ case 39: goto tr24;
837
+ case 60: goto tr44;
838
+ case 62: goto tr60;
839
+ case 92: goto tr46;
840
+ }
841
+ if ( (*p) > 13 ) {
842
+ if ( 97 <= (*p) && (*p) <= 122 )
843
+ goto tr58;
844
+ } else if ( (*p) >= 9 )
845
+ goto tr59;
846
+ goto tr23;
847
+ case 76:
848
+ switch( (*p) ) {
849
+ case 39: goto tr100;
850
+ case 60: goto tr101;
851
+ case 92: goto tr102;
852
+ }
853
+ goto tr99;
854
+ case 41:
855
+ switch( (*p) ) {
856
+ case 32: goto tr41;
857
+ case 39: goto tr24;
858
+ case 45: goto tr42;
859
+ case 47: goto tr43;
860
+ case 60: goto tr44;
861
+ case 92: goto tr46;
862
+ case 95: goto tr42;
863
+ }
864
+ if ( (*p) < 65 ) {
865
+ if ( 9 <= (*p) && (*p) <= 13 )
866
+ goto tr41;
867
+ } else if ( (*p) > 90 ) {
868
+ if ( 97 <= (*p) && (*p) <= 122 )
869
+ goto tr42;
870
+ } else
871
+ goto tr42;
872
+ goto tr23;
873
+ case 42:
874
+ switch( (*p) ) {
875
+ case 39: goto tr24;
876
+ case 45: goto tr42;
877
+ case 60: goto tr44;
878
+ case 61: goto tr61;
879
+ case 92: goto tr46;
880
+ case 95: goto tr42;
881
+ }
882
+ if ( (*p) < 65 ) {
883
+ if ( 48 <= (*p) && (*p) <= 57 )
884
+ goto tr42;
885
+ } else if ( (*p) > 90 ) {
886
+ if ( 97 <= (*p) && (*p) <= 122 )
887
+ goto tr42;
888
+ } else
889
+ goto tr42;
890
+ goto tr23;
891
+ case 43:
892
+ switch( (*p) ) {
893
+ case 32: goto tr62;
894
+ case 34: goto tr37;
895
+ case 39: goto tr38;
896
+ case 60: goto tr44;
897
+ case 92: goto tr46;
898
+ }
899
+ if ( 9 <= (*p) && (*p) <= 13 )
900
+ goto tr62;
901
+ goto tr23;
902
+ case 44:
903
+ switch( (*p) ) {
904
+ case 39: goto tr24;
905
+ case 60: goto tr44;
906
+ case 62: goto tr63;
907
+ case 92: goto tr46;
908
+ }
909
+ goto tr23;
910
+ case 45:
911
+ switch( (*p) ) {
912
+ case 34: goto tr38;
913
+ case 39: goto tr30;
914
+ case 47: goto tr64;
915
+ case 60: goto tr39;
916
+ case 92: goto tr40;
917
+ case 101: goto tr65;
918
+ }
919
+ goto tr37;
920
+ case 46:
921
+ switch( (*p) ) {
922
+ case 34: goto tr38;
923
+ case 39: goto tr30;
924
+ case 60: goto tr39;
925
+ case 92: goto tr40;
926
+ case 101: goto tr66;
927
+ }
928
+ goto tr37;
929
+ case 47:
930
+ switch( (*p) ) {
931
+ case 34: goto tr67;
932
+ case 39: goto tr67;
933
+ case 60: goto tr39;
934
+ case 92: goto tr40;
935
+ }
936
+ goto tr37;
937
+ case 48:
938
+ switch( (*p) ) {
939
+ case 32: goto tr68;
940
+ case 34: goto tr38;
941
+ case 39: goto tr30;
942
+ case 45: goto tr69;
943
+ case 47: goto tr70;
944
+ case 60: goto tr39;
945
+ case 62: goto tr71;
946
+ case 92: goto tr40;
947
+ case 95: goto tr69;
948
+ }
949
+ if ( (*p) < 65 ) {
950
+ if ( 9 <= (*p) && (*p) <= 13 )
951
+ goto tr68;
952
+ } else if ( (*p) > 90 ) {
953
+ if ( 97 <= (*p) && (*p) <= 122 )
954
+ goto tr69;
955
+ } else
956
+ goto tr69;
957
+ goto tr37;
958
+ case 49:
959
+ switch( (*p) ) {
960
+ case 32: goto tr68;
961
+ case 34: goto tr38;
962
+ case 39: goto tr30;
963
+ case 45: goto tr69;
964
+ case 47: goto tr70;
965
+ case 60: goto tr39;
966
+ case 92: goto tr40;
967
+ case 95: goto tr69;
968
+ }
969
+ if ( (*p) < 65 ) {
970
+ if ( 9 <= (*p) && (*p) <= 13 )
971
+ goto tr68;
972
+ } else if ( (*p) > 90 ) {
973
+ if ( 97 <= (*p) && (*p) <= 122 )
974
+ goto tr69;
975
+ } else
976
+ goto tr69;
977
+ goto tr37;
978
+ case 50:
979
+ switch( (*p) ) {
980
+ case 34: goto tr38;
981
+ case 39: goto tr30;
982
+ case 45: goto tr69;
983
+ case 60: goto tr39;
984
+ case 61: goto tr72;
985
+ case 92: goto tr40;
986
+ case 95: goto tr69;
987
+ }
988
+ if ( (*p) < 65 ) {
989
+ if ( 48 <= (*p) && (*p) <= 57 )
990
+ goto tr69;
991
+ } else if ( (*p) > 90 ) {
992
+ if ( 97 <= (*p) && (*p) <= 122 )
993
+ goto tr69;
994
+ } else
995
+ goto tr69;
996
+ goto tr37;
997
+ case 51:
998
+ switch( (*p) ) {
999
+ case 32: goto tr73;
1000
+ case 34: goto tr67;
1001
+ case 39: goto tr67;
1002
+ case 60: goto tr39;
1003
+ case 92: goto tr40;
1004
+ }
1005
+ if ( 9 <= (*p) && (*p) <= 13 )
1006
+ goto tr73;
1007
+ goto tr37;
1008
+ case 52:
1009
+ switch( (*p) ) {
1010
+ case 34: goto tr38;
1011
+ case 39: goto tr30;
1012
+ case 60: goto tr39;
1013
+ case 62: goto tr74;
1014
+ case 92: goto tr40;
1015
+ }
1016
+ goto tr37;
1017
+ case 77:
1018
+ switch( (*p) ) {
1019
+ case 34: goto tr104;
1020
+ case 39: goto tr105;
1021
+ case 60: goto tr106;
1022
+ case 92: goto tr107;
1023
+ }
1024
+ goto tr103;
1025
+ case 53:
1026
+ switch( (*p) ) {
1027
+ case 34: goto tr38;
1028
+ case 39: goto tr30;
1029
+ case 60: goto tr39;
1030
+ case 92: goto tr40;
1031
+ case 115: goto tr75;
1032
+ }
1033
+ goto tr37;
1034
+ case 54:
1035
+ switch( (*p) ) {
1036
+ case 34: goto tr38;
1037
+ case 39: goto tr30;
1038
+ case 60: goto tr39;
1039
+ case 92: goto tr40;
1040
+ case 105: goto tr76;
1041
+ }
1042
+ goto tr37;
1043
+ case 55:
1044
+ switch( (*p) ) {
1045
+ case 34: goto tr38;
1046
+ case 39: goto tr30;
1047
+ case 58: goto tr77;
1048
+ case 60: goto tr39;
1049
+ case 92: goto tr40;
1050
+ }
1051
+ goto tr37;
1052
+ case 56:
1053
+ switch( (*p) ) {
1054
+ case 34: goto tr38;
1055
+ case 39: goto tr30;
1056
+ case 60: goto tr39;
1057
+ case 92: goto tr40;
1058
+ }
1059
+ if ( 97 <= (*p) && (*p) <= 122 )
1060
+ goto tr78;
1061
+ goto tr37;
1062
+ case 57:
1063
+ switch( (*p) ) {
1064
+ case 34: goto tr38;
1065
+ case 39: goto tr30;
1066
+ case 60: goto tr39;
1067
+ case 62: goto tr79;
1068
+ case 92: goto tr40;
1069
+ }
1070
+ if ( 97 <= (*p) && (*p) <= 122 )
1071
+ goto tr78;
1072
+ goto tr37;
1073
+ case 58:
1074
+ switch( (*p) ) {
1075
+ case 34: goto tr38;
1076
+ case 39: goto tr30;
1077
+ case 60: goto tr39;
1078
+ case 92: goto tr40;
1079
+ case 115: goto tr80;
1080
+ }
1081
+ goto tr37;
1082
+ case 59:
1083
+ switch( (*p) ) {
1084
+ case 34: goto tr38;
1085
+ case 39: goto tr30;
1086
+ case 60: goto tr39;
1087
+ case 92: goto tr40;
1088
+ case 105: goto tr81;
1089
+ }
1090
+ goto tr37;
1091
+ case 60:
1092
+ switch( (*p) ) {
1093
+ case 34: goto tr38;
1094
+ case 39: goto tr30;
1095
+ case 58: goto tr82;
1096
+ case 60: goto tr39;
1097
+ case 92: goto tr40;
1098
+ }
1099
+ goto tr37;
1100
+ case 61:
1101
+ switch( (*p) ) {
1102
+ case 34: goto tr38;
1103
+ case 39: goto tr30;
1104
+ case 60: goto tr39;
1105
+ case 92: goto tr40;
1106
+ }
1107
+ if ( 97 <= (*p) && (*p) <= 122 )
1108
+ goto tr83;
1109
+ goto tr37;
1110
+ case 62:
1111
+ switch( (*p) ) {
1112
+ case 32: goto tr84;
1113
+ case 34: goto tr38;
1114
+ case 39: goto tr30;
1115
+ case 60: goto tr39;
1116
+ case 62: goto tr85;
1117
+ case 92: goto tr40;
1118
+ }
1119
+ if ( (*p) > 13 ) {
1120
+ if ( 97 <= (*p) && (*p) <= 122 )
1121
+ goto tr83;
1122
+ } else if ( (*p) >= 9 )
1123
+ goto tr84;
1124
+ goto tr37;
1125
+ case 63:
1126
+ switch( (*p) ) {
1127
+ case 34: goto tr24;
1128
+ case 60: goto tr25;
1129
+ case 62: goto tr86;
1130
+ case 92: goto tr26;
1131
+ }
1132
+ goto tr22;
1133
+ case 78:
1134
+ switch( (*p) ) {
1135
+ case 34: goto tr100;
1136
+ case 60: goto tr109;
1137
+ case 92: goto tr110;
1138
+ }
1139
+ goto tr108;
1140
+ case 64:
1141
+ switch( (*p) ) {
1142
+ case 34: goto tr24;
1143
+ case 60: goto tr25;
1144
+ case 92: goto tr26;
1145
+ case 115: goto tr87;
1146
+ }
1147
+ goto tr22;
1148
+ case 65:
1149
+ switch( (*p) ) {
1150
+ case 34: goto tr24;
1151
+ case 60: goto tr25;
1152
+ case 92: goto tr26;
1153
+ case 105: goto tr88;
1154
+ }
1155
+ goto tr22;
1156
+ case 66:
1157
+ switch( (*p) ) {
1158
+ case 34: goto tr24;
1159
+ case 58: goto tr89;
1160
+ case 60: goto tr25;
1161
+ case 92: goto tr26;
1162
+ }
1163
+ goto tr22;
1164
+ case 67:
1165
+ switch( (*p) ) {
1166
+ case 34: goto tr24;
1167
+ case 60: goto tr25;
1168
+ case 92: goto tr26;
1169
+ }
1170
+ if ( 97 <= (*p) && (*p) <= 122 )
1171
+ goto tr90;
1172
+ goto tr22;
1173
+ case 68:
1174
+ switch( (*p) ) {
1175
+ case 34: goto tr24;
1176
+ case 60: goto tr25;
1177
+ case 62: goto tr91;
1178
+ case 92: goto tr26;
1179
+ }
1180
+ if ( 97 <= (*p) && (*p) <= 122 )
1181
+ goto tr90;
1182
+ goto tr22;
1183
+ case 69:
1184
+ switch( (*p) ) {
1185
+ case 34: goto tr24;
1186
+ case 60: goto tr25;
1187
+ case 92: goto tr26;
1188
+ case 115: goto tr92;
1189
+ }
1190
+ goto tr22;
1191
+ case 70:
1192
+ switch( (*p) ) {
1193
+ case 34: goto tr24;
1194
+ case 60: goto tr25;
1195
+ case 92: goto tr26;
1196
+ case 105: goto tr93;
1197
+ }
1198
+ goto tr22;
1199
+ case 71:
1200
+ switch( (*p) ) {
1201
+ case 34: goto tr24;
1202
+ case 58: goto tr94;
1203
+ case 60: goto tr25;
1204
+ case 92: goto tr26;
1205
+ }
1206
+ goto tr22;
1207
+ case 72:
1208
+ switch( (*p) ) {
1209
+ case 34: goto tr24;
1210
+ case 60: goto tr25;
1211
+ case 92: goto tr26;
1212
+ }
1213
+ if ( 97 <= (*p) && (*p) <= 122 )
1214
+ goto tr95;
1215
+ goto tr22;
1216
+ case 73:
1217
+ switch( (*p) ) {
1218
+ case 32: goto tr96;
1219
+ case 34: goto tr24;
1220
+ case 60: goto tr25;
1221
+ case 62: goto tr97;
1222
+ case 92: goto tr26;
1223
+ }
1224
+ if ( (*p) > 13 ) {
1225
+ if ( 97 <= (*p) && (*p) <= 122 )
1226
+ goto tr95;
1227
+ } else if ( (*p) >= 9 )
1228
+ goto tr96;
1229
+ goto tr22;
1230
+ case 74:
1231
+ switch( (*p) ) {
1232
+ case 60: goto tr1;
1233
+ case 62: goto tr98;
1234
+ }
1235
+ goto tr0;
1236
+ case 79:
1237
+ if ( (*p) == 60 )
1238
+ goto tr112;
1239
+ goto tr111;
1240
+ }
1241
+
1242
+ tr0: cs = 0; goto f0;
1243
+ tr9: cs = 0; goto f2;
1244
+ tr111: cs = 0; goto f10;
1245
+ tr1: cs = 1; goto f1;
1246
+ tr112: cs = 1; goto f12;
1247
+ tr2: cs = 2; goto f0;
1248
+ tr4: cs = 3; goto f0;
1249
+ tr5: cs = 4; goto f0;
1250
+ tr6: cs = 5; goto f0;
1251
+ tr7: cs = 6; goto f0;
1252
+ tr8: cs = 7; goto f0;
1253
+ tr3: cs = 8; goto f0;
1254
+ tr10: cs = 9; goto f0;
1255
+ tr11: cs = 10; goto f0;
1256
+ tr12: cs = 11; goto f0;
1257
+ tr13: cs = 12; goto f0;
1258
+ tr14: cs = 13; goto f3;
1259
+ tr24: cs = 13; goto f7;
1260
+ tr100: cs = 13; goto f11;
1261
+ tr16: cs = 14; goto f0;
1262
+ tr17: cs = 15; goto f0;
1263
+ tr21: cs = 16; goto f0;
1264
+ tr20: cs = 16; goto f6;
1265
+ tr22: cs = 17; goto f0;
1266
+ tr91: cs = 17; goto f2;
1267
+ tr108: cs = 17; goto f10;
1268
+ tr25: cs = 18; goto f1;
1269
+ tr109: cs = 18; goto f12;
1270
+ tr27: cs = 19; goto f0;
1271
+ tr26: cs = 20; goto f0;
1272
+ tr110: cs = 20; goto f10;
1273
+ tr96: cs = 21; goto f3;
1274
+ tr30: cs = 21; goto f7;
1275
+ tr105: cs = 21; goto f11;
1276
+ tr31: cs = 22; goto f0;
1277
+ tr32: cs = 23; goto f0;
1278
+ tr36: cs = 24; goto f0;
1279
+ tr35: cs = 24; goto f6;
1280
+ tr37: cs = 25; goto f0;
1281
+ tr79: cs = 25; goto f2;
1282
+ tr103: cs = 25; goto f10;
1283
+ tr59: cs = 26; goto f3;
1284
+ tr38: cs = 26; goto f7;
1285
+ tr104: cs = 26; goto f11;
1286
+ tr23: cs = 27; goto f0;
1287
+ tr54: cs = 27; goto f2;
1288
+ tr99: cs = 27; goto f10;
1289
+ tr44: cs = 28; goto f1;
1290
+ tr101: cs = 28; goto f12;
1291
+ tr47: cs = 29; goto f0;
1292
+ tr46: cs = 30; goto f0;
1293
+ tr102: cs = 30; goto f10;
1294
+ tr49: cs = 31; goto f0;
1295
+ tr50: cs = 32; goto f0;
1296
+ tr51: cs = 33; goto f0;
1297
+ tr52: cs = 34; goto f0;
1298
+ tr53: cs = 35; goto f0;
1299
+ tr48: cs = 36; goto f0;
1300
+ tr55: cs = 37; goto f0;
1301
+ tr56: cs = 38; goto f0;
1302
+ tr57: cs = 39; goto f0;
1303
+ tr58: cs = 40; goto f0;
1304
+ tr41: cs = 41; goto f0;
1305
+ tr42: cs = 42; goto f0;
1306
+ tr62: cs = 43; goto f0;
1307
+ tr61: cs = 43; goto f6;
1308
+ tr43: cs = 44; goto f0;
1309
+ tr39: cs = 45; goto f1;
1310
+ tr106: cs = 45; goto f12;
1311
+ tr64: cs = 46; goto f0;
1312
+ tr40: cs = 47; goto f0;
1313
+ tr107: cs = 47; goto f10;
1314
+ tr84: cs = 48; goto f3;
1315
+ tr67: cs = 48; goto f7;
1316
+ tr68: cs = 49; goto f0;
1317
+ tr69: cs = 50; goto f0;
1318
+ tr73: cs = 51; goto f0;
1319
+ tr72: cs = 51; goto f6;
1320
+ tr70: cs = 52; goto f0;
1321
+ tr66: cs = 53; goto f0;
1322
+ tr75: cs = 54; goto f0;
1323
+ tr76: cs = 55; goto f0;
1324
+ tr77: cs = 56; goto f0;
1325
+ tr78: cs = 57; goto f0;
1326
+ tr65: cs = 58; goto f0;
1327
+ tr80: cs = 59; goto f0;
1328
+ tr81: cs = 60; goto f0;
1329
+ tr82: cs = 61; goto f0;
1330
+ tr83: cs = 62; goto f0;
1331
+ tr33: cs = 63; goto f0;
1332
+ tr29: cs = 64; goto f0;
1333
+ tr87: cs = 65; goto f0;
1334
+ tr88: cs = 66; goto f0;
1335
+ tr89: cs = 67; goto f0;
1336
+ tr90: cs = 68; goto f0;
1337
+ tr28: cs = 69; goto f0;
1338
+ tr92: cs = 70; goto f0;
1339
+ tr93: cs = 71; goto f0;
1340
+ tr94: cs = 72; goto f0;
1341
+ tr95: cs = 73; goto f0;
1342
+ tr18: cs = 74; goto f0;
1343
+ tr60: cs = 76; goto f4;
1344
+ tr45: cs = 76; goto f5;
1345
+ tr63: cs = 76; goto f8;
1346
+ tr85: cs = 77; goto f4;
1347
+ tr71: cs = 77; goto f5;
1348
+ tr74: cs = 77; goto f8;
1349
+ tr97: cs = 78; goto f4;
1350
+ tr34: cs = 78; goto f5;
1351
+ tr86: cs = 78; goto f8;
1352
+ tr15: cs = 79; goto f4;
1353
+ tr19: cs = 79; goto f5;
1354
+ tr98: cs = 79; goto f8;
1355
+
1356
+ f0:
1357
+ #line 295 "parser.rl"
1358
+ {
1359
+ //printf( "[%c:%d],", *p, cs );
1360
+ switch( cs ) {
1361
+ case 0: /* non matching state */
1362
+ if( parser->prev_state != 12 && parser->prev_state != 7 ){ /* states following a possible end state for a tag */
1363
+ if( parser->echobuffer && parser->echobuffer_index != -1 ){
1364
+ /* send the echo buffer */
1365
+ esi_parser_echo_buffer( parser );
1366
+ }
1367
+ /* send the current character */
1368
+ esi_parser_echo_char( parser, *p );
1369
+ }
1370
+ /* clear the echo buffer */
1371
+ esi_parser_echobuffer_clear( parser );
1372
+ break;
1373
+ default:
1374
+ /* append to the echo buffer */
1375
+ esi_parser_concat_to_echobuffer( parser, *p );
1376
+ }
1377
+ /* save the previous state, necessary for end case detection such as /> and </esi:try> the trailing > character
1378
+ is state 12 and 7
1379
+ */
1380
+ parser->prev_state = cs;
1381
+ }
1382
+ goto _again;
1383
+ f1:
1384
+ #line 295 "parser.rl"
1385
+ {
1386
+ //printf( "[%c:%d],", *p, cs );
1387
+ switch( cs ) {
1388
+ case 0: /* non matching state */
1389
+ if( parser->prev_state != 12 && parser->prev_state != 7 ){ /* states following a possible end state for a tag */
1390
+ if( parser->echobuffer && parser->echobuffer_index != -1 ){
1391
+ /* send the echo buffer */
1392
+ esi_parser_echo_buffer( parser );
1393
+ }
1394
+ /* send the current character */
1395
+ esi_parser_echo_char( parser, *p );
1396
+ }
1397
+ /* clear the echo buffer */
1398
+ esi_parser_echobuffer_clear( parser );
1399
+ break;
1400
+ default:
1401
+ /* append to the echo buffer */
1402
+ esi_parser_concat_to_echobuffer( parser, *p );
1403
+ }
1404
+ /* save the previous state, necessary for end case detection such as /> and </esi:try> the trailing > character
1405
+ is state 12 and 7
1406
+ */
1407
+ parser->prev_state = cs;
1408
+ }
1409
+ #line 160 "parser.rl"
1410
+ {
1411
+ parser->mark = p;
1412
+ //debug_string( "begin", p, 1 );
1413
+ }
1414
+ goto _again;
1415
+ f10:
1416
+ #line 295 "parser.rl"
1417
+ {
1418
+ //printf( "[%c:%d],", *p, cs );
1419
+ switch( cs ) {
1420
+ case 0: /* non matching state */
1421
+ if( parser->prev_state != 12 && parser->prev_state != 7 ){ /* states following a possible end state for a tag */
1422
+ if( parser->echobuffer && parser->echobuffer_index != -1 ){
1423
+ /* send the echo buffer */
1424
+ esi_parser_echo_buffer( parser );
1425
+ }
1426
+ /* send the current character */
1427
+ esi_parser_echo_char( parser, *p );
1428
+ }
1429
+ /* clear the echo buffer */
1430
+ esi_parser_echobuffer_clear( parser );
1431
+ break;
1432
+ default:
1433
+ /* append to the echo buffer */
1434
+ esi_parser_concat_to_echobuffer( parser, *p );
1435
+ }
1436
+ /* save the previous state, necessary for end case detection such as /> and </esi:try> the trailing > character
1437
+ is state 12 and 7
1438
+ */
1439
+ parser->prev_state = cs;
1440
+ }
1441
+ #line 164 "parser.rl"
1442
+ {
1443
+ // printf( "finish\n" );
1444
+ }
1445
+ goto _again;
1446
+ f3:
1447
+ #line 295 "parser.rl"
1448
+ {
1449
+ //printf( "[%c:%d],", *p, cs );
1450
+ switch( cs ) {
1451
+ case 0: /* non matching state */
1452
+ if( parser->prev_state != 12 && parser->prev_state != 7 ){ /* states following a possible end state for a tag */
1453
+ if( parser->echobuffer && parser->echobuffer_index != -1 ){
1454
+ /* send the echo buffer */
1455
+ esi_parser_echo_buffer( parser );
1456
+ }
1457
+ /* send the current character */
1458
+ esi_parser_echo_char( parser, *p );
1459
+ }
1460
+ /* clear the echo buffer */
1461
+ esi_parser_echobuffer_clear( parser );
1462
+ break;
1463
+ default:
1464
+ /* append to the echo buffer */
1465
+ esi_parser_concat_to_echobuffer( parser, *p );
1466
+ }
1467
+ /* save the previous state, necessary for end case detection such as /> and </esi:try> the trailing > character
1468
+ is state 12 and 7
1469
+ */
1470
+ parser->prev_state = cs;
1471
+ }
1472
+ #line 169 "parser.rl"
1473
+ {
1474
+ parser->tag_text = parser->mark+1;
1475
+ parser->tag_text_length = p - (parser->mark+1);
1476
+ parser->mark = p;
1477
+ }
1478
+ goto _again;
1479
+ f8:
1480
+ #line 295 "parser.rl"
1481
+ {
1482
+ //printf( "[%c:%d],", *p, cs );
1483
+ switch( cs ) {
1484
+ case 0: /* non matching state */
1485
+ if( parser->prev_state != 12 && parser->prev_state != 7 ){ /* states following a possible end state for a tag */
1486
+ if( parser->echobuffer && parser->echobuffer_index != -1 ){
1487
+ /* send the echo buffer */
1488
+ esi_parser_echo_buffer( parser );
1489
+ }
1490
+ /* send the current character */
1491
+ esi_parser_echo_char( parser, *p );
1492
+ }
1493
+ /* clear the echo buffer */
1494
+ esi_parser_echobuffer_clear( parser );
1495
+ break;
1496
+ default:
1497
+ /* append to the echo buffer */
1498
+ esi_parser_concat_to_echobuffer( parser, *p );
1499
+ }
1500
+ /* save the previous state, necessary for end case detection such as /> and </esi:try> the trailing > character
1501
+ is state 12 and 7
1502
+ */
1503
+ parser->prev_state = cs;
1504
+ }
1505
+ #line 176 "parser.rl"
1506
+ {
1507
+ /* trim the tag text */
1508
+ ltrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1509
+ rtrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1510
+
1511
+ /* send the start tag and end tag message */
1512
+ esi_parser_flush_output( parser );
1513
+ parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->attributes, parser->user_data );
1514
+ parser->end_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->user_data );
1515
+ //printf("\t[see inline tag]\n");
1516
+
1517
+ /* mark the position */
1518
+ parser->tag_text = NULL;
1519
+ parser->tag_text_length = 0;
1520
+ parser->mark = p;
1521
+
1522
+ /* clear out the echo buffer */
1523
+ esi_parser_echobuffer_clear( parser );
1524
+ }
1525
+ goto _again;
1526
+ f5:
1527
+ #line 295 "parser.rl"
1528
+ {
1529
+ //printf( "[%c:%d],", *p, cs );
1530
+ switch( cs ) {
1531
+ case 0: /* non matching state */
1532
+ if( parser->prev_state != 12 && parser->prev_state != 7 ){ /* states following a possible end state for a tag */
1533
+ if( parser->echobuffer && parser->echobuffer_index != -1 ){
1534
+ /* send the echo buffer */
1535
+ esi_parser_echo_buffer( parser );
1536
+ }
1537
+ /* send the current character */
1538
+ esi_parser_echo_char( parser, *p );
1539
+ }
1540
+ /* clear the echo buffer */
1541
+ esi_parser_echobuffer_clear( parser );
1542
+ break;
1543
+ default:
1544
+ /* append to the echo buffer */
1545
+ esi_parser_concat_to_echobuffer( parser, *p );
1546
+ }
1547
+ /* save the previous state, necessary for end case detection such as /> and </esi:try> the trailing > character
1548
+ is state 12 and 7
1549
+ */
1550
+ parser->prev_state = cs;
1551
+ }
1552
+ #line 197 "parser.rl"
1553
+ {
1554
+ /* trim tag text */
1555
+ ltrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1556
+ rtrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1557
+
1558
+ /* send the start and end tag message */
1559
+ esi_parser_flush_output( parser );
1560
+ parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->attributes, parser->user_data );
1561
+ //printf("\t[see start tag with attributes]\n");
1562
+
1563
+ parser->tag_text = NULL;
1564
+ parser->tag_text_length = 0;
1565
+ parser->mark = p;
1566
+
1567
+ /* clear out the echo buffer */
1568
+ esi_parser_echobuffer_clear( parser );
1569
+ }
1570
+ goto _again;
1571
+ f6:
1572
+ #line 295 "parser.rl"
1573
+ {
1574
+ //printf( "[%c:%d],", *p, cs );
1575
+ switch( cs ) {
1576
+ case 0: /* non matching state */
1577
+ if( parser->prev_state != 12 && parser->prev_state != 7 ){ /* states following a possible end state for a tag */
1578
+ if( parser->echobuffer && parser->echobuffer_index != -1 ){
1579
+ /* send the echo buffer */
1580
+ esi_parser_echo_buffer( parser );
1581
+ }
1582
+ /* send the current character */
1583
+ esi_parser_echo_char( parser, *p );
1584
+ }
1585
+ /* clear the echo buffer */
1586
+ esi_parser_echobuffer_clear( parser );
1587
+ break;
1588
+ default:
1589
+ /* append to the echo buffer */
1590
+ esi_parser_concat_to_echobuffer( parser, *p );
1591
+ }
1592
+ /* save the previous state, necessary for end case detection such as /> and </esi:try> the trailing > character
1593
+ is state 12 and 7
1594
+ */
1595
+ parser->prev_state = cs;
1596
+ }
1597
+ #line 216 "parser.rl"
1598
+ {
1599
+ /* save the attribute key start */
1600
+ parser->attr_key = parser->mark;
1601
+ /* compute the length of the key */
1602
+ parser->attr_key_length = p - parser->mark;
1603
+ /* save the position following the key */
1604
+ parser->mark = p;
1605
+
1606
+ /* trim the attribute key */
1607
+ ltrim_pointer( &(parser->attr_key), p, &(parser->attr_key_length) );
1608
+ rtrim_pointer( &(parser->attr_key), p, &(parser->attr_key_length) );
1609
+ }
1610
+ goto _again;
1611
+ f7:
1612
+ #line 295 "parser.rl"
1613
+ {
1614
+ //printf( "[%c:%d],", *p, cs );
1615
+ switch( cs ) {
1616
+ case 0: /* non matching state */
1617
+ if( parser->prev_state != 12 && parser->prev_state != 7 ){ /* states following a possible end state for a tag */
1618
+ if( parser->echobuffer && parser->echobuffer_index != -1 ){
1619
+ /* send the echo buffer */
1620
+ esi_parser_echo_buffer( parser );
1621
+ }
1622
+ /* send the current character */
1623
+ esi_parser_echo_char( parser, *p );
1624
+ }
1625
+ /* clear the echo buffer */
1626
+ esi_parser_echobuffer_clear( parser );
1627
+ break;
1628
+ default:
1629
+ /* append to the echo buffer */
1630
+ esi_parser_concat_to_echobuffer( parser, *p );
1631
+ }
1632
+ /* save the previous state, necessary for end case detection such as /> and </esi:try> the trailing > character
1633
+ is state 12 and 7
1634
+ */
1635
+ parser->prev_state = cs;
1636
+ }
1637
+ #line 230 "parser.rl"
1638
+ {
1639
+ ESIAttribute *attr;
1640
+
1641
+ /* save the attribute value start */
1642
+ parser->attr_value = parser->mark;
1643
+ /* compute the length of the value */
1644
+ parser->attr_value_length = p - parser->mark;
1645
+ /* svae the position following the value */
1646
+ parser->mark = p;
1647
+
1648
+ /* trim the attribute value */
1649
+ ltrim_pointer( &(parser->attr_value), p, &(parser->attr_value_length) );
1650
+ rtrim_pointer( &(parser->attr_value), p, &(parser->attr_value_length) );
1651
+
1652
+ /* using the attr_key and attr_value, allocate a new attribute object */
1653
+ attr = esi_attribute_new( parser->attr_key, parser->attr_key_length,
1654
+ parser->attr_value, parser->attr_value_length );
1655
+
1656
+ /* add the new attribute to the list of attributes */
1657
+ if( parser->attributes ) {
1658
+ parser->last->next = attr;
1659
+ parser->last = attr;
1660
+ }
1661
+ else {
1662
+ parser->last = parser->attributes = attr;
1663
+ }
1664
+ }
1665
+ goto _again;
1666
+ f4:
1667
+ #line 295 "parser.rl"
1668
+ {
1669
+ //printf( "[%c:%d],", *p, cs );
1670
+ switch( cs ) {
1671
+ case 0: /* non matching state */
1672
+ if( parser->prev_state != 12 && parser->prev_state != 7 ){ /* states following a possible end state for a tag */
1673
+ if( parser->echobuffer && parser->echobuffer_index != -1 ){
1674
+ /* send the echo buffer */
1675
+ esi_parser_echo_buffer( parser );
1676
+ }
1677
+ /* send the current character */
1678
+ esi_parser_echo_char( parser, *p );
1679
+ }
1680
+ /* clear the echo buffer */
1681
+ esi_parser_echobuffer_clear( parser );
1682
+ break;
1683
+ default:
1684
+ /* append to the echo buffer */
1685
+ esi_parser_concat_to_echobuffer( parser, *p );
1686
+ }
1687
+ /* save the previous state, necessary for end case detection such as /> and </esi:try> the trailing > character
1688
+ is state 12 and 7
1689
+ */
1690
+ parser->prev_state = cs;
1691
+ }
1692
+ #line 259 "parser.rl"
1693
+ {
1694
+
1695
+ parser->tag_text = parser->mark;
1696
+ parser->tag_text_length = p - parser->mark;
1697
+
1698
+ parser->mark = p;
1699
+
1700
+ ltrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1701
+ rtrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1702
+
1703
+ esi_parser_flush_output( parser );
1704
+ parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, NULL, parser->user_data );
1705
+ //printf("\t[see start tag]\n");
1706
+
1707
+ esi_parser_echobuffer_clear( parser );
1708
+ }
1709
+ goto _again;
1710
+ f2:
1711
+ #line 295 "parser.rl"
1712
+ {
1713
+ //printf( "[%c:%d],", *p, cs );
1714
+ switch( cs ) {
1715
+ case 0: /* non matching state */
1716
+ if( parser->prev_state != 12 && parser->prev_state != 7 ){ /* states following a possible end state for a tag */
1717
+ if( parser->echobuffer && parser->echobuffer_index != -1 ){
1718
+ /* send the echo buffer */
1719
+ esi_parser_echo_buffer( parser );
1720
+ }
1721
+ /* send the current character */
1722
+ esi_parser_echo_char( parser, *p );
1723
+ }
1724
+ /* clear the echo buffer */
1725
+ esi_parser_echobuffer_clear( parser );
1726
+ break;
1727
+ default:
1728
+ /* append to the echo buffer */
1729
+ esi_parser_concat_to_echobuffer( parser, *p );
1730
+ }
1731
+ /* save the previous state, necessary for end case detection such as /> and </esi:try> the trailing > character
1732
+ is state 12 and 7
1733
+ */
1734
+ parser->prev_state = cs;
1735
+ }
1736
+ #line 277 "parser.rl"
1737
+ {
1738
+ /* offset by 2 to account for the </ characters */
1739
+ parser->tag_text = parser->mark+2;
1740
+ parser->tag_text_length = p - (parser->mark+2);
1741
+
1742
+ parser->mark = p;
1743
+
1744
+ ltrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1745
+ rtrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1746
+
1747
+ esi_parser_flush_output( parser );
1748
+ parser->end_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->user_data );
1749
+ //printf("\t[see end tag]\n");
1750
+
1751
+ esi_parser_echobuffer_clear( parser );
1752
+ }
1753
+ goto _again;
1754
+ f12:
1755
+ #line 295 "parser.rl"
1756
+ {
1757
+ //printf( "[%c:%d],", *p, cs );
1758
+ switch( cs ) {
1759
+ case 0: /* non matching state */
1760
+ if( parser->prev_state != 12 && parser->prev_state != 7 ){ /* states following a possible end state for a tag */
1761
+ if( parser->echobuffer && parser->echobuffer_index != -1 ){
1762
+ /* send the echo buffer */
1763
+ esi_parser_echo_buffer( parser );
1764
+ }
1765
+ /* send the current character */
1766
+ esi_parser_echo_char( parser, *p );
1767
+ }
1768
+ /* clear the echo buffer */
1769
+ esi_parser_echobuffer_clear( parser );
1770
+ break;
1771
+ default:
1772
+ /* append to the echo buffer */
1773
+ esi_parser_concat_to_echobuffer( parser, *p );
1774
+ }
1775
+ /* save the previous state, necessary for end case detection such as /> and </esi:try> the trailing > character
1776
+ is state 12 and 7
1777
+ */
1778
+ parser->prev_state = cs;
1779
+ }
1780
+ #line 160 "parser.rl"
1781
+ {
1782
+ parser->mark = p;
1783
+ //debug_string( "begin", p, 1 );
1784
+ }
1785
+ #line 164 "parser.rl"
1786
+ {
1787
+ // printf( "finish\n" );
1788
+ }
1789
+ goto _again;
1790
+ f11:
1791
+ #line 295 "parser.rl"
1792
+ {
1793
+ //printf( "[%c:%d],", *p, cs );
1794
+ switch( cs ) {
1795
+ case 0: /* non matching state */
1796
+ if( parser->prev_state != 12 && parser->prev_state != 7 ){ /* states following a possible end state for a tag */
1797
+ if( parser->echobuffer && parser->echobuffer_index != -1 ){
1798
+ /* send the echo buffer */
1799
+ esi_parser_echo_buffer( parser );
1800
+ }
1801
+ /* send the current character */
1802
+ esi_parser_echo_char( parser, *p );
1803
+ }
1804
+ /* clear the echo buffer */
1805
+ esi_parser_echobuffer_clear( parser );
1806
+ break;
1807
+ default:
1808
+ /* append to the echo buffer */
1809
+ esi_parser_concat_to_echobuffer( parser, *p );
1810
+ }
1811
+ /* save the previous state, necessary for end case detection such as /> and </esi:try> the trailing > character
1812
+ is state 12 and 7
1813
+ */
1814
+ parser->prev_state = cs;
1815
+ }
1816
+ #line 230 "parser.rl"
1817
+ {
1818
+ ESIAttribute *attr;
1819
+
1820
+ /* save the attribute value start */
1821
+ parser->attr_value = parser->mark;
1822
+ /* compute the length of the value */
1823
+ parser->attr_value_length = p - parser->mark;
1824
+ /* svae the position following the value */
1825
+ parser->mark = p;
1826
+
1827
+ /* trim the attribute value */
1828
+ ltrim_pointer( &(parser->attr_value), p, &(parser->attr_value_length) );
1829
+ rtrim_pointer( &(parser->attr_value), p, &(parser->attr_value_length) );
1830
+
1831
+ /* using the attr_key and attr_value, allocate a new attribute object */
1832
+ attr = esi_attribute_new( parser->attr_key, parser->attr_key_length,
1833
+ parser->attr_value, parser->attr_value_length );
1834
+
1835
+ /* add the new attribute to the list of attributes */
1836
+ if( parser->attributes ) {
1837
+ parser->last->next = attr;
1838
+ parser->last = attr;
1839
+ }
1840
+ else {
1841
+ parser->last = parser->attributes = attr;
1842
+ }
1843
+ }
1844
+ #line 164 "parser.rl"
1845
+ {
1846
+ // printf( "finish\n" );
1847
+ }
1848
+ goto _again;
1849
+
1850
+ _again:
1851
+ if ( ++p != pe )
1852
+ goto _resume;
1853
+ _test_eof: {}
1854
+ if ( p == eof )
1855
+ {
1856
+ switch ( _esi_eof_actions[cs] ) {
1857
+ case 10:
1858
+ #line 164 "parser.rl"
1859
+ {
1860
+ // printf( "finish\n" );
1861
+ }
1862
+ break;
1863
+ #line 1864 "parser.c"
1864
+ }
1865
+ }
1866
+
1867
+ }
1868
+ #line 579 "parser.rl"
1869
+
1870
+ parser->cs = cs;
1871
+
1872
+ if( cs != esi_start && cs != 0 ) {
1873
+
1874
+ /* reached the end and we're not at a termination point save the buffer as overflow */
1875
+ if( !parser->using_overflow ) {
1876
+ esi_parser_append_data_to_overflow_data( parser, data, length );
1877
+ parser->using_overflow = 1;
1878
+ }
1879
+
1880
+ } else if ( parser->using_overflow ) {
1881
+ parser->using_overflow = 0;
1882
+ parser->overflow_data_size = 0;
1883
+ }
1884
+
1885
+ return cs;
1886
+ }
1887
+ int esi_parser_finish( ESIParser *parser )
1888
+ {
1889
+ esi_parser_flush_output( parser );
1890
+ return 0;
1891
+ }
1892
+
1893
+ void esi_parser_start_tag_handler( ESIParser *parser, start_tag_cb callback )
1894
+ {
1895
+ parser->start_tag_handler = callback;
1896
+ }
1897
+
1898
+ void esi_parser_end_tag_handler( ESIParser *parser, end_tag_cb callback )
1899
+ {
1900
+ parser->end_tag_handler = callback;
1901
+ }