mongrel_esi 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. data/Rakefile +15 -8
  2. data/bin/mongrel_esi +0 -0
  3. data/ext/esi/common.rl +32 -27
  4. data/ext/esi/esi_parser.c +11 -4
  5. data/ext/esi/parser.c +4536 -901
  6. data/ext/esi/parser.h +7 -0
  7. data/ext/esi/parser.rl +171 -53
  8. data/ext/esi/run-test.rb +0 -0
  9. data/ext/esi/test/common.rl +32 -27
  10. data/ext/esi/test/parser.c +322 -1342
  11. data/ext/esi/test/parser.h +7 -0
  12. data/ext/esi/test/parser.rl +171 -53
  13. data/ext/esi/test/test.c +13 -4
  14. data/ext/esi/test1.rb +35 -3
  15. data/lib/esi/cache.rb +2 -1
  16. data/lib/esi/config.rb +37 -0
  17. data/lib/esi/dispatcher.rb +3 -5
  18. data/lib/esi/invalidator.rb +3 -0
  19. data/lib/esi/logger.rb +0 -7
  20. data/lib/esi/parser.rb +70 -0
  21. data/lib/esi/processor.rb +88 -0
  22. data/lib/esi/proxy.rb +104 -0
  23. data/lib/esi/response.rb +106 -0
  24. data/lib/esi/router.rb +3 -0
  25. data/lib/esi/tag/attempt.rb +3 -0
  26. data/lib/esi/tag/base.rb +3 -1
  27. data/lib/esi/tag/except.rb +2 -0
  28. data/lib/esi/tag/include.rb +131 -132
  29. data/lib/esi/tag/invalidate.rb +2 -0
  30. data/lib/esi/tag/try.rb +3 -0
  31. data/test/integration/basic_test.rb +0 -1
  32. data/test/integration/docs/esi_max_age_varies.html +10 -0
  33. data/test/integration/handler_test.rb +31 -5
  34. data/test/integration/help.rb +13 -1
  35. data/test/load_test.rb +133 -0
  36. data/test/unit/include_request_test.rb +1 -1
  37. data/test/unit/parser_test.rb +41 -5
  38. data/test/unit/response_test.rb +184 -0
  39. metadata +50 -224
  40. data/doc/rdoc/classes/ESI/Cache.html +0 -178
  41. data/doc/rdoc/classes/ESI/Cache.src/M000060.html +0 -17
  42. data/doc/rdoc/classes/ESI/Cache.src/M000061.html +0 -20
  43. data/doc/rdoc/classes/ESI/Config/CacheConfig.html +0 -212
  44. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000055.html +0 -19
  45. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000056.html +0 -19
  46. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000057.html +0 -18
  47. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000058.html +0 -18
  48. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000059.html +0 -18
  49. data/doc/rdoc/classes/ESI/Config/ConfigRouter.html +0 -187
  50. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000052.html +0 -19
  51. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000053.html +0 -21
  52. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000054.html +0 -21
  53. data/doc/rdoc/classes/ESI/Config.html +0 -291
  54. data/doc/rdoc/classes/ESI/Config.src/M000043.html +0 -18
  55. data/doc/rdoc/classes/ESI/Config.src/M000044.html +0 -18
  56. data/doc/rdoc/classes/ESI/Config.src/M000045.html +0 -35
  57. data/doc/rdoc/classes/ESI/Config.src/M000046.html +0 -38
  58. data/doc/rdoc/classes/ESI/Config.src/M000047.html +0 -23
  59. data/doc/rdoc/classes/ESI/Config.src/M000048.html +0 -18
  60. data/doc/rdoc/classes/ESI/Config.src/M000049.html +0 -20
  61. data/doc/rdoc/classes/ESI/Config.src/M000050.html +0 -18
  62. data/doc/rdoc/classes/ESI/Config.src/M000051.html +0 -24
  63. data/doc/rdoc/classes/ESI/Dispatcher.html +0 -172
  64. data/doc/rdoc/classes/ESI/Dispatcher.src/M000062.html +0 -23
  65. data/doc/rdoc/classes/ESI/Dispatcher.src/M000063.html +0 -20
  66. data/doc/rdoc/classes/ESI/Fragment.html +0 -218
  67. data/doc/rdoc/classes/ESI/Fragment.src/M000076.html +0 -21
  68. data/doc/rdoc/classes/ESI/Fragment.src/M000077.html +0 -18
  69. data/doc/rdoc/classes/ESI/Fragment.src/M000078.html +0 -18
  70. data/doc/rdoc/classes/ESI/Handler.html +0 -236
  71. data/doc/rdoc/classes/ESI/Handler.src/M000079.html +0 -19
  72. data/doc/rdoc/classes/ESI/Handler.src/M000080.html +0 -161
  73. data/doc/rdoc/classes/ESI/Handler.src/M000081.html +0 -24
  74. data/doc/rdoc/classes/ESI/Handler.src/M000082.html +0 -18
  75. data/doc/rdoc/classes/ESI/Handler.src/M000083.html +0 -26
  76. data/doc/rdoc/classes/ESI/Handler.src/M000084.html +0 -30
  77. data/doc/rdoc/classes/ESI/Invalidator.html +0 -131
  78. data/doc/rdoc/classes/ESI/Invalidator.src/M000004.html +0 -41
  79. data/doc/rdoc/classes/ESI/Log.html +0 -251
  80. data/doc/rdoc/classes/ESI/Log.src/M000005.html +0 -18
  81. data/doc/rdoc/classes/ESI/Log.src/M000006.html +0 -18
  82. data/doc/rdoc/classes/ESI/Log.src/M000007.html +0 -18
  83. data/doc/rdoc/classes/ESI/Log.src/M000008.html +0 -18
  84. data/doc/rdoc/classes/ESI/Log.src/M000009.html +0 -18
  85. data/doc/rdoc/classes/ESI/Log.src/M000010.html +0 -18
  86. data/doc/rdoc/classes/ESI/Log.src/M000011.html +0 -18
  87. data/doc/rdoc/classes/ESI/Log.src/M000012.html +0 -18
  88. data/doc/rdoc/classes/ESI/Log.src/M000013.html +0 -18
  89. data/doc/rdoc/classes/ESI/MemcachedCache.html +0 -314
  90. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000034.html +0 -24
  91. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000035.html +0 -22
  92. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000036.html +0 -19
  93. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000037.html +0 -23
  94. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000038.html +0 -18
  95. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000039.html +0 -19
  96. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000040.html +0 -18
  97. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000041.html +0 -18
  98. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000042.html +0 -17
  99. data/doc/rdoc/classes/ESI/Router.html +0 -229
  100. data/doc/rdoc/classes/ESI/Router.src/M000073.html +0 -36
  101. data/doc/rdoc/classes/ESI/Router.src/M000074.html +0 -25
  102. data/doc/rdoc/classes/ESI/Router.src/M000075.html +0 -24
  103. data/doc/rdoc/classes/ESI/RubyCache.html +0 -278
  104. data/doc/rdoc/classes/ESI/RubyCache.src/M000064.html +0 -20
  105. data/doc/rdoc/classes/ESI/RubyCache.src/M000065.html +0 -22
  106. data/doc/rdoc/classes/ESI/RubyCache.src/M000066.html +0 -21
  107. data/doc/rdoc/classes/ESI/RubyCache.src/M000067.html +0 -22
  108. data/doc/rdoc/classes/ESI/RubyCache.src/M000068.html +0 -18
  109. data/doc/rdoc/classes/ESI/RubyCache.src/M000069.html +0 -22
  110. data/doc/rdoc/classes/ESI/RubyCache.src/M000070.html +0 -18
  111. data/doc/rdoc/classes/ESI/RubyCache.src/M000071.html +0 -18
  112. data/doc/rdoc/classes/ESI/RubyCache.src/M000072.html +0 -18
  113. data/doc/rdoc/classes/ESI/Tag/Attempt.html +0 -113
  114. data/doc/rdoc/classes/ESI/Tag/Base.html +0 -267
  115. data/doc/rdoc/classes/ESI/Tag/Base.src/M000028.html +0 -26
  116. data/doc/rdoc/classes/ESI/Tag/Base.src/M000029.html +0 -23
  117. data/doc/rdoc/classes/ESI/Tag/Base.src/M000030.html +0 -22
  118. data/doc/rdoc/classes/ESI/Tag/Base.src/M000031.html +0 -18
  119. data/doc/rdoc/classes/ESI/Tag/Base.src/M000032.html +0 -22
  120. data/doc/rdoc/classes/ESI/Tag/Base.src/M000033.html +0 -23
  121. data/doc/rdoc/classes/ESI/Tag/Except.html +0 -184
  122. data/doc/rdoc/classes/ESI/Tag/Except.src/M000020.html +0 -21
  123. data/doc/rdoc/classes/ESI/Tag/Except.src/M000021.html +0 -20
  124. data/doc/rdoc/classes/ESI/Tag/Except.src/M000022.html +0 -18
  125. data/doc/rdoc/classes/ESI/Tag/Include.html +0 -189
  126. data/doc/rdoc/classes/ESI/Tag/Include.src/M000017.html +0 -20
  127. data/doc/rdoc/classes/ESI/Tag/Include.src/M000018.html +0 -18
  128. data/doc/rdoc/classes/ESI/Tag/Include.src/M000019.html +0 -125
  129. data/doc/rdoc/classes/ESI/Tag/IncludeRequest/Error.html +0 -155
  130. data/doc/rdoc/classes/ESI/Tag/IncludeRequest/Error.src/M000016.html +0 -19
  131. data/doc/rdoc/classes/ESI/Tag/IncludeRequest.html +0 -199
  132. data/doc/rdoc/classes/ESI/Tag/IncludeRequest.src/M000014.html +0 -18
  133. data/doc/rdoc/classes/ESI/Tag/IncludeRequest.src/M000015.html +0 -42
  134. data/doc/rdoc/classes/ESI/Tag/Invalidate.html +0 -171
  135. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000025.html +0 -19
  136. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000026.html +0 -51
  137. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000027.html +0 -19
  138. data/doc/rdoc/classes/ESI/Tag/Try.html +0 -161
  139. data/doc/rdoc/classes/ESI/Tag/Try.src/M000023.html +0 -40
  140. data/doc/rdoc/classes/ESI/Tag/Try.src/M000024.html +0 -18
  141. data/doc/rdoc/classes/ESI/Tag.html +0 -137
  142. data/doc/rdoc/classes/ESI.html +0 -169
  143. data/doc/rdoc/classes/MultiDirHandler.html +0 -198
  144. data/doc/rdoc/classes/MultiDirHandler.src/M000001.html +0 -20
  145. data/doc/rdoc/classes/MultiDirHandler.src/M000002.html +0 -28
  146. data/doc/rdoc/classes/MultiDirHandler.src/M000003.html +0 -22
  147. data/doc/rdoc/classes/Net/An/HTTP.html +0 -137
  148. data/doc/rdoc/classes/Net/An/HTTP.src/M000087.html +0 -17
  149. data/doc/rdoc/classes/Net/An/IORequest.html +0 -139
  150. data/doc/rdoc/classes/Net/An/IORequest.src/M000088.html +0 -17
  151. data/doc/rdoc/classes/Net/An/IOResponse.html +0 -139
  152. data/doc/rdoc/classes/Net/An/IOResponse.src/M000085.html +0 -17
  153. data/doc/rdoc/classes/Net/An/IOSocket.html +0 -137
  154. data/doc/rdoc/classes/Net/An/IOSocket.src/M000086.html +0 -17
  155. data/doc/rdoc/classes/Net/An.html +0 -114
  156. data/doc/rdoc/classes/Net.html +0 -119
  157. data/doc/rdoc/created.rid +0 -1
  158. data/doc/rdoc/files/COPYING.html +0 -168
  159. data/doc/rdoc/files/LICENSE.html +0 -605
  160. data/doc/rdoc/files/README.html +0 -361
  161. data/doc/rdoc/files/lib/esi/cache_rb.html +0 -113
  162. data/doc/rdoc/files/lib/esi/config_rb.html +0 -108
  163. data/doc/rdoc/files/lib/esi/dispatcher_rb.html +0 -109
  164. data/doc/rdoc/files/lib/esi/handler_rb.html +0 -121
  165. data/doc/rdoc/files/lib/esi/invalidator_rb.html +0 -117
  166. data/doc/rdoc/files/lib/esi/logger_rb.html +0 -108
  167. data/doc/rdoc/files/lib/esi/router_rb.html +0 -101
  168. data/doc/rdoc/files/lib/esi/tag/attempt_rb.html +0 -101
  169. data/doc/rdoc/files/lib/esi/tag/base_rb.html +0 -108
  170. data/doc/rdoc/files/lib/esi/tag/except_rb.html +0 -101
  171. data/doc/rdoc/files/lib/esi/tag/include_rb.html +0 -109
  172. data/doc/rdoc/files/lib/esi/tag/invalidate_rb.html +0 -109
  173. data/doc/rdoc/files/lib/esi/tag/try_rb.html +0 -108
  174. data/doc/rdoc/files/lib/multi_dirhandler_rb.html +0 -109
  175. data/doc/rdoc/files/lib/net/ahttp_rb.html +0 -109
  176. data/doc/rdoc/fr_class_index.html +0 -55
  177. data/doc/rdoc/fr_file_index.html +0 -44
  178. data/doc/rdoc/fr_method_index.html +0 -114
  179. data/doc/rdoc/index.html +0 -24
  180. data/doc/rdoc/rdoc-style.css +0 -208
  181. data/ext/esi/parser.rb +0 -49
  182. data/ext/esi/ruby_esi.rl +0 -135
  183. data/lib/esi/handler.rb +0 -221
  184. data/lib/net/ahttp.rb +0 -36
