passenger-jmazzi 2.2.9

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 (912) hide show
  1. data/INSTALL +6 -0
  2. data/LICENSE +19 -0
  3. data/NEWS +270 -0
  4. data/README +45 -0
  5. data/Rakefile +918 -0
  6. data/benchmark/ApplicationPool.cpp +52 -0
  7. data/benchmark/accept_vs_socketpair_vs_named_pipes.rb +126 -0
  8. data/benchmark/dispatcher.rb +42 -0
  9. data/benchmark/overhead_of_password_checking.rb +81 -0
  10. data/benchmark/socket_connections_vs_persistent_pipe.rb +99 -0
  11. data/benchmark/unix_sockets_vs_pipes.rb +83 -0
  12. data/bin/passenger-config +46 -0
  13. data/bin/passenger-install-apache2-module +224 -0
  14. data/bin/passenger-install-nginx-module +474 -0
  15. data/bin/passenger-make-enterprisey +83 -0
  16. data/bin/passenger-memory-stats +301 -0
  17. data/bin/passenger-spawn-server +68 -0
  18. data/bin/passenger-status +125 -0
  19. data/bin/passenger-stress-test +344 -0
  20. data/debian/compat +1 -0
  21. data/debian/control +21 -0
  22. data/debian/postinst +24 -0
  23. data/debian/prerm +2 -0
  24. data/doc/ApplicationPool algorithm.txt +402 -0
  25. data/doc/Architectural overview.txt +334 -0
  26. data/doc/Doxyfile +241 -0
  27. data/doc/Security of user switching support.txt +197 -0
  28. data/doc/Users guide Apache.txt +1848 -0
  29. data/doc/Users guide Nginx.txt +769 -0
  30. data/doc/definitions.h +5 -0
  31. data/doc/images/by_sa.png +0 -0
  32. data/doc/images/conservative_spawning.png +0 -0
  33. data/doc/images/conservative_spawning.svg +248 -0
  34. data/doc/images/icons/README +5 -0
  35. data/doc/images/icons/callouts/1.png +0 -0
  36. data/doc/images/icons/callouts/10.png +0 -0
  37. data/doc/images/icons/callouts/11.png +0 -0
  38. data/doc/images/icons/callouts/12.png +0 -0
  39. data/doc/images/icons/callouts/13.png +0 -0
  40. data/doc/images/icons/callouts/14.png +0 -0
  41. data/doc/images/icons/callouts/15.png +0 -0
  42. data/doc/images/icons/callouts/2.png +0 -0
  43. data/doc/images/icons/callouts/3.png +0 -0
  44. data/doc/images/icons/callouts/4.png +0 -0
  45. data/doc/images/icons/callouts/5.png +0 -0
  46. data/doc/images/icons/callouts/6.png +0 -0
  47. data/doc/images/icons/callouts/7.png +0 -0
  48. data/doc/images/icons/callouts/8.png +0 -0
  49. data/doc/images/icons/callouts/9.png +0 -0
  50. data/doc/images/icons/caution.png +0 -0
  51. data/doc/images/icons/example.png +0 -0
  52. data/doc/images/icons/home.png +0 -0
  53. data/doc/images/icons/important.png +0 -0
  54. data/doc/images/icons/next.png +0 -0
  55. data/doc/images/icons/note.png +0 -0
  56. data/doc/images/icons/prev.png +0 -0
  57. data/doc/images/icons/tip.png +0 -0
  58. data/doc/images/icons/up.png +0 -0
  59. data/doc/images/icons/warning.png +0 -0
  60. data/doc/images/passenger_architecture.png +0 -0
  61. data/doc/images/passenger_architecture.svg +401 -0
  62. data/doc/images/phusion_banner.png +0 -0
  63. data/doc/images/smart-lv2.png +0 -0
  64. data/doc/images/smart-lv2.svg +320 -0
  65. data/doc/images/spawn_server_architecture.png +0 -0
  66. data/doc/images/spawn_server_architecture.svg +655 -0
  67. data/doc/images/typical_isolated_web_application.png +0 -0
  68. data/doc/images/typical_isolated_web_application.svg +213 -0
  69. data/doc/template/horo.rb +613 -0
  70. data/doc/users_guide_snippets/analysis_and_system_maintenance_tools.txt +144 -0
  71. data/doc/users_guide_snippets/appendix_a_about.txt +13 -0
  72. data/doc/users_guide_snippets/appendix_b_terminology.txt +63 -0
  73. data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +304 -0
  74. data/doc/users_guide_snippets/global_queueing_explained.txt +78 -0
  75. data/doc/users_guide_snippets/rackup_specifications.txt +71 -0
  76. data/doc/users_guide_snippets/rails_spawn_method.txt +48 -0
  77. data/doc/users_guide_snippets/tips.txt +173 -0
  78. data/ext/apache2/Bucket.cpp +190 -0
  79. data/ext/apache2/Bucket.h +87 -0
  80. data/ext/apache2/Configuration.cpp +798 -0
  81. data/ext/apache2/Configuration.h +405 -0
  82. data/ext/apache2/DirectoryMapper.h +296 -0
  83. data/ext/apache2/Hooks.cpp +1617 -0
  84. data/ext/apache2/Hooks.h +45 -0
  85. data/ext/apache2/LICENSE-CNRI.TXT +79 -0
  86. data/ext/apache2/mod_passenger.c +38 -0
  87. data/ext/boost/LICENSE.TXT +23 -0
  88. data/ext/boost/VERSION.TXT +1 -0
  89. data/ext/boost/algorithm/string/case_conv.hpp +176 -0
  90. data/ext/boost/algorithm/string/compare.hpp +199 -0
  91. data/ext/boost/algorithm/string/concept.hpp +83 -0
  92. data/ext/boost/algorithm/string/config.hpp +28 -0
  93. data/ext/boost/algorithm/string/constants.hpp +36 -0
  94. data/ext/boost/algorithm/string/detail/case_conv.hpp +112 -0
  95. data/ext/boost/algorithm/string/detail/find_format.hpp +193 -0
  96. data/ext/boost/algorithm/string/detail/find_format_all.hpp +263 -0
  97. data/ext/boost/algorithm/string/detail/find_format_store.hpp +71 -0
  98. data/ext/boost/algorithm/string/detail/finder.hpp +646 -0
  99. data/ext/boost/algorithm/string/detail/formatter.hpp +94 -0
  100. data/ext/boost/algorithm/string/detail/replace_storage.hpp +159 -0
  101. data/ext/boost/algorithm/string/detail/sequence.hpp +200 -0
  102. data/ext/boost/algorithm/string/detail/util.hpp +106 -0
  103. data/ext/boost/algorithm/string/erase.hpp +844 -0
  104. data/ext/boost/algorithm/string/find_format.hpp +269 -0
  105. data/ext/boost/algorithm/string/finder.hpp +270 -0
  106. data/ext/boost/algorithm/string/formatter.hpp +103 -0
  107. data/ext/boost/algorithm/string/replace.hpp +928 -0
  108. data/ext/boost/algorithm/string/sequence_traits.hpp +193 -0
  109. data/ext/boost/algorithm/string/yes_no_type.hpp +33 -0
  110. data/ext/boost/assert.hpp +50 -0
  111. data/ext/boost/bind.hpp +1689 -0
  112. data/ext/boost/bind/arg.hpp +62 -0
  113. data/ext/boost/bind/bind_cc.hpp +117 -0
  114. data/ext/boost/bind/bind_mf_cc.hpp +227 -0
  115. data/ext/boost/bind/bind_template.hpp +345 -0
  116. data/ext/boost/bind/mem_fn_cc.hpp +103 -0
  117. data/ext/boost/bind/mem_fn_template.hpp +1020 -0
  118. data/ext/boost/bind/placeholders.hpp +68 -0
  119. data/ext/boost/bind/storage.hpp +475 -0
  120. data/ext/boost/call_traits.hpp +24 -0
  121. data/ext/boost/checked_delete.hpp +69 -0
  122. data/ext/boost/concept/assert.hpp +46 -0
  123. data/ext/boost/concept/detail/concept_def.hpp +51 -0
  124. data/ext/boost/concept/detail/concept_undef.hpp +5 -0
  125. data/ext/boost/concept/detail/general.hpp +66 -0
  126. data/ext/boost/concept/detail/has_constraints.hpp +48 -0
  127. data/ext/boost/concept/usage.hpp +43 -0
  128. data/ext/boost/concept_check.hpp +988 -0
  129. data/ext/boost/config.hpp +70 -0
  130. data/ext/boost/config/abi/borland_prefix.hpp +27 -0
  131. data/ext/boost/config/abi/borland_suffix.hpp +12 -0
  132. data/ext/boost/config/abi/msvc_prefix.hpp +8 -0
  133. data/ext/boost/config/abi/msvc_suffix.hpp +8 -0
  134. data/ext/boost/config/abi_prefix.hpp +25 -0
  135. data/ext/boost/config/abi_suffix.hpp +26 -0
  136. data/ext/boost/config/auto_link.hpp +368 -0
  137. data/ext/boost/config/compiler/borland.hpp +209 -0
  138. data/ext/boost/config/compiler/comeau.hpp +59 -0
  139. data/ext/boost/config/compiler/common_edg.hpp +62 -0
  140. data/ext/boost/config/compiler/compaq_cxx.hpp +19 -0
  141. data/ext/boost/config/compiler/digitalmars.hpp +67 -0
  142. data/ext/boost/config/compiler/gcc.hpp +149 -0
  143. data/ext/boost/config/compiler/gcc_xml.hpp +30 -0
  144. data/ext/boost/config/compiler/greenhills.hpp +28 -0
  145. data/ext/boost/config/compiler/hp_acc.hpp +95 -0
  146. data/ext/boost/config/compiler/intel.hpp +162 -0
  147. data/ext/boost/config/compiler/kai.hpp +35 -0
  148. data/ext/boost/config/compiler/metrowerks.hpp +111 -0
  149. data/ext/boost/config/compiler/mpw.hpp +51 -0
  150. data/ext/boost/config/compiler/pgi.hpp +25 -0
  151. data/ext/boost/config/compiler/sgi_mipspro.hpp +28 -0
  152. data/ext/boost/config/compiler/sunpro_cc.hpp +98 -0
  153. data/ext/boost/config/compiler/vacpp.hpp +60 -0
  154. data/ext/boost/config/compiler/visualc.hpp +191 -0
  155. data/ext/boost/config/no_tr1/complex.hpp +28 -0
  156. data/ext/boost/config/no_tr1/functional.hpp +28 -0
  157. data/ext/boost/config/no_tr1/memory.hpp +28 -0
  158. data/ext/boost/config/no_tr1/utility.hpp +28 -0
  159. data/ext/boost/config/platform/aix.hpp +33 -0
  160. data/ext/boost/config/platform/amigaos.hpp +15 -0
  161. data/ext/boost/config/platform/beos.hpp +26 -0
  162. data/ext/boost/config/platform/bsd.hpp +73 -0
  163. data/ext/boost/config/platform/cygwin.hpp +51 -0
  164. data/ext/boost/config/platform/hpux.hpp +84 -0
  165. data/ext/boost/config/platform/irix.hpp +31 -0
  166. data/ext/boost/config/platform/linux.hpp +98 -0
  167. data/ext/boost/config/platform/macos.hpp +78 -0
  168. data/ext/boost/config/platform/qnxnto.hpp +31 -0
  169. data/ext/boost/config/platform/solaris.hpp +21 -0
  170. data/ext/boost/config/platform/win32.hpp +58 -0
  171. data/ext/boost/config/posix_features.hpp +95 -0
  172. data/ext/boost/config/requires_threads.hpp +92 -0
  173. data/ext/boost/config/select_compiler_config.hpp +115 -0
  174. data/ext/boost/config/select_platform_config.hpp +90 -0
  175. data/ext/boost/config/select_stdlib_config.hpp +68 -0
  176. data/ext/boost/config/stdlib/dinkumware.hpp +106 -0
  177. data/ext/boost/config/stdlib/libcomo.hpp +46 -0
  178. data/ext/boost/config/stdlib/libstdcpp3.hpp +73 -0
  179. data/ext/boost/config/stdlib/modena.hpp +30 -0
  180. data/ext/boost/config/stdlib/msl.hpp +59 -0
  181. data/ext/boost/config/stdlib/roguewave.hpp +153 -0
  182. data/ext/boost/config/stdlib/sgi.hpp +111 -0
  183. data/ext/boost/config/stdlib/stlport.hpp +201 -0
  184. data/ext/boost/config/stdlib/vacpp.hpp +18 -0
  185. data/ext/boost/config/suffix.hpp +566 -0
  186. data/ext/boost/config/user.hpp +124 -0
  187. data/ext/boost/cstdint.hpp +449 -0
  188. data/ext/boost/current_function.hpp +67 -0
  189. data/ext/boost/date_time/adjust_functors.hpp +178 -0
  190. data/ext/boost/date_time/c_time.hpp +91 -0
  191. data/ext/boost/date_time/compiler_config.hpp +149 -0
  192. data/ext/boost/date_time/constrained_value.hpp +98 -0
  193. data/ext/boost/date_time/date.hpp +197 -0
  194. data/ext/boost/date_time/date_clock_device.hpp +77 -0
  195. data/ext/boost/date_time/date_defs.hpp +26 -0
  196. data/ext/boost/date_time/date_duration.hpp +147 -0
  197. data/ext/boost/date_time/date_duration_types.hpp +269 -0
  198. data/ext/boost/date_time/date_facet.hpp +775 -0
  199. data/ext/boost/date_time/date_format_simple.hpp +159 -0
  200. data/ext/boost/date_time/date_formatting.hpp +127 -0
  201. data/ext/boost/date_time/date_formatting_limited.hpp +121 -0
  202. data/ext/boost/date_time/date_formatting_locales.hpp +233 -0
  203. data/ext/boost/date_time/date_generator_formatter.hpp +263 -0
  204. data/ext/boost/date_time/date_generator_parser.hpp +329 -0
  205. data/ext/boost/date_time/date_generators.hpp +509 -0
  206. data/ext/boost/date_time/date_iterator.hpp +101 -0
  207. data/ext/boost/date_time/date_names_put.hpp +320 -0
  208. data/ext/boost/date_time/date_parsing.hpp +299 -0
  209. data/ext/boost/date_time/dst_rules.hpp +391 -0
  210. data/ext/boost/date_time/filetime_functions.hpp +78 -0
  211. data/ext/boost/date_time/format_date_parser.hpp +731 -0
  212. data/ext/boost/date_time/gregorian/conversion.hpp +73 -0
  213. data/ext/boost/date_time/gregorian/formatters.hpp +162 -0
  214. data/ext/boost/date_time/gregorian/formatters_limited.hpp +81 -0
  215. data/ext/boost/date_time/gregorian/greg_calendar.hpp +47 -0
  216. data/ext/boost/date_time/gregorian/greg_date.hpp +135 -0
  217. data/ext/boost/date_time/gregorian/greg_day.hpp +57 -0
  218. data/ext/boost/date_time/gregorian/greg_day_of_year.hpp +38 -0
  219. data/ext/boost/date_time/gregorian/greg_duration.hpp +38 -0
  220. data/ext/boost/date_time/gregorian/greg_duration_types.hpp +34 -0
  221. data/ext/boost/date_time/gregorian/greg_month.hpp +105 -0
  222. data/ext/boost/date_time/gregorian/greg_weekday.hpp +66 -0
  223. data/ext/boost/date_time/gregorian/greg_year.hpp +53 -0
  224. data/ext/boost/date_time/gregorian/greg_ymd.hpp +33 -0
  225. data/ext/boost/date_time/gregorian/gregorian.hpp +38 -0
  226. data/ext/boost/date_time/gregorian/gregorian_io.hpp +777 -0
  227. data/ext/boost/date_time/gregorian/gregorian_types.hpp +109 -0
  228. data/ext/boost/date_time/gregorian/parsers.hpp +91 -0
  229. data/ext/boost/date_time/gregorian_calendar.hpp +70 -0
  230. data/ext/boost/date_time/gregorian_calendar.ipp +219 -0
  231. data/ext/boost/date_time/int_adapter.hpp +507 -0
  232. data/ext/boost/date_time/iso_format.hpp +303 -0
  233. data/ext/boost/date_time/locale_config.hpp +31 -0
  234. data/ext/boost/date_time/microsec_time_clock.hpp +205 -0
  235. data/ext/boost/date_time/parse_format_base.hpp +29 -0
  236. data/ext/boost/date_time/period.hpp +377 -0
  237. data/ext/boost/date_time/period_formatter.hpp +196 -0
  238. data/ext/boost/date_time/period_parser.hpp +196 -0
  239. data/ext/boost/date_time/posix_time/conversion.hpp +93 -0
  240. data/ext/boost/date_time/posix_time/date_duration_operators.hpp +114 -0
  241. data/ext/boost/date_time/posix_time/posix_time.hpp +39 -0
  242. data/ext/boost/date_time/posix_time/posix_time_config.hpp +178 -0
  243. data/ext/boost/date_time/posix_time/posix_time_duration.hpp +82 -0
  244. data/ext/boost/date_time/posix_time/posix_time_io.hpp +246 -0
  245. data/ext/boost/date_time/posix_time/posix_time_system.hpp +68 -0
  246. data/ext/boost/date_time/posix_time/posix_time_types.hpp +55 -0
  247. data/ext/boost/date_time/posix_time/ptime.hpp +65 -0
  248. data/ext/boost/date_time/posix_time/time_formatters.hpp +289 -0
  249. data/ext/boost/date_time/posix_time/time_parsers.hpp +44 -0
  250. data/ext/boost/date_time/posix_time/time_period.hpp +29 -0
  251. data/ext/boost/date_time/special_defs.hpp +25 -0
  252. data/ext/boost/date_time/special_values_formatter.hpp +96 -0
  253. data/ext/boost/date_time/special_values_parser.hpp +159 -0
  254. data/ext/boost/date_time/string_convert.hpp +33 -0
  255. data/ext/boost/date_time/string_parse_tree.hpp +278 -0
  256. data/ext/boost/date_time/strings_from_facet.hpp +123 -0
  257. data/ext/boost/date_time/time.hpp +190 -0
  258. data/ext/boost/date_time/time_clock.hpp +83 -0
  259. data/ext/boost/date_time/time_defs.hpp +33 -0
  260. data/ext/boost/date_time/time_duration.hpp +281 -0
  261. data/ext/boost/date_time/time_facet.hpp +1263 -0
  262. data/ext/boost/date_time/time_formatting_streams.hpp +119 -0
  263. data/ext/boost/date_time/time_iterator.hpp +52 -0
  264. data/ext/boost/date_time/time_parsing.hpp +321 -0
  265. data/ext/boost/date_time/time_resolution_traits.hpp +140 -0
  266. data/ext/boost/date_time/time_system_counted.hpp +254 -0
  267. data/ext/boost/date_time/time_system_split.hpp +213 -0
  268. data/ext/boost/date_time/wrapping_int.hpp +163 -0
  269. data/ext/boost/date_time/year_month_day.hpp +45 -0
  270. data/ext/boost/detail/atomic_count.hpp +124 -0
  271. data/ext/boost/detail/atomic_count_gcc.hpp +68 -0
  272. data/ext/boost/detail/atomic_count_gcc_x86.hpp +84 -0
  273. data/ext/boost/detail/atomic_count_pthreads.hpp +96 -0
  274. data/ext/boost/detail/atomic_count_solaris.hpp +59 -0
  275. data/ext/boost/detail/atomic_count_sync.hpp +57 -0
  276. data/ext/boost/detail/atomic_count_win32.hpp +63 -0
  277. data/ext/boost/detail/bad_weak_ptr.hpp +59 -0
  278. data/ext/boost/detail/call_traits.hpp +164 -0
  279. data/ext/boost/detail/endian.hpp +73 -0
  280. data/ext/boost/detail/indirect_traits.hpp +487 -0
  281. data/ext/boost/detail/iterator.hpp +494 -0
  282. data/ext/boost/detail/lcast_precision.hpp +184 -0
  283. data/ext/boost/detail/limits.hpp +449 -0
  284. data/ext/boost/detail/reference_content.hpp +141 -0
  285. data/ext/boost/detail/shared_count.hpp +375 -0
  286. data/ext/boost/detail/sp_counted_base.hpp +81 -0
  287. data/ext/boost/detail/sp_counted_base_acc_ia64.hpp +150 -0
  288. data/ext/boost/detail/sp_counted_base_cw_ppc.hpp +170 -0
  289. data/ext/boost/detail/sp_counted_base_cw_x86.hpp +158 -0
  290. data/ext/boost/detail/sp_counted_base_gcc_ia64.hpp +157 -0
  291. data/ext/boost/detail/sp_counted_base_gcc_ppc.hpp +181 -0
  292. data/ext/boost/detail/sp_counted_base_gcc_sparc.hpp +166 -0
  293. data/ext/boost/detail/sp_counted_base_gcc_x86.hpp +173 -0
  294. data/ext/boost/detail/sp_counted_base_nt.hpp +107 -0
  295. data/ext/boost/detail/sp_counted_base_pt.hpp +135 -0
  296. data/ext/boost/detail/sp_counted_base_solaris.hpp +113 -0
  297. data/ext/boost/detail/sp_counted_base_sync.hpp +151 -0
  298. data/ext/boost/detail/sp_counted_base_w32.hpp +130 -0
  299. data/ext/boost/detail/sp_counted_impl.hpp +231 -0
  300. data/ext/boost/detail/sp_typeinfo.hpp +83 -0
  301. data/ext/boost/detail/workaround.hpp +202 -0
  302. data/ext/boost/enable_shared_from_this.hpp +73 -0
  303. data/ext/boost/function.hpp +66 -0
  304. data/ext/boost/function/detail/function_iterate.hpp +16 -0
  305. data/ext/boost/function/detail/maybe_include.hpp +267 -0
  306. data/ext/boost/function/detail/prologue.hpp +25 -0
  307. data/ext/boost/function/function_base.hpp +762 -0
  308. data/ext/boost/function/function_template.hpp +969 -0
  309. data/ext/boost/function_equal.hpp +28 -0
  310. data/ext/boost/get_pointer.hpp +29 -0
  311. data/ext/boost/implicit_cast.hpp +29 -0
  312. data/ext/boost/integer_traits.hpp +236 -0
  313. data/ext/boost/io/ios_state.hpp +431 -0
  314. data/ext/boost/io_fwd.hpp +67 -0
  315. data/ext/boost/is_placeholder.hpp +31 -0
  316. data/ext/boost/iterator.hpp +59 -0
  317. data/ext/boost/iterator/detail/config_def.hpp +135 -0
  318. data/ext/boost/iterator/detail/config_undef.hpp +25 -0
  319. data/ext/boost/iterator/detail/enable_if.hpp +86 -0
  320. data/ext/boost/iterator/detail/facade_iterator_category.hpp +200 -0
  321. data/ext/boost/iterator/detail/minimum_category.hpp +116 -0
  322. data/ext/boost/iterator/interoperable.hpp +50 -0
  323. data/ext/boost/iterator/iterator_adaptor.hpp +366 -0
  324. data/ext/boost/iterator/iterator_categories.hpp +188 -0
  325. data/ext/boost/iterator/iterator_facade.hpp +879 -0
  326. data/ext/boost/iterator/iterator_traits.hpp +92 -0
  327. data/ext/boost/iterator/reverse_iterator.hpp +69 -0
  328. data/ext/boost/iterator/transform_iterator.hpp +188 -0
  329. data/ext/boost/lexical_cast.hpp +1205 -0
  330. data/ext/boost/limits.hpp +146 -0
  331. data/ext/boost/mem_fn.hpp +389 -0
  332. data/ext/boost/mpl/always.hpp +39 -0
  333. data/ext/boost/mpl/and.hpp +60 -0
  334. data/ext/boost/mpl/apply.hpp +229 -0
  335. data/ext/boost/mpl/apply_fwd.hpp +107 -0
  336. data/ext/boost/mpl/apply_wrap.hpp +203 -0
  337. data/ext/boost/mpl/arg.hpp +131 -0
  338. data/ext/boost/mpl/arg_fwd.hpp +28 -0
  339. data/ext/boost/mpl/assert.hpp +370 -0
  340. data/ext/boost/mpl/aux_/adl_barrier.hpp +48 -0
  341. data/ext/boost/mpl/aux_/arg_typedef.hpp +31 -0
  342. data/ext/boost/mpl/aux_/arity.hpp +39 -0
  343. data/ext/boost/mpl/aux_/arity_spec.hpp +67 -0
  344. data/ext/boost/mpl/aux_/common_name_wknd.hpp +34 -0
  345. data/ext/boost/mpl/aux_/config/adl.hpp +40 -0
  346. data/ext/boost/mpl/aux_/config/arrays.hpp +30 -0
  347. data/ext/boost/mpl/aux_/config/bind.hpp +33 -0
  348. data/ext/boost/mpl/aux_/config/compiler.hpp +64 -0
  349. data/ext/boost/mpl/aux_/config/ctps.hpp +30 -0
  350. data/ext/boost/mpl/aux_/config/dtp.hpp +46 -0
  351. data/ext/boost/mpl/aux_/config/eti.hpp +47 -0
  352. data/ext/boost/mpl/aux_/config/gcc.hpp +23 -0
  353. data/ext/boost/mpl/aux_/config/has_apply.hpp +32 -0
  354. data/ext/boost/mpl/aux_/config/has_xxx.hpp +33 -0
  355. data/ext/boost/mpl/aux_/config/integral.hpp +38 -0
  356. data/ext/boost/mpl/aux_/config/intel.hpp +21 -0
  357. data/ext/boost/mpl/aux_/config/lambda.hpp +32 -0
  358. data/ext/boost/mpl/aux_/config/msvc.hpp +21 -0
  359. data/ext/boost/mpl/aux_/config/msvc_typename.hpp +26 -0
  360. data/ext/boost/mpl/aux_/config/nttp.hpp +41 -0
  361. data/ext/boost/mpl/aux_/config/overload_resolution.hpp +29 -0
  362. data/ext/boost/mpl/aux_/config/pp_counter.hpp +26 -0
  363. data/ext/boost/mpl/aux_/config/preprocessor.hpp +39 -0
  364. data/ext/boost/mpl/aux_/config/static_constant.hpp +25 -0
  365. data/ext/boost/mpl/aux_/config/ttp.hpp +41 -0
  366. data/ext/boost/mpl/aux_/config/use_preprocessed.hpp +19 -0
  367. data/ext/boost/mpl/aux_/config/workaround.hpp +19 -0
  368. data/ext/boost/mpl/aux_/full_lambda.hpp +354 -0
  369. data/ext/boost/mpl/aux_/has_apply.hpp +32 -0
  370. data/ext/boost/mpl/aux_/has_type.hpp +23 -0
  371. data/ext/boost/mpl/aux_/include_preprocessed.hpp +42 -0
  372. data/ext/boost/mpl/aux_/integral_wrapper.hpp +93 -0
  373. data/ext/boost/mpl/aux_/lambda_arity_param.hpp +25 -0
  374. data/ext/boost/mpl/aux_/lambda_support.hpp +169 -0
  375. data/ext/boost/mpl/aux_/msvc_never_true.hpp +34 -0
  376. data/ext/boost/mpl/aux_/na.hpp +95 -0
  377. data/ext/boost/mpl/aux_/na_assert.hpp +34 -0
  378. data/ext/boost/mpl/aux_/na_fwd.hpp +31 -0
  379. data/ext/boost/mpl/aux_/na_spec.hpp +175 -0
  380. data/ext/boost/mpl/aux_/nested_type_wknd.hpp +48 -0
  381. data/ext/boost/mpl/aux_/nttp_decl.hpp +35 -0
  382. data/ext/boost/mpl/aux_/preprocessed/gcc/and.hpp +69 -0
  383. data/ext/boost/mpl/aux_/preprocessed/gcc/apply.hpp +169 -0
  384. data/ext/boost/mpl/aux_/preprocessed/gcc/apply_fwd.hpp +52 -0
  385. data/ext/boost/mpl/aux_/preprocessed/gcc/apply_wrap.hpp +84 -0
  386. data/ext/boost/mpl/aux_/preprocessed/gcc/arg.hpp +123 -0
  387. data/ext/boost/mpl/aux_/preprocessed/gcc/bind.hpp +561 -0
  388. data/ext/boost/mpl/aux_/preprocessed/gcc/bind_fwd.hpp +52 -0
  389. data/ext/boost/mpl/aux_/preprocessed/gcc/full_lambda.hpp +558 -0
  390. data/ext/boost/mpl/aux_/preprocessed/gcc/or.hpp +69 -0
  391. data/ext/boost/mpl/aux_/preprocessed/gcc/placeholders.hpp +105 -0
  392. data/ext/boost/mpl/aux_/preprocessed/gcc/quote.hpp +123 -0
  393. data/ext/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp +101 -0
  394. data/ext/boost/mpl/aux_/preprocessor/def_params_tail.hpp +105 -0
  395. data/ext/boost/mpl/aux_/preprocessor/enum.hpp +62 -0
  396. data/ext/boost/mpl/aux_/preprocessor/filter_params.hpp +28 -0
  397. data/ext/boost/mpl/aux_/preprocessor/params.hpp +65 -0
  398. data/ext/boost/mpl/aux_/preprocessor/sub.hpp +65 -0
  399. data/ext/boost/mpl/aux_/static_cast.hpp +27 -0
  400. data/ext/boost/mpl/aux_/template_arity.hpp +189 -0
  401. data/ext/boost/mpl/aux_/template_arity_fwd.hpp +23 -0
  402. data/ext/boost/mpl/aux_/type_wrapper.hpp +47 -0
  403. data/ext/boost/mpl/aux_/value_wknd.hpp +89 -0
  404. data/ext/boost/mpl/aux_/yes_no.hpp +58 -0
  405. data/ext/boost/mpl/bind.hpp +551 -0
  406. data/ext/boost/mpl/bind_fwd.hpp +99 -0
  407. data/ext/boost/mpl/bool.hpp +39 -0
  408. data/ext/boost/mpl/bool_fwd.hpp +33 -0
  409. data/ext/boost/mpl/eval_if.hpp +71 -0
  410. data/ext/boost/mpl/has_xxx.hpp +272 -0
  411. data/ext/boost/mpl/identity.hpp +45 -0
  412. data/ext/boost/mpl/if.hpp +135 -0
  413. data/ext/boost/mpl/int.hpp +22 -0
  414. data/ext/boost/mpl/int_fwd.hpp +27 -0
  415. data/ext/boost/mpl/integral_c.hpp +51 -0
  416. data/ext/boost/mpl/integral_c_fwd.hpp +32 -0
  417. data/ext/boost/mpl/integral_c_tag.hpp +26 -0
  418. data/ext/boost/mpl/lambda.hpp +29 -0
  419. data/ext/boost/mpl/lambda_fwd.hpp +57 -0
  420. data/ext/boost/mpl/limits/arity.hpp +21 -0
  421. data/ext/boost/mpl/logical.hpp +21 -0
  422. data/ext/boost/mpl/next.hpp +19 -0
  423. data/ext/boost/mpl/next_prior.hpp +49 -0
  424. data/ext/boost/mpl/not.hpp +51 -0
  425. data/ext/boost/mpl/or.hpp +61 -0
  426. data/ext/boost/mpl/placeholders.hpp +100 -0
  427. data/ext/boost/mpl/protect.hpp +55 -0
  428. data/ext/boost/mpl/quote.hpp +140 -0
  429. data/ext/boost/mpl/size_t.hpp +25 -0
  430. data/ext/boost/mpl/size_t_fwd.hpp +28 -0
  431. data/ext/boost/mpl/void.hpp +76 -0
  432. data/ext/boost/mpl/void_fwd.hpp +26 -0
  433. data/ext/boost/next_prior.hpp +51 -0
  434. data/ext/boost/non_type.hpp +27 -0
  435. data/ext/boost/noncopyable.hpp +36 -0
  436. data/ext/boost/none.hpp +28 -0
  437. data/ext/boost/none_t.hpp +24 -0
  438. data/ext/boost/operators.hpp +943 -0
  439. data/ext/boost/optional.hpp +18 -0
  440. data/ext/boost/optional/optional.hpp +922 -0
  441. data/ext/boost/optional/optional_fwd.hpp +22 -0
  442. data/ext/boost/preprocessor/arithmetic/add.hpp +51 -0
  443. data/ext/boost/preprocessor/arithmetic/dec.hpp +288 -0
  444. data/ext/boost/preprocessor/arithmetic/inc.hpp +288 -0
  445. data/ext/boost/preprocessor/arithmetic/sub.hpp +50 -0
  446. data/ext/boost/preprocessor/array/data.hpp +28 -0
  447. data/ext/boost/preprocessor/array/elem.hpp +29 -0
  448. data/ext/boost/preprocessor/array/size.hpp +28 -0
  449. data/ext/boost/preprocessor/cat.hpp +35 -0
  450. data/ext/boost/preprocessor/comma_if.hpp +17 -0
  451. data/ext/boost/preprocessor/config/config.hpp +70 -0
  452. data/ext/boost/preprocessor/control/detail/while.hpp +536 -0
  453. data/ext/boost/preprocessor/control/expr_iif.hpp +31 -0
  454. data/ext/boost/preprocessor/control/if.hpp +30 -0
  455. data/ext/boost/preprocessor/control/iif.hpp +34 -0
  456. data/ext/boost/preprocessor/control/while.hpp +312 -0
  457. data/ext/boost/preprocessor/debug/error.hpp +33 -0
  458. data/ext/boost/preprocessor/detail/auto_rec.hpp +293 -0
  459. data/ext/boost/preprocessor/detail/check.hpp +48 -0
  460. data/ext/boost/preprocessor/detail/is_binary.hpp +30 -0
  461. data/ext/boost/preprocessor/empty.hpp +17 -0
  462. data/ext/boost/preprocessor/enum.hpp +17 -0
  463. data/ext/boost/preprocessor/enum_params.hpp +17 -0
  464. data/ext/boost/preprocessor/facilities/empty.hpp +21 -0
  465. data/ext/boost/preprocessor/facilities/identity.hpp +23 -0
  466. data/ext/boost/preprocessor/identity.hpp +17 -0
  467. data/ext/boost/preprocessor/inc.hpp +17 -0
  468. data/ext/boost/preprocessor/iterate.hpp +17 -0
  469. data/ext/boost/preprocessor/iteration/detail/bounds/lower1.hpp +99 -0
  470. data/ext/boost/preprocessor/iteration/detail/bounds/upper1.hpp +99 -0
  471. data/ext/boost/preprocessor/iteration/detail/iter/forward1.hpp +1342 -0
  472. data/ext/boost/preprocessor/iteration/iterate.hpp +82 -0
  473. data/ext/boost/preprocessor/list/adt.hpp +73 -0
  474. data/ext/boost/preprocessor/list/append.hpp +40 -0
  475. data/ext/boost/preprocessor/list/detail/fold_left.hpp +279 -0
  476. data/ext/boost/preprocessor/list/detail/fold_right.hpp +277 -0
  477. data/ext/boost/preprocessor/list/fold_left.hpp +303 -0
  478. data/ext/boost/preprocessor/list/fold_right.hpp +40 -0
  479. data/ext/boost/preprocessor/list/for_each_i.hpp +65 -0
  480. data/ext/boost/preprocessor/list/reverse.hpp +40 -0
  481. data/ext/boost/preprocessor/list/transform.hpp +49 -0
  482. data/ext/boost/preprocessor/logical/and.hpp +30 -0
  483. data/ext/boost/preprocessor/logical/bitand.hpp +38 -0
  484. data/ext/boost/preprocessor/logical/bool.hpp +288 -0
  485. data/ext/boost/preprocessor/logical/compl.hpp +36 -0
  486. data/ext/boost/preprocessor/punctuation/comma.hpp +21 -0
  487. data/ext/boost/preprocessor/punctuation/comma_if.hpp +31 -0
  488. data/ext/boost/preprocessor/repeat.hpp +17 -0
  489. data/ext/boost/preprocessor/repetition/detail/for.hpp +536 -0
  490. data/ext/boost/preprocessor/repetition/enum.hpp +66 -0
  491. data/ext/boost/preprocessor/repetition/enum_binary_params.hpp +54 -0
  492. data/ext/boost/preprocessor/repetition/enum_params.hpp +41 -0
  493. data/ext/boost/preprocessor/repetition/for.hpp +306 -0
  494. data/ext/boost/preprocessor/repetition/repeat.hpp +825 -0
  495. data/ext/boost/preprocessor/repetition/repeat_from_to.hpp +87 -0
  496. data/ext/boost/preprocessor/seq/elem.hpp +304 -0
  497. data/ext/boost/preprocessor/seq/enum.hpp +288 -0
  498. data/ext/boost/preprocessor/seq/for_each_i.hpp +61 -0
  499. data/ext/boost/preprocessor/seq/seq.hpp +44 -0
  500. data/ext/boost/preprocessor/seq/size.hpp +548 -0
  501. data/ext/boost/preprocessor/slot/detail/def.hpp +49 -0
  502. data/ext/boost/preprocessor/slot/detail/shared.hpp +247 -0
  503. data/ext/boost/preprocessor/slot/slot.hpp +32 -0
  504. data/ext/boost/preprocessor/stringize.hpp +33 -0
  505. data/ext/boost/preprocessor/tuple/eat.hpp +57 -0
  506. data/ext/boost/preprocessor/tuple/elem.hpp +385 -0
  507. data/ext/boost/preprocessor/tuple/rem.hpp +72 -0
  508. data/ext/boost/preprocessor/tuple/to_list.hpp +62 -0
  509. data/ext/boost/range/as_literal.hpp +131 -0
  510. data/ext/boost/range/begin.hpp +132 -0
  511. data/ext/boost/range/config.hpp +54 -0
  512. data/ext/boost/range/const_iterator.hpp +64 -0
  513. data/ext/boost/range/detail/common.hpp +117 -0
  514. data/ext/boost/range/detail/implementation_help.hpp +99 -0
  515. data/ext/boost/range/detail/sfinae.hpp +77 -0
  516. data/ext/boost/range/detail/str_types.hpp +38 -0
  517. data/ext/boost/range/difference_type.hpp +29 -0
  518. data/ext/boost/range/distance.hpp +34 -0
  519. data/ext/boost/range/empty.hpp +34 -0
  520. data/ext/boost/range/end.hpp +131 -0
  521. data/ext/boost/range/functions.hpp +27 -0
  522. data/ext/boost/range/iterator.hpp +72 -0
  523. data/ext/boost/range/iterator_range.hpp +643 -0
  524. data/ext/boost/range/mutable_iterator.hpp +64 -0
  525. data/ext/boost/range/rbegin.hpp +65 -0
  526. data/ext/boost/range/rend.hpp +65 -0
  527. data/ext/boost/range/reverse_iterator.hpp +40 -0
  528. data/ext/boost/range/size.hpp +36 -0
  529. data/ext/boost/range/size_type.hpp +78 -0
  530. data/ext/boost/range/value_type.hpp +34 -0
  531. data/ext/boost/ref.hpp +178 -0
  532. data/ext/boost/shared_ptr.hpp +619 -0
  533. data/ext/boost/src/pthread/exceptions.cpp +146 -0
  534. data/ext/boost/src/pthread/once.cpp +51 -0
  535. data/ext/boost/src/pthread/thread.cpp +709 -0
  536. data/ext/boost/src/pthread/timeconv.inl +130 -0
  537. data/ext/boost/src/tss_null.cpp +34 -0
  538. data/ext/boost/src/win32/exceptions.cpp +124 -0
  539. data/ext/boost/src/win32/thread.cpp +629 -0
  540. data/ext/boost/src/win32/timeconv.inl +130 -0
  541. data/ext/boost/src/win32/tss_dll.cpp +72 -0
  542. data/ext/boost/src/win32/tss_pe.cpp +269 -0
  543. data/ext/boost/static_assert.hpp +122 -0
  544. data/ext/boost/thread.hpp +21 -0
  545. data/ext/boost/thread/condition.hpp +16 -0
  546. data/ext/boost/thread/condition_variable.hpp +21 -0
  547. data/ext/boost/thread/detail/config.hpp +94 -0
  548. data/ext/boost/thread/detail/move.hpp +33 -0
  549. data/ext/boost/thread/detail/platform.hpp +71 -0
  550. data/ext/boost/thread/exceptions.hpp +109 -0
  551. data/ext/boost/thread/locks.hpp +589 -0
  552. data/ext/boost/thread/mutex.hpp +21 -0
  553. data/ext/boost/thread/once.hpp +29 -0
  554. data/ext/boost/thread/pthread/condition_variable.hpp +184 -0
  555. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +66 -0
  556. data/ext/boost/thread/pthread/mutex.hpp +211 -0
  557. data/ext/boost/thread/pthread/once.hpp +85 -0
  558. data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +50 -0
  559. data/ext/boost/thread/pthread/recursive_mutex.hpp +249 -0
  560. data/ext/boost/thread/pthread/thread.hpp +339 -0
  561. data/ext/boost/thread/pthread/thread_data.hpp +102 -0
  562. data/ext/boost/thread/pthread/timespec.hpp +28 -0
  563. data/ext/boost/thread/pthread/tss.hpp +103 -0
  564. data/ext/boost/thread/recursive_mutex.hpp +21 -0
  565. data/ext/boost/thread/thread.hpp +22 -0
  566. data/ext/boost/thread/thread_time.hpp +46 -0
  567. data/ext/boost/thread/tss.hpp +18 -0
  568. data/ext/boost/thread/xtime.hpp +88 -0
  569. data/ext/boost/throw_exception.hpp +46 -0
  570. data/ext/boost/token_functions.hpp +621 -0
  571. data/ext/boost/token_iterator.hpp +128 -0
  572. data/ext/boost/tokenizer.hpp +98 -0
  573. data/ext/boost/type.hpp +18 -0
  574. data/ext/boost/type_traits/add_const.hpp +47 -0
  575. data/ext/boost/type_traits/add_pointer.hpp +72 -0
  576. data/ext/boost/type_traits/add_reference.hpp +89 -0
  577. data/ext/boost/type_traits/alignment_of.hpp +100 -0
  578. data/ext/boost/type_traits/broken_compiler_spec.hpp +117 -0
  579. data/ext/boost/type_traits/composite_traits.hpp +29 -0
  580. data/ext/boost/type_traits/config.hpp +76 -0
  581. data/ext/boost/type_traits/conversion_traits.hpp +17 -0
  582. data/ext/boost/type_traits/detail/bool_trait_def.hpp +173 -0
  583. data/ext/boost/type_traits/detail/bool_trait_undef.hpp +27 -0
  584. data/ext/boost/type_traits/detail/cv_traits_impl.hpp +97 -0
  585. data/ext/boost/type_traits/detail/false_result.hpp +28 -0
  586. data/ext/boost/type_traits/detail/ice_and.hpp +35 -0
  587. data/ext/boost/type_traits/detail/ice_eq.hpp +36 -0
  588. data/ext/boost/type_traits/detail/ice_not.hpp +31 -0
  589. data/ext/boost/type_traits/detail/ice_or.hpp +34 -0
  590. data/ext/boost/type_traits/detail/is_function_ptr_helper.hpp +220 -0
  591. data/ext/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp +817 -0
  592. data/ext/boost/type_traits/detail/size_t_trait_def.hpp +58 -0
  593. data/ext/boost/type_traits/detail/size_t_trait_undef.hpp +16 -0
  594. data/ext/boost/type_traits/detail/template_arity_spec.hpp +31 -0
  595. data/ext/boost/type_traits/detail/type_trait_def.hpp +61 -0
  596. data/ext/boost/type_traits/detail/type_trait_undef.hpp +19 -0
  597. data/ext/boost/type_traits/detail/yes_no_type.hpp +26 -0
  598. data/ext/boost/type_traits/function_traits.hpp +236 -0
  599. data/ext/boost/type_traits/has_nothrow_copy.hpp +39 -0
  600. data/ext/boost/type_traits/has_trivial_copy.hpp +49 -0
  601. data/ext/boost/type_traits/ice.hpp +20 -0
  602. data/ext/boost/type_traits/integral_constant.hpp +53 -0
  603. data/ext/boost/type_traits/intrinsics.hpp +153 -0
  604. data/ext/boost/type_traits/is_abstract.hpp +144 -0
  605. data/ext/boost/type_traits/is_arithmetic.hpp +43 -0
  606. data/ext/boost/type_traits/is_array.hpp +90 -0
  607. data/ext/boost/type_traits/is_class.hpp +128 -0
  608. data/ext/boost/type_traits/is_const.hpp +142 -0
  609. data/ext/boost/type_traits/is_convertible.hpp +418 -0
  610. data/ext/boost/type_traits/is_enum.hpp +180 -0
  611. data/ext/boost/type_traits/is_float.hpp +27 -0
  612. data/ext/boost/type_traits/is_function.hpp +95 -0
  613. data/ext/boost/type_traits/is_integral.hpp +73 -0
  614. data/ext/boost/type_traits/is_member_function_pointer.hpp +134 -0
  615. data/ext/boost/type_traits/is_member_pointer.hpp +114 -0
  616. data/ext/boost/type_traits/is_pod.hpp +135 -0
  617. data/ext/boost/type_traits/is_pointer.hpp +160 -0
  618. data/ext/boost/type_traits/is_reference.hpp +116 -0
  619. data/ext/boost/type_traits/is_same.hpp +103 -0
  620. data/ext/boost/type_traits/is_scalar.hpp +55 -0
  621. data/ext/boost/type_traits/is_union.hpp +49 -0
  622. data/ext/boost/type_traits/is_void.hpp +33 -0
  623. data/ext/boost/type_traits/is_volatile.hpp +131 -0
  624. data/ext/boost/type_traits/remove_const.hpp +78 -0
  625. data/ext/boost/type_traits/remove_cv.hpp +61 -0
  626. data/ext/boost/type_traits/remove_pointer.hpp +43 -0
  627. data/ext/boost/type_traits/remove_reference.hpp +50 -0
  628. data/ext/boost/type_traits/type_with_alignment.hpp +288 -0
  629. data/ext/boost/utility.hpp +19 -0
  630. data/ext/boost/utility/addressof.hpp +58 -0
  631. data/ext/boost/utility/base_from_member.hpp +87 -0
  632. data/ext/boost/utility/compare_pointees.hpp +68 -0
  633. data/ext/boost/utility/enable_if.hpp +119 -0
  634. data/ext/boost/visit_each.hpp +29 -0
  635. data/ext/boost/weak_ptr.hpp +188 -0
  636. data/ext/common/Application.h +511 -0
  637. data/ext/common/ApplicationPool.h +205 -0
  638. data/ext/common/ApplicationPoolServer.h +794 -0
  639. data/ext/common/ApplicationPoolServerExecutable.cpp +743 -0
  640. data/ext/common/ApplicationPoolStatusReporter.h +336 -0
  641. data/ext/common/Base64.cpp +143 -0
  642. data/ext/common/Base64.h +57 -0
  643. data/ext/common/CachedFileStat.cpp +62 -0
  644. data/ext/common/CachedFileStat.h +51 -0
  645. data/ext/common/CachedFileStat.hpp +243 -0
  646. data/ext/common/DummySpawnManager.h +108 -0
  647. data/ext/common/Exceptions.h +258 -0
  648. data/ext/common/FileChangeChecker.h +209 -0
  649. data/ext/common/Logging.cpp +65 -0
  650. data/ext/common/Logging.h +123 -0
  651. data/ext/common/MessageChannel.h +615 -0
  652. data/ext/common/PoolOptions.h +355 -0
  653. data/ext/common/SpawnManager.h +561 -0
  654. data/ext/common/StandardApplicationPool.h +821 -0
  655. data/ext/common/StaticString.h +148 -0
  656. data/ext/common/StringListCreator.h +83 -0
  657. data/ext/common/SystemTime.cpp +33 -0
  658. data/ext/common/SystemTime.h +88 -0
  659. data/ext/common/Timer.h +90 -0
  660. data/ext/common/Utils.cpp +681 -0
  661. data/ext/common/Utils.h +497 -0
  662. data/ext/common/Version.h +31 -0
  663. data/ext/nginx/Configuration.c +1098 -0
  664. data/ext/nginx/Configuration.h +71 -0
  665. data/ext/nginx/ContentHandler.c +1225 -0
  666. data/ext/nginx/ContentHandler.h +64 -0
  667. data/ext/nginx/HelperServer.cpp +850 -0
  668. data/ext/nginx/HttpStatusExtractor.h +350 -0
  669. data/ext/nginx/ScgiRequestParser.h +317 -0
  670. data/ext/nginx/StaticContentHandler.c +257 -0
  671. data/ext/nginx/StaticContentHandler.h +37 -0
  672. data/ext/nginx/config +45 -0
  673. data/ext/nginx/ngx_http_passenger_module.c +653 -0
  674. data/ext/nginx/ngx_http_passenger_module.h +72 -0
  675. data/ext/oxt/backtrace.cpp +177 -0
  676. data/ext/oxt/backtrace.hpp +135 -0
  677. data/ext/oxt/detail/backtrace_disabled.hpp +39 -0
  678. data/ext/oxt/detail/backtrace_enabled.hpp +155 -0
  679. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +82 -0
  680. data/ext/oxt/detail/spin_lock_portable.hpp +38 -0
  681. data/ext/oxt/detail/spin_lock_pthreads.hpp +97 -0
  682. data/ext/oxt/detail/tracable_exception_disabled.hpp +46 -0
  683. data/ext/oxt/detail/tracable_exception_enabled.hpp +48 -0
  684. data/ext/oxt/macros.hpp +58 -0
  685. data/ext/oxt/spin_lock.hpp +55 -0
  686. data/ext/oxt/system_calls.cpp +351 -0
  687. data/ext/oxt/system_calls.hpp +244 -0
  688. data/ext/oxt/thread.cpp +32 -0
  689. data/ext/oxt/thread.hpp +335 -0
  690. data/ext/oxt/tracable_exception.cpp +87 -0
  691. data/ext/oxt/tracable_exception.hpp +35 -0
  692. data/ext/phusion_passenger/extconf.rb +36 -0
  693. data/ext/phusion_passenger/native_support.c +308 -0
  694. data/lib/jeweler_spec.rb +86 -0
  695. data/lib/phusion_passenger/abstract_installer.rb +196 -0
  696. data/lib/phusion_passenger/abstract_request_handler.rb +475 -0
  697. data/lib/phusion_passenger/abstract_server.rb +369 -0
  698. data/lib/phusion_passenger/abstract_server_collection.rb +306 -0
  699. data/lib/phusion_passenger/admin_tools.rb +48 -0
  700. data/lib/phusion_passenger/admin_tools/control_process.rb +150 -0
  701. data/lib/phusion_passenger/application.rb +113 -0
  702. data/lib/phusion_passenger/console_text_template.rb +66 -0
  703. data/lib/phusion_passenger/constants.rb +31 -0
  704. data/lib/phusion_passenger/dependencies.rb +425 -0
  705. data/lib/phusion_passenger/events.rb +50 -0
  706. data/lib/phusion_passenger/exceptions.rb +103 -0
  707. data/lib/phusion_passenger/html_template.rb +109 -0
  708. data/lib/phusion_passenger/message_channel.rb +229 -0
  709. data/lib/phusion_passenger/packaging.rb +39 -0
  710. data/lib/phusion_passenger/platform_info.rb +550 -0
  711. data/lib/phusion_passenger/rack/application_spawner.rb +146 -0
  712. data/lib/phusion_passenger/rack/request_handler.rb +122 -0
  713. data/lib/phusion_passenger/railz/application_spawner.rb +412 -0
  714. data/lib/phusion_passenger/railz/cgi_fixed.rb +68 -0
  715. data/lib/phusion_passenger/railz/framework_spawner.rb +334 -0
  716. data/lib/phusion_passenger/railz/request_handler.rb +73 -0
  717. data/lib/phusion_passenger/simple_benchmarking.rb +52 -0
  718. data/lib/phusion_passenger/spawn_manager.rb +372 -0
  719. data/lib/phusion_passenger/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +9 -0
  720. data/lib/phusion_passenger/templates/apache2/config_snippets.txt.erb +13 -0
  721. data/lib/phusion_passenger/templates/apache2/deployment_example.txt.erb +23 -0
  722. data/lib/phusion_passenger/templates/apache2/no_write_permission_to_passenger_root.txt.erb +9 -0
  723. data/lib/phusion_passenger/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +11 -0
  724. data/lib/phusion_passenger/templates/apache2/run_installer_as_root.txt.erb +8 -0
  725. data/lib/phusion_passenger/templates/apache2/welcome.txt.erb +15 -0
  726. data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +14 -0
  727. data/lib/phusion_passenger/templates/app_init_error.html.erb +46 -0
  728. data/lib/phusion_passenger/templates/database_error.html.erb +24 -0
  729. data/lib/phusion_passenger/templates/error_layout.css +97 -0
  730. data/lib/phusion_passenger/templates/error_layout.html.erb +39 -0
  731. data/lib/phusion_passenger/templates/framework_init_error.html.erb +10 -0
  732. data/lib/phusion_passenger/templates/general_error.html.erb +8 -0
  733. data/lib/phusion_passenger/templates/invalid_app_root.html.erb +9 -0
  734. data/lib/phusion_passenger/templates/load_error.html.erb +6 -0
  735. data/lib/phusion_passenger/templates/nginx/ask_for_extra_configure_flags.txt.erb +8 -0
  736. data/lib/phusion_passenger/templates/nginx/cannot_write_to_dir.txt.erb +11 -0
  737. data/lib/phusion_passenger/templates/nginx/config_snippets.txt.erb +17 -0
  738. data/lib/phusion_passenger/templates/nginx/config_snippets_inserted.txt.erb +20 -0
  739. data/lib/phusion_passenger/templates/nginx/confirm_extra_configure_flags.txt.erb +5 -0
  740. data/lib/phusion_passenger/templates/nginx/deployment_example.txt.erb +22 -0
  741. data/lib/phusion_passenger/templates/nginx/pcre_could_not_be_downloaded.txt.erb +11 -0
  742. data/lib/phusion_passenger/templates/nginx/pcre_could_not_be_extracted.txt.erb +11 -0
  743. data/lib/phusion_passenger/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +11 -0
  744. data/lib/phusion_passenger/templates/nginx/possible_solutions_for_download_and_extraction_problems.txt.erb +20 -0
  745. data/lib/phusion_passenger/templates/nginx/query_download_and_install.txt.erb +21 -0
  746. data/lib/phusion_passenger/templates/nginx/run_installer_as_root.txt.erb +8 -0
  747. data/lib/phusion_passenger/templates/nginx/welcome.txt.erb +15 -0
  748. data/lib/phusion_passenger/templates/version_not_found.html.erb +6 -0
  749. data/lib/phusion_passenger/utils.rb +611 -0
  750. data/lib/phusion_passenger/utils/rewindable_input.rb +116 -0
  751. data/lib/phusion_passenger/wsgi/application_spawner.rb +104 -0
  752. data/lib/phusion_passenger/wsgi/request_handler.py +199 -0
  753. data/man/passenger-config.1 +29 -0
  754. data/man/passenger-make-enterprisey.8 +23 -0
  755. data/man/passenger-memory-stats.8 +33 -0
  756. data/man/passenger-status.8 +43 -0
  757. data/man/passenger-stress-test.1 +43 -0
  758. data/misc/copy_boost_headers.rb +125 -0
  759. data/misc/find_owner_pipe_leaks.rb +128 -0
  760. data/misc/rake/cplusplus.rb +57 -0
  761. data/misc/rake/extensions.rb +182 -0
  762. data/misc/rake/gempackagetask.rb +99 -0
  763. data/misc/rake/packagetask.rb +186 -0
  764. data/misc/rake/rdoctask.rb +209 -0
  765. data/misc/render_error_pages.rb +116 -0
  766. data/test/ApplicationPoolServerTest.cpp +114 -0
  767. data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +33 -0
  768. data/test/ApplicationPoolTest.cpp +599 -0
  769. data/test/Base64Test.cpp +48 -0
  770. data/test/CachedFileStatTest.cpp +402 -0
  771. data/test/CxxTestMain.cpp +143 -0
  772. data/test/FileChangeCheckerTest.cpp +331 -0
  773. data/test/HttpStatusExtractorTest.cpp +198 -0
  774. data/test/MessageChannelTest.cpp +312 -0
  775. data/test/PoolOptionsTest.cpp +117 -0
  776. data/test/ScgiRequestParserTest.cpp +337 -0
  777. data/test/SpawnManagerTest.cpp +64 -0
  778. data/test/StandardApplicationPoolTest.cpp +27 -0
  779. data/test/StaticStringTest.cpp +51 -0
  780. data/test/SystemTimeTest.cpp +37 -0
  781. data/test/UtilsTest.cpp +257 -0
  782. data/test/config.yml.example +30 -0
  783. data/test/integration_tests/apache2_tests.rb +595 -0
  784. data/test/integration_tests/hello_world_rack_spec.rb +36 -0
  785. data/test/integration_tests/hello_world_wsgi_spec.rb +41 -0
  786. data/test/integration_tests/mycook_spec.rb +192 -0
  787. data/test/integration_tests/nginx_tests.rb +151 -0
  788. data/test/oxt/backtrace_test.cpp +128 -0
  789. data/test/oxt/oxt_test_main.cpp +25 -0
  790. data/test/oxt/syscall_interruption_test.cpp +38 -0
  791. data/test/ruby/abstract_request_handler_spec.rb +85 -0
  792. data/test/ruby/abstract_server_collection_spec.rb +246 -0
  793. data/test/ruby/abstract_server_spec.rb +51 -0
  794. data/test/ruby/application_spec.rb +43 -0
  795. data/test/ruby/message_channel_spec.rb +170 -0
  796. data/test/ruby/rack/application_spawner_spec.rb +99 -0
  797. data/test/ruby/rails/application_spawner_spec.rb +159 -0
  798. data/test/ruby/rails/framework_spawner_spec.rb +133 -0
  799. data/test/ruby/rails/minimal_spawner_spec.rb +93 -0
  800. data/test/ruby/rails/spawner_error_handling_spec.rb +107 -0
  801. data/test/ruby/rails/spawner_privilege_lowering_spec.rb +97 -0
  802. data/test/ruby/spawn_manager_spec.rb +205 -0
  803. data/test/ruby/spawn_server_spec.rb +26 -0
  804. data/test/ruby/utils_spec.rb +335 -0
  805. data/test/ruby/wsgi/application_spawner_spec.rb +54 -0
  806. data/test/stub/apache2/httpd.conf.erb +81 -0
  807. data/test/stub/apache2/mime.types +748 -0
  808. data/test/stub/garbage1.dat +0 -0
  809. data/test/stub/garbage2.dat +0 -0
  810. data/test/stub/garbage3.dat +0 -0
  811. data/test/stub/http_request.yml +23 -0
  812. data/test/stub/message_channel.rb +9 -0
  813. data/test/stub/message_channel_2.rb +10 -0
  814. data/test/stub/message_channel_3.rb +17 -0
  815. data/test/stub/nginx/koi-utf +109 -0
  816. data/test/stub/nginx/koi-win +103 -0
  817. data/test/stub/nginx/mime.types +70 -0
  818. data/test/stub/nginx/nginx.conf.erb +57 -0
  819. data/test/stub/nginx/win-utf +126 -0
  820. data/test/stub/rack/config.ru +4 -0
  821. data/test/stub/rack/public/rack.jpg +0 -0
  822. data/test/stub/rails_apps/foobar/app/controllers/application.rb +12 -0
  823. data/test/stub/rails_apps/foobar/app/controllers/bar_controller_1.rb +5 -0
  824. data/test/stub/rails_apps/foobar/app/controllers/bar_controller_2.rb +5 -0
  825. data/test/stub/rails_apps/foobar/app/controllers/foo_controller.rb +21 -0
  826. data/test/stub/rails_apps/foobar/app/helpers/application_helper.rb +3 -0
  827. data/test/stub/rails_apps/foobar/config/boot.rb +108 -0
  828. data/test/stub/rails_apps/foobar/config/database.yml +19 -0
  829. data/test/stub/rails_apps/foobar/config/environment.rb +59 -0
  830. data/test/stub/rails_apps/foobar/config/environments/development.rb +17 -0
  831. data/test/stub/rails_apps/foobar/config/environments/production.rb +18 -0
  832. data/test/stub/rails_apps/foobar/config/initializers/inflections.rb +10 -0
  833. data/test/stub/rails_apps/foobar/config/initializers/mime_types.rb +5 -0
  834. data/test/stub/rails_apps/foobar/config/routes.rb +35 -0
  835. data/test/stub/rails_apps/mycook/app/controllers/application.rb +12 -0
  836. data/test/stub/rails_apps/mycook/app/controllers/recipes_controller.rb +5 -0
  837. data/test/stub/rails_apps/mycook/app/controllers/uploads_controller.rb +15 -0
  838. data/test/stub/rails_apps/mycook/app/controllers/welcome_controller.rb +71 -0
  839. data/test/stub/rails_apps/mycook/app/helpers/application_helper.rb +3 -0
  840. data/test/stub/rails_apps/mycook/app/views/layouts/default.rhtml +26 -0
  841. data/test/stub/rails_apps/mycook/app/views/recipes/create.rhtml +13 -0
  842. data/test/stub/rails_apps/mycook/app/views/recipes/index.rhtml +3 -0
  843. data/test/stub/rails_apps/mycook/app/views/recipes/new.rhtml +8 -0
  844. data/test/stub/rails_apps/mycook/app/views/uploads/index.rhtml +1 -0
  845. data/test/stub/rails_apps/mycook/app/views/uploads/new.html.erb +8 -0
  846. data/test/stub/rails_apps/mycook/app/views/welcome/cached.rhtml +1 -0
  847. data/test/stub/rails_apps/mycook/app/views/welcome/index.rhtml +20 -0
  848. data/test/stub/rails_apps/mycook/config/boot.rb +108 -0
  849. data/test/stub/rails_apps/mycook/config/database.yml +19 -0
  850. data/test/stub/rails_apps/mycook/config/environment.rb +61 -0
  851. data/test/stub/rails_apps/mycook/config/environments/development.rb +18 -0
  852. data/test/stub/rails_apps/mycook/config/environments/production.rb +19 -0
  853. data/test/stub/rails_apps/mycook/config/initializers/inflections.rb +10 -0
  854. data/test/stub/rails_apps/mycook/config/initializers/mime_types.rb +5 -0
  855. data/test/stub/rails_apps/mycook/config/routes.rb +38 -0
  856. data/test/stub/rails_apps/mycook/log/useless.txt +1 -0
  857. data/test/stub/rails_apps/mycook/public/404.html +30 -0
  858. data/test/stub/rails_apps/mycook/public/422.html +30 -0
  859. data/test/stub/rails_apps/mycook/public/500.html +30 -0
  860. data/test/stub/rails_apps/mycook/public/dispatch.cgi +10 -0
  861. data/test/stub/rails_apps/mycook/public/dispatch.fcgi +24 -0
  862. data/test/stub/rails_apps/mycook/public/dispatch.rb +10 -0
  863. data/test/stub/rails_apps/mycook/public/favicon.ico +0 -0
  864. data/test/stub/rails_apps/mycook/public/images/angrywizard.gif +0 -0
  865. data/test/stub/rails_apps/mycook/public/images/cookbook.gif +0 -0
  866. data/test/stub/rails_apps/mycook/public/images/header.png +0 -0
  867. data/test/stub/rails_apps/mycook/public/images/rails.png +0 -0
  868. data/test/stub/rails_apps/mycook/public/javascripts/application.js +2 -0
  869. data/test/stub/rails_apps/mycook/public/javascripts/controls.js +963 -0
  870. data/test/stub/rails_apps/mycook/public/javascripts/dragdrop.js +972 -0
  871. data/test/stub/rails_apps/mycook/public/javascripts/effects.js +1120 -0
  872. data/test/stub/rails_apps/mycook/public/javascripts/prototype.js +4225 -0
  873. data/test/stub/rails_apps/mycook/public/robots.txt +5 -0
  874. data/test/stub/rails_apps/mycook/public/uploads.html +26 -0
  875. data/test/stub/rails_apps/mycook/public/welcome/cached.html +26 -0
  876. data/test/stub/rails_apps/mycook/sites/some.site/public/uploads.html +26 -0
  877. data/test/stub/rails_apps/mycook/sites/some.site/public/welcome/cached.html +26 -0
  878. data/test/stub/rails_apps/mycook/tmp/cache/useless.txt +1 -0
  879. data/test/stub/rails_apps/mycook/tmp/pids/useless.txt +1 -0
  880. data/test/stub/rails_apps/mycook/tmp/sessions/useless.txt +1 -0
  881. data/test/stub/rails_apps/mycook/tmp/sockets/useless.txt +1 -0
  882. data/test/stub/spawn_server.rb +20 -0
  883. data/test/stub/upload_data.txt +494 -0
  884. data/test/stub/vendor_rails/minimal/README +1 -0
  885. data/test/stub/vendor_rails/minimal/actionmailer/lib/action_mailer.rb +0 -0
  886. data/test/stub/vendor_rails/minimal/actionpack/lib/action_controller.rb +19 -0
  887. data/test/stub/vendor_rails/minimal/actionpack/lib/action_pack.rb +0 -0
  888. data/test/stub/vendor_rails/minimal/actionpack/lib/action_view.rb +0 -0
  889. data/test/stub/vendor_rails/minimal/activerecord/lib/active_record.rb +7 -0
  890. data/test/stub/vendor_rails/minimal/activeresource/lib/active_resource.rb +0 -0
  891. data/test/stub/vendor_rails/minimal/activesupport/lib/active_support.rb +17 -0
  892. data/test/stub/vendor_rails/minimal/activesupport/lib/active_support/whiny_nil.rb +0 -0
  893. data/test/stub/vendor_rails/minimal/railties/lib/dispatcher.rb +0 -0
  894. data/test/stub/vendor_rails/minimal/railties/lib/initializer.rb +52 -0
  895. data/test/stub/vendor_rails/minimal/railties/lib/ruby_version_check.rb +1 -0
  896. data/test/stub/wsgi/passenger_wsgi.py +3 -0
  897. data/test/stub/wsgi/public/wsgi-snake.jpg +0 -0
  898. data/test/stub/zsfa/header.png +0 -0
  899. data/test/stub/zsfa/index.html +14 -0
  900. data/test/stub/zsfa/zsfa.png +0 -0
  901. data/test/support/Support.cpp +84 -0
  902. data/test/support/Support.h +118 -0
  903. data/test/support/apache2_controller.rb +250 -0
  904. data/test/support/config.rb +38 -0
  905. data/test/support/multipart.rb +62 -0
  906. data/test/support/nginx_controller.rb +98 -0
  907. data/test/support/run_rspec_tests.rb +10 -0
  908. data/test/support/test_helper.rb +207 -0
  909. data/test/support/tut.h +1234 -0
  910. data/test/support/tut_reporter.h +256 -0
  911. data/test/support/valgrind.h +2539 -0
  912. metadata +1078 -0
