gitlab-pygments.rb 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (399) hide show
  1. data/.gitignore +6 -0
  2. data/Gemfile +2 -0
  3. data/README.md +91 -0
  4. data/Rakefile +78 -0
  5. data/bench.rb +22 -0
  6. data/cache-lexers.rb +8 -0
  7. data/lexers +0 -0
  8. data/lib/pygments/lexer.rb +148 -0
  9. data/lib/pygments/mentos.py +344 -0
  10. data/lib/pygments/popen.rb +389 -0
  11. data/lib/pygments/version.rb +3 -0
  12. data/lib/pygments.rb +8 -0
  13. data/pygments.rb.gemspec +24 -0
  14. data/test/test_data.c +2581 -0
  15. data/test/test_data.py +514 -0
  16. data/test/test_data_generated +2582 -0
  17. data/test/test_pygments.rb +276 -0
  18. data/vendor/custom_formatters/gitlab.py +171 -0
  19. data/vendor/custom_lexers/github.py +362 -0
  20. data/vendor/pygments-main/AUTHORS +115 -0
  21. data/vendor/pygments-main/CHANGES +762 -0
  22. data/vendor/pygments-main/LICENSE +25 -0
  23. data/vendor/pygments-main/MANIFEST.in +6 -0
  24. data/vendor/pygments-main/Makefile +59 -0
  25. data/vendor/pygments-main/REVISION +1 -0
  26. data/vendor/pygments-main/TODO +15 -0
  27. data/vendor/pygments-main/docs/generate.py +472 -0
  28. data/vendor/pygments-main/docs/pygmentize.1 +94 -0
  29. data/vendor/pygments-main/docs/src/api.txt +270 -0
  30. data/vendor/pygments-main/docs/src/authors.txt +5 -0
  31. data/vendor/pygments-main/docs/src/changelog.txt +5 -0
  32. data/vendor/pygments-main/docs/src/cmdline.txt +147 -0
  33. data/vendor/pygments-main/docs/src/filterdevelopment.txt +70 -0
  34. data/vendor/pygments-main/docs/src/filters.txt +42 -0
  35. data/vendor/pygments-main/docs/src/formatterdevelopment.txt +169 -0
  36. data/vendor/pygments-main/docs/src/formatters.txt +48 -0
  37. data/vendor/pygments-main/docs/src/index.txt +69 -0
  38. data/vendor/pygments-main/docs/src/installation.txt +71 -0
  39. data/vendor/pygments-main/docs/src/integrate.txt +43 -0
  40. data/vendor/pygments-main/docs/src/lexerdevelopment.txt +551 -0
  41. data/vendor/pygments-main/docs/src/lexers.txt +67 -0
  42. data/vendor/pygments-main/docs/src/moinmoin.txt +39 -0
  43. data/vendor/pygments-main/docs/src/plugins.txt +93 -0
  44. data/vendor/pygments-main/docs/src/quickstart.txt +202 -0
  45. data/vendor/pygments-main/docs/src/rstdirective.txt +22 -0
  46. data/vendor/pygments-main/docs/src/styles.txt +143 -0
  47. data/vendor/pygments-main/docs/src/tokens.txt +349 -0
  48. data/vendor/pygments-main/docs/src/unicode.txt +49 -0
  49. data/vendor/pygments-main/external/markdown-processor.py +67 -0
  50. data/vendor/pygments-main/external/moin-parser.py +112 -0
  51. data/vendor/pygments-main/external/pygments.bashcomp +38 -0
  52. data/vendor/pygments-main/external/rst-directive-old.py +77 -0
  53. data/vendor/pygments-main/external/rst-directive.py +83 -0
  54. data/vendor/pygments-main/ez_setup.py +276 -0
  55. data/vendor/pygments-main/pygmentize +7 -0
  56. data/vendor/pygments-main/pygments/__init__.py +91 -0
  57. data/vendor/pygments-main/pygments/cmdline.py +433 -0
  58. data/vendor/pygments-main/pygments/console.py +74 -0
  59. data/vendor/pygments-main/pygments/filter.py +74 -0
  60. data/vendor/pygments-main/pygments/filters/__init__.py +357 -0
  61. data/vendor/pygments-main/pygments/formatter.py +92 -0
  62. data/vendor/pygments-main/pygments/formatters/__init__.py +68 -0
  63. data/vendor/pygments-main/pygments/formatters/_mapping.py +94 -0
  64. data/vendor/pygments-main/pygments/formatters/bbcode.py +109 -0
  65. data/vendor/pygments-main/pygments/formatters/gitlab.py +171 -0
  66. data/vendor/pygments-main/pygments/formatters/html.py +750 -0
  67. data/vendor/pygments-main/pygments/formatters/img.py +553 -0
  68. data/vendor/pygments-main/pygments/formatters/latex.py +378 -0
  69. data/vendor/pygments-main/pygments/formatters/other.py +117 -0
  70. data/vendor/pygments-main/pygments/formatters/rtf.py +136 -0
  71. data/vendor/pygments-main/pygments/formatters/svg.py +154 -0
  72. data/vendor/pygments-main/pygments/formatters/terminal.py +112 -0
  73. data/vendor/pygments-main/pygments/formatters/terminal256.py +222 -0
  74. data/vendor/pygments-main/pygments/lexer.py +697 -0
  75. data/vendor/pygments-main/pygments/lexers/__init__.py +229 -0
  76. data/vendor/pygments-main/pygments/lexers/_asybuiltins.py +1645 -0
  77. data/vendor/pygments-main/pygments/lexers/_clbuiltins.py +232 -0
  78. data/vendor/pygments-main/pygments/lexers/_luabuiltins.py +249 -0
  79. data/vendor/pygments-main/pygments/lexers/_mapping.py +298 -0
  80. data/vendor/pygments-main/pygments/lexers/_phpbuiltins.py +3787 -0
  81. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +232 -0
  82. data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +29 -0
  83. data/vendor/pygments-main/pygments/lexers/_vimbuiltins.py +3 -0
  84. data/vendor/pygments-main/pygments/lexers/agile.py +1803 -0
  85. data/vendor/pygments-main/pygments/lexers/asm.py +360 -0
  86. data/vendor/pygments-main/pygments/lexers/compiled.py +2891 -0
  87. data/vendor/pygments-main/pygments/lexers/dotnet.py +636 -0
  88. data/vendor/pygments-main/pygments/lexers/functional.py +1832 -0
  89. data/vendor/pygments-main/pygments/lexers/github.py +362 -0
  90. data/vendor/pygments-main/pygments/lexers/hdl.py +356 -0
  91. data/vendor/pygments-main/pygments/lexers/jvm.py +847 -0
  92. data/vendor/pygments-main/pygments/lexers/math.py +1072 -0
  93. data/vendor/pygments-main/pygments/lexers/other.py +3339 -0
  94. data/vendor/pygments-main/pygments/lexers/parsers.py +695 -0
  95. data/vendor/pygments-main/pygments/lexers/shell.py +361 -0
  96. data/vendor/pygments-main/pygments/lexers/special.py +100 -0
  97. data/vendor/pygments-main/pygments/lexers/sql.py +559 -0
  98. data/vendor/pygments-main/pygments/lexers/templates.py +1631 -0
  99. data/vendor/pygments-main/pygments/lexers/text.py +1753 -0
  100. data/vendor/pygments-main/pygments/lexers/web.py +2864 -0
  101. data/vendor/pygments-main/pygments/plugin.py +74 -0
  102. data/vendor/pygments-main/pygments/scanner.py +104 -0
  103. data/vendor/pygments-main/pygments/style.py +117 -0
  104. data/vendor/pygments-main/pygments/styles/__init__.py +70 -0
  105. data/vendor/pygments-main/pygments/styles/autumn.py +65 -0
  106. data/vendor/pygments-main/pygments/styles/borland.py +51 -0
  107. data/vendor/pygments-main/pygments/styles/bw.py +49 -0
  108. data/vendor/pygments-main/pygments/styles/colorful.py +81 -0
  109. data/vendor/pygments-main/pygments/styles/default.py +73 -0
  110. data/vendor/pygments-main/pygments/styles/emacs.py +72 -0
  111. data/vendor/pygments-main/pygments/styles/friendly.py +72 -0
  112. data/vendor/pygments-main/pygments/styles/fruity.py +42 -0
  113. data/vendor/pygments-main/pygments/styles/manni.py +75 -0
  114. data/vendor/pygments-main/pygments/styles/monokai.py +106 -0
  115. data/vendor/pygments-main/pygments/styles/murphy.py +80 -0
  116. data/vendor/pygments-main/pygments/styles/native.py +65 -0
  117. data/vendor/pygments-main/pygments/styles/pastie.py +75 -0
  118. data/vendor/pygments-main/pygments/styles/perldoc.py +69 -0
  119. data/vendor/pygments-main/pygments/styles/rrt.py +33 -0
  120. data/vendor/pygments-main/pygments/styles/tango.py +141 -0
  121. data/vendor/pygments-main/pygments/styles/trac.py +63 -0
  122. data/vendor/pygments-main/pygments/styles/vim.py +63 -0
  123. data/vendor/pygments-main/pygments/styles/vs.py +38 -0
  124. data/vendor/pygments-main/pygments/token.py +195 -0
  125. data/vendor/pygments-main/pygments/unistring.py +130 -0
  126. data/vendor/pygments-main/pygments/util.py +232 -0
  127. data/vendor/pygments-main/scripts/check_sources.py +242 -0
  128. data/vendor/pygments-main/scripts/detect_missing_analyse_text.py +30 -0
  129. data/vendor/pygments-main/scripts/epydoc.css +280 -0
  130. data/vendor/pygments-main/scripts/find_codetags.py +205 -0
  131. data/vendor/pygments-main/scripts/find_error.py +171 -0
  132. data/vendor/pygments-main/scripts/get_vimkw.py +43 -0
  133. data/vendor/pygments-main/scripts/pylintrc +301 -0
  134. data/vendor/pygments-main/scripts/reindent.py +291 -0
  135. data/vendor/pygments-main/scripts/vim2pygments.py +933 -0
  136. data/vendor/pygments-main/setup.cfg +6 -0
  137. data/vendor/pygments-main/setup.py +88 -0
  138. data/vendor/pygments-main/tests/dtds/HTML4-f.dtd +37 -0
  139. data/vendor/pygments-main/tests/dtds/HTML4-s.dtd +869 -0
  140. data/vendor/pygments-main/tests/dtds/HTML4.dcl +88 -0
  141. data/vendor/pygments-main/tests/dtds/HTML4.dtd +1092 -0
  142. data/vendor/pygments-main/tests/dtds/HTML4.soc +9 -0
  143. data/vendor/pygments-main/tests/dtds/HTMLlat1.ent +195 -0
  144. data/vendor/pygments-main/tests/dtds/HTMLspec.ent +77 -0
  145. data/vendor/pygments-main/tests/dtds/HTMLsym.ent +241 -0
  146. data/vendor/pygments-main/tests/examplefiles/ANTLRv3.g +608 -0
  147. data/vendor/pygments-main/tests/examplefiles/AcidStateAdvanced.hs +209 -0
  148. data/vendor/pygments-main/tests/examplefiles/AlternatingGroup.mu +102 -0
  149. data/vendor/pygments-main/tests/examplefiles/CPDictionary.j +611 -0
  150. data/vendor/pygments-main/tests/examplefiles/Constants.mo +158 -0
  151. data/vendor/pygments-main/tests/examplefiles/DancingSudoku.lhs +411 -0
  152. data/vendor/pygments-main/tests/examplefiles/Errors.scala +18 -0
  153. data/vendor/pygments-main/tests/examplefiles/File.hy +174 -0
  154. data/vendor/pygments-main/tests/examplefiles/Intro.java +1660 -0
  155. data/vendor/pygments-main/tests/examplefiles/Makefile +1131 -0
  156. data/vendor/pygments-main/tests/examplefiles/Object.st +4394 -0
  157. data/vendor/pygments-main/tests/examplefiles/OrderedMap.hx +584 -0
  158. data/vendor/pygments-main/tests/examplefiles/SmallCheck.hs +378 -0
  159. data/vendor/pygments-main/tests/examplefiles/Sorting.mod +470 -0
  160. data/vendor/pygments-main/tests/examplefiles/Sudoku.lhs +382 -0
  161. data/vendor/pygments-main/tests/examplefiles/addressbook.proto +30 -0
  162. data/vendor/pygments-main/tests/examplefiles/antlr_throws +1 -0
  163. data/vendor/pygments-main/tests/examplefiles/apache2.conf +393 -0
  164. data/vendor/pygments-main/tests/examplefiles/as3_test.as +143 -0
  165. data/vendor/pygments-main/tests/examplefiles/as3_test2.as +46 -0
  166. data/vendor/pygments-main/tests/examplefiles/as3_test3.as +3 -0
  167. data/vendor/pygments-main/tests/examplefiles/aspx-cs_example +27 -0
  168. data/vendor/pygments-main/tests/examplefiles/badcase.java +2 -0
  169. data/vendor/pygments-main/tests/examplefiles/batchfile.bat +49 -0
  170. data/vendor/pygments-main/tests/examplefiles/boot-9.scm +1557 -0
  171. data/vendor/pygments-main/tests/examplefiles/cells.ps +515 -0
  172. data/vendor/pygments-main/tests/examplefiles/ceval.c +2604 -0
  173. data/vendor/pygments-main/tests/examplefiles/cheetah_example.html +13 -0
  174. data/vendor/pygments-main/tests/examplefiles/classes.dylan +40 -0
  175. data/vendor/pygments-main/tests/examplefiles/condensed_ruby.rb +10 -0
  176. data/vendor/pygments-main/tests/examplefiles/coq_RelationClasses +447 -0
  177. data/vendor/pygments-main/tests/examplefiles/database.pytb +20 -0
  178. data/vendor/pygments-main/tests/examplefiles/de.MoinMoin.po +2461 -0
  179. data/vendor/pygments-main/tests/examplefiles/demo.ahk +181 -0
  180. data/vendor/pygments-main/tests/examplefiles/demo.cfm +38 -0
  181. data/vendor/pygments-main/tests/examplefiles/django_sample.html+django +68 -0
  182. data/vendor/pygments-main/tests/examplefiles/dwarf.cw +17 -0
  183. data/vendor/pygments-main/tests/examplefiles/erl_session +10 -0
  184. data/vendor/pygments-main/tests/examplefiles/escape_semicolon.clj +1 -0
  185. data/vendor/pygments-main/tests/examplefiles/evil_regex.js +48 -0
  186. data/vendor/pygments-main/tests/examplefiles/example.c +2080 -0
  187. data/vendor/pygments-main/tests/examplefiles/example.cls +15 -0
  188. data/vendor/pygments-main/tests/examplefiles/example.cpp +2363 -0
  189. data/vendor/pygments-main/tests/examplefiles/example.gs +106 -0
  190. data/vendor/pygments-main/tests/examplefiles/example.gst +7 -0
  191. data/vendor/pygments-main/tests/examplefiles/example.kt +47 -0
  192. data/vendor/pygments-main/tests/examplefiles/example.lua +250 -0
  193. data/vendor/pygments-main/tests/examplefiles/example.moo +26 -0
  194. data/vendor/pygments-main/tests/examplefiles/example.moon +629 -0
  195. data/vendor/pygments-main/tests/examplefiles/example.nim +1010 -0
  196. data/vendor/pygments-main/tests/examplefiles/example.ns2 +69 -0
  197. data/vendor/pygments-main/tests/examplefiles/example.p +34 -0
  198. data/vendor/pygments-main/tests/examplefiles/example.pas +2708 -0
  199. data/vendor/pygments-main/tests/examplefiles/example.rb +1852 -0
  200. data/vendor/pygments-main/tests/examplefiles/example.rhtml +561 -0
  201. data/vendor/pygments-main/tests/examplefiles/example.sh-session +19 -0
  202. data/vendor/pygments-main/tests/examplefiles/example.sml +156 -0
  203. data/vendor/pygments-main/tests/examplefiles/example.snobol +15 -0
  204. data/vendor/pygments-main/tests/examplefiles/example.tea +34 -0
  205. data/vendor/pygments-main/tests/examplefiles/example.u +548 -0
  206. data/vendor/pygments-main/tests/examplefiles/example.weechatlog +9 -0
  207. data/vendor/pygments-main/tests/examplefiles/example.xhtml +376 -0
  208. data/vendor/pygments-main/tests/examplefiles/example.yaml +302 -0
  209. data/vendor/pygments-main/tests/examplefiles/example2.aspx +29 -0
  210. data/vendor/pygments-main/tests/examplefiles/example_elixir.ex +363 -0
  211. data/vendor/pygments-main/tests/examplefiles/example_file.fy +128 -0
  212. data/vendor/pygments-main/tests/examplefiles/firefox.mak +586 -0
  213. data/vendor/pygments-main/tests/examplefiles/flipflop.sv +19 -0
  214. data/vendor/pygments-main/tests/examplefiles/foo.sce +6 -0
  215. data/vendor/pygments-main/tests/examplefiles/format.ml +1213 -0
  216. data/vendor/pygments-main/tests/examplefiles/fucked_up.rb +77 -0
  217. data/vendor/pygments-main/tests/examplefiles/function.mu +1 -0
  218. data/vendor/pygments-main/tests/examplefiles/functional.rst +1472 -0
  219. data/vendor/pygments-main/tests/examplefiles/genclass.clj +510 -0
  220. data/vendor/pygments-main/tests/examplefiles/genshi_example.xml+genshi +193 -0
  221. data/vendor/pygments-main/tests/examplefiles/genshitext_example.genshitext +33 -0
  222. data/vendor/pygments-main/tests/examplefiles/glsl.frag +7 -0
  223. data/vendor/pygments-main/tests/examplefiles/glsl.vert +13 -0
  224. data/vendor/pygments-main/tests/examplefiles/html+php_faulty.php +1 -0
  225. data/vendor/pygments-main/tests/examplefiles/http_request_example +14 -0
  226. data/vendor/pygments-main/tests/examplefiles/http_response_example +27 -0
  227. data/vendor/pygments-main/tests/examplefiles/import.hs +4 -0
  228. data/vendor/pygments-main/tests/examplefiles/intro.ik +24 -0
  229. data/vendor/pygments-main/tests/examplefiles/ints.php +10 -0
  230. data/vendor/pygments-main/tests/examplefiles/intsyn.fun +675 -0
  231. data/vendor/pygments-main/tests/examplefiles/intsyn.sig +286 -0
  232. data/vendor/pygments-main/tests/examplefiles/irb_heredoc +8 -0
  233. data/vendor/pygments-main/tests/examplefiles/irc.lsp +214 -0
  234. data/vendor/pygments-main/tests/examplefiles/java.properties +16 -0
  235. data/vendor/pygments-main/tests/examplefiles/jbst_example1.jbst +28 -0
  236. data/vendor/pygments-main/tests/examplefiles/jbst_example2.jbst +45 -0
  237. data/vendor/pygments-main/tests/examplefiles/jinjadesignerdoc.rst +713 -0
  238. data/vendor/pygments-main/tests/examplefiles/lighttpd_config.conf +13 -0
  239. data/vendor/pygments-main/tests/examplefiles/linecontinuation.py +47 -0
  240. data/vendor/pygments-main/tests/examplefiles/ltmain.sh +2849 -0
  241. data/vendor/pygments-main/tests/examplefiles/main.cmake +42 -0
  242. data/vendor/pygments-main/tests/examplefiles/markdown.lsp +679 -0
  243. data/vendor/pygments-main/tests/examplefiles/matlab_noreturn +3 -0
  244. data/vendor/pygments-main/tests/examplefiles/matlab_sample +27 -0
  245. data/vendor/pygments-main/tests/examplefiles/matlabsession_sample.txt +37 -0
  246. data/vendor/pygments-main/tests/examplefiles/minimal.ns2 +4 -0
  247. data/vendor/pygments-main/tests/examplefiles/moin_SyntaxReference.txt +340 -0
  248. data/vendor/pygments-main/tests/examplefiles/multiline_regexes.rb +38 -0
  249. data/vendor/pygments-main/tests/examplefiles/nasm_aoutso.asm +96 -0
  250. data/vendor/pygments-main/tests/examplefiles/nasm_objexe.asm +30 -0
  251. data/vendor/pygments-main/tests/examplefiles/nemerle_sample.n +87 -0
  252. data/vendor/pygments-main/tests/examplefiles/nginx_nginx.conf +118 -0
  253. data/vendor/pygments-main/tests/examplefiles/numbers.c +12 -0
  254. data/vendor/pygments-main/tests/examplefiles/objc_example.m +25 -0
  255. data/vendor/pygments-main/tests/examplefiles/objc_example2.m +24 -0
  256. data/vendor/pygments-main/tests/examplefiles/perl_misc +62 -0
  257. data/vendor/pygments-main/tests/examplefiles/perl_perl5db +998 -0
  258. data/vendor/pygments-main/tests/examplefiles/perl_regex-delims +120 -0
  259. data/vendor/pygments-main/tests/examplefiles/perlfunc.1 +856 -0
  260. data/vendor/pygments-main/tests/examplefiles/phpcomplete.vim +567 -0
  261. data/vendor/pygments-main/tests/examplefiles/pleac.in.rb +1223 -0
  262. data/vendor/pygments-main/tests/examplefiles/postgresql_test.txt +47 -0
  263. data/vendor/pygments-main/tests/examplefiles/pppoe.applescript +10 -0
  264. data/vendor/pygments-main/tests/examplefiles/psql_session.txt +122 -0
  265. data/vendor/pygments-main/tests/examplefiles/py3_test.txt +2 -0
  266. data/vendor/pygments-main/tests/examplefiles/pycon_test.pycon +14 -0
  267. data/vendor/pygments-main/tests/examplefiles/pytb_test2.pytb +2 -0
  268. data/vendor/pygments-main/tests/examplefiles/python25-bsd.mak +234 -0
  269. data/vendor/pygments-main/tests/examplefiles/qsort.prolog +13 -0
  270. data/vendor/pygments-main/tests/examplefiles/r-console-transcript.Rout +38 -0
  271. data/vendor/pygments-main/tests/examplefiles/ragel-cpp_rlscan +280 -0
  272. data/vendor/pygments-main/tests/examplefiles/ragel-cpp_snippet +2 -0
  273. data/vendor/pygments-main/tests/examplefiles/regex.js +22 -0
  274. data/vendor/pygments-main/tests/examplefiles/reversi.lsp +427 -0
  275. data/vendor/pygments-main/tests/examplefiles/ruby_func_def.rb +11 -0
  276. data/vendor/pygments-main/tests/examplefiles/scilab.sci +30 -0
  277. data/vendor/pygments-main/tests/examplefiles/sibling.prolog +19 -0
  278. data/vendor/pygments-main/tests/examplefiles/simple.md +747 -0
  279. data/vendor/pygments-main/tests/examplefiles/smarty_example.html +209 -0
  280. data/vendor/pygments-main/tests/examplefiles/source.lgt +343 -0
  281. data/vendor/pygments-main/tests/examplefiles/sources.list +62 -0
  282. data/vendor/pygments-main/tests/examplefiles/sphere.pov +18 -0
  283. data/vendor/pygments-main/tests/examplefiles/sqlite3.sqlite3-console +27 -0
  284. data/vendor/pygments-main/tests/examplefiles/squid.conf +30 -0
  285. data/vendor/pygments-main/tests/examplefiles/string.jl +1031 -0
  286. data/vendor/pygments-main/tests/examplefiles/string_delimiters.d +21 -0
  287. data/vendor/pygments-main/tests/examplefiles/stripheredoc.sh +3 -0
  288. data/vendor/pygments-main/tests/examplefiles/test.R +119 -0
  289. data/vendor/pygments-main/tests/examplefiles/test.adb +211 -0
  290. data/vendor/pygments-main/tests/examplefiles/test.asy +131 -0
  291. data/vendor/pygments-main/tests/examplefiles/test.awk +121 -0
  292. data/vendor/pygments-main/tests/examplefiles/test.bas +29 -0
  293. data/vendor/pygments-main/tests/examplefiles/test.bmx +145 -0
  294. data/vendor/pygments-main/tests/examplefiles/test.boo +39 -0
  295. data/vendor/pygments-main/tests/examplefiles/test.bro +250 -0
  296. data/vendor/pygments-main/tests/examplefiles/test.cs +374 -0
  297. data/vendor/pygments-main/tests/examplefiles/test.css +54 -0
  298. data/vendor/pygments-main/tests/examplefiles/test.d +135 -0
  299. data/vendor/pygments-main/tests/examplefiles/test.dart +23 -0
  300. data/vendor/pygments-main/tests/examplefiles/test.dtd +89 -0
  301. data/vendor/pygments-main/tests/examplefiles/test.ec +605 -0
  302. data/vendor/pygments-main/tests/examplefiles/test.ecl +58 -0
  303. data/vendor/pygments-main/tests/examplefiles/test.eh +315 -0
  304. data/vendor/pygments-main/tests/examplefiles/test.erl +169 -0
  305. data/vendor/pygments-main/tests/examplefiles/test.evoque +33 -0
  306. data/vendor/pygments-main/tests/examplefiles/test.fan +818 -0
  307. data/vendor/pygments-main/tests/examplefiles/test.flx +57 -0
  308. data/vendor/pygments-main/tests/examplefiles/test.gdc +13 -0
  309. data/vendor/pygments-main/tests/examplefiles/test.groovy +97 -0
  310. data/vendor/pygments-main/tests/examplefiles/test.html +339 -0
  311. data/vendor/pygments-main/tests/examplefiles/test.ini +10 -0
  312. data/vendor/pygments-main/tests/examplefiles/test.java +653 -0
  313. data/vendor/pygments-main/tests/examplefiles/test.jsp +24 -0
  314. data/vendor/pygments-main/tests/examplefiles/test.maql +45 -0
  315. data/vendor/pygments-main/tests/examplefiles/test.mod +374 -0
  316. data/vendor/pygments-main/tests/examplefiles/test.moo +51 -0
  317. data/vendor/pygments-main/tests/examplefiles/test.myt +166 -0
  318. data/vendor/pygments-main/tests/examplefiles/test.nim +93 -0
  319. data/vendor/pygments-main/tests/examplefiles/test.pas +743 -0
  320. data/vendor/pygments-main/tests/examplefiles/test.php +505 -0
  321. data/vendor/pygments-main/tests/examplefiles/test.plot +333 -0
  322. data/vendor/pygments-main/tests/examplefiles/test.ps1 +108 -0
  323. data/vendor/pygments-main/tests/examplefiles/test.pypylog +1839 -0
  324. data/vendor/pygments-main/tests/examplefiles/test.r3 +94 -0
  325. data/vendor/pygments-main/tests/examplefiles/test.rb +177 -0
  326. data/vendor/pygments-main/tests/examplefiles/test.rhtml +43 -0
  327. data/vendor/pygments-main/tests/examplefiles/test.scaml +8 -0
  328. data/vendor/pygments-main/tests/examplefiles/test.ssp +12 -0
  329. data/vendor/pygments-main/tests/examplefiles/test.tcsh +830 -0
  330. data/vendor/pygments-main/tests/examplefiles/test.vb +407 -0
  331. data/vendor/pygments-main/tests/examplefiles/test.vhdl +161 -0
  332. data/vendor/pygments-main/tests/examplefiles/test.xqy +138 -0
  333. data/vendor/pygments-main/tests/examplefiles/test.xsl +23 -0
  334. data/vendor/pygments-main/tests/examplefiles/truncated.pytb +15 -0
  335. data/vendor/pygments-main/tests/examplefiles/type.lisp +1202 -0
  336. data/vendor/pygments-main/tests/examplefiles/underscore.coffee +603 -0
  337. data/vendor/pygments-main/tests/examplefiles/unicode.applescript +5 -0
  338. data/vendor/pygments-main/tests/examplefiles/unicodedoc.py +11 -0
  339. data/vendor/pygments-main/tests/examplefiles/webkit-transition.css +3 -0
  340. data/vendor/pygments-main/tests/examplefiles/while.pov +13 -0
  341. data/vendor/pygments-main/tests/examplefiles/wiki.factor +384 -0
  342. data/vendor/pygments-main/tests/examplefiles/xml_example +1897 -0
  343. data/vendor/pygments-main/tests/examplefiles/zmlrpc.f90 +798 -0
  344. data/vendor/pygments-main/tests/old_run.py +138 -0
  345. data/vendor/pygments-main/tests/run.py +48 -0
  346. data/vendor/pygments-main/tests/support.py +15 -0
  347. data/vendor/pygments-main/tests/test_basic_api.py +294 -0
  348. data/vendor/pygments-main/tests/test_clexer.py +31 -0
  349. data/vendor/pygments-main/tests/test_cmdline.py +105 -0
  350. data/vendor/pygments-main/tests/test_examplefiles.py +97 -0
  351. data/vendor/pygments-main/tests/test_html_formatter.py +162 -0
  352. data/vendor/pygments-main/tests/test_latex_formatter.py +55 -0
  353. data/vendor/pygments-main/tests/test_perllexer.py +137 -0
  354. data/vendor/pygments-main/tests/test_regexlexer.py +47 -0
  355. data/vendor/pygments-main/tests/test_token.py +46 -0
  356. data/vendor/pygments-main/tests/test_using_api.py +40 -0
  357. data/vendor/pygments-main/tests/test_util.py +116 -0
  358. data/vendor/simplejson/.gitignore +10 -0
  359. data/vendor/simplejson/.travis.yml +5 -0
  360. data/vendor/simplejson/CHANGES.txt +291 -0
  361. data/vendor/simplejson/LICENSE.txt +19 -0
  362. data/vendor/simplejson/MANIFEST.in +5 -0
  363. data/vendor/simplejson/README.rst +19 -0
  364. data/vendor/simplejson/conf.py +179 -0
  365. data/vendor/simplejson/index.rst +628 -0
  366. data/vendor/simplejson/scripts/make_docs.py +18 -0
  367. data/vendor/simplejson/setup.py +104 -0
  368. data/vendor/simplejson/simplejson/__init__.py +510 -0
  369. data/vendor/simplejson/simplejson/_speedups.c +2745 -0
  370. data/vendor/simplejson/simplejson/decoder.py +425 -0
  371. data/vendor/simplejson/simplejson/encoder.py +567 -0
  372. data/vendor/simplejson/simplejson/ordered_dict.py +119 -0
  373. data/vendor/simplejson/simplejson/scanner.py +77 -0
  374. data/vendor/simplejson/simplejson/tests/__init__.py +67 -0
  375. data/vendor/simplejson/simplejson/tests/test_bigint_as_string.py +55 -0
  376. data/vendor/simplejson/simplejson/tests/test_check_circular.py +30 -0
  377. data/vendor/simplejson/simplejson/tests/test_decimal.py +66 -0
  378. data/vendor/simplejson/simplejson/tests/test_decode.py +83 -0
  379. data/vendor/simplejson/simplejson/tests/test_default.py +9 -0
  380. data/vendor/simplejson/simplejson/tests/test_dump.py +67 -0
  381. data/vendor/simplejson/simplejson/tests/test_encode_basestring_ascii.py +46 -0
  382. data/vendor/simplejson/simplejson/tests/test_encode_for_html.py +32 -0
  383. data/vendor/simplejson/simplejson/tests/test_errors.py +34 -0
  384. data/vendor/simplejson/simplejson/tests/test_fail.py +91 -0
  385. data/vendor/simplejson/simplejson/tests/test_float.py +19 -0
  386. data/vendor/simplejson/simplejson/tests/test_indent.py +86 -0
  387. data/vendor/simplejson/simplejson/tests/test_item_sort_key.py +20 -0
  388. data/vendor/simplejson/simplejson/tests/test_namedtuple.py +121 -0
  389. data/vendor/simplejson/simplejson/tests/test_pass1.py +76 -0
  390. data/vendor/simplejson/simplejson/tests/test_pass2.py +14 -0
  391. data/vendor/simplejson/simplejson/tests/test_pass3.py +20 -0
  392. data/vendor/simplejson/simplejson/tests/test_recursion.py +67 -0
  393. data/vendor/simplejson/simplejson/tests/test_scanstring.py +117 -0
  394. data/vendor/simplejson/simplejson/tests/test_separators.py +42 -0
  395. data/vendor/simplejson/simplejson/tests/test_speedups.py +20 -0
  396. data/vendor/simplejson/simplejson/tests/test_tuple.py +49 -0
  397. data/vendor/simplejson/simplejson/tests/test_unicode.py +109 -0
  398. data/vendor/simplejson/simplejson/tool.py +39 -0
  399. metadata +492 -0