data/ext/esi/run-test.rb CHANGED
File without changes
@@ -1,41 +1,46 @@
1
+ /**
2
+ * Copyright (c) 2008 Todd A. Fisher
3
+ * see LICENSE
4
+ */
1
5
  %%{
2
6
  machine esi_common_parser;
3
7
 
4
- # inline tags e.g. <esi:comment text='some useless text'/> or <esi:include src='/foo/'/>, etc...
5
- esi_inline_tag = (
6
- start: (
7
- '<esi:' [a-z]+ space @see_start_tag -> start_attribute |
8
- '<esi:' [a-z]+ space* '/>' >see_start_tag %see_end_tag -> final
9
- ),
10
- start_attribute: (
11
- space* [a-zA-Z_\-]+ [a-zA-Z_\-0-9]* '=' @see_attribute_key -> end_attribute |
12
- space* '/>' @see_end_tag -> final
13
- ),
14
- end_attribute: (
15
- space* ['"][!{}#-&(-/:-@a-zA-Z0-9+_\-]+['"] @see_attribute_value -> start_attribute
16
- )
17
- ) >begin %finish;
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 = ("'" ("\\\'"| [^'])* "'");
18
15
 
19
- # block tags e.g. <esi:try> <esi:attempt>, etc..
20
- esi_block_tag = (
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 = (
21
23
  start: (
22
- '<esi:' [a-z]+ '>' @block_start_tag -> 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
23
27
  '<esi:' [a-z]+ space @see_start_tag -> start_attribute |
28
+ # finally match a closing block tag
24
29
  '</esi:' [a-z]+ '>' @block_end_tag
25
30
  ),
26
31
  start_attribute: (
27
- space* [a-zA-Z_\-]+ [a-zA-Z_\-0-9]* '=' @see_attribute_key -> end_attribute | '>' @see_block_start_with_attributes -> final
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
28
38
  ),
29
39
  end_attribute: (
30
- space* ['"][!{}#-&(-/:-@a-zA-Z0-9+_\-]+['"] @see_attribute_value -> start_attribute
40
+ # match the attribute value and return to matching attribute start
41
+ space* attr_value @see_attribute_value -> start_attribute
31
42
  )
32
- ) >begin %finish;
33
-
34
- echo_state = (
35
- start: (
36
- /./ @echo
37
- )
38
- );
43
+ ) >begin %finish;
39
44
 
40
- main := ((/.*/)? @echo (esi_inline_tag|esi_block_tag) )*;
45
+ main := ((/.*/)? @echo (esi_tags) )*;
41
46
  }%%
@@ -2,7 +2,7 @@
2
2
  #include <stdio.h>
3
3
  #include <stdlib.h>
4
4
  #include <string.h>
5
- #include <ctype.h>
5
+ #include <unistd.h>
6
6
  #include "parser.h"
7
7
 
8
8
  /* define default callbacks */
@@ -27,7 +27,8 @@ esi_parser_default_output_cp(const void *data,
27
27
  void *user_data)
28
28
  {
29
29
  }
30
- #ifdef DEBUG
30
+
31
+ #if defined(DEBUG)
31
32
  static void debug_string( const char *msg, const char *str, size_t len )
32
33
  {
33
34
  char *pstr = esi_strndup( str, len );
@@ -65,33 +66,219 @@ static void esi_parser_concat_to_echobuffer( ESIParser *parser, char ch )
65
66
  // debug_string( "echo buffer", parser->echobuffer, parser->echobuffer_index+1 );
66
67
  }
67
68
 
68
- static void ltrim_pointer( const char **ptr, const char *bounds, size_t *len )
69
- {
70
- // remove any spaces or = at the before the value
71
- while( isspace( **ptr ) ||
72
- **ptr == '=' ||
73
- **ptr == '"' ||
74
- **ptr == '<' ||
75
- **ptr == '\'' &&
76
- *len > 0 &&
77
- (*ptr != bounds) ){
78
- (*ptr)++;
79
- (*len)--;
80
- }
81
- }
69
+ #line 164 "parser.rl"
82
70
 
83
- #line 198 "parser.rl"
84
71
 
85
72
 
73
+ #line 74 "parser.c"
74
+ static const char _esi_actions[] = {
75
+ 0, 1, 9, 2, 9, 0, 2, 9,
76
+ 1, 2, 9, 2, 2, 9, 3, 2,
77
+ 9, 4, 2, 9, 5, 2, 9, 6,
78
+ 2, 9, 7, 2, 9, 8, 3, 9,
79
+ 0, 1, 3, 9, 3, 1, 4, 9,
80
+ 0, 3, 1, 4, 9, 3, 6, 1
81
+
82
+ };
83
+
84
+ static const short _esi_key_offsets[] = {
85
+ 0, 1, 4, 6, 8, 10, 12, 15,
86
+ 19, 21, 23, 25, 28, 36, 48, 59,
87
+ 69, 75, 85, 94, 106, 117, 119, 130,
88
+ 140, 150, 160, 170, 180, 191, 201, 211,
89
+ 221, 231, 246, 256, 265, 277, 288, 298,
90
+ 304, 314, 325, 335, 345, 355, 365, 375,
91
+ 386, 396, 406, 416, 426, 441, 451, 453,
92
+ 455, 456, 457, 466, 475
93
+ };
94
+
95
+ static const char _esi_trans_keys[] = {
96
+ 60, 47, 60, 101, 60, 101, 60, 115,
97
+ 60, 105, 58, 60, 60, 97, 122, 60,
98
+ 62, 97, 122, 60, 115, 60, 105, 58,
99
+ 60, 60, 97, 122, 32, 47, 60, 62,
100
+ 9, 13, 97, 122, 32, 45, 47, 60,
101
+ 62, 95, 9, 13, 65, 90, 97, 122,
102
+ 32, 45, 47, 60, 95, 9, 13, 65,
103
+ 90, 97, 122, 45, 60, 61, 95, 48,
104
+ 57, 65, 90, 97, 122, 32, 34, 39,
105
+ 60, 9, 13, 33, 60, 95, 125, 35,
106
+ 38, 40, 90, 97, 123, 34, 39, 60,
107
+ 95, 125, 33, 90, 97, 123, 32, 45,
108
+ 47, 60, 62, 95, 9, 13, 65, 90,
109
+ 97, 122, 32, 45, 47, 60, 95, 9,
110
+ 13, 65, 90, 97, 122, 60, 62, 34,
111
+ 39, 47, 60, 95, 101, 125, 33, 90,
112
+ 97, 123, 34, 39, 60, 95, 101, 125,
113
+ 33, 90, 97, 123, 34, 39, 60, 95,
114
+ 115, 125, 33, 90, 97, 123, 34, 39,
115
+ 60, 95, 105, 125, 33, 90, 97, 123,
116
+ 34, 39, 58, 60, 95, 125, 33, 90,
117
+ 97, 123, 34, 39, 60, 95, 123, 125,
118
+ 33, 90, 97, 122, 34, 39, 60, 62,
119
+ 95, 123, 125, 33, 90, 97, 122, 34,
120
+ 39, 60, 95, 115, 125, 33, 90, 97,
121
+ 123, 34, 39, 60, 95, 105, 125, 33,
122
+ 90, 97, 123, 34, 39, 58, 60, 95,
123
+ 125, 33, 90, 97, 123, 34, 39, 60,
124
+ 95, 123, 125, 33, 90, 97, 122, 32,
125
+ 34, 39, 47, 60, 62, 95, 123, 125,
126
+ 9, 13, 33, 90, 97, 122, 34, 39,
127
+ 60, 62, 95, 125, 33, 90, 97, 123,
128
+ 34, 39, 60, 95, 125, 33, 90, 97,
129
+ 123, 32, 45, 47, 60, 62, 95, 9,
130
+ 13, 65, 90, 97, 122, 32, 45, 47,
131
+ 60, 95, 9, 13, 65, 90, 97, 122,
132
+ 45, 60, 61, 95, 48, 57, 65, 90,
133
+ 97, 122, 32, 34, 39, 60, 9, 13,
134
+ 33, 60, 95, 125, 35, 38, 40, 90,
135
+ 97, 123, 34, 39, 47, 60, 95, 101,
136
+ 125, 33, 90, 97, 123, 34, 39, 60,
137
+ 95, 101, 125, 33, 90, 97, 123, 34,
138
+ 39, 60, 95, 115, 125, 33, 90, 97,
139
+ 123, 34, 39, 60, 95, 105, 125, 33,
140
+ 90, 97, 123, 34, 39, 58, 60, 95,
141
+ 125, 33, 90, 97, 123, 34, 39, 60,
142
+ 95, 123, 125, 33, 90, 97, 122, 34,
143
+ 39, 60, 62, 95, 123, 125, 33, 90,
144
+ 97, 122, 34, 39, 60, 95, 115, 125,
145
+ 33, 90, 97, 123, 34, 39, 60, 95,
146
+ 105, 125, 33, 90, 97, 123, 34, 39,
147
+ 58, 60, 95, 125, 33, 90, 97, 123,
148
+ 34, 39, 60, 95, 123, 125, 33, 90,
149
+ 97, 122, 32, 34, 39, 47, 60, 62,
150
+ 95, 123, 125, 9, 13, 33, 90, 97,
151
+ 122, 34, 39, 60, 62, 95, 125, 33,
152
+ 90, 97, 123, 60, 62, 60, 62, 60,
153
+ 60, 34, 39, 60, 95, 125, 33, 90,
154
+ 97, 123, 34, 39, 60, 95, 125, 33,
155
+ 90, 97, 123, 60, 0
156
+ };
157
+
158
+ static const char _esi_single_lengths[] = {
159
+ 1, 3, 2, 2, 2, 2, 1, 2,
160
+ 2, 2, 2, 1, 4, 6, 5, 4,
161
+ 4, 4, 5, 6, 5, 2, 7, 6,
162
+ 6, 6, 6, 6, 7, 6, 6, 6,
163
+ 6, 9, 6, 5, 6, 5, 4, 4,
164
+ 4, 7, 6, 6, 6, 6, 6, 7,
165
+ 6, 6, 6, 6, 9, 6, 2, 2,
166
+ 1, 1, 5, 5, 1
167
+ };
168
+
169
+ static const char _esi_range_lengths[] = {
170
+ 0, 0, 0, 0, 0, 0, 1, 1,
171
+ 0, 0, 0, 1, 2, 3, 3, 3,
172
+ 1, 3, 2, 3, 3, 0, 2, 2,
173
+ 2, 2, 2, 2, 2, 2, 2, 2,
174
+ 2, 3, 2, 2, 3, 3, 3, 1,
175
+ 3, 2, 2, 2, 2, 2, 2, 2,
176
+ 2, 2, 2, 2, 3, 2, 0, 0,
177
+ 0, 0, 2, 2, 0
178
+ };
179
+
180
+ static const short _esi_index_offsets[] = {
181
+ 0, 2, 6, 9, 12, 15, 18, 21,
182
+ 25, 28, 31, 34, 37, 44, 54, 63,
183
+ 71, 77, 85, 93, 103, 112, 115, 125,
184
+ 134, 143, 152, 161, 170, 180, 189, 198,
185
+ 207, 216, 229, 238, 246, 256, 265, 273,
186
+ 279, 287, 297, 306, 315, 324, 333, 342,
187
+ 352, 361, 370, 379, 388, 401, 410, 413,
188
+ 416, 418, 420, 428, 436
189
+ };
190
+
191
+ static const char _esi_indicies[] = {
192
+ 1, 0, 2, 1, 3, 0, 1, 4,
193
+ 0, 1, 5, 0, 1, 6, 0, 7,
194
+ 1, 0, 1, 8, 0, 1, 9, 8,
195
+ 0, 1, 10, 0, 1, 11, 0, 12,
196
+ 1, 0, 1, 13, 0, 14, 15, 1,
197
+ 16, 14, 13, 0, 17, 18, 19, 1,
198
+ 20, 18, 17, 18, 18, 0, 17, 18,
199
+ 19, 1, 18, 17, 18, 18, 0, 18,
200
+ 1, 21, 18, 18, 18, 18, 0, 22,
201
+ 23, 23, 1, 22, 0, 24, 25, 24,
202
+ 24, 24, 24, 24, 0, 26, 26, 25,
203
+ 24, 24, 24, 24, 0, 27, 18, 28,
204
+ 1, 20, 18, 27, 18, 18, 0, 27,
205
+ 18, 28, 1, 18, 27, 18, 18, 0,
206
+ 1, 29, 0, 26, 26, 30, 25, 24,
207
+ 31, 24, 24, 24, 0, 26, 26, 25,
208
+ 24, 32, 24, 24, 24, 0, 26, 26,
209
+ 25, 24, 33, 24, 24, 24, 0, 26,
210
+ 26, 25, 24, 34, 24, 24, 24, 0,
211
+ 26, 26, 35, 25, 24, 24, 24, 24,
212
+ 0, 26, 26, 25, 24, 24, 24, 24,
213
+ 36, 0, 26, 26, 25, 37, 24, 24,
214
+ 24, 24, 36, 0, 26, 26, 25, 24,
215
+ 38, 24, 24, 24, 0, 26, 26, 25,
216
+ 24, 39, 24, 24, 24, 0, 26, 26,
217
+ 40, 25, 24, 24, 24, 24, 0, 26,
218
+ 26, 25, 24, 24, 24, 24, 41, 0,
219
+ 14, 26, 26, 42, 25, 43, 24, 24,
220
+ 24, 14, 24, 41, 0, 26, 26, 25,
221
+ 44, 24, 24, 24, 24, 0, 46, 46,
222
+ 47, 45, 45, 45, 45, 0, 48, 49,
223
+ 28, 1, 20, 49, 48, 49, 49, 0,
224
+ 48, 49, 28, 1, 49, 48, 49, 49,
225
+ 0, 49, 1, 50, 49, 49, 49, 49,
226
+ 0, 51, 52, 52, 1, 51, 0, 45,
227
+ 47, 45, 45, 45, 45, 45, 0, 46,
228
+ 46, 53, 47, 45, 54, 45, 45, 45,
229
+ 0, 46, 46, 47, 45, 55, 45, 45,
230
+ 45, 0, 46, 46, 47, 45, 56, 45,
231
+ 45, 45, 0, 46, 46, 47, 45, 57,
232
+ 45, 45, 45, 0, 46, 46, 58, 47,
233
+ 45, 45, 45, 45, 0, 46, 46, 47,
234
+ 45, 45, 45, 45, 59, 0, 46, 46,
235
+ 47, 60, 45, 45, 45, 45, 59, 0,
236
+ 46, 46, 47, 45, 61, 45, 45, 45,
237
+ 0, 46, 46, 47, 45, 62, 45, 45,
238
+ 45, 0, 46, 46, 63, 47, 45, 45,
239
+ 45, 45, 0, 46, 46, 47, 45, 45,
240
+ 45, 45, 64, 0, 14, 46, 46, 65,
241
+ 47, 66, 45, 45, 45, 14, 45, 64,
242
+ 0, 46, 46, 47, 67, 45, 45, 45,
243
+ 45, 0, 1, 68, 0, 1, 69, 0,
244
+ 1, 0, 71, 70, 74, 74, 75, 73,
245
+ 73, 73, 73, 72, 74, 74, 75, 73,
246
+ 73, 73, 73, 72, 76, 72, 0
247
+ };
248
+
249
+ static const char _esi_trans_targs_wi[] = {
250
+ 0, 1, 2, 8, 3, 4, 5, 6,
251
+ 7, 0, 9, 10, 11, 12, 13, 55,
252
+ 0, 14, 15, 54, 57, 16, 16, 17,
253
+ 18, 22, 19, 20, 21, 57, 23, 29,
254
+ 24, 25, 26, 27, 28, 18, 30, 31,
255
+ 32, 33, 34, 18, 58, 35, 36, 41,
256
+ 37, 38, 39, 39, 40, 42, 48, 43,
257
+ 44, 45, 46, 47, 35, 49, 50, 51,
258
+ 52, 53, 35, 59, 60, 60, 0, 1,
259
+ 0, 35, 36, 41, 1
260
+ };
261
+
262
+ static const char _esi_trans_actions_wi[] = {
263
+ 1, 3, 1, 1, 1, 1, 1, 1,
264
+ 1, 27, 1, 1, 1, 1, 9, 9,
265
+ 24, 1, 1, 9, 15, 18, 1, 1,
266
+ 1, 3, 21, 1, 1, 12, 1, 1,
267
+ 1, 1, 1, 1, 1, 27, 1, 1,
268
+ 1, 1, 9, 24, 1, 1, 21, 3,
269
+ 1, 1, 18, 1, 1, 1, 1, 1,
270
+ 1, 1, 1, 1, 27, 1, 1, 1,
271
+ 1, 9, 24, 1, 12, 1, 6, 30,
272
+ 34, 34, 43, 38, 38
273
+ };
86
274
 
87
- #line 88 "parser.c"
88
275
  static const int esi_start = 56;
89
276
  static const int esi_first_final = 56;
90
277
  static const int esi_error = -1;
91
278
 
92
279
  static const int esi_en_main = 56;
93
280
 
94
- #line 201 "parser.rl"
281
+ #line 167 "parser.rl"
95
282
 
96
283
  char *esi_strndup( const char *str, size_t len )
97
284
  {
@@ -110,29 +297,6 @@ ESIAttribute *esi_attribute_new( const char *name, size_t name_length, const cha
110
297
  return attr;
111
298
  }
112
299
 
113
- ESIAttribute *esi_attribute_copy( ESIAttribute *attribute )
114
- {
115
- ESIAttribute *head, *nattr;
116
- if( !attribute ){ return NULL; }
117
-
118
- // copy the first attribute
119
- nattr = esi_attribute_new( attribute->name, strlen( attribute->name ),
120
- attribute->value, strlen( attribute->value ) );
121
- // save a pointer for return
122
- head = nattr;
123
- // copy next attributes
124
- attribute = attribute->next;
125
- while( attribute ) {
126
- // set the next attribute
127
- nattr->next = esi_attribute_new( attribute->name, strlen( attribute->name ),
128
- attribute->value, strlen( attribute->value ) );
129
- // next attribute
130
- nattr = nattr->next;
131
- attribute = attribute->next;
132
- }
133
- return head;
134
- }
135
-
136
300
  void esi_attribute_free( ESIAttribute *attribute )
137
301
  {
138
302
  ESIAttribute *ptr;
@@ -186,11 +350,11 @@ int esi_parser_init( ESIParser *parser )
186
350
  {
187
351
  int cs;
188
352
 
189
- #line 190 "parser.c"
353
+ #line 354 "parser.c"
190
354
  {
191
355
  cs = esi_start;
192
356
  }
193
- #line 295 "parser.rl"
357
+ #line 238 "parser.rl"
194
358
  parser->prev_state = parser->cs = cs;
195
359
  return 0;
196
360
  }
@@ -227,10 +391,10 @@ int esi_parser_execute( ESIParser *parser, const char *data, size_t length )
227
391
  p = parser->overflow_data + parser->overflow_data_size;
228
392
 
229
393
  // in our new memory space mark will now be
230
- parser->mark = ( mark_offset >= 0 ) ? parser->overflow_data + mark_offset : NULL;
231
- parser->tag_text = ( tag_text_offset >= 0 ) ? parser->overflow_data + tag_text_offset : NULL;
232
- parser->attr_key = ( attr_key_offset >= 0 ) ? parser->overflow_data + attr_key_offset : NULL;
233
- parser->attr_value = ( attr_value_offset >= 0 ) ? parser->overflow_data + attr_value_offset : NULL;
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;
234
398
 
235
399
  data = parser->overflow_data;
236
400
  parser->overflow_data_size = length = length + parser->overflow_data_size;
@@ -247,1107 +411,135 @@ int esi_parser_execute( ESIParser *parser, const char *data, size_t length )
247
411
  // debug_string( "data", data, length );
248
412
 
249
413
 
250
- #line 251 "parser.c"
414
+ #line 415 "parser.c"
251
415
  {
416
+ int _klen;
417
+ unsigned int _trans;
418
+ const char *_acts;
419
+ unsigned int _nacts;
420
+ const char *_keys;
421
+
252
422
  if ( p == pe )
253
423
  goto _out;
254
424
  _resume:
255
- switch ( cs ) {
256
- case 56:
257
- if ( (*p) == 60 )
258
- goto tr1;
259
- goto tr0;
260
- case 0:
261
- if ( (*p) == 60 )
262
- goto tr1;
263
- goto tr0;
264
- case 1:
265
- switch( (*p) ) {
266
- case 47: goto tr2;
267
- case 60: goto tr1;
268
- case 101: goto tr3;
269
- }
270
- goto tr0;
271
- case 2:
272
- switch( (*p) ) {
273
- case 60: goto tr1;
274
- case 101: goto tr4;
275
- }
276
- goto tr0;
277
- case 3:
278
- switch( (*p) ) {
279
- case 60: goto tr1;
280
- case 115: goto tr5;
281
- }
282
- goto tr0;
283
- case 4:
284
- switch( (*p) ) {
285
- case 60: goto tr1;
286
- case 105: goto tr6;
287
- }
288
- goto tr0;
289
- case 5:
290
- switch( (*p) ) {
291
- case 58: goto tr7;
292
- case 60: goto tr1;
293
- }
294
- goto tr0;
295
- case 6:
296
- if ( (*p) == 60 )
297
- goto tr1;
298
- if ( 97 <= (*p) && (*p) <= 122 )
299
- goto tr8;
300
- goto tr0;
301
- case 7:
302
- switch( (*p) ) {
303
- case 60: goto tr1;
304
- case 62: goto tr9;
305
- }
306
- if ( 97 <= (*p) && (*p) <= 122 )
307
- goto tr8;
308
- goto tr0;
309
- case 8:
310
- switch( (*p) ) {
311
- case 60: goto tr1;
312
- case 115: goto tr10;
313
- }
314
- goto tr0;
315
- case 9:
316
- switch( (*p) ) {
317
- case 60: goto tr1;
318
- case 105: goto tr11;
319
- }
320
- goto tr0;
321
- case 10:
322
- switch( (*p) ) {
323
- case 58: goto tr12;
324
- case 60: goto tr1;
325
- }
326
- goto tr0;
327
- case 11:
328
- if ( (*p) == 60 )
329
- goto tr1;
330
- if ( 97 <= (*p) && (*p) <= 122 )
331
- goto tr13;
332
- goto tr0;
333
- case 12:
334
- switch( (*p) ) {
335
- case 32: goto tr14;
336
- case 47: goto tr15;
337
- case 60: goto tr1;
338
- case 62: goto tr16;
339
- }
340
- if ( (*p) > 13 ) {
341
- if ( 97 <= (*p) && (*p) <= 122 )
342
- goto tr13;
343
- } else if ( (*p) >= 9 )
344
- goto tr14;
345
- goto tr0;
346
- case 13:
347
- switch( (*p) ) {
348
- case 32: goto tr17;
349
- case 45: goto tr18;
350
- case 47: goto tr19;
351
- case 60: goto tr1;
352
- case 62: goto tr20;
353
- case 95: goto tr18;
354
- }
355
- if ( (*p) < 65 ) {
356
- if ( 9 <= (*p) && (*p) <= 13 )
357
- goto tr17;
358
- } else if ( (*p) > 90 ) {
359
- if ( 97 <= (*p) && (*p) <= 122 )
360
- goto tr18;
361
- } else
362
- goto tr18;
363
- goto tr0;
364
- case 14:
365
- switch( (*p) ) {
366
- case 32: goto tr17;
367
- case 45: goto tr18;
368
- case 47: goto tr19;
369
- case 60: goto tr1;
370
- case 95: goto tr18;
371
- }
372
- if ( (*p) < 65 ) {
373
- if ( 9 <= (*p) && (*p) <= 13 )
374
- goto tr17;
375
- } else if ( (*p) > 90 ) {
376
- if ( 97 <= (*p) && (*p) <= 122 )
377
- goto tr18;
378
- } else
379
- goto tr18;
380
- goto tr0;
381
- case 15:
382
- switch( (*p) ) {
383
- case 45: goto tr18;
384
- case 60: goto tr1;
385
- case 61: goto tr21;
386
- case 95: goto tr18;
387
- }
388
- if ( (*p) < 65 ) {
389
- if ( 48 <= (*p) && (*p) <= 57 )
390
- goto tr18;
391
- } else if ( (*p) > 90 ) {
392
- if ( 97 <= (*p) && (*p) <= 122 )
393
- goto tr18;
394
- } else
395
- goto tr18;
396
- goto tr0;
397
- case 16:
398
- switch( (*p) ) {
399
- case 32: goto tr22;
400
- case 34: goto tr23;
401
- case 39: goto tr23;
402
- case 60: goto tr1;
403
- }
404
- if ( 9 <= (*p) && (*p) <= 13 )
405
- goto tr22;
406
- goto tr0;
407
- case 17:
408
- switch( (*p) ) {
409
- case 33: goto tr24;
410
- case 60: goto tr25;
411
- case 95: goto tr24;
412
- case 125: goto tr24;
413
- }
414
- if ( (*p) < 40 ) {
415
- if ( 35 <= (*p) && (*p) <= 38 )
416
- goto tr24;
417
- } else if ( (*p) > 90 ) {
418
- if ( 97 <= (*p) && (*p) <= 123 )
419
- goto tr24;
420
- } else
421
- goto tr24;
422
- goto tr0;
423
- case 18:
424
- switch( (*p) ) {
425
- case 34: goto tr26;
426
- case 39: goto tr26;
427
- case 60: goto tr25;
428
- case 95: goto tr24;
429
- case 125: goto tr24;
430
- }
431
- if ( (*p) > 90 ) {
432
- if ( 97 <= (*p) && (*p) <= 123 )
433
- goto tr24;
434
- } else if ( (*p) >= 33 )
435
- goto tr24;
436
- goto tr0;
437
- case 19:
438
- switch( (*p) ) {
439
- case 32: goto tr27;
440
- case 45: goto tr18;
441
- case 47: goto tr28;
442
- case 60: goto tr1;
443
- case 62: goto tr20;
444
- case 95: goto tr18;
445
- }
446
- if ( (*p) < 65 ) {
447
- if ( 9 <= (*p) && (*p) <= 13 )
448
- goto tr27;
449
- } else if ( (*p) > 90 ) {
450
- if ( 97 <= (*p) && (*p) <= 122 )
451
- goto tr18;
452
- } else
453
- goto tr18;
454
- goto tr0;
455
- case 20:
456
- switch( (*p) ) {
457
- case 32: goto tr27;
458
- case 45: goto tr18;
459
- case 47: goto tr28;
460
- case 60: goto tr1;
461
- case 95: goto tr18;
462
- }
463
- if ( (*p) < 65 ) {
464
- if ( 9 <= (*p) && (*p) <= 13 )
465
- goto tr27;
466
- } else if ( (*p) > 90 ) {
467
- if ( 97 <= (*p) && (*p) <= 122 )
468
- goto tr18;
469
- } else
470
- goto tr18;
471
- goto tr0;
472
- case 21:
473
- switch( (*p) ) {
474
- case 60: goto tr1;
475
- case 62: goto tr29;
476
- }
477
- goto tr0;
478
- case 57:
479
- if ( (*p) == 60 )
480
- goto tr71;
481
- goto tr70;
482
- case 22:
483
- switch( (*p) ) {
484
- case 34: goto tr26;
485
- case 39: goto tr26;
486
- case 47: goto tr30;
487
- case 60: goto tr25;
488
- case 95: goto tr24;
489
- case 101: goto tr31;
490
- case 125: goto tr24;
491
- }
492
- if ( (*p) > 90 ) {
493
- if ( 97 <= (*p) && (*p) <= 123 )
494
- goto tr24;
495
- } else if ( (*p) >= 33 )
496
- goto tr24;
497
- goto tr0;
498
- case 23:
499
- switch( (*p) ) {
500
- case 34: goto tr26;
501
- case 39: goto tr26;
502
- case 60: goto tr25;
503
- case 95: goto tr24;
504
- case 101: goto tr32;
505
- case 125: goto tr24;
506
- }
507
- if ( (*p) > 90 ) {
508
- if ( 97 <= (*p) && (*p) <= 123 )
509
- goto tr24;
510
- } else if ( (*p) >= 33 )
511
- goto tr24;
512
- goto tr0;
513
- case 24:
514
- switch( (*p) ) {
515
- case 34: goto tr26;
516
- case 39: goto tr26;
517
- case 60: goto tr25;
518
- case 95: goto tr24;
519
- case 115: goto tr33;
520
- case 125: goto tr24;
521
- }
522
- if ( (*p) > 90 ) {
523
- if ( 97 <= (*p) && (*p) <= 123 )
524
- goto tr24;
525
- } else if ( (*p) >= 33 )
526
- goto tr24;
527
- goto tr0;
528
- case 25:
529
- switch( (*p) ) {
530
- case 34: goto tr26;
531
- case 39: goto tr26;
532
- case 60: goto tr25;
533
- case 95: goto tr24;
534
- case 105: goto tr34;
535
- case 125: goto tr24;
536
- }
537
- if ( (*p) > 90 ) {
538
- if ( 97 <= (*p) && (*p) <= 123 )
539
- goto tr24;
540
- } else if ( (*p) >= 33 )
541
- goto tr24;
542
- goto tr0;
543
- case 26:
544
- switch( (*p) ) {
545
- case 34: goto tr26;
546
- case 39: goto tr26;
547
- case 58: goto tr35;
548
- case 60: goto tr25;
549
- case 95: goto tr24;
550
- case 125: goto tr24;
551
- }
552
- if ( (*p) > 90 ) {
553
- if ( 97 <= (*p) && (*p) <= 123 )
554
- goto tr24;
555
- } else if ( (*p) >= 33 )
556
- goto tr24;
557
- goto tr0;
558
- case 27:
559
- switch( (*p) ) {
560
- case 34: goto tr26;
561
- case 39: goto tr26;
562
- case 60: goto tr25;
563
- case 95: goto tr24;
564
- case 123: goto tr24;
565
- case 125: goto tr24;
566
- }
567
- if ( (*p) > 90 ) {
568
- if ( 97 <= (*p) && (*p) <= 122 )
569
- goto tr36;
570
- } else if ( (*p) >= 33 )
571
- goto tr24;
572
- goto tr0;
573
- case 28:
574
- switch( (*p) ) {
575
- case 34: goto tr26;
576
- case 39: goto tr26;
577
- case 60: goto tr25;
578
- case 62: goto tr37;
579
- case 95: goto tr24;
580
- case 123: goto tr24;
581
- case 125: goto tr24;
582
- }
583
- if ( (*p) > 90 ) {
584
- if ( 97 <= (*p) && (*p) <= 122 )
585
- goto tr36;
586
- } else if ( (*p) >= 33 )
587
- goto tr24;
588
- goto tr0;
589
- case 29:
590
- switch( (*p) ) {
591
- case 34: goto tr26;
592
- case 39: goto tr26;
593
- case 60: goto tr25;
594
- case 95: goto tr24;
595
- case 115: goto tr38;
596
- case 125: goto tr24;
597
- }
598
- if ( (*p) > 90 ) {
599
- if ( 97 <= (*p) && (*p) <= 123 )
600
- goto tr24;
601
- } else if ( (*p) >= 33 )
602
- goto tr24;
603
- goto tr0;
604
- case 30:
605
- switch( (*p) ) {
606
- case 34: goto tr26;
607
- case 39: goto tr26;
608
- case 60: goto tr25;
609
- case 95: goto tr24;
610
- case 105: goto tr39;
611
- case 125: goto tr24;
612
- }
613
- if ( (*p) > 90 ) {
614
- if ( 97 <= (*p) && (*p) <= 123 )
615
- goto tr24;
616
- } else if ( (*p) >= 33 )
617
- goto tr24;
618
- goto tr0;
619
- case 31:
620
- switch( (*p) ) {
621
- case 34: goto tr26;
622
- case 39: goto tr26;
623
- case 58: goto tr40;
624
- case 60: goto tr25;
625
- case 95: goto tr24;
626
- case 125: goto tr24;
627
- }
628
- if ( (*p) > 90 ) {
629
- if ( 97 <= (*p) && (*p) <= 123 )
630
- goto tr24;
631
- } else if ( (*p) >= 33 )
632
- goto tr24;
633
- goto tr0;
634
- case 32:
635
- switch( (*p) ) {
636
- case 34: goto tr26;
637
- case 39: goto tr26;
638
- case 60: goto tr25;
639
- case 95: goto tr24;
640
- case 123: goto tr24;
641
- case 125: goto tr24;
642
- }
643
- if ( (*p) > 90 ) {
644
- if ( 97 <= (*p) && (*p) <= 122 )
645
- goto tr41;
646
- } else if ( (*p) >= 33 )
647
- goto tr24;
648
- goto tr0;
649
- case 33:
650
- switch( (*p) ) {
651
- case 32: goto tr14;
652
- case 34: goto tr26;
653
- case 39: goto tr26;
654
- case 47: goto tr42;
655
- case 60: goto tr25;
656
- case 62: goto tr43;
657
- case 95: goto tr24;
658
- case 123: goto tr24;
659
- case 125: goto tr24;
660
- }
661
- if ( (*p) < 33 ) {
662
- if ( 9 <= (*p) && (*p) <= 13 )
663
- goto tr14;
664
- } else if ( (*p) > 90 ) {
665
- if ( 97 <= (*p) && (*p) <= 122 )
666
- goto tr41;
667
- } else
668
- goto tr24;
669
- goto tr0;
670
- case 34:
671
- switch( (*p) ) {
672
- case 34: goto tr26;
673
- case 39: goto tr26;
674
- case 60: goto tr25;
675
- case 62: goto tr44;
676
- case 95: goto tr24;
677
- case 125: goto tr24;
678
- }
679
- if ( (*p) > 90 ) {
680
- if ( 97 <= (*p) && (*p) <= 123 )
681
- goto tr24;
682
- } else if ( (*p) >= 33 )
683
- goto tr24;
684
- goto tr0;
685
- case 58:
686
- switch( (*p) ) {
687
- case 34: goto tr74;
688
- case 39: goto tr74;
689
- case 60: goto tr75;
690
- case 95: goto tr73;
691
- case 125: goto tr73;
692
- }
693
- if ( (*p) > 90 ) {
694
- if ( 97 <= (*p) && (*p) <= 123 )
695
- goto tr73;
696
- } else if ( (*p) >= 33 )
697
- goto tr73;
698
- goto tr72;
699
- case 35:
700
- switch( (*p) ) {
701
- case 34: goto tr46;
702
- case 39: goto tr46;
703
- case 60: goto tr47;
704
- case 95: goto tr45;
705
- case 125: goto tr45;
706
- }
707
- if ( (*p) > 90 ) {
708
- if ( 97 <= (*p) && (*p) <= 123 )
709
- goto tr45;
710
- } else if ( (*p) >= 33 )
711
- goto tr45;
712
- goto tr0;
713
- case 36:
714
- switch( (*p) ) {
715
- case 32: goto tr48;
716
- case 45: goto tr49;
717
- case 47: goto tr28;
718
- case 60: goto tr1;
719
- case 62: goto tr20;
720
- case 95: goto tr49;
721
- }
722
- if ( (*p) < 65 ) {
723
- if ( 9 <= (*p) && (*p) <= 13 )
724
- goto tr48;
725
- } else if ( (*p) > 90 ) {
726
- if ( 97 <= (*p) && (*p) <= 122 )
727
- goto tr49;
728
- } else
729
- goto tr49;
730
- goto tr0;
731
- case 37:
732
- switch( (*p) ) {
733
- case 32: goto tr48;
734
- case 45: goto tr49;
735
- case 47: goto tr28;
736
- case 60: goto tr1;
737
- case 95: goto tr49;
738
- }
739
- if ( (*p) < 65 ) {
740
- if ( 9 <= (*p) && (*p) <= 13 )
741
- goto tr48;
742
- } else if ( (*p) > 90 ) {
743
- if ( 97 <= (*p) && (*p) <= 122 )
744
- goto tr49;
745
- } else
746
- goto tr49;
747
- goto tr0;
748
- case 38:
749
- switch( (*p) ) {
750
- case 45: goto tr49;
751
- case 60: goto tr1;
752
- case 61: goto tr50;
753
- case 95: goto tr49;
754
- }
755
- if ( (*p) < 65 ) {
756
- if ( 48 <= (*p) && (*p) <= 57 )
757
- goto tr49;
758
- } else if ( (*p) > 90 ) {
759
- if ( 97 <= (*p) && (*p) <= 122 )
760
- goto tr49;
761
- } else
762
- goto tr49;
763
- goto tr0;
764
- case 39:
765
- switch( (*p) ) {
766
- case 32: goto tr51;
767
- case 34: goto tr52;
768
- case 39: goto tr52;
769
- case 60: goto tr1;
770
- }
771
- if ( 9 <= (*p) && (*p) <= 13 )
772
- goto tr51;
773
- goto tr0;
774
- case 40:
775
- switch( (*p) ) {
776
- case 33: goto tr45;
777
- case 60: goto tr47;
778
- case 95: goto tr45;
779
- case 125: goto tr45;
780
- }
781
- if ( (*p) < 40 ) {
782
- if ( 35 <= (*p) && (*p) <= 38 )
783
- goto tr45;
784
- } else if ( (*p) > 90 ) {
785
- if ( 97 <= (*p) && (*p) <= 123 )
786
- goto tr45;
787
- } else
788
- goto tr45;
789
- goto tr0;
790
- case 41:
791
- switch( (*p) ) {
792
- case 34: goto tr46;
793
- case 39: goto tr46;
794
- case 47: goto tr53;
795
- case 60: goto tr47;
796
- case 95: goto tr45;
797
- case 101: goto tr54;
798
- case 125: goto tr45;
799
- }
800
- if ( (*p) > 90 ) {
801
- if ( 97 <= (*p) && (*p) <= 123 )
802
- goto tr45;
803
- } else if ( (*p) >= 33 )
804
- goto tr45;
805
- goto tr0;
806
- case 42:
807
- switch( (*p) ) {
808
- case 34: goto tr46;
809
- case 39: goto tr46;
810
- case 60: goto tr47;
811
- case 95: goto tr45;
812
- case 101: goto tr55;
813
- case 125: goto tr45;
814
- }
815
- if ( (*p) > 90 ) {
816
- if ( 97 <= (*p) && (*p) <= 123 )
817
- goto tr45;
818
- } else if ( (*p) >= 33 )
819
- goto tr45;
820
- goto tr0;
821
- case 43:
822
- switch( (*p) ) {
823
- case 34: goto tr46;
824
- case 39: goto tr46;
825
- case 60: goto tr47;
826
- case 95: goto tr45;
827
- case 115: goto tr56;
828
- case 125: goto tr45;
829
- }
830
- if ( (*p) > 90 ) {
831
- if ( 97 <= (*p) && (*p) <= 123 )
832
- goto tr45;
833
- } else if ( (*p) >= 33 )
834
- goto tr45;
835
- goto tr0;
836
- case 44:
837
- switch( (*p) ) {
838
- case 34: goto tr46;
839
- case 39: goto tr46;
840
- case 60: goto tr47;
841
- case 95: goto tr45;
842
- case 105: goto tr57;
843
- case 125: goto tr45;
844
- }
845
- if ( (*p) > 90 ) {
846
- if ( 97 <= (*p) && (*p) <= 123 )
847
- goto tr45;
848
- } else if ( (*p) >= 33 )
849
- goto tr45;
850
- goto tr0;
851
- case 45:
852
- switch( (*p) ) {
853
- case 34: goto tr46;
854
- case 39: goto tr46;
855
- case 58: goto tr58;
856
- case 60: goto tr47;
857
- case 95: goto tr45;
858
- case 125: goto tr45;
859
- }
860
- if ( (*p) > 90 ) {
861
- if ( 97 <= (*p) && (*p) <= 123 )
862
- goto tr45;
863
- } else if ( (*p) >= 33 )
864
- goto tr45;
865
- goto tr0;
866
- case 46:
867
- switch( (*p) ) {
868
- case 34: goto tr46;
869
- case 39: goto tr46;
870
- case 60: goto tr47;
871
- case 95: goto tr45;
872
- case 123: goto tr45;
873
- case 125: goto tr45;
874
- }
875
- if ( (*p) > 90 ) {
876
- if ( 97 <= (*p) && (*p) <= 122 )
877
- goto tr59;
878
- } else if ( (*p) >= 33 )
879
- goto tr45;
880
- goto tr0;
881
- case 47:
882
- switch( (*p) ) {
883
- case 34: goto tr46;
884
- case 39: goto tr46;
885
- case 60: goto tr47;
886
- case 62: goto tr60;
887
- case 95: goto tr45;
888
- case 123: goto tr45;
889
- case 125: goto tr45;
890
- }
891
- if ( (*p) > 90 ) {
892
- if ( 97 <= (*p) && (*p) <= 122 )
893
- goto tr59;
894
- } else if ( (*p) >= 33 )
895
- goto tr45;
896
- goto tr0;
897
- case 48:
898
- switch( (*p) ) {
899
- case 34: goto tr46;
900
- case 39: goto tr46;
901
- case 60: goto tr47;
902
- case 95: goto tr45;
903
- case 115: goto tr61;
904
- case 125: goto tr45;
905
- }
906
- if ( (*p) > 90 ) {
907
- if ( 97 <= (*p) && (*p) <= 123 )
908
- goto tr45;
909
- } else if ( (*p) >= 33 )
910
- goto tr45;
911
- goto tr0;
912
- case 49:
913
- switch( (*p) ) {
914
- case 34: goto tr46;
915
- case 39: goto tr46;
916
- case 60: goto tr47;
917
- case 95: goto tr45;
918
- case 105: goto tr62;
919
- case 125: goto tr45;
920
- }
921
- if ( (*p) > 90 ) {
922
- if ( 97 <= (*p) && (*p) <= 123 )
923
- goto tr45;
924
- } else if ( (*p) >= 33 )
925
- goto tr45;
926
- goto tr0;
927
- case 50:
928
- switch( (*p) ) {
929
- case 34: goto tr46;
930
- case 39: goto tr46;
931
- case 58: goto tr63;
932
- case 60: goto tr47;
933
- case 95: goto tr45;
934
- case 125: goto tr45;
935
- }
936
- if ( (*p) > 90 ) {
937
- if ( 97 <= (*p) && (*p) <= 123 )
938
- goto tr45;
939
- } else if ( (*p) >= 33 )
940
- goto tr45;
941
- goto tr0;
942
- case 51:
943
- switch( (*p) ) {
944
- case 34: goto tr46;
945
- case 39: goto tr46;
946
- case 60: goto tr47;
947
- case 95: goto tr45;
948
- case 123: goto tr45;
949
- case 125: goto tr45;
950
- }
951
- if ( (*p) > 90 ) {
952
- if ( 97 <= (*p) && (*p) <= 122 )
953
- goto tr64;
954
- } else if ( (*p) >= 33 )
955
- goto tr45;
956
- goto tr0;
957
- case 52:
958
- switch( (*p) ) {
959
- case 32: goto tr14;
960
- case 34: goto tr46;
961
- case 39: goto tr46;
962
- case 47: goto tr65;
963
- case 60: goto tr47;
964
- case 62: goto tr66;
965
- case 95: goto tr45;
966
- case 123: goto tr45;
967
- case 125: goto tr45;
968
- }
969
- if ( (*p) < 33 ) {
970
- if ( 9 <= (*p) && (*p) <= 13 )
971
- goto tr14;
972
- } else if ( (*p) > 90 ) {
973
- if ( 97 <= (*p) && (*p) <= 122 )
974
- goto tr64;
975
- } else
976
- goto tr45;
977
- goto tr0;
978
- case 53:
979
- switch( (*p) ) {
980
- case 34: goto tr46;
981
- case 39: goto tr46;
982
- case 60: goto tr47;
983
- case 62: goto tr67;
984
- case 95: goto tr45;
985
- case 125: goto tr45;
986
- }
987
- if ( (*p) > 90 ) {
988
- if ( 97 <= (*p) && (*p) <= 123 )
989
- goto tr45;
990
- } else if ( (*p) >= 33 )
991
- goto tr45;
992
- goto tr0;
993
- case 59:
994
- switch( (*p) ) {
995
- case 34: goto tr74;
996
- case 39: goto tr74;
997
- case 60: goto tr75;
998
- case 95: goto tr73;
999
- case 125: goto tr73;
1000
- }
1001
- if ( (*p) > 90 ) {
1002
- if ( 97 <= (*p) && (*p) <= 123 )
1003
- goto tr73;
1004
- } else if ( (*p) >= 33 )
1005
- goto tr73;
1006
- goto tr72;
1007
- case 54:
1008
- switch( (*p) ) {
1009
- case 60: goto tr1;
1010
- case 62: goto tr68;
1011
- }
1012
- goto tr0;
1013
- case 60:
1014
- if ( (*p) == 60 )
1015
- goto tr76;
1016
- goto tr72;
1017
- case 55:
1018
- switch( (*p) ) {
1019
- case 60: goto tr1;
1020
- case 62: goto tr69;
1021
- }
1022
- goto tr0;
1023
- }
1024
-
1025
- tr0: cs = 0; goto f0;
1026
- tr9: cs = 0; goto f2;
1027
- tr16: cs = 0; goto f4;
1028
- tr70: cs = 0; goto f9;
1029
- tr72: cs = 0; goto f11;
1030
- tr1: cs = 1; goto f1;
1031
- tr71: cs = 1; goto f10;
1032
- tr76: cs = 1; goto f13;
1033
- tr2: cs = 2; goto f0;
1034
- tr4: cs = 3; goto f0;
1035
- tr5: cs = 4; goto f0;
1036
- tr6: cs = 5; goto f0;
1037
- tr7: cs = 6; goto f0;
1038
- tr8: cs = 7; goto f0;
1039
- tr3: cs = 8; goto f0;
1040
- tr10: cs = 9; goto f0;
1041
- tr11: cs = 10; goto f0;
1042
- tr12: cs = 11; goto f0;
1043
- tr13: cs = 12; goto f0;
1044
- tr14: cs = 13; goto f3;
1045
- tr17: cs = 14; goto f0;
1046
- tr18: cs = 15; goto f0;
1047
- tr22: cs = 16; goto f0;
1048
- tr21: cs = 16; goto f6;
1049
- tr23: cs = 17; goto f0;
1050
- tr24: cs = 18; goto f0;
1051
- tr37: cs = 18; goto f2;
1052
- tr43: cs = 18; goto f4;
1053
- tr26: cs = 19; goto f7;
1054
- tr27: cs = 20; goto f0;
1055
- tr28: cs = 21; goto f0;
1056
- tr25: cs = 22; goto f1;
1057
- tr30: cs = 23; goto f0;
1058
- tr32: cs = 24; goto f0;
1059
- tr33: cs = 25; goto f0;
1060
- tr34: cs = 26; goto f0;
1061
- tr35: cs = 27; goto f0;
1062
- tr36: cs = 28; goto f0;
1063
- tr31: cs = 29; goto f0;
1064
- tr38: cs = 30; goto f0;
1065
- tr39: cs = 31; goto f0;
1066
- tr40: cs = 32; goto f0;
1067
- tr41: cs = 33; goto f0;
1068
- tr42: cs = 34; goto f3;
1069
- tr45: cs = 35; goto f0;
1070
- tr60: cs = 35; goto f2;
1071
- tr66: cs = 35; goto f4;
1072
- tr73: cs = 35; goto f11;
1073
- tr46: cs = 36; goto f7;
1074
- tr74: cs = 36; goto f12;
1075
- tr48: cs = 37; goto f0;
1076
- tr49: cs = 38; goto f0;
1077
- tr51: cs = 39; goto f0;
1078
- tr50: cs = 39; goto f6;
1079
- tr52: cs = 40; goto f0;
1080
- tr47: cs = 41; goto f1;
1081
- tr75: cs = 41; goto f13;
1082
- tr53: cs = 42; goto f0;
1083
- tr55: cs = 43; goto f0;
1084
- tr56: cs = 44; goto f0;
1085
- tr57: cs = 45; goto f0;
1086
- tr58: cs = 46; goto f0;
1087
- tr59: cs = 47; goto f0;
1088
- tr54: cs = 48; goto f0;
1089
- tr61: cs = 49; goto f0;
1090
- tr62: cs = 50; goto f0;
1091
- tr63: cs = 51; goto f0;
1092
- tr64: cs = 52; goto f0;
1093
- tr65: cs = 53; goto f3;
1094
- tr19: cs = 54; goto f3;
1095
- tr15: cs = 55; goto f3;
1096
- tr20: cs = 57; goto f5;
1097
- tr29: cs = 57; goto f8;
1098
- tr44: cs = 58; goto f0;
1099
- tr67: cs = 59; goto f0;
1100
- tr69: cs = 60; goto f0;
1101
- tr68: cs = 60; goto f8;
1102
-
1103
- f0:
1104
- #line 175 "parser.rl"
1105
- {
1106
- switch( cs ){
1107
- case 0:
1108
- if( parser->prev_state != 12 && parser->prev_state != 7 ){
1109
- if( parser->echobuffer && (parser->prev_state != (esi_en_main +1)) && parser->prev_state != 60 ){
1110
- // stream echobuffer
1111
- esi_parser_echo_buffer( parser );
1112
- }
1113
- // printf( "[%d: %c]", cs, *p );
1114
- // stream the current character
1115
- esi_parser_echo_char( parser, *p );
1116
- }
1117
- // clear the echobuffer
1118
- esi_parser_echobuffer_clear( parser );
1119
- break;
1120
- default:
1121
- // append characters to echobuffer
1122
- esi_parser_concat_to_echobuffer( parser, *p );
1123
- }
1124
- parser->prev_state = cs;
1125
- }
1126
- goto _again;
1127
- f1:
1128
- #line 175 "parser.rl"
1129
- {
1130
- switch( cs ){
1131
- case 0:
1132
- if( parser->prev_state != 12 && parser->prev_state != 7 ){
1133
- if( parser->echobuffer && (parser->prev_state != (esi_en_main +1)) && parser->prev_state != 60 ){
1134
- // stream echobuffer
1135
- esi_parser_echo_buffer( parser );
1136
- }
1137
- // printf( "[%d: %c]", cs, *p );
1138
- // stream the current character
1139
- esi_parser_echo_char( parser, *p );
1140
- }
1141
- // clear the echobuffer
1142
- esi_parser_echobuffer_clear( parser );
1143
- break;
1144
- default:
1145
- // append characters to echobuffer
1146
- esi_parser_concat_to_echobuffer( parser, *p );
1147
- }
1148
- parser->prev_state = cs;
1149
- }
1150
- #line 85 "parser.rl"
425
+ _keys = _esi_trans_keys + _esi_key_offsets[cs];
426
+ _trans = _esi_index_offsets[cs];
427
+
428
+ _klen = _esi_single_lengths[cs];
429
+ if ( _klen > 0 ) {
430
+ const char *_lower = _keys;
431
+ const char *_mid;
432
+ const char *_upper = _keys + _klen - 1;
433
+ while (1) {
434
+ if ( _upper < _lower )
435
+ break;
436
+
437
+ _mid = _lower + ((_upper-_lower) >> 1);
438
+ if ( (*p) < *_mid )
439
+ _upper = _mid - 1;
440
+ else if ( (*p) > *_mid )
441
+ _lower = _mid + 1;
442
+ else {
443
+ _trans += (_mid - _keys);
444
+ goto _match;
445
+ }
446
+ }
447
+ _keys += _klen;
448
+ _trans += _klen;
449
+ }
450
+
451
+ _klen = _esi_range_lengths[cs];
452
+ if ( _klen > 0 ) {
453
+ const char *_lower = _keys;
454
+ const char *_mid;
455
+ const char *_upper = _keys + (_klen<<1) - 2;
456
+ while (1) {
457
+ if ( _upper < _lower )
458
+ break;
459
+
460
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
461
+ if ( (*p) < _mid[0] )
462
+ _upper = _mid - 2;
463
+ else if ( (*p) > _mid[1] )
464
+ _lower = _mid + 2;
465
+ else {
466
+ _trans += ((_mid - _keys)>>1);
467
+ goto _match;
468
+ }
469
+ }
470
+ _trans += _klen;
471
+ }
472
+
473
+ _match:
474
+ _trans = _esi_indicies[_trans];
475
+ cs = _esi_trans_targs_wi[_trans];
476
+
477
+ if ( _esi_trans_actions_wi[_trans] == 0 )
478
+ goto _again;
479
+
480
+ _acts = _esi_actions + _esi_trans_actions_wi[_trans];
481
+ _nacts = (unsigned int) *_acts++;
482
+ while ( _nacts-- > 0 )
483
+ {
484
+ switch ( *_acts++ )
485
+ {
486
+ case 0:
487
+ #line 71 "parser.rl"
1151
488
  {
1152
489
  parser->mark = p;
1153
- //debug_string( "begin", p, 1 );
490
+ // printf( "begin\n" );
1154
491
  }
1155
- goto _again;
1156
- f9:
1157
- #line 175 "parser.rl"
1158
- {
1159
- switch( cs ){
1160
- case 0:
1161
- if( parser->prev_state != 12 && parser->prev_state != 7 ){
1162
- if( parser->echobuffer && (parser->prev_state != (esi_en_main +1)) && parser->prev_state != 60 ){
1163
- // stream echobuffer
1164
- esi_parser_echo_buffer( parser );
1165
- }
1166
- // printf( "[%d: %c]", cs, *p );
1167
- // stream the current character
1168
- esi_parser_echo_char( parser, *p );
1169
- }
1170
- // clear the echobuffer
1171
- esi_parser_echobuffer_clear( parser );
1172
- break;
1173
- default:
1174
- // append characters to echobuffer
1175
- esi_parser_concat_to_echobuffer( parser, *p );
1176
- }
1177
- parser->prev_state = cs;
1178
- }
1179
- #line 89 "parser.rl"
492
+ break;
493
+ case 1:
494
+ #line 75 "parser.rl"
1180
495
  {
1181
496
  // printf( "finish\n" );
1182
497
  }
1183
- goto _again;
1184
- f3:
1185
- #line 175 "parser.rl"
1186
- {
1187
- switch( cs ){
1188
- case 0:
1189
- if( parser->prev_state != 12 && parser->prev_state != 7 ){
1190
- if( parser->echobuffer && (parser->prev_state != (esi_en_main +1)) && parser->prev_state != 60 ){
1191
- // stream echobuffer
1192
- esi_parser_echo_buffer( parser );
1193
- }
1194
- // printf( "[%d: %c]", cs, *p );
1195
- // stream the current character
1196
- esi_parser_echo_char( parser, *p );
1197
- }
1198
- // clear the echobuffer
1199
- esi_parser_echobuffer_clear( parser );
1200
- break;
1201
- default:
1202
- // append characters to echobuffer
1203
- esi_parser_concat_to_echobuffer( parser, *p );
1204
- }
1205
- parser->prev_state = cs;
1206
- }
1207
- #line 94 "parser.rl"
498
+ break;
499
+ case 2:
500
+ #line 80 "parser.rl"
1208
501
  {
1209
502
  parser->tag_text = parser->mark+1;
1210
503
  parser->tag_text_length = p - (parser->mark+1);
1211
504
  // debug_string( "have esi start", parser->tag_text, parser->tag_text_length );
1212
505
  parser->mark = p;
1213
- //debug_string( "see_start_tag", p, 1 );
1214
- }
1215
- goto _again;
1216
- f8:
1217
- #line 175 "parser.rl"
1218
- {
1219
- switch( cs ){
1220
- case 0:
1221
- if( parser->prev_state != 12 && parser->prev_state != 7 ){
1222
- if( parser->echobuffer && (parser->prev_state != (esi_en_main +1)) && parser->prev_state != 60 ){
1223
- // stream echobuffer
1224
- esi_parser_echo_buffer( parser );
1225
- }
1226
- // printf( "[%d: %c]", cs, *p );
1227
- // stream the current character
1228
- esi_parser_echo_char( parser, *p );
1229
- }
1230
- // clear the echobuffer
1231
- esi_parser_echobuffer_clear( parser );
1232
- break;
1233
- default:
1234
- // append characters to echobuffer
1235
- esi_parser_concat_to_echobuffer( parser, *p );
1236
- }
1237
- parser->prev_state = cs;
1238
506
  }
1239
- #line 102 "parser.rl"
507
+ break;
508
+ case 3:
509
+ #line 87 "parser.rl"
1240
510
  {
1241
- //debug_string( "see_end_tag: before parsed esi tag", parser->tag_text, parser->tag_text_length );
1242
- ltrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1243
- //debug_string( "see_end_tag: after parsed esi tag", parser->tag_text, parser->tag_text_length );
511
+ // debug_string( "parsed esi tag", parser->tag_text, parser->tag_text_length );
1244
512
  parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->attributes, parser->user_data );
1245
- //debug_string( "see_end_tag: after start parsed esi tag", parser->tag_text, parser->tag_text_length );
1246
513
  parser->end_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->user_data );
1247
- //debug_string( "see_end_tag: after end parsed esi tag", parser->tag_text, parser->tag_text_length );
1248
514
  parser->tag_text = NULL;
1249
515
  parser->tag_text_length = 0;
1250
- parser->mark = p;
1251
- //debug_string( "see_end_tag", p, 1 );
1252
516
  }
1253
- goto _again;
1254
- f5:
1255
- #line 175 "parser.rl"
1256
- {
1257
- switch( cs ){
1258
- case 0:
1259
- if( parser->prev_state != 12 && parser->prev_state != 7 ){
1260
- if( parser->echobuffer && (parser->prev_state != (esi_en_main +1)) && parser->prev_state != 60 ){
1261
- // stream echobuffer
1262
- esi_parser_echo_buffer( parser );
1263
- }
1264
- // printf( "[%d: %c]", cs, *p );
1265
- // stream the current character
1266
- esi_parser_echo_char( parser, *p );
1267
- }
1268
- // clear the echobuffer
1269
- esi_parser_echobuffer_clear( parser );
1270
- break;
1271
- default:
1272
- // append characters to echobuffer
1273
- esi_parser_concat_to_echobuffer( parser, *p );
1274
- }
1275
- parser->prev_state = cs;
1276
- }
1277
- #line 116 "parser.rl"
517
+ break;
518
+ case 4:
519
+ #line 95 "parser.rl"
1278
520
  {
1279
521
  // debug_string( "parsed esi tag", parser->tag_text, parser->tag_text_length );
1280
- ltrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1281
522
  parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->attributes, parser->user_data );
1282
523
  parser->tag_text = NULL;
1283
524
  parser->tag_text_length = 0;
1284
525
  }
1285
- goto _again;
1286
- f6:
1287
- #line 175 "parser.rl"
1288
- {
1289
- switch( cs ){
1290
- case 0:
1291
- if( parser->prev_state != 12 && parser->prev_state != 7 ){
1292
- if( parser->echobuffer && (parser->prev_state != (esi_en_main +1)) && parser->prev_state != 60 ){
1293
- // stream echobuffer
1294
- esi_parser_echo_buffer( parser );
1295
- }
1296
- // printf( "[%d: %c]", cs, *p );
1297
- // stream the current character
1298
- esi_parser_echo_char( parser, *p );
1299
- }
1300
- // clear the echobuffer
1301
- esi_parser_echobuffer_clear( parser );
1302
- break;
1303
- default:
1304
- // append characters to echobuffer
1305
- esi_parser_concat_to_echobuffer( parser, *p );
1306
- }
1307
- parser->prev_state = cs;
1308
- }
1309
- #line 124 "parser.rl"
526
+ break;
527
+ case 5:
528
+ #line 102 "parser.rl"
1310
529
  {
1311
530
  parser->attr_key = parser->mark;
1312
531
  parser->attr_key_length = p - parser->mark;
1313
532
  parser->mark = p;
1314
- ltrim_pointer( &(parser->attr_key), p, &(parser->attr_key_length) );
1315
533
  // debug_string( "\tattribute key", parser->attr_key, parser->attr_key_length );
1316
- //debug_string( "see_attribute_key", p, 1 );
1317
534
  }
1318
- goto _again;
1319
- f7:
1320
- #line 175 "parser.rl"
1321
- {
1322
- switch( cs ){
1323
- case 0:
1324
- if( parser->prev_state != 12 && parser->prev_state != 7 ){
1325
- if( parser->echobuffer && (parser->prev_state != (esi_en_main +1)) && parser->prev_state != 60 ){
1326
- // stream echobuffer
1327
- esi_parser_echo_buffer( parser );
1328
- }
1329
- // printf( "[%d: %c]", cs, *p );
1330
- // stream the current character
1331
- esi_parser_echo_char( parser, *p );
1332
- }
1333
- // clear the echobuffer
1334
- esi_parser_echobuffer_clear( parser );
1335
- break;
1336
- default:
1337
- // append characters to echobuffer
1338
- esi_parser_concat_to_echobuffer( parser, *p );
1339
- }
1340
- parser->prev_state = cs;
1341
- }
1342
- #line 133 "parser.rl"
535
+ break;
536
+ case 6:
537
+ #line 109 "parser.rl"
1343
538
  {
1344
539
  ESIAttribute *attr;
1345
540
  parser->attr_value = parser->mark;
1346
541
  parser->attr_value_length = p - parser->mark;
1347
542
  parser->mark = p;
1348
-
1349
- ltrim_pointer( &(parser->attr_value), p, &(parser->attr_value_length) );
1350
-
1351
543
  // allocate a new attribute
1352
544
  attr = esi_attribute_new( parser->attr_key, parser->attr_key_length,
1353
545
  parser->attr_value, parser->attr_value_length );
@@ -1359,201 +551,28 @@ f7:
1359
551
  parser->last = parser->attributes = attr;
1360
552
  }
1361
553
  // debug_string( "\tattribute value", parser->attr_value, parser->attr_value_length );
1362
- //debug_string( "see_attribute_value", p, 1 );
1363
- }
1364
- goto _again;
1365
- f4:
1366
- #line 175 "parser.rl"
1367
- {
1368
- switch( cs ){
1369
- case 0:
1370
- if( parser->prev_state != 12 && parser->prev_state != 7 ){
1371
- if( parser->echobuffer && (parser->prev_state != (esi_en_main +1)) && parser->prev_state != 60 ){
1372
- // stream echobuffer
1373
- esi_parser_echo_buffer( parser );
1374
- }
1375
- // printf( "[%d: %c]", cs, *p );
1376
- // stream the current character
1377
- esi_parser_echo_char( parser, *p );
1378
- }
1379
- // clear the echobuffer
1380
- esi_parser_echobuffer_clear( parser );
1381
- break;
1382
- default:
1383
- // append characters to echobuffer
1384
- esi_parser_concat_to_echobuffer( parser, *p );
1385
- }
1386
- parser->prev_state = cs;
1387
554
  }
1388
- #line 155 "parser.rl"
555
+ break;
556
+ case 7:
557
+ #line 127 "parser.rl"
1389
558
  {
1390
559
  parser->tag_text = parser->mark;
1391
560
  parser->tag_text_length = p - parser->mark;
1392
561
  parser->mark = p;
1393
- ltrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1394
562
  parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, NULL, parser->user_data );
1395
- //debug_string( "block_start_tag", p, 1 );
1396
563
  }
1397
- goto _again;
1398
- f2:
1399
- #line 175 "parser.rl"
1400
- {
1401
- switch( cs ){
1402
- case 0:
1403
- if( parser->prev_state != 12 && parser->prev_state != 7 ){
1404
- if( parser->echobuffer && (parser->prev_state != (esi_en_main +1)) && parser->prev_state != 60 ){
1405
- // stream echobuffer
1406
- esi_parser_echo_buffer( parser );
1407
- }
1408
- // printf( "[%d: %c]", cs, *p );
1409
- // stream the current character
1410
- esi_parser_echo_char( parser, *p );
1411
- }
1412
- // clear the echobuffer
1413
- esi_parser_echobuffer_clear( parser );
1414
- break;
1415
- default:
1416
- // append characters to echobuffer
1417
- esi_parser_concat_to_echobuffer( parser, *p );
1418
- }
1419
- parser->prev_state = cs;
1420
- }
1421
- #line 164 "parser.rl"
564
+ break;
565
+ case 8:
566
+ #line 134 "parser.rl"
1422
567
  {
1423
568
  parser->tag_text = parser->mark+2;
1424
569
  parser->tag_text_length = p - (parser->mark+2);
1425
- //printf( "mark: [%s], p: [%s], length: %d\n", parser->mark, p, parser->tag_text_length );
1426
- parser->mark = p;
1427
- //debug_string( "block_end_tag: before parsed esi tag", parser->tag_text, parser->tag_text_length );
1428
- ltrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1429
- //debug_string( "block_end_tag: after parsed esi tag", parser->tag_text, parser->tag_text_length );
1430
- parser->end_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->user_data );
1431
- }
1432
- goto _again;
1433
- f10:
1434
- #line 175 "parser.rl"
1435
- {
1436
- switch( cs ){
1437
- case 0:
1438
- if( parser->prev_state != 12 && parser->prev_state != 7 ){
1439
- if( parser->echobuffer && (parser->prev_state != (esi_en_main +1)) && parser->prev_state != 60 ){
1440
- // stream echobuffer
1441
- esi_parser_echo_buffer( parser );
1442
- }
1443
- // printf( "[%d: %c]", cs, *p );
1444
- // stream the current character
1445
- esi_parser_echo_char( parser, *p );
1446
- }
1447
- // clear the echobuffer
1448
- esi_parser_echobuffer_clear( parser );
1449
- break;
1450
- default:
1451
- // append characters to echobuffer
1452
- esi_parser_concat_to_echobuffer( parser, *p );
1453
- }
1454
- parser->prev_state = cs;
1455
- }
1456
- #line 85 "parser.rl"
1457
- {
1458
- parser->mark = p;
1459
- //debug_string( "begin", p, 1 );
1460
- }
1461
- #line 89 "parser.rl"
1462
- {
1463
- // printf( "finish\n" );
1464
- }
1465
- goto _again;
1466
- f11:
1467
- #line 175 "parser.rl"
1468
- {
1469
- switch( cs ){
1470
- case 0:
1471
- if( parser->prev_state != 12 && parser->prev_state != 7 ){
1472
- if( parser->echobuffer && (parser->prev_state != (esi_en_main +1)) && parser->prev_state != 60 ){
1473
- // stream echobuffer
1474
- esi_parser_echo_buffer( parser );
1475
- }
1476
- // printf( "[%d: %c]", cs, *p );
1477
- // stream the current character
1478
- esi_parser_echo_char( parser, *p );
1479
- }
1480
- // clear the echobuffer
1481
- esi_parser_echobuffer_clear( parser );
1482
- break;
1483
- default:
1484
- // append characters to echobuffer
1485
- esi_parser_concat_to_echobuffer( parser, *p );
1486
- }
1487
- parser->prev_state = cs;
1488
- }
1489
- #line 102 "parser.rl"
1490
- {
1491
- //debug_string( "see_end_tag: before parsed esi tag", parser->tag_text, parser->tag_text_length );
1492
- ltrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1493
- //debug_string( "see_end_tag: after parsed esi tag", parser->tag_text, parser->tag_text_length );
1494
- parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->attributes, parser->user_data );
1495
- //debug_string( "see_end_tag: after start parsed esi tag", parser->tag_text, parser->tag_text_length );
1496
- parser->end_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->user_data );
1497
- //debug_string( "see_end_tag: after end parsed esi tag", parser->tag_text, parser->tag_text_length );
1498
- parser->tag_text = NULL;
1499
- parser->tag_text_length = 0;
1500
- parser->mark = p;
1501
- //debug_string( "see_end_tag", p, 1 );
1502
- }
1503
- #line 89 "parser.rl"
1504
- {
1505
- // printf( "finish\n" );
1506
- }
1507
- goto _again;
1508
- f13:
1509
- #line 175 "parser.rl"
1510
- {
1511
- switch( cs ){
1512
- case 0:
1513
- if( parser->prev_state != 12 && parser->prev_state != 7 ){
1514
- if( parser->echobuffer && (parser->prev_state != (esi_en_main +1)) && parser->prev_state != 60 ){
1515
- // stream echobuffer
1516
- esi_parser_echo_buffer( parser );
1517
- }
1518
- // printf( "[%d: %c]", cs, *p );
1519
- // stream the current character
1520
- esi_parser_echo_char( parser, *p );
1521
- }
1522
- // clear the echobuffer
1523
- esi_parser_echobuffer_clear( parser );
1524
- break;
1525
- default:
1526
- // append characters to echobuffer
1527
- esi_parser_concat_to_echobuffer( parser, *p );
1528
- }
1529
- parser->prev_state = cs;
1530
- }
1531
- #line 85 "parser.rl"
1532
- {
1533
570
  parser->mark = p;
1534
- //debug_string( "begin", p, 1 );
1535
- }
1536
- #line 102 "parser.rl"
1537
- {
1538
- //debug_string( "see_end_tag: before parsed esi tag", parser->tag_text, parser->tag_text_length );
1539
- ltrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1540
- //debug_string( "see_end_tag: after parsed esi tag", parser->tag_text, parser->tag_text_length );
1541
- parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->attributes, parser->user_data );
1542
- //debug_string( "see_end_tag: after start parsed esi tag", parser->tag_text, parser->tag_text_length );
1543
571
  parser->end_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->user_data );
1544
- //debug_string( "see_end_tag: after end parsed esi tag", parser->tag_text, parser->tag_text_length );
1545
- parser->tag_text = NULL;
1546
- parser->tag_text_length = 0;
1547
- parser->mark = p;
1548
- //debug_string( "see_end_tag", p, 1 );
1549
- }
1550
- #line 89 "parser.rl"
1551
- {
1552
- // printf( "finish\n" );
1553
572
  }