@@ -0,0 +1,1263 @@
1
+
2
+ #ifndef _DATE_TIME_FACET__HPP__
3
+ #define _DATE_TIME_FACET__HPP__
4
+
5
+ /* Copyright (c) 2004-2005 CrystalClear Software, Inc.
6
+ * Use, modification and distribution is subject to the
7
+ * Boost Software License, Version 1.0. (See accompanying
8
+ * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
9
+ * Author: Martin Andrian, Jeff Garland, Bart Garst
10
+ * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
11
+ */
12
+
13
+ #include "boost/date_time/date_facet.hpp"
14
+ #include "boost/date_time/string_convert.hpp"
15
+ #include "boost/algorithm/string/erase.hpp"
16
+ #include <sstream>
17
+ #include <iomanip>
18
+ #include <exception>
19
+
20
+ namespace boost {
21
+ namespace date_time {
22
+
23
+ template <class CharT>
24
+ struct time_formats {
25
+ public:
26
+ typedef CharT char_type;
27
+ static const char_type fractional_seconds_format[3]; // f
28
+ static const char_type fractional_seconds_or_none_format[3]; // F
29
+ static const char_type seconds_with_fractional_seconds_format[3]; // s
30
+ static const char_type seconds_format[3]; // S
31
+ static const char_type standard_format[9]; // x X
32
+ static const char_type zone_abbrev_format[3]; // z
33
+ static const char_type zone_name_format[3]; // Z
34
+ static const char_type zone_iso_format[3]; // q
35
+ static const char_type zone_iso_extended_format[3]; // Q
36
+ static const char_type posix_zone_string_format[4]; // ZP
37
+ static const char_type duration_sign_negative_only[3]; // -
38
+ static const char_type duration_sign_always[3]; // +
39
+ static const char_type duration_seperator[2];
40
+ static const char_type negative_sign[2]; //-
41
+ static const char_type positive_sign[2]; //+
42
+ static const char_type iso_time_format_specifier[18];
43
+ static const char_type iso_time_format_extended_specifier[22];
44
+ //default ptime format is YYYY-Mon-DD HH:MM:SS[.fff...][ zzz]
45
+ static const char_type default_time_format[23];
46
+ // default_time_input_format uses a posix_time_zone_string instead of a time zone abbrev
47
+ static const char_type default_time_input_format[24];
48
+ //default time_duration format is HH:MM:SS[.fff...]
49
+ static const char_type default_time_duration_format[11];
50
+ };
51
+
52
+ template <class CharT>
53
+ const typename time_formats<CharT>::char_type
54
+ time_formats<CharT>::fractional_seconds_format[3] = {'%','f'};
55
+
56
+ template <class CharT>
57
+ const typename time_formats<CharT>::char_type
58
+ time_formats<CharT>::fractional_seconds_or_none_format[3] = {'%','F'};
59
+
60
+ template <class CharT>
61
+ const typename time_formats<CharT>::char_type
62
+ time_formats<CharT>::seconds_with_fractional_seconds_format[3] =
63
+ {'%','s'};
64
+
65
+ template <class CharT>
66
+ const typename time_formats<CharT>::char_type
67
+ time_formats<CharT>::seconds_format[3] = {'%','S'};
68
+
69
+ template <class CharT>
70
+ const typename time_formats<CharT>::char_type
71
+ //time_formats<CharT>::standard_format[5] = {'%','c',' ','%','z'};
72
+ time_formats<CharT>::standard_format[9] = {'%','x',' ','%','X',' ','%','z'};
73
+
74
+ template <class CharT>
75
+ const typename time_formats<CharT>::char_type
76
+ time_formats<CharT>::zone_abbrev_format[3] = {'%','z'};
77
+
78
+ template <class CharT>
79
+ const typename time_formats<CharT>::char_type
80
+ time_formats<CharT>::zone_name_format[3] = {'%','Z'};
81
+
82
+ template <class CharT>
83
+ const typename time_formats<CharT>::char_type
84
+ time_formats<CharT>::zone_iso_format[3] = {'%','q'};
85
+
86
+ template <class CharT>
87
+ const typename time_formats<CharT>::char_type
88
+ time_formats<CharT>::zone_iso_extended_format[3] ={'%','Q'};
89
+
90
+ template <class CharT>
91
+ const typename time_formats<CharT>::char_type
92
+ time_formats<CharT>::posix_zone_string_format[4] ={'%','Z','P'};
93
+
94
+ template <class CharT>
95
+ const typename time_formats<CharT>::char_type
96
+ time_formats<CharT>::duration_seperator[2] = {':'};
97
+
98
+ template <class CharT>
99
+ const typename time_formats<CharT>::char_type
100
+ time_formats<CharT>::negative_sign[2] = {'-'};
101
+
102
+ template <class CharT>
103
+ const typename time_formats<CharT>::char_type
104
+ time_formats<CharT>::positive_sign[2] = {'+'};
105
+
106
+ template <class CharT>
107
+ const typename time_formats<CharT>::char_type
108
+ time_formats<CharT>::duration_sign_negative_only[3] ={'%','-'};
109
+
110
+ template <class CharT>
111
+ const typename time_formats<CharT>::char_type
112
+ time_formats<CharT>::duration_sign_always[3] ={'%','+'};
113
+
114
+ template <class CharT>
115
+ const typename time_formats<CharT>::char_type
116
+ time_formats<CharT>::iso_time_format_specifier[18] =
117
+ {'%', 'Y', '%', 'm', '%', 'd', 'T',
118
+ '%', 'H', '%', 'M', '%', 'S', '%', 'F', '%','q' };
119
+
120
+ template <class CharT>
121
+ const typename time_formats<CharT>::char_type
122
+ time_formats<CharT>::iso_time_format_extended_specifier[22] =
123
+ {'%', 'Y', '-', '%', 'm', '-', '%', 'd', ' ',
124
+ '%', 'H', ':', '%', 'M', ':', '%', 'S', '%', 'F','%','Q'};
125
+
126
+ template <class CharT>
127
+ const typename time_formats<CharT>::char_type
128
+ time_formats<CharT>::default_time_format[23] =
129
+ {'%','Y','-','%','b','-','%','d',' ',
130
+ '%','H',':','%','M',':','%','S','%','F',' ','%','z'};
131
+
132
+ template <class CharT>
133
+ const typename time_formats<CharT>::char_type
134
+ time_formats<CharT>::default_time_input_format[24] =
135
+ {'%','Y','-','%','b','-','%','d',' ',
136
+ '%','H',':','%','M',':','%','S','%','F',' ','%','Z','P'};
137
+
138
+ template <class CharT>
139
+ const typename time_formats<CharT>::char_type
140
+ time_formats<CharT>::default_time_duration_format[11] =
141
+ {'%','H',':','%','M',':','%','S','%','F'};
142
+
143
+
144
+
145
+ /*! Facet used for format-based output of time types
146
+ * This class provides for the use of format strings to output times. In addition
147
+ * to the flags for formatting date elements, the following are the allowed format flags:
148
+ * - %x %X => default format - enables addition of more flags to default (ie. "%x %X %z")
149
+ * - %f => fractional seconds ".123456"
150
+ * - %F => fractional seconds or none: like frac sec but empty if frac sec == 0
151
+ * - %s => seconds w/ fractional sec "02.123" (this is the same as "%S%f)
152
+ * - %S => seconds "02"
153
+ * - %z => abbreviated time zone "EDT"
154
+ * - %Z => full time zone name "Eastern Daylight Time"
155
+ */
156
+ template <class time_type,
157
+ class CharT,
158
+ class OutItrT = std::ostreambuf_iterator<CharT, std::char_traits<CharT> > >
159
+ class time_facet :
160
+ public boost::date_time::date_facet<typename time_type::date_type , CharT, OutItrT> {
161
+ public:
162
+ typedef typename time_type::date_type date_type;
163
+ typedef typename time_type::time_duration_type time_duration_type;
164
+ typedef boost::date_time::period<time_type,time_duration_type> period_type;
165
+ typedef boost::date_time::date_facet<typename time_type::date_type, CharT, OutItrT> base_type;
166
+ typedef typename base_type::string_type string_type;
167
+ typedef typename base_type::char_type char_type;
168
+ typedef typename base_type::period_formatter_type period_formatter_type;
169
+ typedef typename base_type::special_values_formatter_type special_values_formatter_type;
170
+ typedef typename base_type::date_gen_formatter_type date_gen_formatter_type;
171
+ static const char_type* fractional_seconds_format; // %f
172
+ static const char_type* fractional_seconds_or_none_format; // %F
173
+ static const char_type* seconds_with_fractional_seconds_format; // %s
174
+ static const char_type* seconds_format; // %S
175
+ static const char_type* standard_format; // %x X
176
+ static const char_type* zone_abbrev_format; // %z
177
+ static const char_type* zone_name_format; // %Z
178
+ static const char_type* zone_iso_format; // %q
179
+ static const char_type* zone_iso_extended_format; // %Q
180
+ static const char_type* posix_zone_string_format; // %ZP
181
+ static const char_type* duration_seperator;
182
+ static const char_type* duration_sign_always; // %+
183
+ static const char_type* duration_sign_negative_only; // %-
184
+ static const char_type* negative_sign; //-
185
+ static const char_type* positive_sign; //+
186
+ static const char_type* iso_time_format_specifier;
187
+ static const char_type* iso_time_format_extended_specifier;
188
+
189
+ //default ptime format is YYYY-Mon-DD HH:MM:SS[.fff...][ zzz]
190
+ static const char_type* default_time_format;
191
+ //default time_duration format is HH:MM:SS[.fff...]
192
+ static const char_type* default_time_duration_format;
193
+ static std::locale::id id;
194
+
195
+ #if defined (__SUNPRO_CC) && defined (_RWSTD_VER)
196
+ std::locale::id& __get_id (void) const { return id; }
197
+ #endif
198
+
199
+ //! sets default formats for ptime, local_date_time, and time_duration
200
+ explicit time_facet(::size_t /* a_ref */ = 0)
201
+ //: base_type(standard_format),
202
+ : base_type(default_time_format),
203
+ m_time_duration_format(string_type(duration_sign_negative_only) + default_time_duration_format)
204
+ {}
205
+
206
+ //! Construct the facet with an explicitly specified format
207
+ explicit time_facet(const char_type* a_format,
208
+ period_formatter_type period_formatter = period_formatter_type(),
209
+ const special_values_formatter_type& special_value_formatter = special_values_formatter_type(),
210
+ date_gen_formatter_type dg_formatter = date_gen_formatter_type(),
211
+ ::size_t a_ref = 0)
212
+ : base_type(a_format,
213
+ period_formatter,
214
+ special_value_formatter,
215
+ dg_formatter,
216
+ a_ref),
217
+ m_time_duration_format(string_type(duration_sign_negative_only) + default_time_duration_format)
218
+ {}
219
+
220
+ //! Changes format for time_duration
221
+ void time_duration_format(const char_type* const format)
222
+ {
223
+ m_time_duration_format = format;
224
+ }
225
+
226
+ virtual void set_iso_format()
227
+ {
228
+ this->m_format = iso_time_format_specifier;
229
+ }
230
+ virtual void set_iso_extended_format()
231
+ {
232
+ this->m_format = iso_time_format_extended_specifier;
233
+ }
234
+
235
+ OutItrT put(OutItrT a_next,
236
+ std::ios_base& a_ios,
237
+ char_type a_fill,
238
+ const time_type& a_time) const
239
+ {
240
+ if (a_time.is_special()) {
241
+ return this->do_put_special(a_next, a_ios, a_fill,
242
+ a_time.date().as_special());
243
+ }
244
+ string_type format(this->m_format);
245
+ string_type frac_str;
246
+ if (format.find(seconds_with_fractional_seconds_format) != string_type::npos) {
247
+ // replace %s with %S.nnn
248
+ frac_str =
249
+ fractional_seconds_as_string(a_time.time_of_day(), false);
250
+ char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point();
251
+
252
+ string_type replace_string(seconds_format);
253
+ replace_string += sep;
254
+ replace_string += frac_str;
255
+ boost::algorithm::replace_all(format,
256
+ seconds_with_fractional_seconds_format,
257
+ replace_string);
258
+ }
259
+ /* NOTE: replacing posix_zone_string_format must be done BEFORE
260
+ * zone_name_format: "%ZP" & "%Z", if Z is checked first it will
261
+ * incorrectly replace a zone_name where a posix_string should go */
262
+ if (format.find(posix_zone_string_format) != string_type::npos) {
263
+ if(a_time.zone_abbrev().empty()) {
264
+ // if zone_abbrev() returns an empty string, we want to
265
+ // erase posix_zone_string_format from format
266
+ boost::algorithm::replace_all(format,
267
+ posix_zone_string_format,
268
+ "");
269
+ }
270
+ else{
271
+ boost::algorithm::replace_all(format,
272
+ posix_zone_string_format,
273
+ a_time.zone_as_posix_string());
274
+ }
275
+ }
276
+ if (format.find(zone_name_format) != string_type::npos) {
277
+ if(a_time.zone_name().empty()) {
278
+ /* TODO: this'll probably create problems if a user places
279
+ * the zone_*_format flag in the format with a ptime. This
280
+ * code removes the flag from the default formats */
281
+
282
+ // if zone_name() returns an empty string, we want to
283
+ // erase zone_name_format & one preceeding space
284
+ std::basic_ostringstream<char_type> ss;
285
+ ss << ' ' << zone_name_format;
286
+ boost::algorithm::replace_all(format,
287
+ ss.str(),
288
+ "");
289
+ }
290
+ else{
291
+ boost::algorithm::replace_all(format,
292
+ zone_name_format,
293
+ a_time.zone_name());
294
+ }
295
+ }
296
+ if (format.find(zone_abbrev_format) != string_type::npos) {
297
+ if(a_time.zone_abbrev(false).empty()) {
298
+ /* TODO: this'll probably create problems if a user places
299
+ * the zone_*_format flag in the format with a ptime. This
300
+ * code removes the flag from the default formats */
301
+
302
+ // if zone_abbrev() returns an empty string, we want to
303
+ // erase zone_abbrev_format & one preceeding space
304
+ std::basic_ostringstream<char_type> ss;
305
+ ss << ' ' << zone_abbrev_format;
306
+ boost::algorithm::replace_all(format,
307
+ ss.str(),
308
+ "");
309
+ }
310
+ else{
311
+ boost::algorithm::replace_all(format,
312
+ zone_abbrev_format,
313
+ a_time.zone_abbrev(false));
314
+ }
315
+ }
316
+ if (format.find(zone_iso_extended_format) != string_type::npos) {
317
+ if(a_time.zone_name(true).empty()) {
318
+ /* TODO: this'll probably create problems if a user places
319
+ * the zone_*_format flag in the format with a ptime. This
320
+ * code removes the flag from the default formats */
321
+
322
+ // if zone_name() returns an empty string, we want to
323
+ // erase zone_iso_extended_format from format
324
+ boost::algorithm::replace_all(format,
325
+ zone_iso_extended_format,
326
+ "");
327
+ }
328
+ else{
329
+ boost::algorithm::replace_all(format,
330
+ zone_iso_extended_format,
331
+ a_time.zone_name(true));
332
+ }
333
+ }
334
+
335
+ if (format.find(zone_iso_format) != string_type::npos) {
336
+ if(a_time.zone_abbrev(true).empty()) {
337
+ /* TODO: this'll probably create problems if a user places
338
+ * the zone_*_format flag in the format with a ptime. This
339
+ * code removes the flag from the default formats */
340
+
341
+ // if zone_abbrev() returns an empty string, we want to
342
+ // erase zone_iso_format from format
343
+ boost::algorithm::replace_all(format,
344
+ zone_iso_format,
345
+ "");
346
+ }
347
+ else{
348
+ boost::algorithm::replace_all(format,
349
+ zone_iso_format,
350
+ a_time.zone_abbrev(true));
351
+ }
352
+ }
353
+ if (format.find(fractional_seconds_format) != string_type::npos) {
354
+ // replace %f with nnnnnnn
355
+ if (!frac_str.size()) {
356
+ frac_str = fractional_seconds_as_string(a_time.time_of_day(), false);
357
+ }
358
+ boost::algorithm::replace_all(format,
359
+ fractional_seconds_format,
360
+ frac_str);
361
+ }
362
+
363
+ if (format.find(fractional_seconds_or_none_format) != string_type::npos) {
364
+ // replace %F with nnnnnnn or nothing if fs == 0
365
+ frac_str =
366
+ fractional_seconds_as_string(a_time.time_of_day(), true);
367
+ if (frac_str.size()) {
368
+ char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point();
369
+ string_type replace_string;
370
+ replace_string += sep;
371
+ replace_string += frac_str;
372
+ boost::algorithm::replace_all(format,
373
+ fractional_seconds_or_none_format,
374
+ replace_string);
375
+ }
376
+ else {
377
+ boost::algorithm::erase_all(format,
378
+ fractional_seconds_or_none_format);
379
+ }
380
+ }
381
+
382
+ return this->do_put_tm(a_next, a_ios, a_fill,
383
+ to_tm(a_time), format);
384
+ }
385
+
386
+ //! put function for time_duration
387
+ OutItrT put(OutItrT a_next,
388
+ std::ios_base& a_ios,
389
+ char_type a_fill,
390
+ const time_duration_type& a_time_dur) const
391
+ {
392
+ if (a_time_dur.is_special()) {
393
+ return this->do_put_special(a_next, a_ios, a_fill,
394
+ a_time_dur.get_rep().as_special());
395
+ }
396
+
397
+ string_type format(m_time_duration_format);
398
+ if (a_time_dur.is_negative()) {
399
+ // replace %- with minus sign. Should we use the numpunct facet?
400
+ boost::algorithm::replace_all(format,
401
+ duration_sign_negative_only,
402
+ negative_sign);
403
+ // remove all the %+ in the string with '-'
404
+ boost::algorithm::replace_all(format,
405
+ duration_sign_always,
406
+ negative_sign);
407
+ }
408
+ else { //duration is positive
409
+ // remove all the %- combos from the string
410
+ boost::algorithm::replace_all(format,
411
+ duration_sign_negative_only,
412
+ "");
413
+ // remove all the %+ in the string with '+'
414
+ boost::algorithm::replace_all(format,
415
+ duration_sign_always,
416
+ positive_sign);
417
+ }
418
+
419
+ string_type frac_str;
420
+ if (format.find(seconds_with_fractional_seconds_format) != string_type::npos) {
421
+ // replace %s with %S.nnn
422
+ frac_str =
423
+ fractional_seconds_as_string(a_time_dur, false);
424
+ char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point();
425
+
426
+ string_type replace_string(seconds_format);
427
+ replace_string += sep;
428
+ replace_string += frac_str;
429
+ boost::algorithm::replace_all(format,
430
+ seconds_with_fractional_seconds_format,
431
+ replace_string);
432
+ }
433
+ if (format.find(fractional_seconds_format) != string_type::npos) {
434
+ // replace %f with nnnnnnn
435
+ if (!frac_str.size()) {
436
+ frac_str = fractional_seconds_as_string(a_time_dur, false);
437
+ }
438
+ boost::algorithm::replace_all(format,
439
+ fractional_seconds_format,
440
+ frac_str);
441
+ }
442
+
443
+ if (format.find(fractional_seconds_or_none_format) != string_type::npos) {
444
+ // replace %F with nnnnnnn or nothing if fs == 0
445
+ frac_str =
446
+ fractional_seconds_as_string(a_time_dur, true);
447
+ if (frac_str.size()) {
448
+ char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point();
449
+ string_type replace_string;
450
+ replace_string += sep;
451
+ replace_string += frac_str;
452
+ boost::algorithm::replace_all(format,
453
+ fractional_seconds_or_none_format,
454
+ replace_string);
455
+ }
456
+ else {
457
+ boost::algorithm::erase_all(format,
458
+ fractional_seconds_or_none_format);
459
+ }
460
+ }
461
+
462
+ return this->do_put_tm(a_next, a_ios, a_fill,
463
+ to_tm(a_time_dur), format);
464
+ }
465
+
466
+ OutItrT put(OutItrT next, std::ios_base& a_ios,
467
+ char_type fill, const period_type& p) const
468
+ {
469
+ return this->m_period_formatter.put_period(next, a_ios, fill,p,*this);
470
+ }
471
+
472
+
473
+ protected:
474
+
475
+ static
476
+ string_type
477
+ fractional_seconds_as_string(const time_duration_type& a_time,
478
+ bool null_when_zero)
479
+ {
480
+ typename time_duration_type::fractional_seconds_type frac_sec =
481
+ a_time.fractional_seconds();
482
+
483
+ if (null_when_zero && (frac_sec == 0)) {
484
+ return string_type();
485
+ }
486
+
487
+ //make sure there is no sign
488
+ frac_sec = date_time::absolute_value(frac_sec);
489
+ std::basic_ostringstream<char_type> ss;
490
+ ss.imbue(std::locale::classic()); // don't want any formatting
491
+ ss << std::setw(time_duration_type::num_fractional_digits())
492
+ << std::setfill(static_cast<char_type>('0'));
493
+ #if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
494
+ // JDG [7/6/02 VC++ compatibility]
495
+ char_type buff[34];
496
+ ss << _i64toa(static_cast<boost::int64_t>(frac_sec), buff, 10);
497
+ #else
498
+ ss << frac_sec;
499
+ #endif
500
+ return ss.str();
501
+ }
502
+
503
+ private:
504
+ string_type m_time_duration_format;
505
+
506
+ };
507
+
508
+ template <class time_type, class CharT, class OutItrT>
509
+ std::locale::id time_facet<time_type, CharT, OutItrT>::id;
510
+
511
+ template <class time_type, class CharT, class OutItrT>
512
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
513
+ time_facet<time_type, CharT, OutItrT>::fractional_seconds_format = time_formats<CharT>::fractional_seconds_format;
514
+
515
+ template <class time_type, class CharT, class OutItrT>
516
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
517
+ time_facet<time_type, CharT, OutItrT>::fractional_seconds_or_none_format = time_formats<CharT>::fractional_seconds_or_none_format;
518
+
519
+ template <class time_type, class CharT, class OutItrT>
520
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
521
+ time_facet<time_type, CharT, OutItrT>::seconds_with_fractional_seconds_format =
522
+ time_formats<CharT>::seconds_with_fractional_seconds_format;
523
+
524
+
525
+ template <class time_type, class CharT, class OutItrT>
526
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
527
+ time_facet<time_type, CharT, OutItrT>::zone_name_format = time_formats<CharT>::zone_name_format;
528
+
529
+ template <class time_type, class CharT, class OutItrT>
530
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
531
+ time_facet<time_type, CharT, OutItrT>::zone_abbrev_format = time_formats<CharT>::zone_abbrev_format;
532
+
533
+ template <class time_type, class CharT, class OutItrT>
534
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
535
+ time_facet<time_type, CharT, OutItrT>::zone_iso_extended_format =time_formats<CharT>::zone_iso_extended_format;
536
+
537
+ template <class time_type, class CharT, class OutItrT>
538
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
539
+ time_facet<time_type, CharT, OutItrT>::posix_zone_string_format =time_formats<CharT>::posix_zone_string_format;
540
+
541
+ template <class time_type, class CharT, class OutItrT>
542
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
543
+ time_facet<time_type, CharT, OutItrT>::zone_iso_format = time_formats<CharT>::zone_iso_format;
544
+
545
+ template <class time_type, class CharT, class OutItrT>
546
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
547
+ time_facet<time_type, CharT, OutItrT>::seconds_format = time_formats<CharT>::seconds_format;
548
+
549
+ template <class time_type, class CharT, class OutItrT>
550
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
551
+ time_facet<time_type, CharT, OutItrT>::standard_format = time_formats<CharT>::standard_format;
552
+
553
+ template <class time_type, class CharT, class OutItrT>
554
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
555
+ time_facet<time_type, CharT, OutItrT>::duration_seperator = time_formats<CharT>::duration_seperator;
556
+
557
+ template <class time_type, class CharT, class OutItrT>
558
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
559
+ time_facet<time_type, CharT, OutItrT>::negative_sign = time_formats<CharT>::negative_sign;
560
+
561
+ template <class time_type, class CharT, class OutItrT>
562
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
563
+ time_facet<time_type, CharT, OutItrT>::positive_sign = time_formats<CharT>::positive_sign;
564
+
565
+ template <class time_type, class CharT, class OutItrT>
566
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
567
+ time_facet<time_type, CharT, OutItrT>::duration_sign_negative_only = time_formats<CharT>::duration_sign_negative_only;
568
+
569
+ template <class time_type, class CharT, class OutItrT>
570
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
571
+ time_facet<time_type, CharT, OutItrT>::duration_sign_always = time_formats<CharT>::duration_sign_always;
572
+
573
+ template <class time_type, class CharT, class OutItrT>
574
+ const typename time_facet<time_type,CharT, OutItrT>::char_type*
575
+ time_facet<time_type,CharT, OutItrT>::iso_time_format_specifier = time_formats<CharT>::iso_time_format_specifier;
576
+
577
+ template <class time_type, class CharT, class OutItrT>
578
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
579
+ time_facet<time_type, CharT, OutItrT>::iso_time_format_extended_specifier = time_formats<CharT>::iso_time_format_extended_specifier;
580
+
581
+ template <class time_type, class CharT, class OutItrT>
582
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
583
+ time_facet<time_type, CharT, OutItrT>::default_time_format =
584
+ time_formats<CharT>::default_time_format;
585
+
586
+ template <class time_type, class CharT, class OutItrT>
587
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
588
+ time_facet<time_type, CharT, OutItrT>::default_time_duration_format =
589
+ time_formats<CharT>::default_time_duration_format;
590
+
591
+
592
+ //! Facet for format-based input.
593
+ /*!
594
+ */
595
+ template <class time_type,
596
+ class CharT,
597
+ class InItrT = std::istreambuf_iterator<CharT, std::char_traits<CharT> > >
598
+ class time_input_facet :
599
+ public boost::date_time::date_input_facet<typename time_type::date_type , CharT, InItrT> {
600
+ public:
601
+ typedef typename time_type::date_type date_type;
602
+ typedef typename time_type::time_duration_type time_duration_type;
603
+ typedef typename time_duration_type::fractional_seconds_type fracional_seconds_type;
604
+ typedef boost::date_time::period<time_type,time_duration_type> period_type;
605
+ typedef boost::date_time::date_input_facet<typename time_type::date_type, CharT, InItrT> base_type;
606
+ typedef typename base_type::duration_type date_duration_type;
607
+ typedef typename base_type::year_type year_type;
608
+ typedef typename base_type::month_type month_type;
609
+ typedef typename base_type::day_type day_type;
610
+ typedef typename base_type::string_type string_type;
611
+ typedef typename string_type::const_iterator const_itr;
612
+ typedef typename base_type::char_type char_type;
613
+ typedef typename base_type::format_date_parser_type format_date_parser_type;
614
+ typedef typename base_type::period_parser_type period_parser_type;
615
+ typedef typename base_type::special_values_parser_type special_values_parser_type;
616
+ typedef typename base_type::date_gen_parser_type date_gen_parser_type;
617
+ typedef typename base_type::special_values_parser_type::match_results match_results;
618
+
619
+ static const char_type* fractional_seconds_format; // f
620
+ static const char_type* fractional_seconds_or_none_format; // F
621
+ static const char_type* seconds_with_fractional_seconds_format; // s
622
+ static const char_type* seconds_format; // S
623
+ static const char_type* standard_format; // x X
624
+ static const char_type* zone_abbrev_format; // z
625
+ static const char_type* zone_name_format; // Z
626
+ static const char_type* zone_iso_format; // q
627
+ static const char_type* zone_iso_extended_format; // Q
628
+ static const char_type* duration_seperator;
629
+ static const char_type* iso_time_format_specifier;
630
+ static const char_type* iso_time_format_extended_specifier;
631
+ static const char_type* default_time_input_format;
632
+ static const char_type* default_time_duration_format;
633
+ static std::locale::id id;
634
+
635
+ //! Constructor that takes a format string for a ptime
636
+ explicit time_input_facet(const string_type& format, ::size_t a_ref = 0)
637
+ : base_type(format, a_ref),
638
+ m_time_duration_format(default_time_duration_format)
639
+ { }
640
+
641
+ explicit time_input_facet(const string_type& format,
642
+ const format_date_parser_type& date_parser,
643
+ const special_values_parser_type& sv_parser,
644
+ const period_parser_type& per_parser,
645
+ const date_gen_parser_type& date_gen_parser,
646
+ ::size_t a_ref = 0)
647
+ : base_type(format,
648
+ date_parser,
649
+ sv_parser,
650
+ per_parser,
651
+ date_gen_parser,
652
+ a_ref),
653
+ m_time_duration_format(default_time_duration_format)
654
+ {}
655
+
656
+ //! sets default formats for ptime, local_date_time, and time_duration
657
+ explicit time_input_facet(::size_t a_ref = 0)
658
+ : base_type(default_time_input_format, a_ref),
659
+ m_time_duration_format(default_time_duration_format)
660
+ { }
661
+
662
+ //! Set the format for time_duration
663
+ void time_duration_format(const char_type* const format) {
664
+ m_time_duration_format = format;
665
+ }
666
+ virtual void set_iso_format()
667
+ {
668
+ this->m_format = iso_time_format_specifier;
669
+ }
670
+ virtual void set_iso_extended_format()
671
+ {
672
+ this->m_format = iso_time_format_extended_specifier;
673
+ }
674
+
675
+ InItrT get(InItrT& sitr,
676
+ InItrT& stream_end,
677
+ std::ios_base& a_ios,
678
+ period_type& p) const
679
+ {
680
+ p = this->m_period_parser.get_period(sitr,
681
+ stream_end,
682
+ a_ios,
683
+ p,
684
+ time_duration_type::unit(),
685
+ *this);
686
+ return sitr;
687
+ }
688
+
689
+ //default ptime format is YYYY-Mon-DD HH:MM:SS[.fff...][ zzz]
690
+ //default time_duration format is %H:%M:%S%F HH:MM:SS[.fff...]
691
+
692
+ InItrT get(InItrT& sitr,
693
+ InItrT& stream_end,
694
+ std::ios_base& a_ios,
695
+ time_duration_type& td) const
696
+ {
697
+ // skip leading whitespace
698
+ while((sitr != stream_end) && std::isspace(*sitr)) { ++sitr; }
699
+
700
+ bool use_current_char = false;
701
+
702
+ // num_get will consume the +/-, we may need a copy if special_value
703
+ char_type c = '\0';
704
+ if((sitr != stream_end) && (*sitr == '-' || *sitr == '+')) {
705
+ c = *sitr;
706
+ }
707
+
708
+ long hour = 0;
709
+ long min = 0;
710
+ long sec = 0;
711
+ typename time_duration_type::fractional_seconds_type frac(0);
712
+
713
+ typedef std::num_get<CharT, InItrT> num_get;
714
+ if(!std::has_facet<num_get>(a_ios.getloc())) {
715
+ num_get* ng = new num_get();
716
+ std::locale loc = std::locale(a_ios.getloc(), ng);
717
+ a_ios.imbue(loc);
718
+ }
719
+
720
+ const_itr itr(m_time_duration_format.begin());
721
+ while (itr != m_time_duration_format.end() && (sitr != stream_end)) {
722
+ if (*itr == '%') {
723
+ itr++;
724
+ if (*itr != '%') {
725
+ switch(*itr) {
726
+ case 'H':
727
+ {
728
+ match_results mr;
729
+ hour = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
730
+ if(hour == -1){
731
+ return check_special_value(sitr, stream_end, td, c);
732
+ }
733
+ break;
734
+ }
735
+ case 'M':
736
+ {
737
+ match_results mr;
738
+ min = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
739
+ if(min == -1){
740
+ return check_special_value(sitr, stream_end, td, c);
741
+ }
742
+ break;
743
+ }
744
+ case 'S':
745
+ {
746
+ match_results mr;
747
+ sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
748
+ if(sec == -1){
749
+ return check_special_value(sitr, stream_end, td, c);
750
+ }
751
+ break;
752
+ }
753
+ case 's':
754
+ {
755
+ match_results mr;
756
+ sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
757
+ if(sec == -1){
758
+ return check_special_value(sitr, stream_end, td, c);
759
+ }
760
+ // %s is the same as %S%f so we drop through into %f
761
+ //break;
762
+ }
763
+ case 'f':
764
+ {
765
+ // check for decimal, check special_values if missing
766
+ if(*sitr == '.') {
767
+ ++sitr;
768
+ parse_frac_type(sitr, stream_end, frac);
769
+ // sitr will point to next expected char after this parsing
770
+ // is complete so no need to advance it
771
+ use_current_char = true;
772
+ }
773
+ else {
774
+ return check_special_value(sitr, stream_end, td, c);
775
+ }
776
+ break;
777
+ }
778
+ case 'F':
779
+ {
780
+ // check for decimal, skip if missing
781
+ if(*sitr == '.') {
782
+ ++sitr;
783
+ parse_frac_type(sitr, stream_end, frac);
784
+ // sitr will point to next expected char after this parsing
785
+ // is complete so no need to advance it
786
+ use_current_char = true;
787
+ }
788
+ else {
789
+ // nothing was parsed so we don't want to advance sitr
790
+ use_current_char = true;
791
+ }
792
+ break;
793
+ }
794
+ default:
795
+ {} // ignore what we don't understand?
796
+ }// switch
797
+ }
798
+ else { // itr == '%', second consecutive
799
+ sitr++;
800
+ }
801
+
802
+ itr++; //advance past format specifier
803
+ }
804
+ else { //skip past chars in format and in buffer
805
+ itr++;
806
+ // set use_current_char when sitr is already
807
+ // pointing at the next character to process
808
+ if (use_current_char) {
809
+ use_current_char = false;
810
+ }
811
+ else {
812
+ sitr++;
813
+ }
814
+ }
815
+ }
816
+
817
+ td = time_duration_type(hour, min, sec, frac);
818
+ return sitr;
819
+ }
820
+
821
+
822
+ //! Parses a time object from the input stream
823
+ InItrT get(InItrT& sitr,
824
+ InItrT& stream_end,
825
+ std::ios_base& a_ios,
826
+ time_type& t) const
827
+ {
828
+ string_type tz_str;
829
+ return get(sitr, stream_end, a_ios, t, tz_str, false);
830
+ }
831
+ //! Expects a time_zone in the input stream
832
+ InItrT get_local_time(InItrT& sitr,
833
+ InItrT& stream_end,
834
+ std::ios_base& a_ios,
835
+ time_type& t,
836
+ string_type& tz_str) const
837
+ {
838
+ return get(sitr, stream_end, a_ios, t, tz_str, true);
839
+ }
840
+
841
+ protected:
842
+
843
+ InItrT get(InItrT& sitr,
844
+ InItrT& stream_end,
845
+ std::ios_base& a_ios,
846
+ time_type& t,
847
+ string_type& tz_str,
848
+ bool time_is_local) const
849
+ {
850
+ // skip leading whitespace
851
+ while((sitr != stream_end) && std::isspace(*sitr)) { ++sitr; }
852
+
853
+ bool use_current_char = false;
854
+ bool use_current_format_char = false; // used whith two character flags
855
+
856
+ // num_get will consume the +/-, we may need a copy if special_value
857
+ char_type c = '\0';
858
+ if((sitr != stream_end) && (*sitr == '-' || *sitr == '+')) {
859
+ c = *sitr;
860
+ }
861
+
862
+ // time elements
863
+ long hour = 0;
864
+ long min = 0;
865
+ long sec = 0;
866
+ typename time_duration_type::fractional_seconds_type frac(0);
867
+ // date elements
868
+ short day_of_year(0);
869
+ /* Initialized the following to their minimum values. These intermediate
870
+ * objects are used so we get specific exceptions when part of the input
871
+ * is unparsable.
872
+ * Ex: "205-Jan-15" will throw a bad_year, "2005-Jsn-15"- bad_month, etc.*/
873
+ year_type t_year(1400);
874
+ month_type t_month(1);
875
+ day_type t_day(1);
876
+
877
+ typedef std::num_get<CharT, InItrT> num_get;
878
+ if(!std::has_facet<num_get>(a_ios.getloc())) {
879
+ num_get* ng = new num_get();
880
+ std::locale loc = std::locale(a_ios.getloc(), ng);
881
+ a_ios.imbue(loc);
882
+ }
883
+
884
+ const_itr itr(this->m_format.begin());
885
+ while (itr != this->m_format.end() && (sitr != stream_end)) {
886
+ if (*itr == '%') {
887
+ itr++;
888
+ if (*itr != '%') {
889
+ // the cases are grouped by date & time flags - not alphabetical order
890
+ switch(*itr) {
891
+ // date flags
892
+ case 'Y':
893
+ case 'y':
894
+ {
895
+ char_type cs[3] = { '%', *itr };
896
+ string_type s(cs);
897
+ match_results mr;
898
+ try {
899
+ t_year = this->m_parser.parse_year(sitr, stream_end, s, mr);
900
+ }
901
+ catch(std::out_of_range bad_year) { // base class for bad_year exception
902
+ if(this->m_sv_parser.match(sitr, stream_end, mr)) {
903
+ t = time_type(static_cast<special_values>(mr.current_match));
904
+ return sitr;
905
+ }
906
+ else {
907
+ throw; // rethrow bad_year
908
+ }
909
+ }
910
+ break;
911
+ }
912
+ case 'B':
913
+ case 'b':
914
+ case 'm':
915
+ {
916
+ char_type cs[3] = { '%', *itr };
917
+ string_type s(cs);
918
+ match_results mr;
919
+ try {
920
+ t_month = this->m_parser.parse_month(sitr, stream_end, s, mr);
921
+ }
922
+ catch(std::out_of_range bad_month) { // base class for bad_month exception
923
+ if(this->m_sv_parser.match(sitr, stream_end, mr)) {
924
+ t = time_type(static_cast<special_values>(mr.current_match));
925
+ return sitr;
926
+ }
927
+ else {
928
+ throw; // rethrow bad_year
929
+ }
930
+ }
931
+ // did m_parser already advance sitr to next char?
932
+ if(mr.has_remaining()) {
933
+ use_current_char = true;
934
+ }
935
+ break;
936
+ }
937
+ case 'a':
938
+ case 'A':
939
+ case 'w':
940
+ {
941
+ // weekday is not used in construction but we need to get it out of the stream
942
+ char_type cs[3] = { '%', *itr };
943
+ string_type s(cs);
944
+ match_results mr;
945
+ typename date_type::day_of_week_type wd(0);
946
+ try {
947
+ wd = this->m_parser.parse_weekday(sitr, stream_end, s, mr);
948
+ }
949
+ catch(std::out_of_range bad_weekday) { // base class for bad_weekday exception
950
+ if(this->m_sv_parser.match(sitr, stream_end, mr)) {
951
+ t = time_type(static_cast<special_values>(mr.current_match));
952
+ return sitr;
953
+ }
954
+ else {
955
+ throw; // rethrow bad_weekday
956
+ }
957
+ }
958
+ // did m_parser already advance sitr to next char?
959
+ if(mr.has_remaining()) {
960
+ use_current_char = true;
961
+ }
962
+ break;
963
+ }
964
+ case 'j':
965
+ {
966
+ // code that gets julian day (from format_date_parser)
967
+ match_results mr;
968
+ day_of_year = fixed_string_to_int<unsigned short, CharT>(sitr, stream_end, mr, 3);
969
+ if(day_of_year == -1) {
970
+ if(this->m_sv_parser.match(sitr, stream_end, mr)) {
971
+ t = time_type(static_cast<special_values>(mr.current_match));
972
+ return sitr;
973
+ }
974
+ }
975
+ // these next two lines are so we get an exception with bad input
976
+ typedef typename time_type::date_type::day_of_year_type day_of_year_type;
977
+ day_of_year_type t_day_of_year(day_of_year);
978
+ break;
979
+ }
980
+ case 'd':
981
+ {
982
+ try {
983
+ t_day = this->m_parser.parse_day_of_month(sitr, stream_end);
984
+ }
985
+ catch(std::out_of_range bad_day_of_month) { // base class for exception
986
+ match_results mr;
987
+ if(this->m_sv_parser.match(sitr, stream_end, mr)) {
988
+ t = time_type(static_cast<special_values>(mr.current_match));
989
+ return sitr;
990
+ }
991
+ else {
992
+ throw; // rethrow bad_year
993
+ }
994
+ }
995
+ break;
996
+ }
997
+ // time flags
998
+ case 'H':
999
+ {
1000
+ match_results mr;
1001
+ hour = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
1002
+ if(hour == -1){
1003
+ return check_special_value(sitr, stream_end, t, c);
1004
+ }
1005
+ break;
1006
+ }
1007
+ case 'M':
1008
+ {
1009
+ match_results mr;
1010
+ min = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
1011
+ if(min == -1){
1012
+ return check_special_value(sitr, stream_end, t, c);
1013
+ }
1014
+ break;
1015
+ }
1016
+ case 'S':
1017
+ {
1018
+ match_results mr;
1019
+ sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
1020
+ if(sec == -1){
1021
+ return check_special_value(sitr, stream_end, t, c);
1022
+ }
1023
+ break;
1024
+ }
1025
+ case 's':
1026
+ {
1027
+ match_results mr;
1028
+ sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
1029
+ if(sec == -1){
1030
+ return check_special_value(sitr, stream_end, t, c);
1031
+ }
1032
+ // %s is the same as %S%f so we drop through into %f
1033
+ //break;
1034
+ }
1035
+ case 'f':
1036
+ {
1037
+ // check for decimal, check SV if missing
1038
+ if(*sitr == '.') {
1039
+ ++sitr;
1040
+ parse_frac_type(sitr, stream_end, frac);
1041
+ // sitr will point to next expected char after this parsing
1042
+ // is complete so no need to advance it
1043
+ use_current_char = true;
1044
+ }
1045
+ else {
1046
+ return check_special_value(sitr, stream_end, t, c);
1047
+ }
1048
+ break;
1049
+ }
1050
+ case 'F':
1051
+ {
1052
+ // check for decimal, skip if missing
1053
+ if(*sitr == '.') {
1054
+ ++sitr;
1055
+ parse_frac_type(sitr, stream_end, frac);
1056
+ // sitr will point to next expected char after this parsing
1057
+ // is complete so no need to advance it
1058
+ use_current_char = true;
1059
+ }
1060
+ else {
1061
+ // nothing was parsed so we don't want to advance sitr
1062
+ use_current_char = true;
1063
+ }
1064
+ break;
1065
+ }
1066
+ // time_zone flags
1067
+ //case 'q':
1068
+ //case 'Q':
1069
+ //case 'z':
1070
+ case 'Z':
1071
+ {
1072
+ if(time_is_local) { // skip if 't' is a ptime
1073
+ ++itr;
1074
+ if(*itr == 'P') {
1075
+ // skip leading whitespace
1076
+ while((sitr != stream_end) && std::isspace(*sitr)) { ++sitr; }
1077
+ // parse zone
1078
+ while((sitr != stream_end) && (!std::isspace(*sitr))) {
1079
+ tz_str += *sitr;
1080
+ ++sitr;
1081
+ }
1082
+ }
1083
+ else {
1084
+ use_current_format_char = true;
1085
+ }
1086
+
1087
+ }
1088
+ else {
1089
+ // nothing was parsed so we don't want to advance sitr
1090
+ use_current_char = true;
1091
+ }
1092
+
1093
+ break;
1094
+ }
1095
+ default:
1096
+ {} // ignore what we don't understand?
1097
+ }// switch
1098
+ }
1099
+ else { // itr == '%', second consecutive
1100
+ sitr++;
1101
+ }
1102
+
1103
+ if(use_current_format_char) {
1104
+ use_current_format_char = false;
1105
+ }
1106
+ else {
1107
+ itr++; //advance past format specifier
1108
+ }
1109
+
1110
+ }
1111
+ else { //skip past chars in format and in buffer
1112
+ itr++;
1113
+ // set use_current_char when sitr is already
1114
+ // pointing at the next character to process
1115
+ if (use_current_char) {
1116
+ use_current_char = false;
1117
+ }
1118
+ else {
1119
+ sitr++;
1120
+ }
1121
+ }
1122
+ }
1123
+
1124
+ date_type d(not_a_date_time);
1125
+ if (day_of_year > 0) {
1126
+ d = date_type(static_cast<unsigned short>(t_year-1),12,31) + date_duration_type(day_of_year);
1127
+ }
1128
+ else {
1129
+ d = date_type(t_year, t_month, t_day);
1130
+ }
1131
+
1132
+ time_duration_type td(hour, min, sec, frac);
1133
+ t = time_type(d, td);
1134
+ return sitr;
1135
+ }
1136
+
1137
+ //! Helper function to check for special_value
1138
+ /*! First character may have been consumed during original parse
1139
+ * attempt. Parameter 'c' should be a copy of that character.
1140
+ * Throws ios_base::failure if parse fails. */
1141
+ template<class temporal_type>
1142
+ inline
1143
+ InItrT check_special_value(InItrT& sitr,InItrT& stream_end, temporal_type& tt, char_type c='\0') const
1144
+ {
1145
+ match_results mr;
1146
+ if((c == '-' || c == '+') && (*sitr != c)) { // was the first character consumed?
1147
+ mr.cache += c;
1148
+ }
1149
+ this->m_sv_parser.match(sitr, stream_end, mr);
1150
+ if(mr.current_match == match_results::PARSE_ERROR) {
1151
+ std::string tmp = convert_string_type<char_type, char>(mr.cache);
1152
+ throw std::ios_base::failure("Parse failed. No match found for '" + tmp + "'");
1153
+ }
1154
+ tt = temporal_type(static_cast<special_values>(mr.current_match));
1155
+ return sitr;
1156
+ }
1157
+
1158
+ //! Helper function for parsing a fractional second type from the stream
1159
+ void parse_frac_type(InItrT& sitr,
1160
+ InItrT& stream_end,
1161
+ fracional_seconds_type& frac) const
1162
+ {
1163
+ string_type cache;
1164
+ while((sitr != stream_end) && std::isdigit(*sitr)) {
1165
+ cache += *sitr;
1166
+ ++sitr;
1167
+ }
1168
+ if(cache.size() > 0) {
1169
+ unsigned short precision = time_duration_type::num_fractional_digits();
1170
+ // input may be only the first few decimal places
1171
+ if(cache.size() < precision) {
1172
+ frac = lexical_cast<fracional_seconds_type>(cache);
1173
+ frac = decimal_adjust(frac, static_cast<unsigned short>(precision - cache.size()));
1174
+ }
1175
+ else {
1176
+ // if input has too many decimal places, drop excess digits
1177
+ frac = lexical_cast<fracional_seconds_type>(cache.substr(0, precision));
1178
+ }
1179
+ }
1180
+ }
1181
+
1182
+ private:
1183
+ string_type m_time_duration_format;
1184
+
1185
+ //! Helper function to adjust trailing zeros when parsing fractional digits
1186
+ template<class int_type>
1187
+ inline
1188
+ int_type decimal_adjust(int_type val, const unsigned short places) const
1189
+ {
1190
+ unsigned long factor = 1;
1191
+ for(int i = 0; i < places; ++i){
1192
+ factor *= 10; // shift decimal to the right
1193
+ }
1194
+ return val * factor;
1195
+ }
1196
+
1197
+ };
1198
+
1199
+ template <class time_type, class CharT, class InItrT>
1200
+ std::locale::id time_input_facet<time_type, CharT, InItrT>::id;
1201
+
1202
+ template <class time_type, class CharT, class InItrT>
1203
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1204
+ time_input_facet<time_type, CharT, InItrT>::fractional_seconds_format = time_formats<CharT>::fractional_seconds_format;
1205
+
1206
+ template <class time_type, class CharT, class InItrT>
1207
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1208
+ time_input_facet<time_type, CharT, InItrT>::fractional_seconds_or_none_format = time_formats<CharT>::fractional_seconds_or_none_format;
1209
+
1210
+ template <class time_type, class CharT, class InItrT>
1211
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1212
+ time_input_facet<time_type, CharT, InItrT>::seconds_with_fractional_seconds_format = time_formats<CharT>::seconds_with_fractional_seconds_format;
1213
+
1214
+ template <class time_type, class CharT, class InItrT>
1215
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1216
+ time_input_facet<time_type, CharT, InItrT>::seconds_format = time_formats<CharT>::seconds_format;
1217
+
1218
+ template <class time_type, class CharT, class InItrT>
1219
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1220
+ time_input_facet<time_type, CharT, InItrT>::standard_format = time_formats<CharT>::standard_format;
1221
+
1222
+ template <class time_type, class CharT, class InItrT>
1223
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1224
+ time_input_facet<time_type, CharT, InItrT>::zone_abbrev_format = time_formats<CharT>::zone_abbrev_format;
1225
+
1226
+ template <class time_type, class CharT, class InItrT>
1227
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1228
+ time_input_facet<time_type, CharT, InItrT>::zone_name_format = time_formats<CharT>::zone_name_format;
1229
+
1230
+ template <class time_type, class CharT, class InItrT>
1231
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1232
+ time_input_facet<time_type, CharT, InItrT>::zone_iso_format = time_formats<CharT>::zone_iso_format;
1233
+
1234
+ template <class time_type, class CharT, class InItrT>
1235
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1236
+ time_input_facet<time_type, CharT, InItrT>::zone_iso_extended_format = time_formats<CharT>::zone_iso_extended_format;
1237
+
1238
+ template <class time_type, class CharT, class InItrT>
1239
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1240
+ time_input_facet<time_type, CharT, InItrT>::duration_seperator = time_formats<CharT>::duration_seperator;
1241
+
1242
+ template <class time_type, class CharT, class InItrT>
1243
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1244
+ time_input_facet<time_type, CharT, InItrT>::iso_time_format_specifier = time_formats<CharT>::iso_time_format_specifier;
1245
+
1246
+ template <class time_type, class CharT, class InItrT>
1247
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1248
+ time_input_facet<time_type, CharT, InItrT>::iso_time_format_extended_specifier = time_formats<CharT>::iso_time_format_extended_specifier;
1249
+
1250
+ template <class time_type, class CharT, class InItrT>
1251
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1252
+ time_input_facet<time_type, CharT, InItrT>::default_time_input_format = time_formats<CharT>::default_time_input_format;
1253
+
1254
+ template <class time_type, class CharT, class InItrT>
1255
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1256
+ time_input_facet<time_type, CharT, InItrT>::default_time_duration_format = time_formats<CharT>::default_time_duration_format;
1257
+
1258
+
1259
+ } } // namespaces
1260
+
1261
+
1262
+ #endif
1263
+