mongrel_esi 0.5.1 → 0.5.2

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