1554
- goto _again;
1555
- f12:
1556
- #line 175 "parser.rl"
573
+ break;
574
+ case 9:
575
+ #line 141 "parser.rl"
1557
576
  {
1558
577
  switch( cs ){
1559
578
  case 0:
@@ -1575,54 +594,17 @@ f12:
1575
594
  }
1576
595
  parser->prev_state = cs;
1577
596
  }
1578
- #line 102 "parser.rl"
1579
- {
1580
- //debug_string( "see_end_tag: before parsed esi tag", parser->tag_text, parser->tag_text_length );
1581
- ltrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
1582
- //debug_string( "see_end_tag: after parsed esi tag", parser->tag_text, parser->tag_text_length );
1583
- parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->attributes, parser->user_data );
1584
- //debug_string( "see_end_tag: after start parsed esi tag", parser->tag_text, parser->tag_text_length );
1585
- parser->end_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->user_data );
1586
- //debug_string( "see_end_tag: after end parsed esi tag", parser->tag_text, parser->tag_text_length );
1587
- parser->tag_text = NULL;
1588
- parser->tag_text_length = 0;
1589
- parser->mark = p;
1590
- //debug_string( "see_end_tag", p, 1 );
1591
- }
1592
- #line 133 "parser.rl"
1593
- {
1594
- ESIAttribute *attr;
1595
- parser->attr_value = parser->mark;
1596
- parser->attr_value_length = p - parser->mark;
1597
- parser->mark = p;
1598
-
1599
- ltrim_pointer( &(parser->attr_value), p, &(parser->attr_value_length) );
1600
-
1601
- // allocate a new attribute
1602
- attr = esi_attribute_new( parser->attr_key, parser->attr_key_length,
1603
- parser->attr_value, parser->attr_value_length );
1604
- if( parser->attributes ){
1605
- parser->last->next = attr;
1606
- parser->last = attr;
1607
- }
1608
- else{
1609
- parser->last = parser->attributes = attr;
1610
- }
1611
- // debug_string( "\tattribute value", parser->attr_value, parser->attr_value_length );
1612
- //debug_string( "see_attribute_value", p, 1 );
1613
- }
1614
- #line 89 "parser.rl"
1615
- {
1616
- // printf( "finish\n" );
1617
- }
1618
- goto _again;
597
+ break;
598
+ #line 599 "parser.c"
599
+ }
600
+ }
1619
601
 