@@ -0,0 +1,62 @@
1
+ ## CD ROM
2
+ deb cdrom:[Xubuntu 6.06.1 _Dapper Drake_ - Release i386 (20060807)]/ dapper main restricted
3
+
4
+ deb http://archive.ubuntu.com/ubuntu/ dapper main restricted
5
+ deb-src http://archive.ubuntu.com/ubuntu/ dapper main restricted
6
+
7
+ deb http://foo.com/$(ARCH)/ main foo
8
+
9
+ ## Major bug fix updates produced after the final release of the
10
+ ## distribution.
11
+ deb http://archive.ubuntu.com/ubuntu/ dapper-updates main restricted
12
+ deb-src http://archive.ubuntu.com/ubuntu/ dapper-updates main restricted
13
+
14
+ ## Uncomment the following two lines to add software from the 'universe'
15
+ ## repository.
16
+ ## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
17
+ ## team, and may not be under a free licence. Please satisfy yourself as to
18
+ ## your rights to use the software. Also, please note that software in
19
+ ## universe WILL NOT receive any review or updates from the Ubuntu security
20
+ ## team.
21
+ deb http://archive.ubuntu.com/ubuntu/ dapper universe multiverse
22
+ deb-src http://archive.ubuntu.com/ubuntu/ dapper universe multiverse
23
+
24
+ ## Uncomment the following two lines to add software from the 'backports'
25
+ ## repository.
26
+ ## N.B. software from this repository may not have been tested as
27
+ ## extensively as that contained in the main release, although it includes
28
+ ## newer versions of some applications which may provide useful features.
29
+ ## Also, please note that software in backports WILL NOT receive any review
30
+ ## or updates from the Ubuntu security team.
31
+ deb http://archive.ubuntu.com/ubuntu/ dapper-backports main restricted universe multiverse
32
+ deb-src http://archive.ubuntu.com/ubuntu/ dapper-backports main restricted universe multiverse
33
+
34
+ deb http://security.ubuntu.com/ubuntu dapper-security main restricted
35
+ deb-src http://security.ubuntu.com/ubuntu dapper-security main restricted
36
+ deb http://security.ubuntu.com/ubuntu dapper-security universe multiverse
37
+ deb-src http://security.ubuntu.com/ubuntu dapper-security universe multiverse
38
+
39
+ ## dapper-commercial by canonical
40
+ ## currently has realplay (realplayer 10) and opera (opera 9)
41
+ deb http://archive.canonical.com/ubuntu dapper-commercial main
42
+
43
+ ## Bleeding edge wine repository for Dapper
44
+ ## only uncomment it if you need it
45
+ ## deb http://wine.budgetdedicated.com/apt dapper main
46
+ ## deb-src http://wine.budgetdedicated.com/apt dapper main
47
+
48
+ ## skype
49
+ ## only uncomment it if you need it
50
+ ## deb http://download.skype.com/linux/repos/debian/ stable non-free
51
+
52
+ deb http://de.archive.ubuntu.com/ubuntu/ edgy main restricted multiverse universe
53
+
54
+ deb http://de.archive.ubuntu.com/ubuntu/ edgy-updates main restricted multiverse universe
55
+
56
+ deb http://de.archive.ubuntu.com/ubuntu/ edgy-backports main restricted universe multiverse
57
+
58
+ deb http://security.ubuntu.com/ubuntu edgy-security main restricted universe multiverse
59
+
60
+ deb http://wine.budgetdedicated.com/apt edgy main
61
+
62
+ deb http://archive.czessi.net/ubuntu edgy main restricted universe multiverse i18n-de
@@ -0,0 +1,18 @@
1
+ #include "colors.inc"
2
+
3
+ background { color Cyan }
4
+
5
+ camera {
6
+ location <0, 2, -3>
7
+ look_at <0, 1, 2>
8
+ }
9
+
10
+ sphere {
11
+ <0, 1, 2>, 2
12
+ texture {
13
+ pigment { color Yellow }
14
+ }
15
+ }
16
+
17
+ light_source { <2, 4, -3> color White}
18
+
@@ -0,0 +1,27 @@
1
+ SQLite version 3.4.2
2
+ Enter ".help" for instructions
3
+ sqlite> .schema
4
+ CREATE TABLE paste (paste_id integer, code text, parsed_code text, pub_date
5
+ varchar(24), language varchar(64), parent_id integer, url varchar(128));
6
+ CREATE TABLE vars (key varchar(24), value varchar(128));
7
+ sqlite> a '
8
+ ...> '
9
+ ...> ;
10
+ SQL error: near "a": syntax error
11
+ sqlite> %;
12
+ SQL error: near "%": syntax error
13
+ sqlite> select count(language), language from paste group by language order
14
+ ...> by count(language) desc;
15
+ 144|python
16
+ 76|text
17
+ 22|pycon
18
+ 9|ruby
19
+ 7|c
20
+ 7|js
21
+ 6|html+django
22
+ 4|html
23
+ 4|tex
24
+ 2|html+php
25
+ 1|cpp
26
+ 1|scheme
27
+ sqlite>
@@ -0,0 +1,30 @@
1
+ # Some multiline comments
2
+
3
+ acl manager proto cache_object
4
+ acl localhost src 127.0.0.1/32 ::1
5
+ acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
6
+ acl SSL_ports port 443
7
+ acl Safe_ports port 80 # http
8
+ acl Safe_ports port 21 # ftp
9
+ acl Safe_ports port 443 # https
10
+ acl Safe_ports port 70 # gopher
11
+ acl Safe_ports port 210 # wais
12
+ acl Safe_ports port 1025-65535 # unregistered ports
13
+ acl Safe_ports port 280 # http-mgmt
14
+ acl Safe_ports port 488 # gss-http
15
+ acl Safe_ports port 591 # filemaker
16
+ acl Safe_ports port 777 # multiling http
17
+ acl CONNECT method CONNECT
18
+ http_access allow manager localhost
19
+ http_access deny manager
20
+ http_access deny !Safe_ports
21
+ http_access deny CONNECT !SSL_ports
22
+ http_access allow localhost
23
+ http_access deny all
24
+ http_port 3128
25
+ hierarchy_stoplist cgi-bin ?
26
+ coredump_dir /var/spool/squid3
27
+ refresh_pattern ^ftp: 1440 20% 10080
28
+ refresh_pattern ^gopher: 1440 0% 1440
29
+ refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
30
+ refresh_pattern . 0 20% 4320
@@ -0,0 +1,1031 @@
1
+ ## core string functions ##
2
+
3
+ length(s::String) = error("you must implement length(",typeof(s),")")
4
+ next(s::String, i::Int) = error("you must implement next(",typeof(s),",Int)")
5
+ next(s::DirectIndexString, i::Int) = (s[i],i+1)
6
+ next(s::String, i::Integer) = next(s,int(i))
7
+
8
+ ## generic supplied functions ##
9
+
10
+ start(s::String) = 1
11
+ done(s::String,i) = (i > length(s))
12
+ isempty(s::String) = done(s,start(s))
13
+ ref(s::String, i::Int) = next(s,i)[1]
14
+ ref(s::String, i::Integer) = s[int(i)]
15
+ ref(s::String, x::Real) = s[iround(x)]
16
+ ref{T<:Integer}(s::String, r::Range1{T}) = s[int(first(r)):int(last(r))]
17
+
18
+ symbol(s::String) = symbol(cstring(s))
19
+ string(s::String) = s
20
+
21
+ print(s::String) = for c=s; print(c); end
22
+ print(x...) = for i=x; print(i); end
23
+ println(args...) = print(args..., '\n')
24
+
25
+ show(s::String) = print_quoted(s)
26
+
27
+ (*)(s::String...) = strcat(s...)
28
+ (^)(s::String, r::Integer) = repeat(s,r)
29
+
30
+ size(s::String) = (length(s),)
31
+ size(s::String, d::Integer) = d==1 ? length(s) :
32
+ error("in size: dimension ",d," out of range")
33
+
34
+ strlen(s::DirectIndexString) = length(s)
35
+ function strlen(s::String)
36
+ i = start(s)
37
+ if done(s,i)
38
+ return 0
39
+ end
40
+ n = 1
41
+ while true
42
+ c, j = next(s,i)
43
+ if done(s,j)
44
+ return n
45
+ end
46
+ n += 1
47
+ i = j
48
+ end
49
+ end
50
+
51
+ isvalid(s::DirectIndexString, i::Integer) = (start(s) <= i <= length(s))
52
+ function isvalid(s::String, i::Integer)
53
+ try
54
+ next(s,i)
55
+ true
56
+ catch
57
+ false
58
+ end
59
+ end
60
+
61
+ prevind(s::DirectIndexString, i::Integer) = i-1
62
+ thisind(s::DirectIndexString, i::Integer) = i
63
+ nextind(s::DirectIndexString, i::Integer) = i+1
64
+
65
+ prevind(s::String, i::Integer) = thisind(s,thisind(s,i)-1)
66
+
67
+ function thisind(s::String, i::Integer)
68
+ for j = i:-1:1
69
+ if isvalid(s,j)
70
+ return j
71
+ end
72
+ end
73
+ return 0 # out of range
74
+ end
75
+
76
+ function nextind(s::String, i::Integer)
77
+ for j = i+1:length(s)
78
+ if isvalid(s,j)
79
+ return j
80
+ end
81
+ end
82
+ length(s)+1 # out of range
83
+ end
84
+
85
+ ind2chr(s::DirectIndexString, i::Integer) = i
86
+ chr2ind(s::DirectIndexString, i::Integer) = i
87
+
88
+ function ind2chr(s::String, i::Integer)
89
+ s[i] # throws error if invalid
90
+ j = 1
91
+ k = start(s)
92
+ while true
93
+ c, l = next(s,k)
94
+ if i <= k
95
+ return j
96
+ end
97
+ j += 1
98
+ k = l
99
+ end
100
+ end
101
+
102
+ function chr2ind(s::String, i::Integer)
103
+ if i < 1
104
+ return i
105
+ end
106
+ j = 1
107
+ k = start(s)
108
+ while true
109
+ c, l = next(s,k)
110
+ if i == j
111
+ return k
112
+ end
113
+ j += 1
114
+ k = l
115
+ end
116
+ end
117
+
118
+ function strchr(s::String, c::Char, i::Integer)
119
+ i = nextind(s,i)
120
+ while !done(s,i)
121
+ d, j = next(s,i)
122
+ if c == d
123
+ return i
124
+ end
125
+ i = j
126
+ end
127
+ return 0
128
+ end
129
+ strchr(s::String, c::Char) = strchr(s, c, start(s))
130
+ contains(s::String, c::Char) = (strchr(s,c)!=0)
131
+
132
+ function chars(s::String)
133
+ cx = Array(Char,strlen(s))
134
+ i = 0
135
+ for c in s
136
+ cx[i += 1] = c
137
+ end
138
+ return cx
139
+ end
140
+
141
+ function cmp(a::String, b::String)
142
+ i = start(a)
143
+ j = start(b)
144
+ while !done(a,i) && !done(b,i)
145
+ c, i = next(a,i)
146
+ d, j = next(b,j)
147
+ if c != d
148
+ return c < d ? -1 : +1
149
+ end
150
+ end
151
+ done(a,i) && !done(b,j) ? -1 :
152
+ !done(a,i) && done(b,j) ? +1 : 0
153
+ end
154
+
155
+ isequal(a::String, b::String) = cmp(a,b) == 0
156
+ isless(a::String, b::String) = cmp(a,b) < 0
157
+
158
+ # faster comparisons for byte strings
159
+
160
+ cmp(a::ByteString, b::ByteString) = lexcmp(a.data, b.data)
161
+ isequal(a::ByteString, b::ByteString) = length(a)==length(b) && cmp(a,b)==0
162
+
163
+ ## character column width function ##
164
+
165
+ charwidth(c::Char) = max(0,int(ccall(:wcwidth, Int32, (Char,), c)))
166
+ strwidth(s::String) = (w=0; for c in s; w += charwidth(c); end; w)
167
+ strwidth(s::ByteString) = ccall(:u8_strwidth, Int, (Ptr{Uint8},), s.data)
168
+ # TODO: implement and use u8_strnwidth that takes a length argument
169
+
170
+ ## generic string uses only length and next ##
171
+
172
+ type GenericString <: String
173
+ string::String
174
+ end
175
+
176
+ length(s::GenericString) = length(s.string)
177
+ next(s::GenericString, i::Int) = next(s.string, i)
178
+
179
+ ## plain old character arrays ##
180
+
181
+ type CharString <: String
182
+ chars::Array{Char,1}
183
+
184
+ CharString(a::Array{Char,1}) = new(a)
185
+ CharString(c::Char...) = new([ c[i] | i=1:length(c) ])
186
+ end
187
+ CharString(x...) = CharString(map(char,x)...)
188
+
189
+ next(s::CharString, i::Int) = (s.chars[i], i+1)
190
+ length(s::CharString) = length(s.chars)
191
+ strlen(s::CharString) = length(s)
192
+
193
+ string(c::Char) = CharString(c)
194
+ string(c::Char, x::Char...) = CharString(c, x...)
195
+
196
+ ## substrings reference original strings ##
197
+
198
+ type SubString <: String
199
+ string::String
200
+ offset::Int
201
+ length::Int
202
+
203
+ SubString(s::String, i::Int, j::Int) = new(s, i-1, j-i+1)
204
+ SubString(s::SubString, i::Int, j::Int) =
205
+ new(s.string, i-1+s.offset, j-i+1)
206
+ end
207
+ SubString(s::String, i::Integer, j::Integer) = SubString(s, int(i), int(j))
208
+
209
+ function next(s::SubString, i::Int)
210
+ if i < 1 || i > s.length
211
+ error("string index out of bounds")
212
+ end
213
+ c, i = next(s.string, i+s.offset)
214
+ c, i-s.offset
215
+ end
216
+
217
+ length(s::SubString) = s.length
218
+ # TODO: strlen(s::SubString) = ??
219
+ # default implementation will work but it's slow
220
+ # can this be delegated efficiently somehow?
221
+ # that may require additional string interfaces
222
+
223
+ function ref(s::String, r::Range1{Int})
224
+ if first(r) < 1 || length(s) < last(r)
225
+ error("in substring slice: index out of range")
226
+ end
227
+ SubString(s, first(r), last(r))
228
+ end
229
+
230
+ ## efficient representation of repeated strings ##
231
+
232
+ type RepString <: String
233
+ string::String
234
+ repeat::Integer
235
+ end
236
+
237
+ length(s::RepString) = length(s.string)*s.repeat
238
+ strlen(s::RepString) = strlen(s.string)*s.repeat
239
+
240
+ function next(s::RepString, i::Int)
241
+ if i < 1 || i > length(s)
242
+ error("string index out of bounds")
243
+ end
244
+ j = mod1(i,length(s.string))
245
+ c, k = next(s.string, j)
246
+ c, k-j+i
247
+ end
248
+
249
+ function repeat(s::String, r::Integer)
250
+ r < 0 ? error("can't repeat a string ",r," times") :
251
+ r == 0 ? "" :
252
+ r == 1 ? s :
253
+ RepString(s,r)
254
+ end
255
+
256
+ ## reversed strings without data movement ##
257
+
258
+ type RevString <: String
259
+ string::String
260
+ end
261
+
262
+ length(s::RevString) = length(s.string)
263
+ strlen(s::RevString) = strlen(s.string)
264
+
265
+ start(s::RevString) = (n=length(s); n-thisind(s.string,n)+1)
266
+ function next(s::RevString, i::Int)
267
+ n = length(s); j = n-i+1
268
+ (s.string[j], n-thisind(s.string,j-1)+1)
269
+ end
270
+
271
+ reverse(s::String) = RevString(s)
272
+ reverse(s::RevString) = s.string
273
+
274
+ ## ropes for efficient concatenation, etc. ##
275
+
276
+ # Idea: instead of this standard binary tree structure,
277
+ # how about we keep an array of substrings, with an
278
+ # offset array. We can do binary search on the offset
279
+ # array so we get O(log(n)) indexing time still, but we
280
+ # can compute the offsets lazily and avoid all the
281
+ # futzing around while the string is being constructed.
282
+
283
+ type RopeString <: String
284
+ head::String
285
+ tail::String
286
+ depth::Int32
287
+ length::Int
288
+
289
+ RopeString(h::RopeString, t::RopeString) =
290
+ depth(h.tail) + depth(t) < depth(h.head) ?
291
+ RopeString(h.head, RopeString(h.tail, t)) :
292
+ new(h, t, max(h.depth,t.depth)+1, length(h)+length(t))
293
+
294
+ RopeString(h::RopeString, t::String) =
295
+ depth(h.tail) < depth(h.head) ?
296
+ RopeString(h.head, RopeString(h.tail, t)) :
297
+ new(h, t, h.depth+1, length(h)+length(t))
298
+
299
+ RopeString(h::String, t::RopeString) =
300
+ depth(t.head) < depth(t.tail) ?
301
+ RopeString(RopeString(h, t.head), t.tail) :
302
+ new(h, t, t.depth+1, length(h)+length(t))
303
+
304
+ RopeString(h::String, t::String) =
305
+ new(h, t, 1, length(h)+length(t))
306
+ end
307
+
308
+ depth(s::String) = 0
309
+ depth(s::RopeString) = s.depth
310
+
311
+ function next(s::RopeString, i::Int)
312
+ if i <= length(s.head)
313
+ return next(s.head, i)
314
+ else
315
+ c, j = next(s.tail, i-length(s.head))
316
+ return c, j+length(s.head)
317
+ end
318
+ end
319
+
320
+ length(s::RopeString) = s.length
321
+ strlen(s::RopeString) = strlen(s.head) + strlen(s.tail)
322
+
323
+ strcat() = ""
324
+ strcat(s::String) = s
325
+ strcat(x...) = strcat(map(string,x)...)
326
+ strcat(s::String, t::String...) =
327
+ (t = strcat(t...); isempty(s) ? t : isempty(t) ? s : RopeString(s, t))
328
+
329
+ print(s::RopeString) = print(s.head, s.tail)
330
+
331
+ ## transformed strings ##
332
+
333
+ type TransformedString <: String
334
+ transform::Function
335
+ string::String
336
+ end
337
+
338
+ length(s::TransformedString) = length(s.string)
339
+ strlen(s::TransformedString) = strlen(s.string)
340
+
341
+ function next(s::TransformedString, i::Int)
342
+ c, j = next(s.string,i)
343
+ c = s.transform(c, i)
344
+ return c, j
345
+ end
346
+
347
+ ## uppercase and lowercase transformations ##
348
+
349
+ uppercase(c::Char) = ccall(:towupper, Char, (Char,), c)
350
+ lowercase(c::Char) = ccall(:towlower, Char, (Char,), c)
351
+
352
+ uppercase(s::String) = TransformedString((c,i)->uppercase(c), s)
353
+ lowercase(s::String) = TransformedString((c,i)->lowercase(c), s)
354
+
355
+ ucfirst(s::String) = TransformedString((c,i)->i==1 ? uppercase(c) : c, s)
356
+ lcfirst(s::String) = TransformedString((c,i)->i==1 ? lowercase(c) : c, s)
357
+
358
+ const uc = uppercase
359
+ const lc = lowercase
360
+
361
+ ## string map ##
362
+
363
+ function map(f::Function, s::String)
364
+ out = memio(length(s))
365
+ for c in s
366
+ write(out, f(c)::Char)
367
+ end
368
+ takebuf_string(out)
369
+ end
370
+
371
+ ## conversion of general objects to strings ##
372
+
373
+ string(x) = print_to_string(show, x)
374
+ cstring(x...) = print_to_string(print, x...)
375
+
376
+ function cstring(p::Ptr{Uint8})
377
+ p == C_NULL ? error("cannot convert NULL to string") :
378
+ ccall(:jl_cstr_to_string, Any, (Ptr{Uint8},), p)::ByteString
379
+ end
380
+
381
+ ## string promotion rules ##
382
+
383
+ promote_rule(::Type{UTF8String} , ::Type{ASCIIString}) = UTF8String
384
+ promote_rule(::Type{UTF8String} , ::Type{CharString} ) = UTF8String
385
+ promote_rule(::Type{ASCIIString}, ::Type{CharString} ) = UTF8String
386
+
387
+ ## printing literal quoted string data ##
388
+
389
+ # TODO: this is really the inverse of print_unbackslashed
390
+
391
+ function print_quoted_literal(s::String)
392
+ print('"')
393
+ for c = s; c == '"' ? print("\\\"") : print(c); end
394
+ print('"')
395
+ end
396
+
397
+ ## string escaping & unescaping ##
398
+
399
+ escape_nul(s::String, i::Int) =
400
+ !done(s,i) && '0' <= next(s,i)[1] <= '7' ? L"\x00" : L"\0"
401
+
402
+ is_hex_digit(c::Char) = '0'<=c<='9' || 'a'<=c<='f' || 'A'<=c<='F'
403
+ need_full_hex(s::String, i::Int) = !done(s,i) && is_hex_digit(next(s,i)[1])
404
+
405
+ function print_escaped(s::String, esc::String)
406
+ i = start(s)
407
+ while !done(s,i)
408
+ c, j = next(s,i)
409
+ c == '\0' ? print(escape_nul(s,j)) :
410
+ c == '\e' ? print(L"\e") :
411
+ c == '\\' ? print("\\\\") :
412
+ contains(esc,c) ? print('\\', c) :
413
+ iswprint(c) ? print(c) :
414
+ 7 <= c <= 13 ? print('\\', "abtnvfr"[c-6]) :
415
+ c <= '\x7f' ? print(L"\x", hex(c, 2)) :
416
+ c <= '\uffff' ? print(L"\u", hex(c, need_full_hex(s,j) ? 4 : 2)) :
417
+ print(L"\U", hex(c, need_full_hex(s,j) ? 8 : 4))
418
+ i = j
419
+ end
420
+ end
421
+
422
+ escape_string(s::String) = print_to_string(length(s), print_escaped, s, "\"")
423
+ print_quoted(s::String) = (print('"'); print_escaped(s, "\"\$"); print('"'))
424
+ #" # work around syntax highlighting problem
425
+ quote_string(s::String) = print_to_string(length(s)+2, print_quoted, s)
426
+
427
+ # bare minimum unescaping function unescapes only given characters
428
+
429
+ function print_unescaped_chars(s::String, esc::String)
430
+ if !contains(esc,'\\')
431
+ esc = strcat("\\", esc)
432
+ end
433
+ i = start(s)
434
+ while !done(s,i)
435
+ c, i = next(s,i)
436
+ if c == '\\' && !done(s,i) && contains(esc,s[i])
437
+ c, i = next(s,i)
438
+ end
439
+ print(c)
440
+ end
441
+ end
442
+
443
+ unescape_chars(s::String, esc::String) =
444
+ print_to_string(length(s), print_unescaped_chars, s, esc)
445
+
446
+ # general unescaping of traditional C and Unicode escape sequences
447
+
448
+ function print_unescaped(s::String)
449
+ i = start(s)
450
+ while !done(s,i)
451
+ c, i = next(s,i)
452
+ if !done(s,i) && c == '\\'
453
+ c, i = next(s,i)
454
+ if c == 'x' || c == 'u' || c == 'U'
455
+ n = k = 0
456
+ m = c == 'x' ? 2 :
457
+ c == 'u' ? 4 : 8
458
+ while (k+=1) <= m && !done(s,i)
459
+ c, j = next(s,i)
460
+ n = '0' <= c <= '9' ? n<<4 + c-'0' :
461
+ 'a' <= c <= 'f' ? n<<4 + c-'a'+10 :
462
+ 'A' <= c <= 'F' ? n<<4 + c-'A'+10 : break
463
+ i = j
464
+ end
465
+ if k == 1
466
+ error("\\x used with no following hex digits")
467
+ end
468
+ if m == 2 # \x escape sequence
469
+ write(uint8(n))
470
+ else
471
+ print(char(n))
472
+ end
473
+ elseif '0' <= c <= '7'
474
+ k = 1
475
+ n = c-'0'
476
+ while (k+=1) <= 3 && !done(s,i)
477
+ c, j = next(s,i)
478
+ n = '0' <= c <= '7' ? n<<3 + c-'0' : break
479
+ i = j
480
+ end
481
+ if n > 255
482
+ error("octal escape sequence out of range")
483
+ end
484
+ write(uint8(n))
485
+ else
486
+ print(c == 'a' ? '\a' :
487
+ c == 'b' ? '\b' :
488
+ c == 't' ? '\t' :
489
+ c == 'n' ? '\n' :
490
+ c == 'v' ? '\v' :
491
+ c == 'f' ? '\f' :
492
+ c == 'r' ? '\r' :
493
+ c == 'e' ? '\e' : c)
494
+ end
495
+ else
496
+ print(c)
497
+ end
498
+ end
499
+ end
500
+
501
+ unescape_string(s::String) = print_to_string(length(s), print_unescaped, s)
502
+
503
+ ## checking UTF-8 & ACSII validity ##
504
+
505
+ byte_string_classify(s::ByteString) =
506
+ ccall(:u8_isvalid, Int32, (Ptr{Uint8}, Int), s.data, length(s))
507
+ # 0: neither valid ASCII nor UTF-8
508
+ # 1: valid ASCII
509
+ # 2: valid UTF-8
510
+
511
+ is_valid_ascii(s::ByteString) = byte_string_classify(s) == 1
512
+ is_valid_utf8 (s::ByteString) = byte_string_classify(s) != 0
513
+
514
+ check_ascii(s::ByteString) = is_valid_ascii(s) ? s : error("invalid ASCII sequence")
515
+ check_utf8 (s::ByteString) = is_valid_utf8(s) ? s : error("invalid UTF-8 sequence")
516
+
517
+ ## string interpolation parsing ##
518
+
519
+ function _jl_interp_parse(s::String, unescape::Function, printer::Function)
520
+ sx = {}
521
+ i = j = start(s)
522
+ while !done(s,j)
523
+ c, k = next(s,j)
524
+ if c == '$'
525
+ if !isempty(s[i:j-1])
526
+ push(sx, unescape(s[i:j-1]))
527
+ end
528
+ ex, j = parseatom(s,k)
529
+ push(sx, ex)
530
+ i = j
531
+ elseif c == '\\' && !done(s,k)
532
+ if s[k] == '$'
533
+ if !isempty(s[i:j-1])
534
+ push(sx, unescape(s[i:j-1]))
535
+ end
536
+ i = k
537
+ end
538
+ c, j = next(s,k)
539
+ else
540
+ j = k
541
+ end
542
+ end
543
+ if !isempty(s[i:])
544
+ push(sx, unescape(s[i:j-1]))
545
+ end
546
+ length(sx) == 1 && isa(sx[1],ByteString) ? sx[1] :
547
+ expr(:call, :print_to_string, printer, sx...)
548
+ end
549
+
550
+ _jl_interp_parse(s::String, u::Function) = _jl_interp_parse(s, u, print)
551
+ _jl_interp_parse(s::String) = _jl_interp_parse(s, x->check_utf8(unescape_string(x)))
552
+
553
+ function _jl_interp_parse_bytes(s::String)
554
+ writer(x...) = for w=x; write(w); end
555
+ _jl_interp_parse(s, unescape_string, writer)
556
+ end
557
+
558
+ ## core string macros ##
559
+
560
+ macro str(s); _jl_interp_parse(s); end
561
+ macro S_str(s); _jl_interp_parse(s); end
562
+ macro I_str(s); _jl_interp_parse(s, x->unescape_chars(x,"\"")); end
563
+ macro E_str(s); check_utf8(unescape_string(s)); end
564
+ macro B_str(s); _jl_interp_parse_bytes(s); end
565
+ macro b_str(s); ex = _jl_interp_parse_bytes(s); :(($ex).data); end
566
+
567
+ ## shell-like command parsing ##
568
+
569
+ function _jl_shell_parse(s::String, interp::Bool)
570
+
571
+ in_single_quotes = false
572
+ in_double_quotes = false
573
+
574
+ args = {}
575
+ arg = {}
576
+ i = start(s)
577
+ j = i
578
+
579
+ function update_arg(x)
580
+ if !isa(x,String) || !isempty(x)
581
+ push(arg, x)
582
+ end
583
+ end
584
+ function append_arg()
585
+ if isempty(arg); arg = {"",}; end
586
+ push(args, arg)
587
+ arg = {}
588
+ end
589
+
590
+ while !done(s,j)
591
+ c, k = next(s,j)
592
+ if !in_single_quotes && !in_double_quotes && iswspace(c)
593
+ update_arg(s[i:j-1])
594
+ append_arg()
595
+ j = k
596
+ while !done(s,j)
597
+ c, k = next(s,j)
598
+ if !iswspace(c)
599
+ i = j
600
+ break
601
+ end
602
+ j = k
603
+ end
604
+ elseif interp && !in_single_quotes && c == '$'
605
+ update_arg(s[i:j-1]); i = k; j = k
606
+ if done(s,k)
607
+ error("\$ right before end of command")
608
+ end
609
+ if iswspace(s[k])
610
+ error("space not allowed right after \$")
611
+ end
612
+ ex, j = parseatom(s,j)
613
+ update_arg(ex); i = j
614
+ else
615
+ if !in_double_quotes && c == '\''
616
+ in_single_quotes = !in_single_quotes
617
+ update_arg(s[i:j-1]); i = k
618
+ elseif !in_single_quotes && c == '"'
619
+ in_double_quotes = !in_double_quotes
620
+ update_arg(s[i:j-1]); i = k
621
+ elseif c == '\\'
622
+ if in_double_quotes
623
+ if done(s,k)
624
+ error("unterminated double quote")
625
+ end
626
+ if s[k] == '"' || s[k] == '$'
627
+ update_arg(s[i:j-1]); i = k
628
+ c, k = next(s,k)
629
+ end
630
+ elseif !in_single_quotes
631
+ if done(s,k)
632
+ error("dangling backslash")
633
+ end
634
+ update_arg(s[i:j-1]); i = k
635
+ c, k = next(s,k)
636
+ end
637
+ end
638
+ j = k
639
+ end
640
+ end
641
+
642
+ if in_single_quotes; error("unterminated single quote"); end
643
+ if in_double_quotes; error("unterminated double quote"); end
644
+
645
+ update_arg(s[i:])
646
+ append_arg()
647
+
648
+ if !interp
649
+ return args
650
+ end
651
+
652
+ # construct an expression
653
+ exprs = {}
654
+ for arg in args
655
+ push(exprs, expr(:tuple, arg))
656
+ end
657
+ expr(:tuple,exprs)
658
+ end
659
+ _jl_shell_parse(s::String) = _jl_shell_parse(s,true)
660
+
661
+ function shell_split(s::String)
662
+ parsed = _jl_shell_parse(s,false)
663
+ args = String[]
664
+ for arg in parsed
665
+ push(args, strcat(arg...))
666
+ end
667
+ args
668
+ end
669
+
670
+ function print_shell_word(word::String)
671
+ if isempty(word)
672
+ print("''")
673
+ end
674
+ has_single = false
675
+ has_special = false
676
+ for c in word
677
+ if iswspace(c) || c=='\\' || c=='\'' || c=='"' || c=='$'
678
+ has_special = true
679
+ if c == '\''
680
+ has_single = true
681
+ end
682
+ end
683
+ end
684
+ if !has_special
685
+ print(word)
686
+ elseif !has_single
687
+ print('\'', word, '\'')
688
+ else
689
+ print('"')
690
+ for c in word
691
+ if c == '"' || c == '$'
692
+ print('\\')
693
+ end
694
+ print(c)
695
+ end
696
+ print('"')
697
+ end
698
+ end
699
+
700
+ function print_shell_escaped(cmd::String, args::String...)
701
+ print_shell_word(cmd)
702
+ for arg in args
703
+ print(' ')
704
+ print_shell_word(arg)
705
+ end
706
+ end
707
+
708
+ shell_escape(cmd::String, args::String...) =
709
+ print_to_string(print_shell_escaped, cmd, args...)
710
+
711
+ ## interface to parser ##
712
+
713
+ function parse(s::String, pos, greedy)
714
+ # returns (expr, end_pos). expr is () in case of parse error.
715
+ ex, pos = ccall(:jl_parse_string, Any,
716
+ (Ptr{Uint8}, Int32, Int32),
717
+ cstring(s), pos-1, greedy ? 1:0)
718
+ if isa(ex,Expr) && is(ex.head,:error)
719
+ throw(ParseError(ex.args[1]))
720
+ end
721
+ if ex == (); throw(ParseError("end of input")); end
722
+ ex, pos+1 # C is zero-based, Julia is 1-based
723
+ end
724
+
725
+ parse(s::String) = parse(s, 1, true)
726
+ parse(s::String, pos) = parse(s, pos, true)
727
+ parseatom(s::String) = parse(s, 1, false)
728
+ parseatom(s::String, pos) = parse(s, pos, false)
729
+
730
+ ## miscellaneous string functions ##
731
+
732
+ function lpad(s::String, n::Integer, p::String)
733
+ m = n - strlen(s)
734
+ if m <= 0; return s; end
735
+ l = strlen(p)
736
+ if l==1
737
+ return p^m * s
738
+ end
739
+ q = div(m,l)
740
+ r = m - q*l
741
+ cstring(p^q*p[1:chr2ind(p,r)]*s)
742
+ end
743
+
744
+ function rpad(s::String, n::Integer, p::String)
745
+ m = n - strlen(s)
746
+ if m <= 0; return s; end
747
+ l = strlen(p)
748
+ if l==1
749
+ return s * p^m
750
+ end
751
+ q = div(m,l)
752
+ r = m - q*l
753
+ cstring(s*p^q*p[1:chr2ind(p,r)])
754
+ end
755
+
756
+ lpad(s, n::Integer, p) = lpad(string(s), n, string(p))
757
+ rpad(s, n::Integer, p) = rpad(string(s), n, string(p))
758
+
759
+ lpad(s, n::Integer) = lpad(string(s), n, " ")
760
+ rpad(s, n::Integer) = rpad(string(s), n, " ")
761
+
762
+ function split(s::String, delims, include_empty::Bool)
763
+ i = 1
764
+ strs = String[]
765
+ len = length(s)
766
+ while true
767
+ tokstart = tokend = i
768
+ while !done(s,i)
769
+ (c,i) = next(s,i)
770
+ if contains(delims, c)
771
+ break
772
+ end
773
+ tokend = i
774
+ end
775
+ tok = s[tokstart:(tokend-1)]
776
+ if include_empty || !isempty(tok)
777
+ push(strs, tok)
778
+ end
779
+ if !((i <= len) || (i==len+1 && tokend!=i))
780
+ break
781
+ end
782
+ end
783
+ strs
784
+ end
785
+
786
+ split(s::String) = split(s, (' ','\t','\n','\v','\f','\r'), false)
787
+ split(s::String, x) = split(s, x, true)
788
+ split(s::String, x::Char, incl::Bool) = split(s, (x,), incl)
789
+
790
+ function print_joined(strings, delim, last)
791
+ i = start(strings)
792
+ if done(strings,i)
793
+ return
794
+ end
795
+ str, i = next(strings,i)
796
+ print(str)
797
+ while !done(strings,i)
798
+ str, i = next(strings,i)
799
+ print(done(strings,i) ? last : delim)
800
+ print(str)
801
+ end
802
+ end
803
+
804
+ function print_joined(strings, delim)
805
+ i = start(strings)
806
+ while !done(strings,i)
807
+ str, i = next(strings,i)
808
+ print(str)
809
+ if !done(strings,i)
810
+ print(delim)
811
+ end
812
+ end
813
+ end
814
+ print_joined(strings) = print_joined(strings, "")
815
+
816
+ join(args...) = print_to_string(print_joined, args...)
817
+
818
+ chop(s::String) = s[1:thisind(s,length(s))-1]
819
+ chomp(s::String) = (i=thisind(s,length(s)); s[i]=='\n' ? s[1:i-1] : s)
820
+ chomp(s::ByteString) = s.data[end]==0x0a ? s[1:end-1] : s
821
+
822
+ function lstrip(s::String)
823
+ i = start(s)
824
+ while !done(s,i)
825
+ c, j = next(s,i)
826
+ if !iswspace(c)
827
+ return s[i:end]
828
+ end
829
+ i = j
830
+ end
831
+ ""
832
+ end
833
+
834
+ function rstrip(s::String)
835
+ r = reverse(s)
836
+ i = start(r)
837
+ while !done(r,i)
838
+ c, j = next(r,i)
839
+ if !iswspace(c)
840
+ return s[1:end-i+1]
841
+ end
842
+ i = j
843
+ end
844
+ ""
845
+ end
846
+
847
+ strip(s::String) = lstrip(rstrip(s))
848
+
849
+ ## string to integer functions ##
850
+
851
+ function parse_int{T<:Integer}(::Type{T}, s::String, base::Integer)
852
+ if !(2 <= base <= 36); error("invalid base: ",base); end
853
+ i = start(s)
854
+ if done(s,i)
855
+ error("premature end of integer (in ",show_to_string(s),")")
856
+ end
857
+ c,i = next(s,i)
858
+ sgn = one(T)
859
+ if T <: Signed && c == '-'
860
+ sgn = -sgn
861
+ if done(s,i)
862
+ error("premature end of integer (in ",show_to_string(s),")")
863
+ end
864
+ c,i = next(s,i)
865
+ end
866
+ base = convert(T,base)
867
+ n::T = 0
868
+ while true
869
+ d = '0' <= c <= '9' ? c-'0' :
870
+ 'A' <= c <= 'Z' ? c-'A'+10 :
871
+ 'a' <= c <= 'z' ? c-'a'+10 : typemax(Int)
872
+ if d >= base
873
+ error(show_to_string(c)," is not a valid digit (in ",show_to_string(s),")")
874
+ end
875
+ # TODO: overflow detection?
876
+ n = n*base + d
877
+ if done(s,i)
878
+ break
879
+ end
880
+ c,i = next(s,i)
881
+ end
882
+ return flipsign(n,sgn)
883
+ end
884
+
885
+ parse_int(s::String, base::Integer) = parse_int(Int,s,base)
886
+ parse_int(T::Type, s::String) = parse_int(T,s,10)
887
+ parse_int(s::String) = parse_int(Int,s,10)
888
+
889
+ parse_bin(T::Type, s::String) = parse_int(T,s,2)
890
+ parse_oct(T::Type, s::String) = parse_int(T,s,8)
891
+ parse_hex(T::Type, s::String) = parse_int(T,s,16)
892
+
893
+ parse_bin(s::String) = parse_int(Int,s,2)
894
+ parse_oct(s::String) = parse_int(Int,s,8)
895
+ parse_hex(s::String) = parse_int(Int,s,16)
896
+
897
+ integer (s::String) = int(s)
898
+ unsigned(s::String) = uint(s)
899
+ int (s::String) = parse_int(Int,s)
900
+ uint (s::String) = parse_int(Uint,s)
901
+ int8 (s::String) = parse_int(Int8,s)
902
+ uint8 (s::String) = parse_int(Uint8,s)
903
+ int16 (s::String) = parse_int(Int16,s)
904
+ uint16 (s::String) = parse_int(Uint16,s)
905
+ int32 (s::String) = parse_int(Int32,s)
906
+ uint32 (s::String) = parse_int(Uint32,s)
907
+ int64 (s::String) = parse_int(Int64,s)
908
+ uint64 (s::String) = parse_int(Uint64,s)
909
+
910
+ ## integer to string functions ##
911
+
912
+ const _jl_dig_syms = "0123456789abcdefghijklmnopqrstuvwxyz".data
913
+
914
+ function int2str(n::Union(Int64,Uint64), b::Integer, l::Int)
915
+ if b < 2 || b > 36; error("int2str: invalid base ", b); end
916
+ neg = n < 0
917
+ n = unsigned(abs(n))
918
+ b = convert(typeof(n), b)
919
+ ndig = ndigits(n, b)
920
+ sz = max(convert(Int, ndig), l) + neg
921
+ data = Array(Uint8, sz)
922
+ i = sz
923
+ if ispow2(b)
924
+ digmask = b-1
925
+ shift = trailing_zeros(b)
926
+ while i > neg
927
+ ch = n & digmask
928
+ data[i] = _jl_dig_syms[int(ch)+1]
929
+ n >>= shift
930
+ i -= 1
931
+ end
932
+ else
933
+ while i > neg
934
+ ch = n % b
935
+ data[i] = _jl_dig_syms[int(ch)+1]
936
+ n = div(n,b)
937
+ i -= 1
938
+ end
939
+ end
940
+ if neg
941
+ data[1] = '-'
942
+ end
943
+ ASCIIString(data)
944
+ end
945
+ int2str(n::Integer, b::Integer) = int2str(n, b, 0)
946
+ int2str(n::Integer, b::Integer, l::Int) = int2str(int64(n), b, l)
947
+
948
+ string(x::Signed) = dec(int64(x))
949
+ cstring(x::Signed) = dec(int64(x))
950
+
951
+ ## string to float functions ##
952
+
953
+ function float64_isvalid(s::String, out::Array{Float64,1})
954
+ s = cstring(s)
955
+ return (ccall(:jl_strtod, Int32, (Ptr{Uint8},Ptr{Float64}), s, out)==0)
956
+ end
957
+
958
+ function float32_isvalid(s::String, out::Array{Float32,1})
959
+ s = cstring(s)
960
+ return (ccall(:jl_strtof, Int32, (Ptr{Uint8},Ptr{Float32}), s, out)==0)
961
+ end
962
+
963
+ begin
964
+ local tmp::Array{Float64,1} = Array(Float64,1)
965
+ local tmpf::Array{Float32,1} = Array(Float32,1)
966
+ global float64, float32
967
+ function float64(s::String)
968
+ if !float64_isvalid(s, tmp)
969
+ throw(ArgumentError("float64(String): invalid number format"))
970
+ end
971
+ return tmp[1]
972
+ end
973
+
974
+ function float32(s::String)
975
+ if !float32_isvalid(s, tmpf)
976
+ throw(ArgumentError("float32(String): invalid number format"))
977
+ end
978
+ return tmpf[1]
979
+ end
980
+ end
981
+
982
+ float(x::String) = float64(x)
983
+ parse_float(x::String) = float64(x)
984
+ parse_float(::Type{Float64}, x::String) = float64(x)
985
+ parse_float(::Type{Float32}, x::String) = float32(x)
986
+
987
+ # copying a byte string (generally not needed due to "immutability")
988
+
989
+ strcpy{T<:ByteString}(s::T) = T(copy(s.data))
990
+
991
+ # lexicographically compare byte arrays (used by Latin-1 and UTF-8)
992
+
993
+ function lexcmp(a::Array{Uint8,1}, b::Array{Uint8,1})
994
+ c = ccall(:memcmp, Int32, (Ptr{Uint8}, Ptr{Uint8}, Uint),
995
+ a, b, min(length(a),length(b)))
996
+ c < 0 ? -1 : c > 0 ? +1 : cmp(length(a),length(b))
997
+ end
998
+
999
+ # find the index of the first occurrence of a byte value in a byte array
1000
+
1001
+ function memchr(a::Array{Uint8,1}, b::Integer)
1002
+ p = pointer(a)
1003
+ q = ccall(:memchr, Ptr{Uint8}, (Ptr{Uint8}, Int32, Uint), p, b, length(a))
1004
+ q == C_NULL ? 0 : q - p + 1
1005
+ end
1006
+
1007
+ # concatenate byte arrays into a single array
1008
+
1009
+ memcat() = Array(Uint8,0)
1010
+ memcat(a::Array{Uint8,1}) = copy(a)
1011
+
1012
+ function memcat(arrays::Array{Uint8,1}...)
1013
+ n = 0
1014
+ for a in arrays
1015
+ n += length(a)
1016
+ end
1017
+ arr = Array(Uint8, n)
1018
+ ptr = pointer(arr)
1019
+ offset = 0
1020
+ for a in arrays
1021
+ ccall(:memcpy, Ptr{Uint8}, (Ptr{Uint8}, Ptr{Uint8}, Uint),
1022
+ ptr+offset, a, length(a))
1023
+ offset += length(a)
1024
+ end
1025
+ return arr
1026
+ end
1027
+
1028
+ # concatenate the data fields of byte strings
1029
+
1030
+ memcat(s::ByteString) = memcat(s.data)
1031
+ memcat(sx::ByteString...) = memcat(map(s->s.data, sx)...)