1620
602
  _again:
1621
603
  if ( ++p != pe )
1622
604
  goto _resume;
1623
605
  _out: {}
1624
606
  }
1625
- #line 351 "parser.rl"
607
+ #line 294 "parser.rl"
1626
608
 
1627
609
  parser->cs = cs;
1628
610
 
@@ -1634,18 +616,16 @@ _again:
1634
616
  int tag_text_offset = compute_offset( parser->tag_text, data );
1635
617
  int attr_key_offset = compute_offset( parser->attr_key, data );
1636
618
  int attr_value_offset = compute_offset( parser->attr_value, data );
1637
- //debug_string( "mark before move", parser->mark, 1 );
1638
619
 
1639
620
  parser->overflow_data = (char*)malloc( sizeof( char ) * length );
1640
621
  memcpy( parser->overflow_data, data, length );
1641
622
  parser->overflow_data_size = length;
1642
623
 
1643
624
  // in our new memory space mark will now be
1644
- parser->mark = ( mark_offset >= 0 ) ? parser->overflow_data + mark_offset : NULL;
1645
- parser->tag_text = ( tag_text_offset >= 0 ) ? parser->overflow_data + tag_text_offset : NULL;
1646
- parser->attr_key = ( attr_key_offset >= 0 ) ? parser->overflow_data + attr_key_offset : NULL;
1647
- parser->attr_value = ( attr_value_offset >= 0 ) ? parser->overflow_data + attr_value_offset : NULL;
1648
- //if( parser->mark ){ debug_string( "mark after move", parser->mark, 1 ); } else { printf( "mark is now empty\n" ); }
625
+ parser->mark = ( mark_offset > 0 ) ? parser->overflow_data + mark_offset : NULL;
626
+ parser->tag_text = ( tag_text_offset > 0 ) ? parser->overflow_data + tag_text_offset : NULL;
627
+ parser->attr_key = ( attr_key_offset > 0 ) ? parser->overflow_data + attr_key_offset : NULL;
628
+ parser->attr_value = ( attr_value_offset > 0 ) ? parser->overflow_data + attr_value_offset : NULL;
1649
629
  }
1650
630
 
1651
631
  }else if( parser->overflow_data ){
@@ -1659,8 +639,8 @@ _again:
1659
639
  int esi_parser_finish( ESIParser *parser )
1660
640
  {
1661
641
 
1662
- #line 1663 "parser.c"
1663
- #line 387 "parser.rl"
642
+ #line 643 "parser.c"
643
+ #line 328 "parser.rl"
1664
644
  return 0;
1665
645
  }
1666
646