LilyPond-Ruby 0.0.2.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1112) hide show
  1. checksums.yaml +4 -4
  2. data/etc/fonts/conf.d/10-hinting-slight.conf +15 -0
  3. data/etc/fonts/conf.d/10-scale-bitmap-fonts.conf +83 -0
  4. data/etc/fonts/conf.d/11-lcdfilter-default.conf +17 -0
  5. data/etc/fonts/conf.d/20-unhint-small-vera.conf +49 -0
  6. data/etc/fonts/conf.d/30-metric-aliases.conf +637 -0
  7. data/etc/fonts/conf.d/40-nonlatin.conf +332 -0
  8. data/etc/fonts/conf.d/45-generic.conf +136 -0
  9. data/etc/fonts/conf.d/45-latin.conf +301 -0
  10. data/etc/fonts/conf.d/48-spacing.conf +16 -0
  11. data/etc/fonts/conf.d/49-sansserif.conf +22 -0
  12. data/etc/fonts/conf.d/50-user.conf +16 -0
  13. data/etc/fonts/conf.d/51-local.conf +7 -0
  14. data/etc/fonts/conf.d/60-generic.conf +64 -0
  15. data/etc/fonts/conf.d/60-latin.conf +88 -0
  16. data/etc/fonts/conf.d/65-fonts-persian.conf +418 -0
  17. data/etc/fonts/conf.d/65-nonlatin.conf +228 -0
  18. data/etc/fonts/conf.d/69-unifont.conf +28 -0
  19. data/etc/fonts/conf.d/80-delicious.conf +19 -0
  20. data/etc/fonts/conf.d/90-synthetic.conf +64 -0
  21. data/etc/fonts/conf.d/README +23 -0
  22. data/etc/fonts/fonts.conf +101 -0
  23. data/etc/relocate/fontconfig.reloc +2 -0
  24. data/etc/relocate/guile.reloc +2 -0
  25. data/etc/relocate/libexec.reloc +1 -0
  26. data/lib/guile/2.2/ccache/ice-9/and-let-star.go +0 -0
  27. data/lib/guile/2.2/ccache/ice-9/arrays.go +0 -0
  28. data/lib/guile/2.2/ccache/ice-9/atomic.go +0 -0
  29. data/lib/guile/2.2/ccache/ice-9/binary-ports.go +0 -0
  30. data/lib/guile/2.2/ccache/ice-9/boot-9.go +0 -0
  31. data/lib/guile/2.2/ccache/ice-9/buffered-input.go +0 -0
  32. data/lib/guile/2.2/ccache/ice-9/calling.go +0 -0
  33. data/lib/guile/2.2/ccache/ice-9/channel.go +0 -0
  34. data/lib/guile/2.2/ccache/ice-9/command-line.go +0 -0
  35. data/lib/guile/2.2/ccache/ice-9/common-list.go +0 -0
  36. data/lib/guile/2.2/ccache/ice-9/control.go +0 -0
  37. data/lib/guile/2.2/ccache/ice-9/curried-definitions.go +0 -0
  38. data/lib/guile/2.2/ccache/ice-9/debug.go +0 -0
  39. data/lib/guile/2.2/ccache/ice-9/deprecated.go +0 -0
  40. data/lib/guile/2.2/ccache/ice-9/documentation.go +0 -0
  41. data/lib/guile/2.2/ccache/ice-9/eval-string.go +0 -0
  42. data/lib/guile/2.2/ccache/ice-9/eval.go +0 -0
  43. data/lib/guile/2.2/ccache/ice-9/expect.go +0 -0
  44. data/lib/guile/2.2/ccache/ice-9/fdes-finalizers.go +0 -0
  45. data/lib/guile/2.2/ccache/ice-9/format.go +0 -0
  46. data/lib/guile/2.2/ccache/ice-9/ftw.go +0 -0
  47. data/lib/guile/2.2/ccache/ice-9/futures.go +0 -0
  48. data/lib/guile/2.2/ccache/ice-9/gap-buffer.go +0 -0
  49. data/lib/guile/2.2/ccache/ice-9/getopt-long.go +0 -0
  50. data/lib/guile/2.2/ccache/ice-9/hash-table.go +0 -0
  51. data/lib/guile/2.2/ccache/ice-9/hcons.go +0 -0
  52. data/lib/guile/2.2/ccache/ice-9/history.go +0 -0
  53. data/lib/guile/2.2/ccache/ice-9/i18n.go +0 -0
  54. data/lib/guile/2.2/ccache/ice-9/iconv.go +0 -0
  55. data/lib/guile/2.2/ccache/ice-9/lineio.go +0 -0
  56. data/lib/guile/2.2/ccache/ice-9/list.go +0 -0
  57. data/lib/guile/2.2/ccache/ice-9/local-eval.go +0 -0
  58. data/lib/guile/2.2/ccache/ice-9/ls.go +0 -0
  59. data/lib/guile/2.2/ccache/ice-9/mapping.go +0 -0
  60. data/lib/guile/2.2/ccache/ice-9/match.go +0 -0
  61. data/lib/guile/2.2/ccache/ice-9/networking.go +0 -0
  62. data/lib/guile/2.2/ccache/ice-9/null.go +0 -0
  63. data/lib/guile/2.2/ccache/ice-9/occam-channel.go +0 -0
  64. data/lib/guile/2.2/ccache/ice-9/optargs.go +0 -0
  65. data/lib/guile/2.2/ccache/ice-9/peg/cache.go +0 -0
  66. data/lib/guile/2.2/ccache/ice-9/peg/codegen.go +0 -0
  67. data/lib/guile/2.2/ccache/ice-9/peg/simplify-tree.go +0 -0
  68. data/lib/guile/2.2/ccache/ice-9/peg/string-peg.go +0 -0
  69. data/lib/guile/2.2/ccache/ice-9/peg/using-parsers.go +0 -0
  70. data/lib/guile/2.2/ccache/ice-9/peg.go +0 -0
  71. data/lib/guile/2.2/ccache/ice-9/poe.go +0 -0
  72. data/lib/guile/2.2/ccache/ice-9/poll.go +0 -0
  73. data/lib/guile/2.2/ccache/ice-9/popen.go +0 -0
  74. data/lib/guile/2.2/ccache/ice-9/ports.go +0 -0
  75. data/lib/guile/2.2/ccache/ice-9/posix.go +0 -0
  76. data/lib/guile/2.2/ccache/ice-9/pretty-print.go +0 -0
  77. data/lib/guile/2.2/ccache/ice-9/psyntax-pp.go +0 -0
  78. data/lib/guile/2.2/ccache/ice-9/q.go +0 -0
  79. data/lib/guile/2.2/ccache/ice-9/r5rs.go +0 -0
  80. data/lib/guile/2.2/ccache/ice-9/rdelim.go +0 -0
  81. data/lib/guile/2.2/ccache/ice-9/receive.go +0 -0
  82. data/lib/guile/2.2/ccache/ice-9/regex.go +0 -0
  83. data/lib/guile/2.2/ccache/ice-9/runq.go +0 -0
  84. data/lib/guile/2.2/ccache/ice-9/rw.go +0 -0
  85. data/lib/guile/2.2/ccache/ice-9/safe-r5rs.go +0 -0
  86. data/lib/guile/2.2/ccache/ice-9/safe.go +0 -0
  87. data/lib/guile/2.2/ccache/ice-9/sandbox.go +0 -0
  88. data/lib/guile/2.2/ccache/ice-9/save-stack.go +0 -0
  89. data/lib/guile/2.2/ccache/ice-9/scm-style-repl.go +0 -0
  90. data/lib/guile/2.2/ccache/ice-9/serialize.go +0 -0
  91. data/lib/guile/2.2/ccache/ice-9/session.go +0 -0
  92. data/lib/guile/2.2/ccache/ice-9/slib.go +0 -0
  93. data/lib/guile/2.2/ccache/ice-9/stack-catch.go +0 -0
  94. data/lib/guile/2.2/ccache/ice-9/streams.go +0 -0
  95. data/lib/guile/2.2/ccache/ice-9/string-fun.go +0 -0
  96. data/lib/guile/2.2/ccache/ice-9/suspendable-ports.go +0 -0
  97. data/lib/guile/2.2/ccache/ice-9/syncase.go +0 -0
  98. data/lib/guile/2.2/ccache/ice-9/textual-ports.go +0 -0
  99. data/lib/guile/2.2/ccache/ice-9/threads.go +0 -0
  100. data/lib/guile/2.2/ccache/ice-9/time.go +0 -0
  101. data/lib/guile/2.2/ccache/ice-9/top-repl.go +0 -0
  102. data/lib/guile/2.2/ccache/ice-9/unicode.go +0 -0
  103. data/lib/guile/2.2/ccache/ice-9/vlist.go +0 -0
  104. data/lib/guile/2.2/ccache/ice-9/weak-vector.go +0 -0
  105. data/lib/guile/2.2/ccache/language/brainfuck/compile-scheme.go +0 -0
  106. data/lib/guile/2.2/ccache/language/brainfuck/compile-tree-il.go +0 -0
  107. data/lib/guile/2.2/ccache/language/brainfuck/parse.go +0 -0
  108. data/lib/guile/2.2/ccache/language/brainfuck/spec.go +0 -0
  109. data/lib/guile/2.2/ccache/language/bytecode/spec.go +0 -0
  110. data/lib/guile/2.2/ccache/language/bytecode.go +0 -0
  111. data/lib/guile/2.2/ccache/language/cps/closure-conversion.go +0 -0
  112. data/lib/guile/2.2/ccache/language/cps/compile-bytecode.go +0 -0
  113. data/lib/guile/2.2/ccache/language/cps/constructors.go +0 -0
  114. data/lib/guile/2.2/ccache/language/cps/contification.go +0 -0
  115. data/lib/guile/2.2/ccache/language/cps/cse.go +0 -0
  116. data/lib/guile/2.2/ccache/language/cps/dce.go +0 -0
  117. data/lib/guile/2.2/ccache/language/cps/effects-analysis.go +0 -0
  118. data/lib/guile/2.2/ccache/language/cps/elide-values.go +0 -0
  119. data/lib/guile/2.2/ccache/language/cps/handle-interrupts.go +0 -0
  120. data/lib/guile/2.2/ccache/language/cps/intmap.go +0 -0
  121. data/lib/guile/2.2/ccache/language/cps/intset.go +0 -0
  122. data/lib/guile/2.2/ccache/language/cps/licm.go +0 -0
  123. data/lib/guile/2.2/ccache/language/cps/optimize.go +0 -0
  124. data/lib/guile/2.2/ccache/language/cps/peel-loops.go +0 -0
  125. data/lib/guile/2.2/ccache/language/cps/primitives.go +0 -0
  126. data/lib/guile/2.2/ccache/language/cps/prune-bailouts.go +0 -0
  127. data/lib/guile/2.2/ccache/language/cps/prune-top-level-scopes.go +0 -0
  128. data/lib/guile/2.2/ccache/language/cps/reify-primitives.go +0 -0
  129. data/lib/guile/2.2/ccache/language/cps/renumber.go +0 -0
  130. data/lib/guile/2.2/ccache/language/cps/rotate-loops.go +0 -0
  131. data/lib/guile/2.2/ccache/language/cps/self-references.go +0 -0
  132. data/lib/guile/2.2/ccache/language/cps/simplify.go +0 -0
  133. data/lib/guile/2.2/ccache/language/cps/slot-allocation.go +0 -0
  134. data/lib/guile/2.2/ccache/language/cps/spec.go +0 -0
  135. data/lib/guile/2.2/ccache/language/cps/specialize-numbers.go +0 -0
  136. data/lib/guile/2.2/ccache/language/cps/specialize-primcalls.go +0 -0
  137. data/lib/guile/2.2/ccache/language/cps/split-rec.go +0 -0
  138. data/lib/guile/2.2/ccache/language/cps/type-checks.go +0 -0
  139. data/lib/guile/2.2/ccache/language/cps/type-fold.go +0 -0
  140. data/lib/guile/2.2/ccache/language/cps/types.go +0 -0
  141. data/lib/guile/2.2/ccache/language/cps/utils.go +0 -0
  142. data/lib/guile/2.2/ccache/language/cps/verify.go +0 -0
  143. data/lib/guile/2.2/ccache/language/cps/with-cps.go +0 -0
  144. data/lib/guile/2.2/ccache/language/cps.go +0 -0
  145. data/lib/guile/2.2/ccache/language/ecmascript/array.go +0 -0
  146. data/lib/guile/2.2/ccache/language/ecmascript/base.go +0 -0
  147. data/lib/guile/2.2/ccache/language/ecmascript/compile-tree-il.go +0 -0
  148. data/lib/guile/2.2/ccache/language/ecmascript/function.go +0 -0
  149. data/lib/guile/2.2/ccache/language/ecmascript/impl.go +0 -0
  150. data/lib/guile/2.2/ccache/language/ecmascript/parse.go +0 -0
  151. data/lib/guile/2.2/ccache/language/ecmascript/spec.go +0 -0
  152. data/lib/guile/2.2/ccache/language/ecmascript/tokenize.go +0 -0
  153. data/lib/guile/2.2/ccache/language/elisp/bindings.go +0 -0
  154. data/lib/guile/2.2/ccache/language/elisp/boot.go +0 -0
  155. data/lib/guile/2.2/ccache/language/elisp/compile-tree-il.go +0 -0
  156. data/lib/guile/2.2/ccache/language/elisp/falias.go +0 -0
  157. data/lib/guile/2.2/ccache/language/elisp/lexer.go +0 -0
  158. data/lib/guile/2.2/ccache/language/elisp/parser.go +0 -0
  159. data/lib/guile/2.2/ccache/language/elisp/runtime/function-slot.go +0 -0
  160. data/lib/guile/2.2/ccache/language/elisp/runtime/value-slot.go +0 -0
  161. data/lib/guile/2.2/ccache/language/elisp/runtime.go +0 -0
  162. data/lib/guile/2.2/ccache/language/elisp/spec.go +0 -0
  163. data/lib/guile/2.2/ccache/language/scheme/compile-tree-il.go +0 -0
  164. data/lib/guile/2.2/ccache/language/scheme/decompile-tree-il.go +0 -0
  165. data/lib/guile/2.2/ccache/language/scheme/spec.go +0 -0
  166. data/lib/guile/2.2/ccache/language/tree-il/analyze.go +0 -0
  167. data/lib/guile/2.2/ccache/language/tree-il/canonicalize.go +0 -0
  168. data/lib/guile/2.2/ccache/language/tree-il/compile-cps.go +0 -0
  169. data/lib/guile/2.2/ccache/language/tree-il/debug.go +0 -0
  170. data/lib/guile/2.2/ccache/language/tree-il/effects.go +0 -0
  171. data/lib/guile/2.2/ccache/language/tree-il/fix-letrec.go +0 -0
  172. data/lib/guile/2.2/ccache/language/tree-il/optimize.go +0 -0
  173. data/lib/guile/2.2/ccache/language/tree-il/peval.go +0 -0
  174. data/lib/guile/2.2/ccache/language/tree-il/primitives.go +0 -0
  175. data/lib/guile/2.2/ccache/language/tree-il/spec.go +0 -0
  176. data/lib/guile/2.2/ccache/language/tree-il.go +0 -0
  177. data/lib/guile/2.2/ccache/language/value/spec.go +0 -0
  178. data/lib/guile/2.2/ccache/oop/goops/accessors.go +0 -0
  179. data/lib/guile/2.2/ccache/oop/goops/active-slot.go +0 -0
  180. data/lib/guile/2.2/ccache/oop/goops/composite-slot.go +0 -0
  181. data/lib/guile/2.2/ccache/oop/goops/describe.go +0 -0
  182. data/lib/guile/2.2/ccache/oop/goops/internal.go +0 -0
  183. data/lib/guile/2.2/ccache/oop/goops/save.go +0 -0
  184. data/lib/guile/2.2/ccache/oop/goops/simple.go +0 -0
  185. data/lib/guile/2.2/ccache/oop/goops/stklos.go +0 -0
  186. data/lib/guile/2.2/ccache/oop/goops.go +0 -0
  187. data/lib/guile/2.2/ccache/rnrs/arithmetic/bitwise.go +0 -0
  188. data/lib/guile/2.2/ccache/rnrs/arithmetic/fixnums.go +0 -0
  189. data/lib/guile/2.2/ccache/rnrs/arithmetic/flonums.go +0 -0
  190. data/lib/guile/2.2/ccache/rnrs/base.go +0 -0
  191. data/lib/guile/2.2/ccache/rnrs/bytevectors.go +0 -0
  192. data/lib/guile/2.2/ccache/rnrs/conditions.go +0 -0
  193. data/lib/guile/2.2/ccache/rnrs/control.go +0 -0
  194. data/lib/guile/2.2/ccache/rnrs/enums.go +0 -0
  195. data/lib/guile/2.2/ccache/rnrs/eval.go +0 -0
  196. data/lib/guile/2.2/ccache/rnrs/exceptions.go +0 -0
  197. data/lib/guile/2.2/ccache/rnrs/files.go +0 -0
  198. data/lib/guile/2.2/ccache/rnrs/hashtables.go +0 -0
  199. data/lib/guile/2.2/ccache/rnrs/io/ports.go +0 -0
  200. data/lib/guile/2.2/ccache/rnrs/io/simple.go +0 -0
  201. data/lib/guile/2.2/ccache/rnrs/lists.go +0 -0
  202. data/lib/guile/2.2/ccache/rnrs/mutable-pairs.go +0 -0
  203. data/lib/guile/2.2/ccache/rnrs/mutable-strings.go +0 -0
  204. data/lib/guile/2.2/ccache/rnrs/programs.go +0 -0
  205. data/lib/guile/2.2/ccache/rnrs/r5rs.go +0 -0
  206. data/lib/guile/2.2/ccache/rnrs/records/inspection.go +0 -0
  207. data/lib/guile/2.2/ccache/rnrs/records/procedural.go +0 -0
  208. data/lib/guile/2.2/ccache/rnrs/records/syntactic.go +0 -0
  209. data/lib/guile/2.2/ccache/rnrs/sorting.go +0 -0
  210. data/lib/guile/2.2/ccache/rnrs/syntax-case.go +0 -0
  211. data/lib/guile/2.2/ccache/rnrs/unicode.go +0 -0
  212. data/lib/guile/2.2/ccache/rnrs.go +0 -0
  213. data/lib/guile/2.2/ccache/scripts/api-diff.go +0 -0
  214. data/lib/guile/2.2/ccache/scripts/autofrisk.go +0 -0
  215. data/lib/guile/2.2/ccache/scripts/compile.go +0 -0
  216. data/lib/guile/2.2/ccache/scripts/disassemble.go +0 -0
  217. data/lib/guile/2.2/ccache/scripts/display-commentary.go +0 -0
  218. data/lib/guile/2.2/ccache/scripts/doc-snarf.go +0 -0
  219. data/lib/guile/2.2/ccache/scripts/frisk.go +0 -0
  220. data/lib/guile/2.2/ccache/scripts/generate-autoload.go +0 -0
  221. data/lib/guile/2.2/ccache/scripts/help.go +0 -0
  222. data/lib/guile/2.2/ccache/scripts/lint.go +0 -0
  223. data/lib/guile/2.2/ccache/scripts/list.go +0 -0
  224. data/lib/guile/2.2/ccache/scripts/punify.go +0 -0
  225. data/lib/guile/2.2/ccache/scripts/read-rfc822.go +0 -0
  226. data/lib/guile/2.2/ccache/scripts/read-scheme-source.go +0 -0
  227. data/lib/guile/2.2/ccache/scripts/read-text-outline.go +0 -0
  228. data/lib/guile/2.2/ccache/scripts/scan-api.go +0 -0
  229. data/lib/guile/2.2/ccache/scripts/snarf-check-and-output-texi.go +0 -0
  230. data/lib/guile/2.2/ccache/scripts/snarf-guile-m4-docs.go +0 -0
  231. data/lib/guile/2.2/ccache/scripts/summarize-guile-TODO.go +0 -0
  232. data/lib/guile/2.2/ccache/scripts/use2dot.go +0 -0
  233. data/lib/guile/2.2/ccache/srfi/srfi-1.go +0 -0
  234. data/lib/guile/2.2/ccache/srfi/srfi-10.go +0 -0
  235. data/lib/guile/2.2/ccache/srfi/srfi-11.go +0 -0
  236. data/lib/guile/2.2/ccache/srfi/srfi-111.go +0 -0
  237. data/lib/guile/2.2/ccache/srfi/srfi-13.go +0 -0
  238. data/lib/guile/2.2/ccache/srfi/srfi-14.go +0 -0
  239. data/lib/guile/2.2/ccache/srfi/srfi-16.go +0 -0
  240. data/lib/guile/2.2/ccache/srfi/srfi-17.go +0 -0
  241. data/lib/guile/2.2/ccache/srfi/srfi-18.go +0 -0
  242. data/lib/guile/2.2/ccache/srfi/srfi-19.go +0 -0
  243. data/lib/guile/2.2/ccache/srfi/srfi-2.go +0 -0
  244. data/lib/guile/2.2/ccache/srfi/srfi-26.go +0 -0
  245. data/lib/guile/2.2/ccache/srfi/srfi-27.go +0 -0
  246. data/lib/guile/2.2/ccache/srfi/srfi-28.go +0 -0
  247. data/lib/guile/2.2/ccache/srfi/srfi-31.go +0 -0
  248. data/lib/guile/2.2/ccache/srfi/srfi-34.go +0 -0
  249. data/lib/guile/2.2/ccache/srfi/srfi-35.go +0 -0
  250. data/lib/guile/2.2/ccache/srfi/srfi-37.go +0 -0
  251. data/lib/guile/2.2/ccache/srfi/srfi-38.go +0 -0
  252. data/lib/guile/2.2/ccache/srfi/srfi-39.go +0 -0
  253. data/lib/guile/2.2/ccache/srfi/srfi-4/gnu.go +0 -0
  254. data/lib/guile/2.2/ccache/srfi/srfi-4.go +0 -0
  255. data/lib/guile/2.2/ccache/srfi/srfi-41.go +0 -0
  256. data/lib/guile/2.2/ccache/srfi/srfi-42.go +0 -0
  257. data/lib/guile/2.2/ccache/srfi/srfi-43.go +0 -0
  258. data/lib/guile/2.2/ccache/srfi/srfi-45.go +0 -0
  259. data/lib/guile/2.2/ccache/srfi/srfi-6.go +0 -0
  260. data/lib/guile/2.2/ccache/srfi/srfi-60.go +0 -0
  261. data/lib/guile/2.2/ccache/srfi/srfi-64.go +0 -0
  262. data/lib/guile/2.2/ccache/srfi/srfi-67.go +0 -0
  263. data/lib/guile/2.2/ccache/srfi/srfi-69.go +0 -0
  264. data/lib/guile/2.2/ccache/srfi/srfi-71.go +0 -0
  265. data/lib/guile/2.2/ccache/srfi/srfi-8.go +0 -0
  266. data/lib/guile/2.2/ccache/srfi/srfi-88.go +0 -0
  267. data/lib/guile/2.2/ccache/srfi/srfi-9/gnu.go +0 -0
  268. data/lib/guile/2.2/ccache/srfi/srfi-9.go +0 -0
  269. data/lib/guile/2.2/ccache/srfi/srfi-98.go +0 -0
  270. data/lib/guile/2.2/ccache/statprof.go +0 -0
  271. data/lib/guile/2.2/ccache/sxml/apply-templates.go +0 -0
  272. data/lib/guile/2.2/ccache/sxml/fold.go +0 -0
  273. data/lib/guile/2.2/ccache/sxml/match.go +0 -0
  274. data/lib/guile/2.2/ccache/sxml/simple.go +0 -0
  275. data/lib/guile/2.2/ccache/sxml/ssax/input-parse.go +0 -0
  276. data/lib/guile/2.2/ccache/sxml/ssax.go +0 -0
  277. data/lib/guile/2.2/ccache/sxml/transform.go +0 -0
  278. data/lib/guile/2.2/ccache/sxml/xpath.go +0 -0
  279. data/lib/guile/2.2/ccache/system/base/ck.go +0 -0
  280. data/lib/guile/2.2/ccache/system/base/compile.go +0 -0
  281. data/lib/guile/2.2/ccache/system/base/lalr.go +0 -0
  282. data/lib/guile/2.2/ccache/system/base/language.go +0 -0
  283. data/lib/guile/2.2/ccache/system/base/message.go +0 -0
  284. data/lib/guile/2.2/ccache/system/base/pmatch.go +0 -0
  285. data/lib/guile/2.2/ccache/system/base/syntax.go +0 -0
  286. data/lib/guile/2.2/ccache/system/base/target.go +0 -0
  287. data/lib/guile/2.2/ccache/system/base/types.go +0 -0
  288. data/lib/guile/2.2/ccache/system/foreign-object.go +0 -0
  289. data/lib/guile/2.2/ccache/system/foreign.go +0 -0
  290. data/lib/guile/2.2/ccache/system/repl/command.go +0 -0
  291. data/lib/guile/2.2/ccache/system/repl/common.go +0 -0
  292. data/lib/guile/2.2/ccache/system/repl/coop-server.go +0 -0
  293. data/lib/guile/2.2/ccache/system/repl/debug.go +0 -0
  294. data/lib/guile/2.2/ccache/system/repl/error-handling.go +0 -0
  295. data/lib/guile/2.2/ccache/system/repl/repl.go +0 -0
  296. data/lib/guile/2.2/ccache/system/repl/server.go +0 -0
  297. data/lib/guile/2.2/ccache/system/syntax.go +0 -0
  298. data/lib/guile/2.2/ccache/system/vm/assembler.go +0 -0
  299. data/lib/guile/2.2/ccache/system/vm/coverage.go +0 -0
  300. data/lib/guile/2.2/ccache/system/vm/debug.go +0 -0
  301. data/lib/guile/2.2/ccache/system/vm/disassembler.go +0 -0
  302. data/lib/guile/2.2/ccache/system/vm/dwarf.go +0 -0
  303. data/lib/guile/2.2/ccache/system/vm/elf.go +0 -0
  304. data/lib/guile/2.2/ccache/system/vm/frame.go +0 -0
  305. data/lib/guile/2.2/ccache/system/vm/inspect.go +0 -0
  306. data/lib/guile/2.2/ccache/system/vm/linker.go +0 -0
  307. data/lib/guile/2.2/ccache/system/vm/loader.go +0 -0
  308. data/lib/guile/2.2/ccache/system/vm/program.go +0 -0
  309. data/lib/guile/2.2/ccache/system/vm/trace.go +0 -0
  310. data/lib/guile/2.2/ccache/system/vm/trap-state.go +0 -0
  311. data/lib/guile/2.2/ccache/system/vm/traps.go +0 -0
  312. data/lib/guile/2.2/ccache/system/vm/vm.go +0 -0
  313. data/lib/guile/2.2/ccache/system/xref.go +0 -0
  314. data/lib/guile/2.2/ccache/texinfo/docbook.go +0 -0
  315. data/lib/guile/2.2/ccache/texinfo/html.go +0 -0
  316. data/lib/guile/2.2/ccache/texinfo/indexing.go +0 -0
  317. data/lib/guile/2.2/ccache/texinfo/plain-text.go +0 -0
  318. data/lib/guile/2.2/ccache/texinfo/reflection.go +0 -0
  319. data/lib/guile/2.2/ccache/texinfo/serialize.go +0 -0
  320. data/lib/guile/2.2/ccache/texinfo/string-utils.go +0 -0
  321. data/lib/guile/2.2/ccache/texinfo.go +0 -0
  322. data/lib/guile/2.2/ccache/web/client.go +0 -0
  323. data/lib/guile/2.2/ccache/web/http.go +0 -0
  324. data/lib/guile/2.2/ccache/web/request.go +0 -0
  325. data/lib/guile/2.2/ccache/web/response.go +0 -0
  326. data/lib/guile/2.2/ccache/web/server/http.go +0 -0
  327. data/lib/guile/2.2/ccache/web/server.go +0 -0
  328. data/lib/guile/2.2/ccache/web/uri.go +0 -0
  329. data/lib/guile.rb +19 -0
  330. data/lib/lilypond/2.24.1/ccache/lily/accreg.go +0 -0
  331. data/lib/lilypond/2.24.1/ccache/lily/auto-beam.go +0 -0
  332. data/lib/lilypond/2.24.1/ccache/lily/autochange.go +0 -0
  333. data/lib/lilypond/2.24.1/ccache/lily/backend-library.go +0 -0
  334. data/lib/lilypond/2.24.1/ccache/lily/bar-line.go +0 -0
  335. data/lib/lilypond/2.24.1/ccache/lily/breath.go +0 -0
  336. data/lib/lilypond/2.24.1/ccache/lily/c++.go +0 -0
  337. data/lib/lilypond/2.24.1/ccache/lily/chord-entry.go +0 -0
  338. data/lib/lilypond/2.24.1/ccache/lily/chord-ignatzek-names.go +0 -0
  339. data/lib/lilypond/2.24.1/ccache/lily/chord-name.go +0 -0
  340. data/lib/lilypond/2.24.1/ccache/lily/clip-region.go +0 -0
  341. data/lib/lilypond/2.24.1/ccache/lily/color.go +0 -0
  342. data/lib/lilypond/2.24.1/ccache/lily/curried-definitions.go +0 -0
  343. data/lib/lilypond/2.24.1/ccache/lily/define-context-properties.go +0 -0
  344. data/lib/lilypond/2.24.1/ccache/lily/define-event-classes.go +0 -0
  345. data/lib/lilypond/2.24.1/ccache/lily/define-grob-interfaces.go +0 -0
  346. data/lib/lilypond/2.24.1/ccache/lily/define-grob-properties.go +0 -0
  347. data/lib/lilypond/2.24.1/ccache/lily/define-grobs.go +0 -0
  348. data/lib/lilypond/2.24.1/ccache/lily/define-markup-commands.go +0 -0
  349. data/lib/lilypond/2.24.1/ccache/lily/define-music-callbacks.go +0 -0
  350. data/lib/lilypond/2.24.1/ccache/lily/define-music-display-methods.go +0 -0
  351. data/lib/lilypond/2.24.1/ccache/lily/define-music-properties.go +0 -0
  352. data/lib/lilypond/2.24.1/ccache/lily/define-music-types.go +0 -0
  353. data/lib/lilypond/2.24.1/ccache/lily/define-note-names.go +0 -0
  354. data/lib/lilypond/2.24.1/ccache/lily/define-stencil-commands.go +0 -0
  355. data/lib/lilypond/2.24.1/ccache/lily/define-woodwind-diagrams.go +0 -0
  356. data/lib/lilypond/2.24.1/ccache/lily/display-lily.go +0 -0
  357. data/lib/lilypond/2.24.1/ccache/lily/display-woodwind-diagrams.go +0 -0
  358. data/lib/lilypond/2.24.1/ccache/lily/file-cache.go +0 -0
  359. data/lib/lilypond/2.24.1/ccache/lily/flag-styles.go +0 -0
  360. data/lib/lilypond/2.24.1/ccache/lily/font-encodings.go +0 -0
  361. data/lib/lilypond/2.24.1/ccache/lily/font.go +0 -0
  362. data/lib/lilypond/2.24.1/ccache/lily/framework-cairo.go +0 -0
  363. data/lib/lilypond/2.24.1/ccache/lily/framework-ps.go +0 -0
  364. data/lib/lilypond/2.24.1/ccache/lily/framework-svg.go +0 -0
  365. data/lib/lilypond/2.24.1/ccache/lily/fret-diagrams.go +0 -0
  366. data/lib/lilypond/2.24.1/ccache/lily/graphviz.go +0 -0
  367. data/lib/lilypond/2.24.1/ccache/lily/harp-pedals.go +0 -0
  368. data/lib/lilypond/2.24.1/ccache/lily/layout-beam.go +0 -0
  369. data/lib/lilypond/2.24.1/ccache/lily/layout-slur.go +0 -0
  370. data/lib/lilypond/2.24.1/ccache/lily/lily-library.go +0 -0
  371. data/lib/lilypond/2.24.1/ccache/lily/lily.go +0 -0
  372. data/lib/lilypond/2.24.1/ccache/lily/ly-syntax-constructors.go +0 -0
  373. data/lib/lilypond/2.24.1/ccache/lily/markup-macros.go +0 -0
  374. data/lib/lilypond/2.24.1/ccache/lily/markup.go +0 -0
  375. data/lib/lilypond/2.24.1/ccache/lily/midi.go +0 -0
  376. data/lib/lilypond/2.24.1/ccache/lily/modal-transforms.go +0 -0
  377. data/lib/lilypond/2.24.1/ccache/lily/music-functions.go +0 -0
  378. data/lib/lilypond/2.24.1/ccache/lily/output-lib.go +0 -0
  379. data/lib/lilypond/2.24.1/ccache/lily/output-ps.go +0 -0
  380. data/lib/lilypond/2.24.1/ccache/lily/output-svg.go +0 -0
  381. data/lib/lilypond/2.24.1/ccache/lily/page.go +0 -0
  382. data/lib/lilypond/2.24.1/ccache/lily/paper-system.go +0 -0
  383. data/lib/lilypond/2.24.1/ccache/lily/paper.go +0 -0
  384. data/lib/lilypond/2.24.1/ccache/lily/parser-clef.go +0 -0
  385. data/lib/lilypond/2.24.1/ccache/lily/parser-ly-from-scheme.go +0 -0
  386. data/lib/lilypond/2.24.1/ccache/lily/part-combiner.go +0 -0
  387. data/lib/lilypond/2.24.1/ccache/lily/predefined-fretboards.go +0 -0
  388. data/lib/lilypond/2.24.1/ccache/lily/ps-to-png.go +0 -0
  389. data/lib/lilypond/2.24.1/ccache/lily/scheme-engravers.go +0 -0
  390. data/lib/lilypond/2.24.1/ccache/lily/scheme-performers.go +0 -0
  391. data/lib/lilypond/2.24.1/ccache/lily/script.go +0 -0
  392. data/lib/lilypond/2.24.1/ccache/lily/skyline.go +0 -0
  393. data/lib/lilypond/2.24.1/ccache/lily/song-util.go +0 -0
  394. data/lib/lilypond/2.24.1/ccache/lily/song.go +0 -0
  395. data/lib/lilypond/2.24.1/ccache/lily/stencil.go +0 -0
  396. data/lib/lilypond/2.24.1/ccache/lily/tablature.go +0 -0
  397. data/lib/lilypond/2.24.1/ccache/lily/time-signature-settings.go +0 -0
  398. data/lib/lilypond/2.24.1/ccache/lily/time-signature.go +0 -0
  399. data/lib/lilypond/2.24.1/ccache/lily/titling.go +0 -0
  400. data/lib/lilypond/2.24.1/ccache/lily/to-xml.go +0 -0
  401. data/lib/lilypond/2.24.1/ccache/lily/translation-functions.go +0 -0
  402. data/lib/lilypond/builder.rb +161 -0
  403. data/lib/lilypond-ruby.rb +18 -3
  404. data/share/emacs/site-lisp/lilypond-font-lock.el +208 -0
  405. data/share/emacs/site-lisp/lilypond-indent.el +605 -0
  406. data/share/emacs/site-lisp/lilypond-init.el +21 -0
  407. data/share/emacs/site-lisp/lilypond-mode.el +1204 -0
  408. data/share/emacs/site-lisp/lilypond-song.el +556 -0
  409. data/share/emacs/site-lisp/lilypond-what-beat.el +279 -0
  410. data/share/emacs/site-lisp/lilypond-words.el +1428 -0
  411. data/share/guile/2.2/guile-procedures.txt +8860 -0
  412. data/share/guile/2.2/ice-9/and-let-star.scm +73 -0
  413. data/share/guile/2.2/ice-9/arrays.scm +70 -0
  414. data/share/guile/2.2/ice-9/atomic.scm +38 -0
  415. data/share/guile/2.2/ice-9/binary-ports.scm +53 -0
  416. data/share/guile/2.2/ice-9/boot-9.scm +4131 -0
  417. data/share/guile/2.2/ice-9/buffered-input.scm +109 -0
  418. data/share/guile/2.2/ice-9/calling.scm +326 -0
  419. data/share/guile/2.2/ice-9/channel.scm +170 -0
  420. data/share/guile/2.2/ice-9/command-line.scm +477 -0
  421. data/share/guile/2.2/ice-9/common-list.scm +278 -0
  422. data/share/guile/2.2/ice-9/control.scm +110 -0
  423. data/share/guile/2.2/ice-9/curried-definitions.scm +57 -0
  424. data/share/guile/2.2/ice-9/debug.scm +25 -0
  425. data/share/guile/2.2/ice-9/deprecated.scm +93 -0
  426. data/share/guile/2.2/ice-9/documentation.scm +203 -0
  427. data/share/guile/2.2/ice-9/eval-string.scm +90 -0
  428. data/share/guile/2.2/ice-9/eval.scm +723 -0
  429. data/share/guile/2.2/ice-9/expect.scm +171 -0
  430. data/share/guile/2.2/ice-9/fdes-finalizers.scm +25 -0
  431. data/share/guile/2.2/ice-9/format.scm +1626 -0
  432. data/share/guile/2.2/ice-9/ftw.scm +564 -0
  433. data/share/guile/2.2/ice-9/futures.scm +308 -0
  434. data/share/guile/2.2/ice-9/gap-buffer.scm +283 -0
  435. data/share/guile/2.2/ice-9/getopt-long.scm +371 -0
  436. data/share/guile/2.2/ice-9/hash-table.scm +45 -0
  437. data/share/guile/2.2/ice-9/hcons.scm +80 -0
  438. data/share/guile/2.2/ice-9/history.scm +65 -0
  439. data/share/guile/2.2/ice-9/i18n.scm +531 -0
  440. data/share/guile/2.2/ice-9/iconv.scm +95 -0
  441. data/share/guile/2.2/ice-9/lineio.scm +115 -0
  442. data/share/guile/2.2/ice-9/list.scm +36 -0
  443. data/share/guile/2.2/ice-9/local-eval.scm +261 -0
  444. data/share/guile/2.2/ice-9/ls.scm +94 -0
  445. data/share/guile/2.2/ice-9/mapping.scm +118 -0
  446. data/share/guile/2.2/ice-9/match.scm +59 -0
  447. data/share/guile/2.2/ice-9/match.upstream.scm +917 -0
  448. data/share/guile/2.2/ice-9/networking.scm +94 -0
  449. data/share/guile/2.2/ice-9/null.scm +34 -0
  450. data/share/guile/2.2/ice-9/occam-channel.scm +261 -0
  451. data/share/guile/2.2/ice-9/optargs.scm +381 -0
  452. data/share/guile/2.2/ice-9/peg/cache.scm +45 -0
  453. data/share/guile/2.2/ice-9/peg/codegen.scm +359 -0
  454. data/share/guile/2.2/ice-9/peg/simplify-tree.scm +97 -0
  455. data/share/guile/2.2/ice-9/peg/string-peg.scm +273 -0
  456. data/share/guile/2.2/ice-9/peg/using-parsers.scm +116 -0
  457. data/share/guile/2.2/ice-9/peg.scm +42 -0
  458. data/share/guile/2.2/ice-9/poe.scm +116 -0
  459. data/share/guile/2.2/ice-9/poll.scm +172 -0
  460. data/share/guile/2.2/ice-9/popen.scm +178 -0
  461. data/share/guile/2.2/ice-9/ports.scm +566 -0
  462. data/share/guile/2.2/ice-9/posix.scm +75 -0
  463. data/share/guile/2.2/ice-9/pretty-print.scm +483 -0
  464. data/share/guile/2.2/ice-9/psyntax-pp.scm +3542 -0
  465. data/share/guile/2.2/ice-9/psyntax.scm +3326 -0
  466. data/share/guile/2.2/ice-9/q.scm +153 -0
  467. data/share/guile/2.2/ice-9/quasisyntax.scm +136 -0
  468. data/share/guile/2.2/ice-9/r5rs.scm +45 -0
  469. data/share/guile/2.2/ice-9/r6rs-libraries.scm +242 -0
  470. data/share/guile/2.2/ice-9/rdelim.scm +208 -0
  471. data/share/guile/2.2/ice-9/receive.scm +26 -0
  472. data/share/guile/2.2/ice-9/regex.scm +229 -0
  473. data/share/guile/2.2/ice-9/runq.scm +241 -0
  474. data/share/guile/2.2/ice-9/rw.scm +27 -0
  475. data/share/guile/2.2/ice-9/safe-r5rs.scm +145 -0
  476. data/share/guile/2.2/ice-9/safe.scm +34 -0
  477. data/share/guile/2.2/ice-9/sandbox.scm +1399 -0
  478. data/share/guile/2.2/ice-9/save-stack.scm +58 -0
  479. data/share/guile/2.2/ice-9/scm-style-repl.scm +279 -0
  480. data/share/guile/2.2/ice-9/serialize.scm +114 -0
  481. data/share/guile/2.2/ice-9/session.scm +530 -0
  482. data/share/guile/2.2/ice-9/slib.scm +33 -0
  483. data/share/guile/2.2/ice-9/stack-catch.scm +47 -0
  484. data/share/guile/2.2/ice-9/streams.scm +168 -0
  485. data/share/guile/2.2/ice-9/string-fun.scm +280 -0
  486. data/share/guile/2.2/ice-9/suspendable-ports.scm +788 -0
  487. data/share/guile/2.2/ice-9/syncase.scm +37 -0
  488. data/share/guile/2.2/ice-9/textual-ports.scm +70 -0
  489. data/share/guile/2.2/ice-9/threads.scm +392 -0
  490. data/share/guile/2.2/ice-9/time.scm +58 -0
  491. data/share/guile/2.2/ice-9/top-repl.scm +78 -0
  492. data/share/guile/2.2/ice-9/unicode.scm +26 -0
  493. data/share/guile/2.2/ice-9/vlist.scm +595 -0
  494. data/share/guile/2.2/ice-9/weak-vector.scm +31 -0
  495. data/share/guile/2.2/language/brainfuck/compile-scheme.scm +123 -0
  496. data/share/guile/2.2/language/brainfuck/compile-tree-il.scm +184 -0
  497. data/share/guile/2.2/language/brainfuck/parse.scm +95 -0
  498. data/share/guile/2.2/language/brainfuck/spec.scm +43 -0
  499. data/share/guile/2.2/language/bytecode/spec.scm +42 -0
  500. data/share/guile/2.2/language/bytecode.scm +104 -0
  501. data/share/guile/2.2/language/cps/closure-conversion.scm +848 -0
  502. data/share/guile/2.2/language/cps/compile-bytecode.scm +610 -0
  503. data/share/guile/2.2/language/cps/constructors.scm +106 -0
  504. data/share/guile/2.2/language/cps/contification.scm +448 -0
  505. data/share/guile/2.2/language/cps/cse.scm +414 -0
  506. data/share/guile/2.2/language/cps/dce.scm +363 -0
  507. data/share/guile/2.2/language/cps/effects-analysis.scm +597 -0
  508. data/share/guile/2.2/language/cps/elide-values.scm +88 -0
  509. data/share/guile/2.2/language/cps/handle-interrupts.scm +69 -0
  510. data/share/guile/2.2/language/cps/intmap.scm +765 -0
  511. data/share/guile/2.2/language/cps/intset.scm +830 -0
  512. data/share/guile/2.2/language/cps/licm.scm +308 -0
  513. data/share/guile/2.2/language/cps/optimize.scm +135 -0
  514. data/share/guile/2.2/language/cps/peel-loops.scm +287 -0
  515. data/share/guile/2.2/language/cps/primitives.scm +141 -0
  516. data/share/guile/2.2/language/cps/prune-bailouts.scm +86 -0
  517. data/share/guile/2.2/language/cps/prune-top-level-scopes.scm +63 -0
  518. data/share/guile/2.2/language/cps/reify-primitives.scm +179 -0
  519. data/share/guile/2.2/language/cps/renumber.scm +217 -0
  520. data/share/guile/2.2/language/cps/rotate-loops.scm +239 -0
  521. data/share/guile/2.2/language/cps/self-references.scm +79 -0
  522. data/share/guile/2.2/language/cps/simplify.scm +274 -0
  523. data/share/guile/2.2/language/cps/slot-allocation.scm +1058 -0
  524. data/share/guile/2.2/language/cps/spec.scm +51 -0
  525. data/share/guile/2.2/language/cps/specialize-numbers.scm +724 -0
  526. data/share/guile/2.2/language/cps/specialize-primcalls.scm +87 -0
  527. data/share/guile/2.2/language/cps/split-rec.scm +174 -0
  528. data/share/guile/2.2/language/cps/type-checks.scm +72 -0
  529. data/share/guile/2.2/language/cps/type-fold.scm +455 -0
  530. data/share/guile/2.2/language/cps/types.scm +1826 -0
  531. data/share/guile/2.2/language/cps/utils.scm +550 -0
  532. data/share/guile/2.2/language/cps/verify.scm +304 -0
  533. data/share/guile/2.2/language/cps/with-cps.scm +145 -0
  534. data/share/guile/2.2/language/cps.scm +358 -0
  535. data/share/guile/2.2/language/ecmascript/array.scm +121 -0
  536. data/share/guile/2.2/language/ecmascript/base.scm +251 -0
  537. data/share/guile/2.2/language/ecmascript/compile-tree-il.scm +576 -0
  538. data/share/guile/2.2/language/ecmascript/function.scm +78 -0
  539. data/share/guile/2.2/language/ecmascript/impl.scm +169 -0
  540. data/share/guile/2.2/language/ecmascript/parse.scm +352 -0
  541. data/share/guile/2.2/language/ecmascript/spec.scm +37 -0
  542. data/share/guile/2.2/language/ecmascript/tokenize.scm +513 -0
  543. data/share/guile/2.2/language/elisp/bindings.scm +107 -0
  544. data/share/guile/2.2/language/elisp/boot.el +617 -0
  545. data/share/guile/2.2/language/elisp/compile-tree-il.scm +812 -0
  546. data/share/guile/2.2/language/elisp/falias.scm +47 -0
  547. data/share/guile/2.2/language/elisp/lexer.scm +430 -0
  548. data/share/guile/2.2/language/elisp/parser.scm +222 -0
  549. data/share/guile/2.2/language/elisp/runtime/function-slot.scm +63 -0
  550. data/share/guile/2.2/language/elisp/runtime/value-slot.scm +24 -0
  551. data/share/guile/2.2/language/elisp/runtime.scm +153 -0
  552. data/share/guile/2.2/language/elisp/spec.scm +43 -0
  553. data/share/guile/2.2/language/scheme/compile-tree-il.scm +33 -0
  554. data/share/guile/2.2/language/scheme/decompile-tree-il.scm +796 -0
  555. data/share/guile/2.2/language/scheme/spec.scm +63 -0
  556. data/share/guile/2.2/language/tree-il/analyze.scm +1568 -0
  557. data/share/guile/2.2/language/tree-il/canonicalize.scm +82 -0
  558. data/share/guile/2.2/language/tree-il/compile-cps.scm +1149 -0
  559. data/share/guile/2.2/language/tree-il/debug.scm +246 -0
  560. data/share/guile/2.2/language/tree-il/effects.scm +591 -0
  561. data/share/guile/2.2/language/tree-il/fix-letrec.scm +314 -0
  562. data/share/guile/2.2/language/tree-il/optimize.scm +43 -0
  563. data/share/guile/2.2/language/tree-il/peval.scm +1669 -0
  564. data/share/guile/2.2/language/tree-il/primitives.scm +630 -0
  565. data/share/guile/2.2/language/tree-il/spec.scm +46 -0
  566. data/share/guile/2.2/language/tree-il.scm +630 -0
  567. data/share/guile/2.2/language/value/spec.scm +30 -0
  568. data/share/guile/2.2/oop/goops/accessors.scm +72 -0
  569. data/share/guile/2.2/oop/goops/active-slot.scm +63 -0
  570. data/share/guile/2.2/oop/goops/composite-slot.scm +83 -0
  571. data/share/guile/2.2/oop/goops/describe.scm +189 -0
  572. data/share/guile/2.2/oop/goops/internal.scm +30 -0
  573. data/share/guile/2.2/oop/goops/save.scm +874 -0
  574. data/share/guile/2.2/oop/goops/simple.scm +30 -0
  575. data/share/guile/2.2/oop/goops/stklos.scm +74 -0
  576. data/share/guile/2.2/oop/goops.scm +3176 -0
  577. data/share/guile/2.2/rnrs/arithmetic/bitwise.scm +92 -0
  578. data/share/guile/2.2/rnrs/arithmetic/fixnums.scm +291 -0
  579. data/share/guile/2.2/rnrs/arithmetic/flonums.scm +203 -0
  580. data/share/guile/2.2/rnrs/base.scm +291 -0
  581. data/share/guile/2.2/rnrs/bytevectors.scm +83 -0
  582. data/share/guile/2.2/rnrs/conditions.scm +225 -0
  583. data/share/guile/2.2/rnrs/control.scm +22 -0
  584. data/share/guile/2.2/rnrs/enums.scm +152 -0
  585. data/share/guile/2.2/rnrs/eval.scm +39 -0
  586. data/share/guile/2.2/rnrs/exceptions.scm +276 -0
  587. data/share/guile/2.2/rnrs/files.scm +96 -0
  588. data/share/guile/2.2/rnrs/hashtables.scm +190 -0
  589. data/share/guile/2.2/rnrs/io/ports.scm +554 -0
  590. data/share/guile/2.2/rnrs/io/simple.scm +167 -0
  591. data/share/guile/2.2/rnrs/lists.scm +55 -0
  592. data/share/guile/2.2/rnrs/mutable-pairs.scm +23 -0
  593. data/share/guile/2.2/rnrs/mutable-strings.scm +23 -0
  594. data/share/guile/2.2/rnrs/programs.scm +22 -0
  595. data/share/guile/2.2/rnrs/r5rs.scm +34 -0
  596. data/share/guile/2.2/rnrs/records/inspection.scm +81 -0
  597. data/share/guile/2.2/rnrs/records/procedural.scm +289 -0
  598. data/share/guile/2.2/rnrs/records/syntactic.scm +248 -0
  599. data/share/guile/2.2/rnrs/sorting.scm +27 -0
  600. data/share/guile/2.2/rnrs/syntax-case.scm +68 -0
  601. data/share/guile/2.2/rnrs/unicode.scm +104 -0
  602. data/share/guile/2.2/rnrs.scm +289 -0
  603. data/share/guile/2.2/scripts/api-diff.scm +179 -0
  604. data/share/guile/2.2/scripts/autofrisk.scm +218 -0
  605. data/share/guile/2.2/scripts/compile.scm +273 -0
  606. data/share/guile/2.2/scripts/disassemble.scm +38 -0
  607. data/share/guile/2.2/scripts/display-commentary.scm +67 -0
  608. data/share/guile/2.2/scripts/doc-snarf.scm +439 -0
  609. data/share/guile/2.2/scripts/frisk.scm +290 -0
  610. data/share/guile/2.2/scripts/generate-autoload.scm +144 -0
  611. data/share/guile/2.2/scripts/help.scm +188 -0
  612. data/share/guile/2.2/scripts/lint.scm +318 -0
  613. data/share/guile/2.2/scripts/list.scm +91 -0
  614. data/share/guile/2.2/scripts/punify.scm +87 -0
  615. data/share/guile/2.2/scripts/read-rfc822.scm +131 -0
  616. data/share/guile/2.2/scripts/read-scheme-source.scm +282 -0
  617. data/share/guile/2.2/scripts/read-text-outline.scm +253 -0
  618. data/share/guile/2.2/scripts/scan-api.scm +223 -0
  619. data/share/guile/2.2/scripts/snarf-check-and-output-texi.scm +303 -0
  620. data/share/guile/2.2/scripts/snarf-guile-m4-docs.scm +86 -0
  621. data/share/guile/2.2/scripts/summarize-guile-TODO.scm +213 -0
  622. data/share/guile/2.2/scripts/use2dot.scm +110 -0
  623. data/share/guile/2.2/srfi/srfi-1.scm +1061 -0
  624. data/share/guile/2.2/srfi/srfi-10.scm +89 -0
  625. data/share/guile/2.2/srfi/srfi-11.scm +146 -0
  626. data/share/guile/2.2/srfi/srfi-111.scm +37 -0
  627. data/share/guile/2.2/srfi/srfi-13.scm +132 -0
  628. data/share/guile/2.2/srfi/srfi-14.scm +99 -0
  629. data/share/guile/2.2/srfi/srfi-16.scm +51 -0
  630. data/share/guile/2.2/srfi/srfi-17.scm +174 -0
  631. data/share/guile/2.2/srfi/srfi-18.scm +382 -0
  632. data/share/guile/2.2/srfi/srfi-19.scm +1470 -0
  633. data/share/guile/2.2/srfi/srfi-2.scm +31 -0
  634. data/share/guile/2.2/srfi/srfi-26.scm +66 -0
  635. data/share/guile/2.2/srfi/srfi-27.scm +96 -0
  636. data/share/guile/2.2/srfi/srfi-28.scm +34 -0
  637. data/share/guile/2.2/srfi/srfi-31.scm +35 -0
  638. data/share/guile/2.2/srfi/srfi-34.scm +84 -0
  639. data/share/guile/2.2/srfi/srfi-35.scm +351 -0
  640. data/share/guile/2.2/srfi/srfi-37.scm +234 -0
  641. data/share/guile/2.2/srfi/srfi-38.scm +207 -0
  642. data/share/guile/2.2/srfi/srfi-39.scm +55 -0
  643. data/share/guile/2.2/srfi/srfi-4/gnu.scm +80 -0
  644. data/share/guile/2.2/srfi/srfi-4.scm +118 -0
  645. data/share/guile/2.2/srfi/srfi-41.scm +505 -0
  646. data/share/guile/2.2/srfi/srfi-42/ec.scm +1053 -0
  647. data/share/guile/2.2/srfi/srfi-42.scm +66 -0
  648. data/share/guile/2.2/srfi/srfi-43.scm +1077 -0
  649. data/share/guile/2.2/srfi/srfi-45.scm +93 -0
  650. data/share/guile/2.2/srfi/srfi-6.scm +29 -0
  651. data/share/guile/2.2/srfi/srfi-60.scm +73 -0
  652. data/share/guile/2.2/srfi/srfi-64/testing.scm +1040 -0
  653. data/share/guile/2.2/srfi/srfi-64.scm +55 -0
  654. data/share/guile/2.2/srfi/srfi-67/compare.scm +686 -0
  655. data/share/guile/2.2/srfi/srfi-67.scm +88 -0
  656. data/share/guile/2.2/srfi/srfi-69.scm +336 -0
  657. data/share/guile/2.2/srfi/srfi-71.scm +267 -0
  658. data/share/guile/2.2/srfi/srfi-8.scm +31 -0
  659. data/share/guile/2.2/srfi/srfi-88.scm +53 -0
  660. data/share/guile/2.2/srfi/srfi-9/gnu.scm +168 -0
  661. data/share/guile/2.2/srfi/srfi-9.scm +351 -0
  662. data/share/guile/2.2/srfi/srfi-98.scm +44 -0
  663. data/share/guile/2.2/statprof.scm +988 -0
  664. data/share/guile/2.2/sxml/apply-templates.scm +102 -0
  665. data/share/guile/2.2/sxml/fold.scm +250 -0
  666. data/share/guile/2.2/sxml/match.scm +75 -0
  667. data/share/guile/2.2/sxml/simple.scm +408 -0
  668. data/share/guile/2.2/sxml/ssax/input-parse.scm +180 -0
  669. data/share/guile/2.2/sxml/ssax.scm +265 -0
  670. data/share/guile/2.2/sxml/sxml-match.ss +1181 -0
  671. data/share/guile/2.2/sxml/transform.scm +298 -0
  672. data/share/guile/2.2/sxml/upstream/SSAX.scm +3235 -0
  673. data/share/guile/2.2/sxml/upstream/SXML-tree-trans.scm +249 -0
  674. data/share/guile/2.2/sxml/upstream/SXPath-old.scm +1216 -0
  675. data/share/guile/2.2/sxml/upstream/assert.scm +35 -0
  676. data/share/guile/2.2/sxml/upstream/input-parse.scm +326 -0
  677. data/share/guile/2.2/sxml/xpath.scm +493 -0
  678. data/share/guile/2.2/system/base/ck.scm +55 -0
  679. data/share/guile/2.2/system/base/compile.scm +282 -0
  680. data/share/guile/2.2/system/base/lalr.scm +51 -0
  681. data/share/guile/2.2/system/base/lalr.upstream.scm +2096 -0
  682. data/share/guile/2.2/system/base/language.scm +119 -0
  683. data/share/guile/2.2/system/base/message.scm +238 -0
  684. data/share/guile/2.2/system/base/pmatch.scm +68 -0
  685. data/share/guile/2.2/system/base/syntax.scm +299 -0
  686. data/share/guile/2.2/system/base/target.scm +152 -0
  687. data/share/guile/2.2/system/base/types.scm +561 -0
  688. data/share/guile/2.2/system/foreign-object.scm +91 -0
  689. data/share/guile/2.2/system/foreign.scm +200 -0
  690. data/share/guile/2.2/system/repl/command.scm +946 -0
  691. data/share/guile/2.2/system/repl/common.scm +263 -0
  692. data/share/guile/2.2/system/repl/coop-server.scm +200 -0
  693. data/share/guile/2.2/system/repl/debug.scm +210 -0
  694. data/share/guile/2.2/system/repl/describe.scm +347 -0
  695. data/share/guile/2.2/system/repl/error-handling.scm +183 -0
  696. data/share/guile/2.2/system/repl/repl.scm +233 -0
  697. data/share/guile/2.2/system/repl/server.scm +332 -0
  698. data/share/guile/2.2/system/syntax.scm +33 -0
  699. data/share/guile/2.2/system/vm/assembler.scm +2614 -0
  700. data/share/guile/2.2/system/vm/coverage.scm +351 -0
  701. data/share/guile/2.2/system/vm/debug.scm +766 -0
  702. data/share/guile/2.2/system/vm/disassembler.scm +658 -0
  703. data/share/guile/2.2/system/vm/dwarf.scm +1852 -0
  704. data/share/guile/2.2/system/vm/elf.scm +1042 -0
  705. data/share/guile/2.2/system/vm/frame.scm +485 -0
  706. data/share/guile/2.2/system/vm/inspect.scm +188 -0
  707. data/share/guile/2.2/system/vm/linker.scm +732 -0
  708. data/share/guile/2.2/system/vm/loader.scm +27 -0
  709. data/share/guile/2.2/system/vm/program.scm +312 -0
  710. data/share/guile/2.2/system/vm/trace.scm +121 -0
  711. data/share/guile/2.2/system/vm/trap-state.scm +302 -0
  712. data/share/guile/2.2/system/vm/traps.scm +608 -0
  713. data/share/guile/2.2/system/vm/vm.scm +32 -0
  714. data/share/guile/2.2/system/xref.scm +369 -0
  715. data/share/guile/2.2/texinfo/docbook.scm +240 -0
  716. data/share/guile/2.2/texinfo/html.scm +279 -0
  717. data/share/guile/2.2/texinfo/indexing.scm +75 -0
  718. data/share/guile/2.2/texinfo/plain-text.scm +322 -0
  719. data/share/guile/2.2/texinfo/reflection.scm +585 -0
  720. data/share/guile/2.2/texinfo/serialize.scm +300 -0
  721. data/share/guile/2.2/texinfo/string-utils.scm +410 -0
  722. data/share/guile/2.2/texinfo.scm +1263 -0
  723. data/share/guile/2.2/web/client.scm +513 -0
  724. data/share/guile/2.2/web/http.scm +2043 -0
  725. data/share/guile/2.2/web/request.scm +326 -0
  726. data/share/guile/2.2/web/response.scm +379 -0
  727. data/share/guile/2.2/web/server/http.scm +183 -0
  728. data/share/guile/2.2/web/server.scm +397 -0
  729. data/share/guile/2.2/web/uri.scm +552 -0
  730. data/share/lilypond/2.24.1/fontconfig/0bd3dc0958fa2205aaaa8ebb13e2872b-le64.cache-8 +0 -0
  731. data/share/lilypond/2.24.1/fontconfig/188ac73a183f12857f63bb60a4a6d603-le64.cache-8 +0 -0
  732. data/share/lilypond/2.24.1/fontconfig/32b6488e5b8292a2e95c79d947e009e8-le64.cache-8 +0 -0
  733. data/share/lilypond/2.24.1/fontconfig/3830d5c3ddfd5cd38a049b759396e72e-le64.cache-8 +0 -0
  734. data/share/lilypond/2.24.1/fontconfig/3f7329c5293ffd510edef78f73874cfd-le64.cache-8 +0 -0
  735. data/share/lilypond/2.24.1/fontconfig/4c599c202bc5c08e2d34565a40eac3b2-le64.cache-8 +0 -0
  736. data/share/lilypond/2.24.1/fontconfig/57e423e26b20ab21d0f2f29c145174c3-le64.cache-8 +0 -0
  737. data/share/lilypond/2.24.1/fontconfig/7ef2298fde41cc6eeb7af42e48b7d293-le64.cache-8 +0 -0
  738. data/share/lilypond/2.24.1/fontconfig/826f6b6ef79022e2eac8af26bf4b62f2-le64.cache-8 +0 -0
  739. data/share/lilypond/2.24.1/fontconfig/945677eb7aeaf62f1d50efc3fb3ec7d8-le64.cache-8 +0 -0
  740. data/share/lilypond/2.24.1/fontconfig/95530828ff6c81d309f8258d8d02a23e-le64.cache-8 +0 -0
  741. data/share/lilypond/2.24.1/fontconfig/CACHEDIR.TAG +4 -0
  742. data/share/lilypond/2.24.1/fontconfig/bf3b770c553c462765856025a94f1ce6-le64.cache-8 +0 -0
  743. data/share/lilypond/2.24.1/fontconfig/c855463f699352c367813e37f3f70ea7-le64.cache-8 +0 -0
  744. data/share/lilypond/2.24.1/fontconfig/d3e5c4ee2ceb1fc347f91d4cefc53bc0-le64.cache-8 +0 -0
  745. data/share/lilypond/2.24.1/fontconfig/d589a48862398ed80a3d6066f4f56f4c-le64.cache-8 +0 -0
  746. data/share/lilypond/2.24.1/fontconfig/d82eb4fd963d448e2fcb7d7b793b5df3-le64.cache-8 +0 -0
  747. data/share/lilypond/2.24.1/fontconfig/e13b20fdb08344e0e664864cc2ede53d-le64.cache-8 +0 -0
  748. data/share/lilypond/2.24.1/fontconfig/e52a45a1c8c8fe895fc0fc8c4e6999b8-le64.cache-8 +0 -0
  749. data/share/lilypond/2.24.1/fontconfig/f1f2465696798768e9653f19e17ccdc8-le64.cache-8 +0 -0
  750. data/share/lilypond/2.24.1/fonts/00-lilypond-fonts.conf +99 -0
  751. data/share/lilypond/2.24.1/fonts/99-lilypond-fonts.conf +28 -0
  752. data/share/lilypond/2.24.1/fonts/otf/C059-BdIta.otf +0 -0
  753. data/share/lilypond/2.24.1/fonts/otf/C059-Bold.otf +0 -0
  754. data/share/lilypond/2.24.1/fonts/otf/C059-Italic.otf +0 -0
  755. data/share/lilypond/2.24.1/fonts/otf/C059-Roman.otf +0 -0
  756. data/share/lilypond/2.24.1/fonts/otf/NimbusMonoPS-Bold.otf +0 -0
  757. data/share/lilypond/2.24.1/fonts/otf/NimbusMonoPS-BoldItalic.otf +0 -0
  758. data/share/lilypond/2.24.1/fonts/otf/NimbusMonoPS-Italic.otf +0 -0
  759. data/share/lilypond/2.24.1/fonts/otf/NimbusMonoPS-Regular.otf +0 -0
  760. data/share/lilypond/2.24.1/fonts/otf/NimbusSans-Bold.otf +0 -0
  761. data/share/lilypond/2.24.1/fonts/otf/NimbusSans-BoldItalic.otf +0 -0
  762. data/share/lilypond/2.24.1/fonts/otf/NimbusSans-Italic.otf +0 -0
  763. data/share/lilypond/2.24.1/fonts/otf/NimbusSans-Regular.otf +0 -0
  764. data/share/lilypond/2.24.1/fonts/otf/emmentaler-11.otf +0 -0
  765. data/share/lilypond/2.24.1/fonts/otf/emmentaler-13.otf +0 -0
  766. data/share/lilypond/2.24.1/fonts/otf/emmentaler-14.otf +0 -0
  767. data/share/lilypond/2.24.1/fonts/otf/emmentaler-16.otf +0 -0
  768. data/share/lilypond/2.24.1/fonts/otf/emmentaler-18.otf +0 -0
  769. data/share/lilypond/2.24.1/fonts/otf/emmentaler-20.otf +0 -0
  770. data/share/lilypond/2.24.1/fonts/otf/emmentaler-23.otf +0 -0
  771. data/share/lilypond/2.24.1/fonts/otf/emmentaler-26.otf +0 -0
  772. data/share/lilypond/2.24.1/fonts/otf/emmentaler-brace.otf +0 -0
  773. data/share/lilypond/2.24.1/fonts/otf/texgyrecursor-bold.otf +0 -0
  774. data/share/lilypond/2.24.1/fonts/otf/texgyrecursor-bolditalic.otf +0 -0
  775. data/share/lilypond/2.24.1/fonts/otf/texgyrecursor-italic.otf +0 -0
  776. data/share/lilypond/2.24.1/fonts/otf/texgyrecursor-regular.otf +0 -0
  777. data/share/lilypond/2.24.1/fonts/otf/texgyreheros-bold.otf +0 -0
  778. data/share/lilypond/2.24.1/fonts/otf/texgyreheros-bolditalic.otf +0 -0
  779. data/share/lilypond/2.24.1/fonts/otf/texgyreheros-italic.otf +0 -0
  780. data/share/lilypond/2.24.1/fonts/otf/texgyreheros-regular.otf +0 -0
  781. data/share/lilypond/2.24.1/fonts/otf/texgyreschola-bold.otf +0 -0
  782. data/share/lilypond/2.24.1/fonts/otf/texgyreschola-bolditalic.otf +0 -0
  783. data/share/lilypond/2.24.1/fonts/otf/texgyreschola-italic.otf +0 -0
  784. data/share/lilypond/2.24.1/fonts/otf/texgyreschola-regular.otf +0 -0
  785. data/share/lilypond/2.24.1/fonts/source/common-modules-and-initialization.mf +26 -0
  786. data/share/lilypond/2.24.1/fonts/source/debugging-settings.mf +14 -0
  787. data/share/lilypond/2.24.1/fonts/source/declare-autometric-parameters.mf +9 -0
  788. data/share/lilypond/2.24.1/fonts/source/feta-accidentals.mf +58 -0
  789. data/share/lilypond/2.24.1/fonts/source/feta-accordion.mf +575 -0
  790. data/share/lilypond/2.24.1/fonts/source/feta-alphabet-generic.mf +16 -0
  791. data/share/lilypond/2.24.1/fonts/source/feta-alphabet11.mf +6 -0
  792. data/share/lilypond/2.24.1/fonts/source/feta-alphabet13.mf +6 -0
  793. data/share/lilypond/2.24.1/fonts/source/feta-alphabet14.mf +6 -0
  794. data/share/lilypond/2.24.1/fonts/source/feta-alphabet16.mf +6 -0
  795. data/share/lilypond/2.24.1/fonts/source/feta-alphabet18.mf +6 -0
  796. data/share/lilypond/2.24.1/fonts/source/feta-alphabet20.mf +6 -0
  797. data/share/lilypond/2.24.1/fonts/source/feta-alphabet23.mf +6 -0
  798. data/share/lilypond/2.24.1/fonts/source/feta-alphabet26.mf +6 -0
  799. data/share/lilypond/2.24.1/fonts/source/feta-arrow.mf +114 -0
  800. data/share/lilypond/2.24.1/fonts/source/feta-arrowheads.mf +171 -0
  801. data/share/lilypond/2.24.1/fonts/source/feta-autometric.mf +303 -0
  802. data/share/lilypond/2.24.1/fonts/source/feta-braces-a.mf +6 -0
  803. data/share/lilypond/2.24.1/fonts/source/feta-braces-b.mf +6 -0
  804. data/share/lilypond/2.24.1/fonts/source/feta-braces-c.mf +6 -0
  805. data/share/lilypond/2.24.1/fonts/source/feta-braces-d.mf +6 -0
  806. data/share/lilypond/2.24.1/fonts/source/feta-braces-e.mf +6 -0
  807. data/share/lilypond/2.24.1/fonts/source/feta-braces-f.mf +6 -0
  808. data/share/lilypond/2.24.1/fonts/source/feta-braces-g.mf +6 -0
  809. data/share/lilypond/2.24.1/fonts/source/feta-braces-generic.mf +47 -0
  810. data/share/lilypond/2.24.1/fonts/source/feta-braces-h.mf +6 -0
  811. data/share/lilypond/2.24.1/fonts/source/feta-braces-i.mf +6 -0
  812. data/share/lilypond/2.24.1/fonts/source/feta-braces.mf +125 -0
  813. data/share/lilypond/2.24.1/fonts/source/feta-brackettips.mf +100 -0
  814. data/share/lilypond/2.24.1/fonts/source/feta-clefs.mf +963 -0
  815. data/share/lilypond/2.24.1/fonts/source/feta-dots.mf +37 -0
  816. data/share/lilypond/2.24.1/fonts/source/feta-dynamics.mf +891 -0
  817. data/share/lilypond/2.24.1/fonts/source/feta-flags-generic.mf +17 -0
  818. data/share/lilypond/2.24.1/fonts/source/feta-flags.mf +926 -0
  819. data/share/lilypond/2.24.1/fonts/source/feta-flags11.mf +6 -0
  820. data/share/lilypond/2.24.1/fonts/source/feta-flags13.mf +6 -0
  821. data/share/lilypond/2.24.1/fonts/source/feta-flags14.mf +6 -0
  822. data/share/lilypond/2.24.1/fonts/source/feta-flags16.mf +6 -0
  823. data/share/lilypond/2.24.1/fonts/source/feta-flags18.mf +6 -0
  824. data/share/lilypond/2.24.1/fonts/source/feta-flags20.mf +6 -0
  825. data/share/lilypond/2.24.1/fonts/source/feta-flags23.mf +6 -0
  826. data/share/lilypond/2.24.1/fonts/source/feta-flags26.mf +6 -0
  827. data/share/lilypond/2.24.1/fonts/source/feta-flats.mf +668 -0
  828. data/share/lilypond/2.24.1/fonts/source/feta-macros.mf +506 -0
  829. data/share/lilypond/2.24.1/fonts/source/feta-naturals.mf +223 -0
  830. data/share/lilypond/2.24.1/fonts/source/feta-noteheads-generic.mf +17 -0
  831. data/share/lilypond/2.24.1/fonts/source/feta-noteheads.mf +2642 -0
  832. data/share/lilypond/2.24.1/fonts/source/feta-noteheads11.mf +6 -0
  833. data/share/lilypond/2.24.1/fonts/source/feta-noteheads13.mf +6 -0
  834. data/share/lilypond/2.24.1/fonts/source/feta-noteheads14.mf +6 -0
  835. data/share/lilypond/2.24.1/fonts/source/feta-noteheads16.mf +6 -0
  836. data/share/lilypond/2.24.1/fonts/source/feta-noteheads18.mf +6 -0
  837. data/share/lilypond/2.24.1/fonts/source/feta-noteheads20.mf +6 -0
  838. data/share/lilypond/2.24.1/fonts/source/feta-noteheads23.mf +6 -0
  839. data/share/lilypond/2.24.1/fonts/source/feta-noteheads26.mf +6 -0
  840. data/share/lilypond/2.24.1/fonts/source/feta-numbers.mf +1677 -0
  841. data/share/lilypond/2.24.1/fonts/source/feta-other-generic.mf +27 -0
  842. data/share/lilypond/2.24.1/fonts/source/feta-params.mf +323 -0
  843. data/share/lilypond/2.24.1/fonts/source/feta-parenthesis.mf +63 -0
  844. data/share/lilypond/2.24.1/fonts/source/feta-pedals.mf +355 -0
  845. data/share/lilypond/2.24.1/fonts/source/feta-rests.mf +890 -0
  846. data/share/lilypond/2.24.1/fonts/source/feta-scripts.mf +2206 -0
  847. data/share/lilypond/2.24.1/fonts/source/feta-sharps.mf +524 -0
  848. data/share/lilypond/2.24.1/fonts/source/feta-sori-koron.mf +325 -0
  849. data/share/lilypond/2.24.1/fonts/source/feta-ties.mf +72 -0
  850. data/share/lilypond/2.24.1/fonts/source/feta-timesignatures.mf +119 -0
  851. data/share/lilypond/2.24.1/fonts/source/feta-trills.mf +321 -0
  852. data/share/lilypond/2.24.1/fonts/source/feta11.mf +6 -0
  853. data/share/lilypond/2.24.1/fonts/source/feta13.mf +6 -0
  854. data/share/lilypond/2.24.1/fonts/source/feta14.mf +6 -0
  855. data/share/lilypond/2.24.1/fonts/source/feta16.mf +6 -0
  856. data/share/lilypond/2.24.1/fonts/source/feta18.mf +6 -0
  857. data/share/lilypond/2.24.1/fonts/source/feta20.mf +7 -0
  858. data/share/lilypond/2.24.1/fonts/source/feta23.mf +6 -0
  859. data/share/lilypond/2.24.1/fonts/source/feta26.mf +6 -0
  860. data/share/lilypond/2.24.1/fonts/source/parmesan-accidentals.mf +483 -0
  861. data/share/lilypond/2.24.1/fonts/source/parmesan-clefs.mf +1636 -0
  862. data/share/lilypond/2.24.1/fonts/source/parmesan-custodes.mf +503 -0
  863. data/share/lilypond/2.24.1/fonts/source/parmesan-dots.mf +62 -0
  864. data/share/lilypond/2.24.1/fonts/source/parmesan-flags.mf +319 -0
  865. data/share/lilypond/2.24.1/fonts/source/parmesan-macros.mf +225 -0
  866. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads-generic.mf +16 -0
  867. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads.mf +2191 -0
  868. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads11.mf +6 -0
  869. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads13.mf +6 -0
  870. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads14.mf +6 -0
  871. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads16.mf +6 -0
  872. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads18.mf +6 -0
  873. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads20.mf +6 -0
  874. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads23.mf +6 -0
  875. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads26.mf +6 -0
  876. data/share/lilypond/2.24.1/fonts/source/parmesan-other-generic.mf +24 -0
  877. data/share/lilypond/2.24.1/fonts/source/parmesan-rests.mf +428 -0
  878. data/share/lilypond/2.24.1/fonts/source/parmesan-scripts.mf +284 -0
  879. data/share/lilypond/2.24.1/fonts/source/parmesan-timesignatures.mf +402 -0
  880. data/share/lilypond/2.24.1/fonts/source/parmesan11.mf +6 -0
  881. data/share/lilypond/2.24.1/fonts/source/parmesan13.mf +6 -0
  882. data/share/lilypond/2.24.1/fonts/source/parmesan14.mf +6 -0
  883. data/share/lilypond/2.24.1/fonts/source/parmesan16.mf +6 -0
  884. data/share/lilypond/2.24.1/fonts/source/parmesan18.mf +6 -0
  885. data/share/lilypond/2.24.1/fonts/source/parmesan20.mf +6 -0
  886. data/share/lilypond/2.24.1/fonts/source/parmesan23.mf +6 -0
  887. data/share/lilypond/2.24.1/fonts/source/parmesan26.mf +6 -0
  888. data/share/lilypond/2.24.1/fonts/svg/emmentaler-11.svg +2525 -0
  889. data/share/lilypond/2.24.1/fonts/svg/emmentaler-11.woff +0 -0
  890. data/share/lilypond/2.24.1/fonts/svg/emmentaler-13.svg +2530 -0
  891. data/share/lilypond/2.24.1/fonts/svg/emmentaler-13.woff +0 -0
  892. data/share/lilypond/2.24.1/fonts/svg/emmentaler-14.svg +2526 -0
  893. data/share/lilypond/2.24.1/fonts/svg/emmentaler-14.woff +0 -0
  894. data/share/lilypond/2.24.1/fonts/svg/emmentaler-16.svg +2523 -0
  895. data/share/lilypond/2.24.1/fonts/svg/emmentaler-16.woff +0 -0
  896. data/share/lilypond/2.24.1/fonts/svg/emmentaler-18.svg +2519 -0
  897. data/share/lilypond/2.24.1/fonts/svg/emmentaler-18.woff +0 -0
  898. data/share/lilypond/2.24.1/fonts/svg/emmentaler-20.svg +2512 -0
  899. data/share/lilypond/2.24.1/fonts/svg/emmentaler-20.woff +0 -0
  900. data/share/lilypond/2.24.1/fonts/svg/emmentaler-23.svg +2506 -0
  901. data/share/lilypond/2.24.1/fonts/svg/emmentaler-23.woff +0 -0
  902. data/share/lilypond/2.24.1/fonts/svg/emmentaler-26.svg +2510 -0
  903. data/share/lilypond/2.24.1/fonts/svg/emmentaler-26.woff +0 -0
  904. data/share/lilypond/2.24.1/fonts/svg/emmentaler-brace.svg +1757 -0
  905. data/share/lilypond/2.24.1/fonts/svg/emmentaler-brace.woff +0 -0
  906. data/share/lilypond/2.24.1/ly/Welcome_to_LilyPond.ly +45 -0
  907. data/share/lilypond/2.24.1/ly/arabic.ly +185 -0
  908. data/share/lilypond/2.24.1/ly/articulate.ly +1013 -0
  909. data/share/lilypond/2.24.1/ly/bagpipe.ly +368 -0
  910. data/share/lilypond/2.24.1/ly/base-tkit.ly +135 -0
  911. data/share/lilypond/2.24.1/ly/catalan.ly +23 -0
  912. data/share/lilypond/2.24.1/ly/chord-modifiers-init.ly +63 -0
  913. data/share/lilypond/2.24.1/ly/chord-repetition-init.ly +60 -0
  914. data/share/lilypond/2.24.1/ly/context-mods-init.ly +119 -0
  915. data/share/lilypond/2.24.1/ly/declarations-init.ly +167 -0
  916. data/share/lilypond/2.24.1/ly/deutsch.ly +23 -0
  917. data/share/lilypond/2.24.1/ly/drumpitch-init.ly +366 -0
  918. data/share/lilypond/2.24.1/ly/dynamic-scripts-init.ly +54 -0
  919. data/share/lilypond/2.24.1/ly/english.ly +23 -0
  920. data/share/lilypond/2.24.1/ly/engraver-init.ly +1619 -0
  921. data/share/lilypond/2.24.1/ly/espanol.ly +23 -0
  922. data/share/lilypond/2.24.1/ly/event-listener.ly +241 -0
  923. data/share/lilypond/2.24.1/ly/festival.ly +38 -0
  924. data/share/lilypond/2.24.1/ly/generate-documentation.ly +7 -0
  925. data/share/lilypond/2.24.1/ly/grace-init.ly +56 -0
  926. data/share/lilypond/2.24.1/ly/graphviz-init.ly +174 -0
  927. data/share/lilypond/2.24.1/ly/gregorian.ly +268 -0
  928. data/share/lilypond/2.24.1/ly/guile-debugger.ly +55 -0
  929. data/share/lilypond/2.24.1/ly/hel-arabic.ly +307 -0
  930. data/share/lilypond/2.24.1/ly/init.ly +96 -0
  931. data/share/lilypond/2.24.1/ly/italiano.ly +23 -0
  932. data/share/lilypond/2.24.1/ly/lilypond-book-preamble.ly +47 -0
  933. data/share/lilypond/2.24.1/ly/lyrics-tkit.ly +68 -0
  934. data/share/lilypond/2.24.1/ly/makam.ly +166 -0
  935. data/share/lilypond/2.24.1/ly/midi-init.ly +59 -0
  936. data/share/lilypond/2.24.1/ly/music-functions-init.ly +2254 -0
  937. data/share/lilypond/2.24.1/ly/nederlands.ly +23 -0
  938. data/share/lilypond/2.24.1/ly/norsk.ly +23 -0
  939. data/share/lilypond/2.24.1/ly/paper-defaults-init.ly +188 -0
  940. data/share/lilypond/2.24.1/ly/performer-init.ly +398 -0
  941. data/share/lilypond/2.24.1/ly/persian.ly +335 -0
  942. data/share/lilypond/2.24.1/ly/piano-tkit.ly +61 -0
  943. data/share/lilypond/2.24.1/ly/portugues.ly +23 -0
  944. data/share/lilypond/2.24.1/ly/predefined-fretboards-init.ly +78 -0
  945. data/share/lilypond/2.24.1/ly/predefined-guitar-fretboards.ly +506 -0
  946. data/share/lilypond/2.24.1/ly/predefined-guitar-ninth-fretboards.ly +75 -0
  947. data/share/lilypond/2.24.1/ly/predefined-mandolin-fretboards.ly +876 -0
  948. data/share/lilypond/2.24.1/ly/predefined-ukulele-fretboards.ly +1285 -0
  949. data/share/lilypond/2.24.1/ly/property-init.ly +858 -0
  950. data/share/lilypond/2.24.1/ly/satb.ly +214 -0
  951. data/share/lilypond/2.24.1/ly/scale-definitions-init.ly +117 -0
  952. data/share/lilypond/2.24.1/ly/scheme-sandbox.ly +39 -0
  953. data/share/lilypond/2.24.1/ly/script-init.ly +94 -0
  954. data/share/lilypond/2.24.1/ly/spanners-init.ly +146 -0
  955. data/share/lilypond/2.24.1/ly/ssaattbb.ly +335 -0
  956. data/share/lilypond/2.24.1/ly/staff-tkit.ly +182 -0
  957. data/share/lilypond/2.24.1/ly/string-tunings-init.ly +94 -0
  958. data/share/lilypond/2.24.1/ly/suomi.ly +23 -0
  959. data/share/lilypond/2.24.1/ly/svenska.ly +23 -0
  960. data/share/lilypond/2.24.1/ly/swing.ly +362 -0
  961. data/share/lilypond/2.24.1/ly/text-replacements.ly +150 -0
  962. data/share/lilypond/2.24.1/ly/titling-init.ly +150 -0
  963. data/share/lilypond/2.24.1/ly/toc-init.ly +182 -0
  964. data/share/lilypond/2.24.1/ly/turkish-makam.ly +609 -0
  965. data/share/lilypond/2.24.1/ly/vlaams.ly +23 -0
  966. data/share/lilypond/2.24.1/ly/vocal-tkit.ly +103 -0
  967. data/share/lilypond/2.24.1/ly/voice-tkit.ly +34 -0
  968. data/share/lilypond/2.24.1/ps/encodingdefs.ps +2611 -0
  969. data/share/lilypond/2.24.1/ps/lilyponddefs.ps +49 -0
  970. data/share/lilypond/2.24.1/ps/music-drawing-routines.ps +329 -0
  971. data/share/lilypond/2.24.1/python/__pycache__/book_base.cpython-310.pyc +0 -0
  972. data/share/lilypond/2.24.1/python/__pycache__/book_docbook.cpython-310.pyc +0 -0
  973. data/share/lilypond/2.24.1/python/__pycache__/book_html.cpython-310.pyc +0 -0
  974. data/share/lilypond/2.24.1/python/__pycache__/book_latex.cpython-310.pyc +0 -0
  975. data/share/lilypond/2.24.1/python/__pycache__/book_snippets.cpython-310.pyc +0 -0
  976. data/share/lilypond/2.24.1/python/__pycache__/book_texinfo.cpython-310.pyc +0 -0
  977. data/share/lilypond/2.24.1/python/__pycache__/convertrules.cpython-310.pyc +0 -0
  978. data/share/lilypond/2.24.1/python/__pycache__/langdefs.cpython-310.pyc +0 -0
  979. data/share/lilypond/2.24.1/python/__pycache__/lilylib.cpython-310.pyc +0 -0
  980. data/share/lilypond/2.24.1/python/__pycache__/midi.cpython-310.pyc +0 -0
  981. data/share/lilypond/2.24.1/python/__pycache__/musicexp.cpython-310.pyc +0 -0
  982. data/share/lilypond/2.24.1/python/__pycache__/musicxml.cpython-310.pyc +0 -0
  983. data/share/lilypond/2.24.1/python/__pycache__/musicxml2ly_conversion.cpython-310.pyc +0 -0
  984. data/share/lilypond/2.24.1/python/__pycache__/utilities.cpython-310.pyc +0 -0
  985. data/share/lilypond/2.24.1/python/book_base.py +331 -0
  986. data/share/lilypond/2.24.1/python/book_docbook.py +154 -0
  987. data/share/lilypond/2.24.1/python/book_html.py +178 -0
  988. data/share/lilypond/2.24.1/python/book_latex.py +373 -0
  989. data/share/lilypond/2.24.1/python/book_snippets.py +1052 -0
  990. data/share/lilypond/2.24.1/python/book_texinfo.py +437 -0
  991. data/share/lilypond/2.24.1/python/convertrules.py +4764 -0
  992. data/share/lilypond/2.24.1/python/langdefs.py +131 -0
  993. data/share/lilypond/2.24.1/python/lilylib.py +141 -0
  994. data/share/lilypond/2.24.1/python/midi.py +212 -0
  995. data/share/lilypond/2.24.1/python/musicexp.py +2781 -0
  996. data/share/lilypond/2.24.1/python/musicxml.py +1905 -0
  997. data/share/lilypond/2.24.1/python/musicxml2ly_conversion.py +80 -0
  998. data/share/lilypond/2.24.1/python/utilities.py +280 -0
  999. data/share/lilypond/2.24.1/scm/lily/accreg.scm +579 -0
  1000. data/share/lilypond/2.24.1/scm/lily/auto-beam.scm +163 -0
  1001. data/share/lilypond/2.24.1/scm/lily/autochange.scm +100 -0
  1002. data/share/lilypond/2.24.1/scm/lily/backend-library.scm +593 -0
  1003. data/share/lilypond/2.24.1/scm/lily/bar-line.scm +1281 -0
  1004. data/share/lilypond/2.24.1/scm/lily/breath.scm +74 -0
  1005. data/share/lilypond/2.24.1/scm/lily/c++.scm +174 -0
  1006. data/share/lilypond/2.24.1/scm/lily/chord-entry.scm +278 -0
  1007. data/share/lilypond/2.24.1/scm/lily/chord-ignatzek-names.scm +304 -0
  1008. data/share/lilypond/2.24.1/scm/lily/chord-name.scm +217 -0
  1009. data/share/lilypond/2.24.1/scm/lily/clip-region.scm +87 -0
  1010. data/share/lilypond/2.24.1/scm/lily/color.scm +757 -0
  1011. data/share/lilypond/2.24.1/scm/lily/curried-definitions.scm +68 -0
  1012. data/share/lilypond/2.24.1/scm/lily/define-context-properties.scm +939 -0
  1013. data/share/lilypond/2.24.1/scm/lily/define-event-classes.scm +142 -0
  1014. data/share/lilypond/2.24.1/scm/lily/define-grob-interfaces.scm +640 -0
  1015. data/share/lilypond/2.24.1/scm/lily/define-grob-properties.scm +1647 -0
  1016. data/share/lilypond/2.24.1/scm/lily/define-grobs.scm +4027 -0
  1017. data/share/lilypond/2.24.1/scm/lily/define-markup-commands.scm +5737 -0
  1018. data/share/lilypond/2.24.1/scm/lily/define-music-callbacks.scm +257 -0
  1019. data/share/lilypond/2.24.1/scm/lily/define-music-display-methods.scm +1350 -0
  1020. data/share/lilypond/2.24.1/scm/lily/define-music-properties.scm +242 -0
  1021. data/share/lilypond/2.24.1/scm/lily/define-music-types.scm +983 -0
  1022. data/share/lilypond/2.24.1/scm/lily/define-note-names.scm +1421 -0
  1023. data/share/lilypond/2.24.1/scm/lily/define-stencil-commands.scm +71 -0
  1024. data/share/lilypond/2.24.1/scm/lily/define-woodwind-diagrams.scm +1215 -0
  1025. data/share/lilypond/2.24.1/scm/lily/display-lily.scm +315 -0
  1026. data/share/lilypond/2.24.1/scm/lily/display-woodwind-diagrams.scm +1985 -0
  1027. data/share/lilypond/2.24.1/scm/lily/document-backend.scm +307 -0
  1028. data/share/lilypond/2.24.1/scm/lily/document-context-mods.scm +98 -0
  1029. data/share/lilypond/2.24.1/scm/lily/document-functions.scm +169 -0
  1030. data/share/lilypond/2.24.1/scm/lily/document-identifiers.scm +76 -0
  1031. data/share/lilypond/2.24.1/scm/lily/document-markup.scm +158 -0
  1032. data/share/lilypond/2.24.1/scm/lily/document-music.scm +146 -0
  1033. data/share/lilypond/2.24.1/scm/lily/document-outside-staff-priorities.scm +40 -0
  1034. data/share/lilypond/2.24.1/scm/lily/document-paper-sizes.scm +71 -0
  1035. data/share/lilypond/2.24.1/scm/lily/document-translation.scm +318 -0
  1036. data/share/lilypond/2.24.1/scm/lily/document-type-predicates.scm +85 -0
  1037. data/share/lilypond/2.24.1/scm/lily/documentation-generate.scm +259 -0
  1038. data/share/lilypond/2.24.1/scm/lily/documentation-lib.scm +207 -0
  1039. data/share/lilypond/2.24.1/scm/lily/file-cache.scm +28 -0
  1040. data/share/lilypond/2.24.1/scm/lily/flag-styles.scm +249 -0
  1041. data/share/lilypond/2.24.1/scm/lily/font-encodings.scm +1242 -0
  1042. data/share/lilypond/2.24.1/scm/lily/font.scm +303 -0
  1043. data/share/lilypond/2.24.1/scm/lily/framework-cairo.scm +26 -0
  1044. data/share/lilypond/2.24.1/scm/lily/framework-ps.scm +896 -0
  1045. data/share/lilypond/2.24.1/scm/lily/framework-svg.scm +172 -0
  1046. data/share/lilypond/2.24.1/scm/lily/fret-diagrams.scm +1261 -0
  1047. data/share/lilypond/2.24.1/scm/lily/graphviz.scm +78 -0
  1048. data/share/lilypond/2.24.1/scm/lily/guile-debugger.scm +90 -0
  1049. data/share/lilypond/2.24.1/scm/lily/harp-pedals.scm +172 -0
  1050. data/share/lilypond/2.24.1/scm/lily/hyphenate-internal-words.scm +51 -0
  1051. data/share/lilypond/2.24.1/scm/lily/layout-beam.scm +73 -0
  1052. data/share/lilypond/2.24.1/scm/lily/layout-slur.scm +45 -0
  1053. data/share/lilypond/2.24.1/scm/lily/lily-library.scm +1446 -0
  1054. data/share/lilypond/2.24.1/scm/lily/lily-sort.scm +116 -0
  1055. data/share/lilypond/2.24.1/scm/lily/lily.scm +929 -0
  1056. data/share/lilypond/2.24.1/scm/lily/ly-syntax-constructors.scm +374 -0
  1057. data/share/lilypond/2.24.1/scm/lily/markup-macros.scm +493 -0
  1058. data/share/lilypond/2.24.1/scm/lily/markup.scm +126 -0
  1059. data/share/lilypond/2.24.1/scm/lily/midi.scm +258 -0
  1060. data/share/lilypond/2.24.1/scm/lily/modal-transforms.scm +337 -0
  1061. data/share/lilypond/2.24.1/scm/lily/music-functions.scm +2878 -0
  1062. data/share/lilypond/2.24.1/scm/lily/output-lib.scm +3377 -0
  1063. data/share/lilypond/2.24.1/scm/lily/output-ps.scm +335 -0
  1064. data/share/lilypond/2.24.1/scm/lily/output-svg.scm +684 -0
  1065. data/share/lilypond/2.24.1/scm/lily/page.scm +321 -0
  1066. data/share/lilypond/2.24.1/scm/lily/paper-system.scm +271 -0
  1067. data/share/lilypond/2.24.1/scm/lily/paper.scm +376 -0
  1068. data/share/lilypond/2.24.1/scm/lily/parser-clef.scm +205 -0
  1069. data/share/lilypond/2.24.1/scm/lily/parser-ly-from-scheme.scm +170 -0
  1070. data/share/lilypond/2.24.1/scm/lily/part-combiner.scm +998 -0
  1071. data/share/lilypond/2.24.1/scm/lily/predefined-fretboards.scm +54 -0
  1072. data/share/lilypond/2.24.1/scm/lily/ps-to-png.scm +182 -0
  1073. data/share/lilypond/2.24.1/scm/lily/scheme-engravers.scm +1813 -0
  1074. data/share/lilypond/2.24.1/scm/lily/scheme-performers.scm +126 -0
  1075. data/share/lilypond/2.24.1/scm/lily/script.scm +416 -0
  1076. data/share/lilypond/2.24.1/scm/lily/skyline.scm +25 -0
  1077. data/share/lilypond/2.24.1/scm/lily/song-util.scm +191 -0
  1078. data/share/lilypond/2.24.1/scm/lily/song.scm +853 -0
  1079. data/share/lilypond/2.24.1/scm/lily/stencil.scm +998 -0
  1080. data/share/lilypond/2.24.1/scm/lily/tablature.scm +392 -0
  1081. data/share/lilypond/2.24.1/scm/lily/time-signature-settings.scm +473 -0
  1082. data/share/lilypond/2.24.1/scm/lily/time-signature.scm +35 -0
  1083. data/share/lilypond/2.24.1/scm/lily/titling.scm +99 -0
  1084. data/share/lilypond/2.24.1/scm/lily/to-xml.scm +254 -0
  1085. data/share/lilypond/2.24.1/scm/lily/translation-functions.scm +1169 -0
  1086. data/share/lilypond/2.24.1/vim/compiler/lilypond.vim +36 -0
  1087. data/share/lilypond/2.24.1/vim/ftdetect/lilypond.vim +4 -0
  1088. data/share/lilypond/2.24.1/vim/ftplugin/lilypond.vim +91 -0
  1089. data/share/lilypond/2.24.1/vim/indent/lilypond.vim +79 -0
  1090. data/share/lilypond/2.24.1/vim/syntax/lilypond-words +1408 -0
  1091. data/share/lilypond/2.24.1/vim/syntax/lilypond-words.vim +3 -0
  1092. data/share/lilypond/2.24.1/vim/syntax/lilypond.vim +104 -0
  1093. data/share/locale/ca/LC_MESSAGES/lilypond.mo +0 -0
  1094. data/share/locale/cs/LC_MESSAGES/lilypond.mo +0 -0
  1095. data/share/locale/da/LC_MESSAGES/lilypond.mo +0 -0
  1096. data/share/locale/de/LC_MESSAGES/lilypond.mo +0 -0
  1097. data/share/locale/el/LC_MESSAGES/lilypond.mo +0 -0
  1098. data/share/locale/eo/LC_MESSAGES/lilypond.mo +0 -0
  1099. data/share/locale/es/LC_MESSAGES/lilypond.mo +0 -0
  1100. data/share/locale/fi/LC_MESSAGES/lilypond.mo +0 -0
  1101. data/share/locale/fr/LC_MESSAGES/lilypond.mo +0 -0
  1102. data/share/locale/it/LC_MESSAGES/lilypond.mo +0 -0
  1103. data/share/locale/ja/LC_MESSAGES/lilypond.mo +0 -0
  1104. data/share/locale/nl/LC_MESSAGES/lilypond.mo +0 -0
  1105. data/share/locale/ru/LC_MESSAGES/lilypond.mo +0 -0
  1106. data/share/locale/sv/LC_MESSAGES/lilypond.mo +0 -0
  1107. data/share/locale/tr/LC_MESSAGES/lilypond.mo +0 -0
  1108. data/share/locale/uk/LC_MESSAGES/lilypond.mo +0 -0
  1109. data/share/locale/vi/LC_MESSAGES/lilypond.mo +0 -0
  1110. data/share/locale/zh_CN/LC_MESSAGES/lilypond.mo +0 -0
  1111. data/share/locale/zh_TW/LC_MESSAGES/lilypond.mo +0 -0
  1112. metadata +1135 -4
@@ -0,0 +1,2043 @@
1
+ ;;; HTTP messages
2
+
3
+ ;; Copyright (C) 2010-2017 Free Software Foundation, Inc.
4
+
5
+ ;; This library is free software; you can redistribute it and/or
6
+ ;; modify it under the terms of the GNU Lesser General Public
7
+ ;; License as published by the Free Software Foundation; either
8
+ ;; version 3 of the License, or (at your option) any later version.
9
+ ;;
10
+ ;; This library is distributed in the hope that it will be useful,
11
+ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ ;; Lesser General Public License for more details.
14
+ ;;
15
+ ;; You should have received a copy of the GNU Lesser General Public
16
+ ;; License along with this library; if not, write to the Free Software
17
+ ;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18
+ ;; 02110-1301 USA
19
+
20
+ ;;; Commentary:
21
+ ;;;
22
+ ;;; This module has a number of routines to parse textual
23
+ ;;; representations of HTTP data into native Scheme data structures.
24
+ ;;;
25
+ ;;; It tries to follow RFCs fairly strictly---the road to perdition
26
+ ;;; being paved with compatibility hacks---though some allowances are
27
+ ;;; made for not-too-divergent texts (like a quality of .2 which should
28
+ ;;; be 0.2, etc).
29
+ ;;;
30
+ ;;; Code:
31
+
32
+ (define-module (web http)
33
+ #:use-module ((srfi srfi-1) #:select (append-map! map!))
34
+ #:use-module (srfi srfi-9)
35
+ #:use-module (srfi srfi-19)
36
+ #:use-module (ice-9 rdelim)
37
+ #:use-module (ice-9 match)
38
+ #:use-module (ice-9 q)
39
+ #:use-module (ice-9 binary-ports)
40
+ #:use-module (ice-9 textual-ports)
41
+ #:use-module (rnrs bytevectors)
42
+ #:use-module (web uri)
43
+ #:export (string->header
44
+ header->string
45
+
46
+ declare-header!
47
+ declare-opaque-header!
48
+ known-header?
49
+ header-parser
50
+ header-validator
51
+ header-writer
52
+
53
+ read-header
54
+ parse-header
55
+ valid-header?
56
+ write-header
57
+
58
+ read-headers
59
+ write-headers
60
+
61
+ parse-http-method
62
+ parse-http-version
63
+ parse-request-uri
64
+
65
+ read-request-line
66
+ write-request-line
67
+ read-response-line
68
+ write-response-line
69
+
70
+ make-chunked-input-port
71
+ make-chunked-output-port
72
+
73
+ http-proxy-port?
74
+ set-http-proxy-port?!))
75
+
76
+
77
+ (define (put-symbol port sym)
78
+ (put-string port (symbol->string sym)))
79
+
80
+ (define (put-non-negative-integer port i)
81
+ (put-string port (number->string i)))
82
+
83
+ (define (string->header name)
84
+ "Parse NAME to a symbolic header name."
85
+ (string->symbol (string-downcase name)))
86
+
87
+ (define-record-type <header-decl>
88
+ (make-header-decl name parser validator writer multiple?)
89
+ header-decl?
90
+ (name header-decl-name)
91
+ (parser header-decl-parser)
92
+ (validator header-decl-validator)
93
+ (writer header-decl-writer)
94
+ (multiple? header-decl-multiple?))
95
+
96
+ ;; sym -> header
97
+ (define *declared-headers* (make-hash-table))
98
+
99
+ (define (lookup-header-decl sym)
100
+ (hashq-ref *declared-headers* sym))
101
+
102
+ (define* (declare-header! name
103
+ parser
104
+ validator
105
+ writer
106
+ #:key multiple?)
107
+ "Declare a parser, validator, and writer for a given header."
108
+ (unless (and (string? name) parser validator writer)
109
+ (error "bad header decl" name parser validator writer multiple?))
110
+ (let ((decl (make-header-decl name parser validator writer multiple?)))
111
+ (hashq-set! *declared-headers* (string->header name) decl)
112
+ decl))
113
+
114
+ (define (header->string sym)
115
+ "Return the string form for the header named SYM."
116
+ (let ((decl (lookup-header-decl sym)))
117
+ (if decl
118
+ (header-decl-name decl)
119
+ (string-titlecase (symbol->string sym)))))
120
+
121
+ (define (known-header? sym)
122
+ "Return ‘#t’ iff SYM is a known header, with associated
123
+ parsers and serialization procedures."
124
+ (and (lookup-header-decl sym) #t))
125
+
126
+ (define (header-parser sym)
127
+ "Return the value parser for headers named SYM. The result is a
128
+ procedure that takes one argument, a string, and returns the parsed
129
+ value. If the header isn't known to Guile, a default parser is returned
130
+ that passes through the string unchanged."
131
+ (let ((decl (lookup-header-decl sym)))
132
+ (if decl
133
+ (header-decl-parser decl)
134
+ (lambda (x) x))))
135
+
136
+ (define (header-validator sym)
137
+ "Return a predicate which returns ‘#t’ if the given value is valid
138
+ for headers named SYM. The default validator for unknown headers
139
+ is ‘string?’."
140
+ (let ((decl (lookup-header-decl sym)))
141
+ (if decl
142
+ (header-decl-validator decl)
143
+ string?)))
144
+
145
+ (define (header-writer sym)
146
+ "Return a procedure that writes values for headers named SYM to a
147
+ port. The resulting procedure takes two arguments: a value and a port.
148
+ The default writer will call ‘put-string’."
149
+ (let ((decl (lookup-header-decl sym)))
150
+ (if decl
151
+ (header-decl-writer decl)
152
+ (lambda (val port)
153
+ (put-string port val)))))
154
+
155
+ (define (read-header-line port)
156
+ "Read an HTTP header line and return it without its final CRLF or LF.
157
+ Raise a 'bad-header' exception if the line does not end in CRLF or LF,
158
+ or if EOF is reached."
159
+ (match (%read-line port)
160
+ (((? string? line) . #\newline)
161
+ ;; '%read-line' does not consider #\return a delimiter; so if it's
162
+ ;; there, remove it. We are more tolerant than the RFC in that we
163
+ ;; tolerate LF-only endings.
164
+ (if (string-suffix? "\r" line)
165
+ (string-drop-right line 1)
166
+ line))
167
+ ((line . _) ;EOF or missing delimiter
168
+ (bad-header 'read-header-line line))))
169
+
170
+ (define (read-continuation-line port val)
171
+ (match (peek-char port)
172
+ ((or #\space #\tab)
173
+ (read-continuation-line port
174
+ (string-append val (read-header-line port))))
175
+ (_ val)))
176
+
177
+ (define *eof* (call-with-input-string "" read))
178
+
179
+ (define (read-header port)
180
+ "Read one HTTP header from PORT. Return two values: the header
181
+ name and the parsed Scheme value. May raise an exception if the header
182
+ was known but the value was invalid.
183
+
184
+ Returns the end-of-file object for both values if the end of the message
185
+ body was reached (i.e., a blank line)."
186
+ (let ((line (read-header-line port)))
187
+ (if (or (string-null? line)
188
+ (string=? line "\r"))
189
+ (values *eof* *eof*)
190
+ (let* ((delim (or (string-index line #\:)
191
+ (bad-header '%read line)))
192
+ (sym (string->header (substring line 0 delim))))
193
+ (values
194
+ sym
195
+ (parse-header
196
+ sym
197
+ (read-continuation-line
198
+ port
199
+ (string-trim-both line char-set:whitespace (1+ delim)))))))))
200
+
201
+ (define (parse-header sym val)
202
+ "Parse VAL, a string, with the parser registered for the header
203
+ named SYM. Returns the parsed value."
204
+ ((header-parser sym) val))
205
+
206
+ (define (valid-header? sym val)
207
+ "Returns a true value iff VAL is a valid Scheme value for the
208
+ header with name SYM."
209
+ (unless (symbol? sym)
210
+ (error "header name not a symbol" sym))
211
+ ((header-validator sym) val))
212
+
213
+ (define (write-header sym val port)
214
+ "Write the given header name and value to PORT, using the writer
215
+ from ‘header-writer’."
216
+ (put-string port (header->string sym))
217
+ (put-string port ": ")
218
+ ((header-writer sym) val port)
219
+ (put-string port "\r\n"))
220
+
221
+ (define (read-headers port)
222
+ "Read the headers of an HTTP message from PORT, returning them
223
+ as an ordered alist."
224
+ (let lp ((headers '()))
225
+ (call-with-values (lambda () (read-header port))
226
+ (lambda (k v)
227
+ (if (eof-object? k)
228
+ (reverse! headers)
229
+ (lp (acons k v headers)))))))
230
+
231
+ (define (write-headers headers port)
232
+ "Write the given header alist to PORT. Doesn't write the final
233
+ ‘\\r\\n’, as the user might want to add another header."
234
+ (let lp ((headers headers))
235
+ (match headers
236
+ (((k . v) . headers)
237
+ (write-header k v port)
238
+ (lp headers))
239
+ (()
240
+ (values)))))
241
+
242
+
243
+
244
+
245
+ ;;;
246
+ ;;; Utilities
247
+ ;;;
248
+
249
+ (define (bad-header sym val)
250
+ (throw 'bad-header sym val))
251
+ (define (bad-header-component sym val)
252
+ (throw 'bad-header-component sym val))
253
+
254
+ (define (bad-header-printer port key args default-printer)
255
+ (apply (case-lambda
256
+ ((sym val)
257
+ (format port "Bad ~a header: ~a\n" (header->string sym) val))
258
+ (_ (default-printer)))
259
+ args))
260
+ (define (bad-header-component-printer port key args default-printer)
261
+ (apply (case-lambda
262
+ ((sym val)
263
+ (format port "Bad ~a header component: ~a\n" sym val))
264
+ (_ (default-printer)))
265
+ args))
266
+ (set-exception-printer! 'bad-header bad-header-printer)
267
+ (set-exception-printer! 'bad-header-component bad-header-component-printer)
268
+
269
+ (define (parse-opaque-string str)
270
+ str)
271
+ (define (validate-opaque-string val)
272
+ (string? val))
273
+ (define (write-opaque-string val port)
274
+ (put-string port val))
275
+
276
+ (define separators-without-slash
277
+ (string->char-set "[^][()<>@,;:\\\"?= \t]"))
278
+ (define (validate-media-type str)
279
+ (let ((idx (string-index str #\/)))
280
+ (and idx (= idx (string-rindex str #\/))
281
+ (not (string-index str separators-without-slash)))))
282
+ (define (parse-media-type str)
283
+ (unless (validate-media-type str)
284
+ (bad-header-component 'media-type str))
285
+ (string->symbol str))
286
+
287
+ (define* (skip-whitespace str #:optional (start 0) (end (string-length str)))
288
+ (let lp ((i start))
289
+ (if (and (< i end) (char-whitespace? (string-ref str i)))
290
+ (lp (1+ i))
291
+ i)))
292
+
293
+ (define* (trim-whitespace str #:optional (start 0) (end (string-length str)))
294
+ (let lp ((i end))
295
+ (if (and (< start i) (char-whitespace? (string-ref str (1- i))))
296
+ (lp (1- i))
297
+ i)))
298
+
299
+ (define* (split-and-trim str #:optional (delim #\,)
300
+ (start 0) (end (string-length str)))
301
+ (let lp ((i start))
302
+ (if (< i end)
303
+ (let* ((idx (string-index str delim i end))
304
+ (tok (string-trim-both str char-set:whitespace i (or idx end))))
305
+ (cons tok (split-and-trim str delim (if idx (1+ idx) end) end)))
306
+ '())))
307
+
308
+ (define (list-of-strings? val)
309
+ (list-of? val string?))
310
+
311
+ (define (write-list-of-strings val port)
312
+ (put-list port val put-string ", "))
313
+
314
+ (define (split-header-names str)
315
+ (map string->header (split-and-trim str)))
316
+
317
+ (define (list-of-header-names? val)
318
+ (list-of? val symbol?))
319
+
320
+ (define (write-header-list val port)
321
+ (put-list port val
322
+ (lambda (port x)
323
+ (put-string port (header->string x)))
324
+ ", "))
325
+
326
+ (define (collect-escaped-string from start len escapes)
327
+ (let ((to (make-string len)))
328
+ (let lp ((start start) (i 0) (escapes escapes))
329
+ (match escapes
330
+ (()
331
+ (substring-move! from start (+ start (- len i)) to i)
332
+ to)
333
+ ((e . escapes)
334
+ (let ((next-start (+ start (- e i) 2)))
335
+ (substring-move! from start (- next-start 2) to i)
336
+ (string-set! to e (string-ref from (- next-start 1)))
337
+ (lp next-start (1+ e) escapes)))))))
338
+
339
+ ;; in incremental mode, returns two values: the string, and the index at
340
+ ;; which the string ended
341
+ (define* (parse-qstring str #:optional
342
+ (start 0) (end (trim-whitespace str start))
343
+ #:key incremental?)
344
+ (unless (and (< start end) (eqv? (string-ref str start) #\"))
345
+ (bad-header-component 'qstring str))
346
+ (let lp ((i (1+ start)) (qi 0) (escapes '()))
347
+ (if (< i end)
348
+ (case (string-ref str i)
349
+ ((#\\)
350
+ (lp (+ i 2) (1+ qi) (cons qi escapes)))
351
+ ((#\")
352
+ (let ((out (collect-escaped-string str (1+ start) qi escapes)))
353
+ (cond
354
+ (incremental? (values out (1+ i)))
355
+ ((= (1+ i) end) out)
356
+ (else (bad-header-component 'qstring str)))))
357
+ (else
358
+ (lp (1+ i) (1+ qi) escapes)))
359
+ (bad-header-component 'qstring str))))
360
+
361
+ (define (put-list port items put-item delim)
362
+ (match items
363
+ (() (values))
364
+ ((item . items)
365
+ (put-item port item)
366
+ (let lp ((items items))
367
+ (match items
368
+ (() (values))
369
+ ((item . items)
370
+ (put-string port delim)
371
+ (put-item port item)
372
+ (lp items)))))))
373
+
374
+ (define (write-qstring str port)
375
+ (put-char port #\")
376
+ (if (string-index str #\")
377
+ ;; optimize me
378
+ (put-list port (string-split str #\") put-string "\\\"")
379
+ (put-string port str))
380
+ (put-char port #\"))
381
+
382
+ (define* (parse-quality str #:optional (start 0) (end (string-length str)))
383
+ (define (char->decimal c)
384
+ (let ((i (- (char->integer c) (char->integer #\0))))
385
+ (unless (and (<= 0 i) (< i 10))
386
+ (bad-header-component 'quality str))
387
+ i))
388
+ (cond
389
+ ((not (< start end))
390
+ (bad-header-component 'quality str))
391
+ ((eqv? (string-ref str start) #\1)
392
+ (unless (or (string= str "1" start end)
393
+ (string= str "1." start end)
394
+ (string= str "1.0" start end)
395
+ (string= str "1.00" start end)
396
+ (string= str "1.000" start end))
397
+ (bad-header-component 'quality str))
398
+ 1000)
399
+ ((eqv? (string-ref str start) #\0)
400
+ (if (or (string= str "0" start end)
401
+ (string= str "0." start end))
402
+ 0
403
+ (if (< 2 (- end start) 6)
404
+ (let lp ((place 1) (i (+ start 4)) (q 0))
405
+ (if (= i (1+ start))
406
+ (if (eqv? (string-ref str (1+ start)) #\.)
407
+ q
408
+ (bad-header-component 'quality str))
409
+ (lp (* 10 place) (1- i)
410
+ (if (< i end)
411
+ (+ q (* place (char->decimal (string-ref str i))))
412
+ q))))
413
+ (bad-header-component 'quality str))))
414
+ ;; Allow the nonstandard .2 instead of 0.2.
415
+ ((and (eqv? (string-ref str start) #\.)
416
+ (< 1 (- end start) 5))
417
+ (let lp ((place 1) (i (+ start 3)) (q 0))
418
+ (if (= i start)
419
+ q
420
+ (lp (* 10 place) (1- i)
421
+ (if (< i end)
422
+ (+ q (* place (char->decimal (string-ref str i))))
423
+ q)))))
424
+ (else
425
+ (bad-header-component 'quality str))))
426
+
427
+ (define (valid-quality? q)
428
+ (and (non-negative-integer? q) (<= q 1000)))
429
+
430
+ (define (write-quality q port)
431
+ (define (digit->char d)
432
+ (integer->char (+ (char->integer #\0) d)))
433
+ (put-char port (digit->char (modulo (quotient q 1000) 10)))
434
+ (put-char port #\.)
435
+ (put-char port (digit->char (modulo (quotient q 100) 10)))
436
+ (put-char port (digit->char (modulo (quotient q 10) 10)))
437
+ (put-char port (digit->char (modulo q 10))))
438
+
439
+ (define (list-of? val pred)
440
+ (match val
441
+ (((? pred) ...) #t)
442
+ (_ #f)))
443
+
444
+ (define* (parse-quality-list str)
445
+ (map (lambda (part)
446
+ (cond
447
+ ((string-rindex part #\;)
448
+ => (lambda (idx)
449
+ (let ((qpart (string-trim-both part char-set:whitespace (1+ idx))))
450
+ (unless (string-prefix? "q=" qpart)
451
+ (bad-header-component 'quality qpart))
452
+ (cons (parse-quality qpart 2)
453
+ (string-trim-both part char-set:whitespace 0 idx)))))
454
+ (else
455
+ (cons 1000 (string-trim-both part char-set:whitespace)))))
456
+ (string-split str #\,)))
457
+
458
+ (define (validate-quality-list l)
459
+ (match l
460
+ ((((? valid-quality?) . (? string?)) ...) #t)
461
+ (_ #f)))
462
+
463
+ (define (write-quality-list l port)
464
+ (put-list port l
465
+ (lambda (port x)
466
+ (let ((q (car x))
467
+ (str (cdr x)))
468
+ (put-string port str)
469
+ (when (< q 1000)
470
+ (put-string port ";q=")
471
+ (write-quality q port))))
472
+ ","))
473
+
474
+ (define* (parse-non-negative-integer val #:optional (start 0)
475
+ (end (string-length val)))
476
+ (define (char->decimal c)
477
+ (let ((i (- (char->integer c) (char->integer #\0))))
478
+ (unless (and (<= 0 i) (< i 10))
479
+ (bad-header-component 'non-negative-integer val))
480
+ i))
481
+ (unless (< start end)
482
+ (bad-header-component 'non-negative-integer val))
483
+ (let lp ((i start) (out 0))
484
+ (if (< i end)
485
+ (lp (1+ i)
486
+ (+ (* out 10) (char->decimal (string-ref val i))))
487
+ out)))
488
+
489
+ (define (non-negative-integer? code)
490
+ (and (number? code) (>= code 0) (exact? code) (integer? code)))
491
+
492
+ (define (default-val-parser k val)
493
+ val)
494
+
495
+ (define (default-val-validator k val)
496
+ (or (not val) (string? val)))
497
+
498
+ (define (default-val-writer k val port)
499
+ (if (or (string-index val #\;)
500
+ (string-index val #\,)
501
+ (string-index val #\"))
502
+ (write-qstring val port)
503
+ (put-string port val)))
504
+
505
+ (define* (parse-key-value-list str #:optional
506
+ (val-parser default-val-parser)
507
+ (start 0) (end (string-length str)))
508
+ (let lp ((i start))
509
+ (if (not (< i end))
510
+ '()
511
+ (let* ((i (skip-whitespace str i end))
512
+ (eq (string-index str #\= i end))
513
+ (comma (string-index str #\, i end))
514
+ (delim (min (or eq end) (or comma end)))
515
+ (k (string->symbol
516
+ (substring str i (trim-whitespace str i delim)))))
517
+ (call-with-values
518
+ (lambda ()
519
+ (if (and eq (or (not comma) (< eq comma)))
520
+ (let ((i (skip-whitespace str (1+ eq) end)))
521
+ (if (and (< i end) (eqv? (string-ref str i) #\"))
522
+ (parse-qstring str i end #:incremental? #t)
523
+ (values (substring str i
524
+ (trim-whitespace str i
525
+ (or comma end)))
526
+ (or comma end))))
527
+ (values #f delim)))
528
+ (lambda (v-str next-i)
529
+ (let ((v (val-parser k v-str))
530
+ (i (skip-whitespace str next-i end)))
531
+ (unless (or (= i end) (eqv? (string-ref str i) #\,))
532
+ (bad-header-component 'key-value-list
533
+ (substring str start end)))
534
+ (cons (if v (cons k v) k)
535
+ (lp (1+ i))))))))))
536
+
537
+ (define* (key-value-list? list #:optional
538
+ (valid? default-val-validator))
539
+ (list-of? list
540
+ (lambda (elt)
541
+ (match elt
542
+ (((? symbol? k) . v) (valid? k v))
543
+ ((? symbol? k) (valid? k #f))
544
+ (_ #f)))))
545
+
546
+ (define* (write-key-value-list list port #:optional
547
+ (val-writer default-val-writer) (delim ", "))
548
+ (put-list
549
+ port list
550
+ (lambda (port x)
551
+ (match x
552
+ ((k . #f)
553
+ (put-symbol port k))
554
+ ((k . v)
555
+ (put-symbol port k)
556
+ (put-char port #\=)
557
+ (val-writer k v port))
558
+ (k
559
+ (put-symbol port k))))
560
+ delim))
561
+
562
+ ;; param-component = token [ "=" (token | quoted-string) ] \
563
+ ;; *(";" token [ "=" (token | quoted-string) ])
564
+ ;;
565
+ (define param-delimiters (char-set #\, #\; #\=))
566
+ (define param-value-delimiters (char-set-adjoin char-set:whitespace #\, #\;))
567
+ (define* (parse-param-component str #:optional
568
+ (val-parser default-val-parser)
569
+ (start 0) (end (string-length str)))
570
+ (let lp ((i start) (out '()))
571
+ (if (not (< i end))
572
+ (values (reverse! out) end)
573
+ (let ((delim (string-index str param-delimiters i)))
574
+ (let ((k (string->symbol
575
+ (substring str i (trim-whitespace str i (or delim end)))))
576
+ (delimc (and delim (string-ref str delim))))
577
+ (case delimc
578
+ ((#\=)
579
+ (call-with-values
580
+ (lambda ()
581
+ (let ((i (skip-whitespace str (1+ delim) end)))
582
+ (if (and (< i end) (eqv? (string-ref str i) #\"))
583
+ (parse-qstring str i end #:incremental? #t)
584
+ (let ((delim
585
+ (or (string-index str param-value-delimiters
586
+ i end)
587
+ end)))
588
+ (values (substring str i delim)
589
+ delim)))))
590
+ (lambda (v-str next-i)
591
+ (let* ((v (val-parser k v-str))
592
+ (x (if v (cons k v) k))
593
+ (i (skip-whitespace str next-i end)))
594
+ (case (and (< i end) (string-ref str i))
595
+ ((#f)
596
+ (values (reverse! (cons x out)) end))
597
+ ((#\;)
598
+ (lp (skip-whitespace str (1+ i) end)
599
+ (cons x out)))
600
+ (else ; including #\,
601
+ (values (reverse! (cons x out)) i)))))))
602
+ ((#\;)
603
+ (let ((v (val-parser k #f)))
604
+ (lp (skip-whitespace str (1+ delim) end)
605
+ (cons (if v (cons k v) k) out))))
606
+
607
+ (else ;; either the end of the string or a #\,
608
+ (let ((v (val-parser k #f)))
609
+ (values (reverse! (cons (if v (cons k v) k) out))
610
+ (or delim end))))))))))
611
+
612
+ (define* (parse-param-list str #:optional
613
+ (val-parser default-val-parser)
614
+ (start 0) (end (string-length str)))
615
+ (let lp ((i start) (out '()))
616
+ (call-with-values
617
+ (lambda () (parse-param-component str val-parser i end))
618
+ (lambda (item i)
619
+ (if (< i end)
620
+ (if (eqv? (string-ref str i) #\,)
621
+ (lp (skip-whitespace str (1+ i) end)
622
+ (cons item out))
623
+ (bad-header-component 'param-list str))
624
+ (reverse! (cons item out)))))))
625
+
626
+ (define* (validate-param-list list #:optional
627
+ (valid? default-val-validator))
628
+ (list-of? list
629
+ (lambda (elt)
630
+ (key-value-list? elt valid?))))
631
+
632
+ (define* (write-param-list list port #:optional
633
+ (val-writer default-val-writer))
634
+ (put-list
635
+ port list
636
+ (lambda (port item)
637
+ (write-key-value-list item port val-writer ";"))
638
+ ","))
639
+
640
+ (define-syntax string-match?
641
+ (lambda (x)
642
+ (syntax-case x ()
643
+ ((_ str pat) (string? (syntax->datum #'pat))
644
+ (let ((p (syntax->datum #'pat)))
645
+ #`(let ((s str))
646
+ (and
647
+ (= (string-length s) #,(string-length p))
648
+ #,@(let lp ((i 0) (tests '()))
649
+ (if (< i (string-length p))
650
+ (let ((c (string-ref p i)))
651
+ (lp (1+ i)
652
+ (case c
653
+ ((#\.) ; Whatever.
654
+ tests)
655
+ ((#\d) ; Digit.
656
+ (cons #`(char-numeric? (string-ref s #,i))
657
+ tests))
658
+ ((#\a) ; Alphabetic.
659
+ (cons #`(char-alphabetic? (string-ref s #,i))
660
+ tests))
661
+ (else ; Literal.
662
+ (cons #`(eqv? (string-ref s #,i) #,c)
663
+ tests)))))
664
+ tests)))))))))
665
+
666
+ ;; "Jan" | "Feb" | "Mar" | "Apr" | "May" | "Jun"
667
+ ;; "Jul" | "Aug" | "Sep" | "Oct" | "Nov" | "Dec"
668
+
669
+ (define (parse-month str start end)
670
+ (define (bad)
671
+ (bad-header-component 'month (substring str start end)))
672
+ (if (not (= (- end start) 3))
673
+ (bad)
674
+ (let ((a (string-ref str (+ start 0)))
675
+ (b (string-ref str (+ start 1)))
676
+ (c (string-ref str (+ start 2))))
677
+ (case a
678
+ ((#\J)
679
+ (case b
680
+ ((#\a) (case c ((#\n) 1) (else (bad))))
681
+ ((#\u) (case c ((#\n) 6) ((#\l) 7) (else (bad))))
682
+ (else (bad))))
683
+ ((#\F)
684
+ (case b
685
+ ((#\e) (case c ((#\b) 2) (else (bad))))
686
+ (else (bad))))
687
+ ((#\M)
688
+ (case b
689
+ ((#\a) (case c ((#\r) 3) ((#\y) 5) (else (bad))))
690
+ (else (bad))))
691
+ ((#\A)
692
+ (case b
693
+ ((#\p) (case c ((#\r) 4) (else (bad))))
694
+ ((#\u) (case c ((#\g) 8) (else (bad))))
695
+ (else (bad))))
696
+ ((#\S)
697
+ (case b
698
+ ((#\e) (case c ((#\p) 9) (else (bad))))
699
+ (else (bad))))
700
+ ((#\O)
701
+ (case b
702
+ ((#\c) (case c ((#\t) 10) (else (bad))))
703
+ (else (bad))))
704
+ ((#\N)
705
+ (case b
706
+ ((#\o) (case c ((#\v) 11) (else (bad))))
707
+ (else (bad))))
708
+ ((#\D)
709
+ (case b
710
+ ((#\e) (case c ((#\c) 12) (else (bad))))
711
+ (else (bad))))
712
+ (else (bad))))))
713
+
714
+ ;; "GMT" | "+" 4DIGIT | "-" 4DIGIT
715
+ ;;
716
+ ;; RFC 2616 requires date values to use "GMT", but recommends accepting
717
+ ;; the others as they are commonly generated by e.g. RFC 822 sources.
718
+ (define (parse-zone-offset str start)
719
+ (let ((s (substring str start)))
720
+ (define (bad)
721
+ (bad-header-component 'zone-offset s))
722
+ (cond
723
+ ((string=? s "GMT")
724
+ 0)
725
+ ((string=? s "UTC")
726
+ 0)
727
+ ((string-match? s ".dddd")
728
+ (let ((sign (case (string-ref s 0)
729
+ ((#\+) +1)
730
+ ((#\-) -1)
731
+ (else (bad))))
732
+ (hours (parse-non-negative-integer s 1 3))
733
+ (minutes (parse-non-negative-integer s 3 5)))
734
+ (* sign 60 (+ (* 60 hours) minutes)))) ; seconds east of Greenwich
735
+ (else (bad)))))
736
+
737
+ ;; RFC 822, updated by RFC 1123
738
+ ;;
739
+ ;; Sun, 06 Nov 1994 08:49:37 GMT
740
+ ;; 01234567890123456789012345678
741
+ ;; 0 1 2
742
+ (define (parse-rfc-822-date str space zone-offset)
743
+ ;; We could verify the day of the week but we don't.
744
+ (cond ((string-match? (substring str 0 space) "aaa, dd aaa dddd dd:dd:dd")
745
+ (let ((date (parse-non-negative-integer str 5 7))
746
+ (month (parse-month str 8 11))
747
+ (year (parse-non-negative-integer str 12 16))
748
+ (hour (parse-non-negative-integer str 17 19))
749
+ (minute (parse-non-negative-integer str 20 22))
750
+ (second (parse-non-negative-integer str 23 25)))
751
+ (make-date 0 second minute hour date month year zone-offset)))
752
+ ((string-match? (substring str 0 space) "aaa, d aaa dddd dd:dd:dd")
753
+ (let ((date (parse-non-negative-integer str 5 6))
754
+ (month (parse-month str 7 10))
755
+ (year (parse-non-negative-integer str 11 15))
756
+ (hour (parse-non-negative-integer str 16 18))
757
+ (minute (parse-non-negative-integer str 19 21))
758
+ (second (parse-non-negative-integer str 22 24)))
759
+ (make-date 0 second minute hour date month year zone-offset)))
760
+
761
+ ;; The next two clauses match dates that have a space instead of
762
+ ;; a leading zero for hours, like " 8:49:37".
763
+ ((string-match? (substring str 0 space) "aaa, dd aaa dddd d:dd:dd")
764
+ (let ((date (parse-non-negative-integer str 5 7))
765
+ (month (parse-month str 8 11))
766
+ (year (parse-non-negative-integer str 12 16))
767
+ (hour (parse-non-negative-integer str 18 19))
768
+ (minute (parse-non-negative-integer str 20 22))
769
+ (second (parse-non-negative-integer str 23 25)))
770
+ (make-date 0 second minute hour date month year zone-offset)))
771
+ ((string-match? (substring str 0 space) "aaa, d aaa dddd d:dd:dd")
772
+ (let ((date (parse-non-negative-integer str 5 6))
773
+ (month (parse-month str 7 10))
774
+ (year (parse-non-negative-integer str 11 15))
775
+ (hour (parse-non-negative-integer str 17 18))
776
+ (minute (parse-non-negative-integer str 19 21))
777
+ (second (parse-non-negative-integer str 22 24)))
778
+ (make-date 0 second minute hour date month year zone-offset)))
779
+
780
+ (else
781
+ (bad-header 'date str) ; prevent tail call
782
+ #f)))
783
+
784
+ ;; RFC 850, updated by RFC 1036
785
+ ;; Sunday, 06-Nov-94 08:49:37 GMT
786
+ ;; 0123456789012345678901
787
+ ;; 0 1 2
788
+ (define (parse-rfc-850-date str comma space zone-offset)
789
+ ;; We could verify the day of the week but we don't.
790
+ (let ((tail (substring str (1+ comma) space)))
791
+ (unless (string-match? tail " dd-aaa-dd dd:dd:dd")
792
+ (bad-header 'date str))
793
+ (let ((date (parse-non-negative-integer tail 1 3))
794
+ (month (parse-month tail 4 7))
795
+ (year (parse-non-negative-integer tail 8 10))
796
+ (hour (parse-non-negative-integer tail 11 13))
797
+ (minute (parse-non-negative-integer tail 14 16))
798
+ (second (parse-non-negative-integer tail 17 19)))
799
+ (make-date 0 second minute hour date month
800
+ (let* ((now (date-year (current-date)))
801
+ (then (+ now year (- (modulo now 100)))))
802
+ (cond ((< (+ then 50) now) (+ then 100))
803
+ ((< (+ now 50) then) (- then 100))
804
+ (else then)))
805
+ zone-offset))))
806
+
807
+ ;; ANSI C's asctime() format
808
+ ;; Sun Nov 6 08:49:37 1994
809
+ ;; 012345678901234567890123
810
+ ;; 0 1 2
811
+ (define (parse-asctime-date str)
812
+ (unless (string-match? str "aaa aaa .d dd:dd:dd dddd")
813
+ (bad-header 'date str))
814
+ (let ((date (parse-non-negative-integer
815
+ str
816
+ (if (eqv? (string-ref str 8) #\space) 9 8)
817
+ 10))
818
+ (month (parse-month str 4 7))
819
+ (year (parse-non-negative-integer str 20 24))
820
+ (hour (parse-non-negative-integer str 11 13))
821
+ (minute (parse-non-negative-integer str 14 16))
822
+ (second (parse-non-negative-integer str 17 19)))
823
+ (make-date 0 second minute hour date month year 0)))
824
+
825
+ ;; Convert all date values to GMT time zone, as per RFC 2616 appendix C.
826
+ (define (normalize-date date)
827
+ (if (zero? (date-zone-offset date))
828
+ date
829
+ (time-utc->date (date->time-utc date) 0)))
830
+
831
+ (define (parse-date str)
832
+ (let* ((space (string-rindex str #\space))
833
+ (zone-offset (and space (false-if-exception
834
+ (parse-zone-offset str (1+ space))))))
835
+ (normalize-date
836
+ (if zone-offset
837
+ (let ((comma (string-index str #\,)))
838
+ (cond ((not comma) (bad-header 'date str))
839
+ ((= comma 3) (parse-rfc-822-date str space zone-offset))
840
+ (else (parse-rfc-850-date str comma space zone-offset))))
841
+ (parse-asctime-date str)))))
842
+
843
+ (define (write-date date port)
844
+ (define (put-digits port n digits)
845
+ (define zero (char->integer #\0))
846
+ (let lp ((tens (expt 10 (1- digits))))
847
+ (when (> tens 0)
848
+ (put-char port
849
+ (integer->char (+ zero (modulo (truncate/ n tens) 10))))
850
+ (lp (floor/ tens 10)))))
851
+ (let ((date (if (zero? (date-zone-offset date))
852
+ date
853
+ (time-tai->date (date->time-tai date) 0))))
854
+ (put-string port
855
+ (case (date-week-day date)
856
+ ((0) "Sun, ") ((1) "Mon, ") ((2) "Tue, ")
857
+ ((3) "Wed, ") ((4) "Thu, ") ((5) "Fri, ")
858
+ ((6) "Sat, ") (else (error "bad date" date))))
859
+ (put-digits port (date-day date) 2)
860
+ (put-string port
861
+ (case (date-month date)
862
+ ((1) " Jan ") ((2) " Feb ") ((3) " Mar ")
863
+ ((4) " Apr ") ((5) " May ") ((6) " Jun ")
864
+ ((7) " Jul ") ((8) " Aug ") ((9) " Sep ")
865
+ ((10) " Oct ") ((11) " Nov ") ((12) " Dec ")
866
+ (else (error "bad date" date))))
867
+ (put-digits port (date-year date) 4)
868
+ (put-char port #\space)
869
+ (put-digits port (date-hour date) 2)
870
+ (put-char port #\:)
871
+ (put-digits port (date-minute date) 2)
872
+ (put-char port #\:)
873
+ (put-digits port (date-second date) 2)
874
+ (put-string port " GMT")))
875
+
876
+ ;; Following https://tools.ietf.org/html/rfc7232#section-2.3, an entity
877
+ ;; tag should really be a qstring. However there are a number of
878
+ ;; servers that emit etags as unquoted strings. Assume that if the
879
+ ;; value doesn't start with a quote, it's an unquoted strong etag.
880
+ (define* (parse-entity-tag val #:optional (start 0) (end (string-length val))
881
+ #:key sloppy-delimiters)
882
+ (define (parse-proper-etag-at start strong?)
883
+ (cond
884
+ (sloppy-delimiters
885
+ (call-with-values (lambda ()
886
+ (parse-qstring val start end #:incremental? #t))
887
+ (lambda (tag next)
888
+ (values (cons tag strong?) next))))
889
+ (else
890
+ (values (cons (parse-qstring val start end) strong?) end))))
891
+ (cond
892
+ ((string-prefix? "W/" val 0 2 start end)
893
+ (parse-proper-etag-at (+ start 2) #f))
894
+ ((string-prefix? "\"" val 0 1 start end)
895
+ (parse-proper-etag-at start #t))
896
+ (else
897
+ (let ((delim (or (and sloppy-delimiters
898
+ (string-index val sloppy-delimiters start end))
899
+ end)))
900
+ (values (cons (substring val start delim) #t) delim)))))
901
+
902
+ (define (entity-tag? val)
903
+ (match val
904
+ (((? string?) . _) #t)
905
+ (_ #f)))
906
+
907
+ (define (put-entity-tag port val)
908
+ (match val
909
+ ((tag . strong?)
910
+ (unless strong? (put-string port "W/"))
911
+ (write-qstring tag port))))
912
+
913
+ (define* (parse-entity-tag-list val #:optional
914
+ (start 0) (end (string-length val)))
915
+ (call-with-values (lambda ()
916
+ (parse-entity-tag val start end #:sloppy-delimiters #\,))
917
+ (lambda (etag next)
918
+ (cons etag
919
+ (let ((next (skip-whitespace val next end)))
920
+ (if (< next end)
921
+ (if (eqv? (string-ref val next) #\,)
922
+ (parse-entity-tag-list
923
+ val
924
+ (skip-whitespace val (1+ next) end)
925
+ end)
926
+ (bad-header-component 'entity-tag-list val))
927
+ '()))))))
928
+
929
+ (define (entity-tag-list? val)
930
+ (list-of? val entity-tag?))
931
+
932
+ (define (put-entity-tag-list port val)
933
+ (put-list port val put-entity-tag ", "))
934
+
935
+ ;; credentials = auth-scheme #auth-param
936
+ ;; auth-scheme = token
937
+ ;; auth-param = token "=" ( token | quoted-string )
938
+ ;;
939
+ ;; That's what the spec says. In reality the Basic scheme doesn't have
940
+ ;; k-v pairs, just one auth token, so we give that token as a string.
941
+ ;;
942
+ (define* (parse-credentials str #:optional (val-parser default-val-parser)
943
+ (start 0) (end (string-length str)))
944
+ (let* ((start (skip-whitespace str start end))
945
+ (delim (or (string-index str char-set:whitespace start end) end)))
946
+ (when (= start end)
947
+ (bad-header-component 'authorization str))
948
+ (let ((scheme (string->symbol
949
+ (string-downcase (substring str start (or delim end))))))
950
+ (case scheme
951
+ ((basic)
952
+ (let* ((start (skip-whitespace str delim end)))
953
+ (unless (< start end)
954
+ (bad-header-component 'credentials str))
955
+ (cons scheme (substring str start end))))
956
+ (else
957
+ (cons scheme (parse-key-value-list str default-val-parser delim end)))))))
958
+
959
+ (define (validate-credentials val)
960
+ (match val
961
+ (('basic . (? string?)) #t)
962
+ (((? symbol?) . (? key-value-list?)) #t)
963
+ (_ #f)))
964
+
965
+ (define (write-credentials val port)
966
+ (match val
967
+ (('basic . cred)
968
+ (put-string port "basic ")
969
+ (put-string port cred))
970
+ ((scheme . params)
971
+ (put-symbol port scheme)
972
+ (put-char port #\space)
973
+ (write-key-value-list params port))))
974
+
975
+ ;; challenges = 1#challenge
976
+ ;; challenge = auth-scheme 1*SP 1#auth-param
977
+ ;;
978
+ ;; A pain to parse, as both challenges and auth params are delimited by
979
+ ;; commas, and qstrings can contain anything. We rely on auth params
980
+ ;; necessarily having "=" in them.
981
+ ;;
982
+ (define* (parse-challenge str #:optional
983
+ (start 0) (end (string-length str)))
984
+ (let* ((start (skip-whitespace str start end))
985
+ (sp (string-index str #\space start end))
986
+ (scheme (if sp
987
+ (string->symbol (string-downcase (substring str start sp)))
988
+ (bad-header-component 'challenge str))))
989
+ (let lp ((i sp) (out (list scheme)))
990
+ (if (not (< i end))
991
+ (values (reverse! out) end)
992
+ (let* ((i (skip-whitespace str i end))
993
+ (eq (string-index str #\= i end))
994
+ (comma (string-index str #\, i end))
995
+ (delim (min (or eq end) (or comma end)))
996
+ (token-end (trim-whitespace str i delim)))
997
+ (if (string-index str #\space i token-end)
998
+ (values (reverse! out) i)
999
+ (let ((k (string->symbol (substring str i token-end))))
1000
+ (call-with-values
1001
+ (lambda ()
1002
+ (if (and eq (or (not comma) (< eq comma)))
1003
+ (let ((i (skip-whitespace str (1+ eq) end)))
1004
+ (if (and (< i end) (eqv? (string-ref str i) #\"))
1005
+ (parse-qstring str i end #:incremental? #t)
1006
+ (values (substring
1007
+ str i
1008
+ (trim-whitespace str i
1009
+ (or comma end)))
1010
+ (or comma end))))
1011
+ (values #f delim)))
1012
+ (lambda (v next-i)
1013
+ (let ((i (skip-whitespace str next-i end)))
1014
+ (unless (or (= i end) (eqv? (string-ref str i) #\,))
1015
+ (bad-header-component 'challenge
1016
+ (substring str start end)))
1017
+ (lp (1+ i) (cons (if v (cons k v) k) out))))))))))))
1018
+
1019
+ (define* (parse-challenges str #:optional (val-parser default-val-parser)
1020
+ (start 0) (end (string-length str)))
1021
+ (let lp ((i start))
1022
+ (let ((i (skip-whitespace str i end)))
1023
+ (if (< i end)
1024
+ (call-with-values (lambda () (parse-challenge str i end))
1025
+ (lambda (challenge i)
1026
+ (cons challenge (lp i))))
1027
+ '()))))
1028
+
1029
+ (define (validate-challenges val)
1030
+ (match val
1031
+ ((((? symbol?) . (? key-value-list?)) ...) #t)
1032
+ (_ #f)))
1033
+
1034
+ (define (put-challenge port val)
1035
+ (match val
1036
+ ((scheme . params)
1037
+ (put-symbol port scheme)
1038
+ (put-char port #\space)
1039
+ (write-key-value-list params port))))
1040
+
1041
+ (define (write-challenges val port)
1042
+ (put-list port val put-challenge ", "))
1043
+
1044
+
1045
+
1046
+
1047
+ ;;;
1048
+ ;;; Request-Line and Response-Line
1049
+ ;;;
1050
+
1051
+ ;; Hmm.
1052
+ (define (bad-request message . args)
1053
+ (throw 'bad-request message args))
1054
+ (define (bad-response message . args)
1055
+ (throw 'bad-response message args))
1056
+
1057
+ (define *known-versions* '())
1058
+
1059
+ (define* (parse-http-version str #:optional (start 0) (end (string-length str)))
1060
+ "Parse an HTTP version from STR, returning it as a major–minor
1061
+ pair. For example, ‘HTTP/1.1’ parses as the pair of integers,
1062
+ ‘(1 . 1)’."
1063
+ (let lp ((known *known-versions*))
1064
+ (match known
1065
+ (((version-str . version-val) . known)
1066
+ (if (string= str version-str start end)
1067
+ version-val
1068
+ (lp known)))
1069
+ (()
1070
+ (let ((dot-idx (string-index str #\. start end)))
1071
+ (unless (and (string-prefix? "HTTP/" str 0 5 start end)
1072
+ dot-idx
1073
+ (= dot-idx (string-rindex str #\. start end)))
1074
+
1075
+ (bad-header-component 'http-version (substring str start end)))
1076
+ (cons (parse-non-negative-integer str (+ start 5) dot-idx)
1077
+ (parse-non-negative-integer str (1+ dot-idx) end)))))))
1078
+
1079
+ (define (write-http-version val port)
1080
+ "Write the given major-minor version pair to PORT."
1081
+ (put-string port "HTTP/")
1082
+ (put-non-negative-integer port (car val))
1083
+ (put-char port #\.)
1084
+ (put-non-negative-integer port (cdr val)))
1085
+
1086
+ (for-each
1087
+ (lambda (v)
1088
+ (set! *known-versions*
1089
+ (acons v (parse-http-version v 0 (string-length v))
1090
+ *known-versions*)))
1091
+ '("HTTP/1.0" "HTTP/1.1"))
1092
+
1093
+
1094
+ ;; Request-URI = "*" | absoluteURI | abs_path | authority
1095
+ ;;
1096
+ ;; The `authority' form is only permissible for the CONNECT method, so
1097
+ ;; because we don't expect people to implement CONNECT, we save
1098
+ ;; ourselves the trouble of that case, and disallow the CONNECT method.
1099
+ ;;
1100
+ (define* (parse-http-method str #:optional (start 0) (end (string-length str)))
1101
+ "Parse an HTTP method from STR. The result is an upper-case
1102
+ symbol, like ‘GET’."
1103
+ (cond
1104
+ ((string= str "GET" start end) 'GET)
1105
+ ((string= str "HEAD" start end) 'HEAD)
1106
+ ((string= str "POST" start end) 'POST)
1107
+ ((string= str "PUT" start end) 'PUT)
1108
+ ((string= str "DELETE" start end) 'DELETE)
1109
+ ((string= str "OPTIONS" start end) 'OPTIONS)
1110
+ ((string= str "TRACE" start end) 'TRACE)
1111
+ (else (bad-request "Invalid method: ~a" (substring str start end)))))
1112
+
1113
+ (define* (parse-request-uri str #:optional (start 0) (end (string-length str)))
1114
+ "Parse a URI from an HTTP request line. Note that URIs in requests do
1115
+ not have to have a scheme or host name. The result is a URI-reference
1116
+ object."
1117
+ (cond
1118
+ ((= start end)
1119
+ (bad-request "Missing Request-URI"))
1120
+ ((string= str "*" start end)
1121
+ #f)
1122
+ ((eqv? (string-ref str start) #\/)
1123
+ (let* ((q (string-index str #\? start end))
1124
+ (f (string-index str #\# start end))
1125
+ (q (and q (or (not f) (< q f)) q)))
1126
+ (build-uri-reference
1127
+ #:path (substring str start (or q f end))
1128
+ #:query (and q (substring str (1+ q) (or f end)))
1129
+ #:fragment (and f (substring str (1+ f) end)))))
1130
+ (else
1131
+ (or (string->uri (substring str start end))
1132
+ (bad-request "Invalid URI: ~a" (substring str start end))))))
1133
+
1134
+ (define (read-request-line port)
1135
+ "Read the first line of an HTTP request from PORT, returning
1136
+ three values: the method, the URI, and the version."
1137
+ (let* ((line (read-header-line port))
1138
+ (d0 (string-index line char-set:whitespace)) ; "delimiter zero"
1139
+ (d1 (string-rindex line char-set:whitespace)))
1140
+ (unless (and d0 d1 (< d0 d1))
1141
+ (bad-request "Bad Request-Line: ~s" line))
1142
+ (values (parse-http-method line 0 d0)
1143
+ (parse-request-uri line (skip-whitespace line (1+ d0) d1) d1)
1144
+ (parse-http-version line (1+ d1) (string-length line)))))
1145
+
1146
+ (define (write-uri uri port)
1147
+ (put-string port (uri->string uri #:include-fragment? #f)))
1148
+
1149
+ (define (write-request-line method uri version port)
1150
+ "Write the first line of an HTTP request to PORT."
1151
+ (put-symbol port method)
1152
+ (put-char port #\space)
1153
+ (when (http-proxy-port? port)
1154
+ (let ((scheme (uri-scheme uri))
1155
+ (host (uri-host uri))
1156
+ (host-port (uri-port uri)))
1157
+ (when (and scheme host)
1158
+ (put-symbol port scheme)
1159
+ (put-string port "://")
1160
+ (cond
1161
+ ((string-index host #\:)
1162
+ (put-char port #\[)
1163
+ (put-string port host)
1164
+ (put-char port #\]))
1165
+ (else
1166
+ (put-string port host)))
1167
+ (unless ((@@ (web uri) default-port?) scheme host-port)
1168
+ (put-char port #\:)
1169
+ (put-non-negative-integer port host-port)))))
1170
+ (let ((path (uri-path uri))
1171
+ (query (uri-query uri)))
1172
+ (if (string-null? path)
1173
+ (put-string port "/")
1174
+ (put-string port path))
1175
+ (when query
1176
+ (put-string port "?")
1177
+ (put-string port query)))
1178
+ (put-char port #\space)
1179
+ (write-http-version version port)
1180
+ (put-string port "\r\n"))
1181
+
1182
+ (define (read-response-line port)
1183
+ "Read the first line of an HTTP response from PORT, returning three
1184
+ values: the HTTP version, the response code, and the (possibly empty)
1185
+ \"reason phrase\"."
1186
+ (let* ((line (read-header-line port))
1187
+ (d0 (string-index line char-set:whitespace)) ; "delimiter zero"
1188
+ (d1 (and d0 (string-index line char-set:whitespace
1189
+ (skip-whitespace line d0)))))
1190
+ (unless (and d0 d1)
1191
+ (bad-response "Bad Response-Line: ~s" line))
1192
+ (values (parse-http-version line 0 d0)
1193
+ (parse-non-negative-integer line (skip-whitespace line d0 d1)
1194
+ d1)
1195
+ (string-trim-both line char-set:whitespace d1))))
1196
+
1197
+ (define (write-response-line version code reason-phrase port)
1198
+ "Write the first line of an HTTP response to PORT."
1199
+ (write-http-version version port)
1200
+ (put-char port #\space)
1201
+ (put-non-negative-integer port code)
1202
+ (put-char port #\space)
1203
+ (put-string port reason-phrase)
1204
+ (put-string port "\r\n"))
1205
+
1206
+
1207
+
1208
+
1209
+ ;;;
1210
+ ;;; Helpers for declaring headers
1211
+ ;;;
1212
+
1213
+ ;; emacs: (put 'declare-header! 'scheme-indent-function 1)
1214
+ ;; emacs: (put 'declare-opaque!-header 'scheme-indent-function 1)
1215
+ (define (declare-opaque-header! name)
1216
+ "Declares a given header as \"opaque\", meaning that its value is not
1217
+ treated specially, and is just returned as a plain string."
1218
+ (declare-header! name
1219
+ parse-opaque-string validate-opaque-string write-opaque-string))
1220
+
1221
+ ;; emacs: (put 'declare-date-header! 'scheme-indent-function 1)
1222
+ (define (declare-date-header! name)
1223
+ (declare-header! name
1224
+ parse-date date? write-date))
1225
+
1226
+ ;; emacs: (put 'declare-string-list-header! 'scheme-indent-function 1)
1227
+ (define (declare-string-list-header! name)
1228
+ (declare-header! name
1229
+ split-and-trim list-of-strings? write-list-of-strings))
1230
+
1231
+ ;; emacs: (put 'declare-symbol-list-header! 'scheme-indent-function 1)
1232
+ (define (declare-symbol-list-header! name)
1233
+ (declare-header! name
1234
+ (lambda (str)
1235
+ (map string->symbol (split-and-trim str)))
1236
+ (lambda (v)
1237
+ (list-of? v symbol?))
1238
+ (lambda (v port)
1239
+ (put-list port v put-symbol ", "))))
1240
+
1241
+ ;; emacs: (put 'declare-header-list-header! 'scheme-indent-function 1)
1242
+ (define (declare-header-list-header! name)
1243
+ (declare-header! name
1244
+ split-header-names list-of-header-names? write-header-list))
1245
+
1246
+ ;; emacs: (put 'declare-integer-header! 'scheme-indent-function 1)
1247
+ (define (declare-integer-header! name)
1248
+ (declare-header! name
1249
+ parse-non-negative-integer non-negative-integer?
1250
+ (lambda (val port) (put-non-negative-integer port val))))
1251
+
1252
+ ;; emacs: (put 'declare-uri-reference-header! 'scheme-indent-function 1)
1253
+ (define (declare-uri-reference-header! name)
1254
+ (declare-header! name
1255
+ (lambda (str)
1256
+ (or (string->uri-reference str)
1257
+ (bad-header-component 'uri-reference str)))
1258
+ uri-reference?
1259
+ write-uri))
1260
+
1261
+ ;; emacs: (put 'declare-quality-list-header! 'scheme-indent-function 1)
1262
+ (define (declare-quality-list-header! name)
1263
+ (declare-header! name
1264
+ parse-quality-list validate-quality-list write-quality-list))
1265
+
1266
+ ;; emacs: (put 'declare-param-list-header! 'scheme-indent-function 1)
1267
+ (define* (declare-param-list-header! name #:optional
1268
+ (val-parser default-val-parser)
1269
+ (val-validator default-val-validator)
1270
+ (val-writer default-val-writer))
1271
+ (declare-header! name
1272
+ (lambda (str) (parse-param-list str val-parser))
1273
+ (lambda (val) (validate-param-list val val-validator))
1274
+ (lambda (val port) (write-param-list val port val-writer))))
1275
+
1276
+ ;; emacs: (put 'declare-key-value-list-header! 'scheme-indent-function 1)
1277
+ (define* (declare-key-value-list-header! name #:optional
1278
+ (val-parser default-val-parser)
1279
+ (val-validator default-val-validator)
1280
+ (val-writer default-val-writer))
1281
+ (declare-header! name
1282
+ (lambda (str) (parse-key-value-list str val-parser))
1283
+ (lambda (val) (key-value-list? val val-validator))
1284
+ (lambda (val port) (write-key-value-list val port val-writer))))
1285
+
1286
+ ;; emacs: (put 'declare-entity-tag-list-header! 'scheme-indent-function 1)
1287
+ (define (declare-entity-tag-list-header! name)
1288
+ (declare-header! name
1289
+ (lambda (str) (if (string=? str "*") '* (parse-entity-tag-list str)))
1290
+ (lambda (val) (or (eq? val '*) (entity-tag-list? val)))
1291
+ (lambda (val port)
1292
+ (if (eq? val '*)
1293
+ (put-string port "*")
1294
+ (put-entity-tag-list port val)))))
1295
+
1296
+ ;; emacs: (put 'declare-credentials-header! 'scheme-indent-function 1)
1297
+ (define (declare-credentials-header! name)
1298
+ (declare-header! name
1299
+ parse-credentials validate-credentials write-credentials))
1300
+
1301
+ ;; emacs: (put 'declare-challenge-list-header! 'scheme-indent-function 1)
1302
+ (define (declare-challenge-list-header! name)
1303
+ (declare-header! name
1304
+ parse-challenges validate-challenges write-challenges))
1305
+
1306
+
1307
+
1308
+
1309
+ ;;;
1310
+ ;;; General headers
1311
+ ;;;
1312
+
1313
+ ;; Cache-Control = 1#(cache-directive)
1314
+ ;; cache-directive = cache-request-directive | cache-response-directive
1315
+ ;; cache-request-directive =
1316
+ ;; "no-cache" ; Section 14.9.1
1317
+ ;; | "no-store" ; Section 14.9.2
1318
+ ;; | "max-age" "=" delta-seconds ; Section 14.9.3, 14.9.4
1319
+ ;; | "max-stale" [ "=" delta-seconds ] ; Section 14.9.3
1320
+ ;; | "min-fresh" "=" delta-seconds ; Section 14.9.3
1321
+ ;; | "no-transform" ; Section 14.9.5
1322
+ ;; | "only-if-cached" ; Section 14.9.4
1323
+ ;; | cache-extension ; Section 14.9.6
1324
+ ;; cache-response-directive =
1325
+ ;; "public" ; Section 14.9.1
1326
+ ;; | "private" [ "=" <"> 1#field-name <"> ] ; Section 14.9.1
1327
+ ;; | "no-cache" [ "=" <"> 1#field-name <"> ]; Section 14.9.1
1328
+ ;; | "no-store" ; Section 14.9.2
1329
+ ;; | "no-transform" ; Section 14.9.5
1330
+ ;; | "must-revalidate" ; Section 14.9.4
1331
+ ;; | "proxy-revalidate" ; Section 14.9.4
1332
+ ;; | "max-age" "=" delta-seconds ; Section 14.9.3
1333
+ ;; | "s-maxage" "=" delta-seconds ; Section 14.9.3
1334
+ ;; | cache-extension ; Section 14.9.6
1335
+ ;; cache-extension = token [ "=" ( token | quoted-string ) ]
1336
+ ;;
1337
+ (declare-key-value-list-header! "Cache-Control"
1338
+ (lambda (k v-str)
1339
+ (case k
1340
+ ((max-age min-fresh s-maxage)
1341
+ (parse-non-negative-integer v-str))
1342
+ ((max-stale)
1343
+ (and v-str (parse-non-negative-integer v-str)))
1344
+ ((private no-cache)
1345
+ (and v-str (split-header-names v-str)))
1346
+ (else v-str)))
1347
+ (lambda (k v)
1348
+ (case k
1349
+ ((max-age min-fresh s-maxage)
1350
+ (non-negative-integer? v))
1351
+ ((max-stale)
1352
+ (or (not v) (non-negative-integer? v)))
1353
+ ((private no-cache)
1354
+ (or (not v) (list-of-header-names? v)))
1355
+ ((no-store no-transform only-if-cache must-revalidate proxy-revalidate)
1356
+ (not v))
1357
+ (else
1358
+ (or (not v) (string? v)))))
1359
+ (lambda (k v port)
1360
+ (cond
1361
+ ((string? v) (default-val-writer k v port))
1362
+ ((pair? v)
1363
+ (put-char port #\")
1364
+ (write-header-list v port)
1365
+ (put-char port #\"))
1366
+ ((integer? v)
1367
+ (put-non-negative-integer port v))
1368
+ (else
1369
+ (bad-header-component 'cache-control v)))))
1370
+
1371
+ ;; Connection = "Connection" ":" 1#(connection-token)
1372
+ ;; connection-token = token
1373
+ ;; e.g.
1374
+ ;; Connection: close, Foo-Header
1375
+ ;;
1376
+ (declare-header! "Connection"
1377
+ split-header-names
1378
+ list-of-header-names?
1379
+ (lambda (val port)
1380
+ (put-list port val
1381
+ (lambda (port x)
1382
+ (put-string port
1383
+ (if (eq? x 'close)
1384
+ "close"
1385
+ (header->string x))))
1386
+ ", ")))
1387
+
1388
+ ;; Date = "Date" ":" HTTP-date
1389
+ ;; e.g.
1390
+ ;; Date: Tue, 15 Nov 1994 08:12:31 GMT
1391
+ ;;
1392
+ (declare-date-header! "Date")
1393
+
1394
+ ;; Pragma = "Pragma" ":" 1#pragma-directive
1395
+ ;; pragma-directive = "no-cache" | extension-pragma
1396
+ ;; extension-pragma = token [ "=" ( token | quoted-string ) ]
1397
+ ;;
1398
+ (declare-key-value-list-header! "Pragma")
1399
+
1400
+ ;; Trailer = "Trailer" ":" 1#field-name
1401
+ ;;
1402
+ (declare-header-list-header! "Trailer")
1403
+
1404
+ ;; Transfer-Encoding = "Transfer-Encoding" ":" 1#transfer-coding
1405
+ ;;
1406
+ (declare-param-list-header! "Transfer-Encoding")
1407
+
1408
+ ;; Upgrade = "Upgrade" ":" 1#product
1409
+ ;;
1410
+ (declare-string-list-header! "Upgrade")
1411
+
1412
+ ;; Via = "Via" ":" 1#( received-protocol received-by [ comment ] )
1413
+ ;; received-protocol = [ protocol-name "/" ] protocol-version
1414
+ ;; protocol-name = token
1415
+ ;; protocol-version = token
1416
+ ;; received-by = ( host [ ":" port ] ) | pseudonym
1417
+ ;; pseudonym = token
1418
+ ;;
1419
+ (declare-header! "Via"
1420
+ split-and-trim
1421
+ list-of-strings?
1422
+ write-list-of-strings
1423
+ #:multiple? #t)
1424
+
1425
+ ;; Warning = "Warning" ":" 1#warning-value
1426
+ ;;
1427
+ ;; warning-value = warn-code SP warn-agent SP warn-text
1428
+ ;; [SP warn-date]
1429
+ ;;
1430
+ ;; warn-code = 3DIGIT
1431
+ ;; warn-agent = ( host [ ":" port ] ) | pseudonym
1432
+ ;; ; the name or pseudonym of the server adding
1433
+ ;; ; the Warning header, for use in debugging
1434
+ ;; warn-text = quoted-string
1435
+ ;; warn-date = <"> HTTP-date <">
1436
+ (declare-header! "Warning"
1437
+ (lambda (str)
1438
+ (let ((len (string-length str)))
1439
+ (let lp ((i (skip-whitespace str 0)))
1440
+ (let* ((idx1 (string-index str #\space i))
1441
+ (idx2 (string-index str #\space (1+ idx1))))
1442
+ (when (and idx1 idx2)
1443
+ (let ((code (parse-non-negative-integer str i idx1))
1444
+ (agent (substring str (1+ idx1) idx2)))
1445
+ (call-with-values
1446
+ (lambda () (parse-qstring str (1+ idx2) #:incremental? #t))
1447
+ (lambda (text i)
1448
+ (call-with-values
1449
+ (lambda ()
1450
+ (let ((c (and (< i len) (string-ref str i))))
1451
+ (case c
1452
+ ((#\space)
1453
+ ;; we have a date.
1454
+ (call-with-values
1455
+ (lambda () (parse-qstring str (1+ i)
1456
+ #:incremental? #t))
1457
+ (lambda (date i)
1458
+ (values text (parse-date date) i))))
1459
+ (else
1460
+ (values text #f i)))))
1461
+ (lambda (text date i)
1462
+ (let ((w (list code agent text date))
1463
+ (c (and (< i len) (string-ref str i))))
1464
+ (case c
1465
+ ((#f) (list w))
1466
+ ((#\,) (cons w (lp (skip-whitespace str (1+ i)))))
1467
+ (else (bad-header 'warning str))))))))))))))
1468
+ (lambda (val)
1469
+ (list-of? val
1470
+ (lambda (elt)
1471
+ (match elt
1472
+ ((code host text date)
1473
+ (and (non-negative-integer? code) (< code 1000)
1474
+ (string? host)
1475
+ (string? text)
1476
+ (or (not date) (date? date))))
1477
+ (_ #f)))))
1478
+ (lambda (val port)
1479
+ (put-list
1480
+ port val
1481
+ (lambda (port w)
1482
+ (match w
1483
+ ((code host text date)
1484
+ (put-non-negative-integer port code)
1485
+ (put-char port #\space)
1486
+ (put-string port host)
1487
+ (put-char port #\space)
1488
+ (write-qstring text port)
1489
+ (when date
1490
+ (put-char port #\space)
1491
+ (put-char port #\")
1492
+ (write-date date port)
1493
+ (put-char port #\")))))
1494
+ ", "))
1495
+ #:multiple? #t)
1496
+
1497
+
1498
+
1499
+
1500
+ ;;;
1501
+ ;;; Entity headers
1502
+ ;;;
1503
+
1504
+ ;; Allow = #Method
1505
+ ;;
1506
+ (declare-symbol-list-header! "Allow")
1507
+
1508
+ ;; Content-Disposition = disposition-type *( ";" disposition-parm )
1509
+ ;; disposition-type = "attachment" | disp-extension-token
1510
+ ;; disposition-parm = filename-parm | disp-extension-parm
1511
+ ;; filename-parm = "filename" "=" quoted-string
1512
+ ;; disp-extension-token = token
1513
+ ;; disp-extension-parm = token "=" ( token | quoted-string )
1514
+ ;;
1515
+ (declare-header! "Content-Disposition"
1516
+ (lambda (str)
1517
+ ;; Lazily reuse the param list parser.
1518
+ (match (parse-param-list str default-val-parser)
1519
+ ((disposition) disposition)
1520
+ (_ (bad-header-component 'content-disposition str))))
1521
+ (lambda (val)
1522
+ (match val
1523
+ (((? symbol?) ((? symbol?) . (? string?)) ...) #t)
1524
+ (_ #f)))
1525
+ (lambda (val port)
1526
+ (write-param-list (list val) port)))
1527
+
1528
+ ;; Content-Encoding = 1#content-coding
1529
+ ;;
1530
+ (declare-symbol-list-header! "Content-Encoding")
1531
+
1532
+ ;; Content-Language = 1#language-tag
1533
+ ;;
1534
+ (declare-string-list-header! "Content-Language")
1535
+
1536
+ ;; Content-Length = 1*DIGIT
1537
+ ;;
1538
+ (declare-integer-header! "Content-Length")
1539
+
1540
+ ;; Content-Location = URI-reference
1541
+ ;;
1542
+ (declare-uri-reference-header! "Content-Location")
1543
+
1544
+ ;; Content-MD5 = <base64 of 128 bit MD5 digest as per RFC 1864>
1545
+ ;;
1546
+ (declare-opaque-header! "Content-MD5")
1547
+
1548
+ ;; Content-Range = content-range-spec
1549
+ ;; content-range-spec = byte-content-range-spec
1550
+ ;; byte-content-range-spec = bytes-unit SP
1551
+ ;; byte-range-resp-spec "/"
1552
+ ;; ( instance-length | "*" )
1553
+ ;; byte-range-resp-spec = (first-byte-pos "-" last-byte-pos)
1554
+ ;; | "*"
1555
+ ;; instance-length = 1*DIGIT
1556
+ ;;
1557
+ (declare-header! "Content-Range"
1558
+ (lambda (str)
1559
+ (let ((dash (string-index str #\-))
1560
+ (slash (string-index str #\/)))
1561
+ (unless (and (string-prefix? "bytes " str) slash)
1562
+ (bad-header 'content-range str))
1563
+ (list 'bytes
1564
+ (cond
1565
+ (dash
1566
+ (cons
1567
+ (parse-non-negative-integer str 6 dash)
1568
+ (parse-non-negative-integer str (1+ dash) slash)))
1569
+ ((string= str "*" 6 slash)
1570
+ '*)
1571
+ (else
1572
+ (bad-header 'content-range str)))
1573
+ (if (string= str "*" (1+ slash))
1574
+ '*
1575
+ (parse-non-negative-integer str (1+ slash))))))
1576
+ (lambda (val)
1577
+ (match val
1578
+ (((? symbol?)
1579
+ (or '* ((? non-negative-integer?) . (? non-negative-integer?)))
1580
+ (or '* (? non-negative-integer?)))
1581
+ #t)
1582
+ (_ #f)))
1583
+ (lambda (val port)
1584
+ (match val
1585
+ ((unit range instance-length)
1586
+ (put-symbol port unit)
1587
+ (put-char port #\space)
1588
+ (match range
1589
+ ('*
1590
+ (put-char port #\*))
1591
+ ((start . end)
1592
+ (put-non-negative-integer port start)
1593
+ (put-char port #\-)
1594
+ (put-non-negative-integer port end)))
1595
+ (put-char port #\/)
1596
+ (match instance-length
1597
+ ('* (put-char port #\*))
1598
+ (len (put-non-negative-integer port len)))))))
1599
+
1600
+ ;; Content-Type = media-type
1601
+ ;;
1602
+ (declare-header! "Content-Type"
1603
+ (lambda (str)
1604
+ (let ((parts (string-split str #\;)))
1605
+ (cons (parse-media-type (car parts))
1606
+ (map (lambda (x)
1607
+ (let ((eq (string-index x #\=)))
1608
+ (unless (and eq (= eq (string-rindex x #\=)))
1609
+ (bad-header 'content-type str))
1610
+ (cons
1611
+ (string->symbol
1612
+ (string-trim x char-set:whitespace 0 eq))
1613
+ (string-trim-right x char-set:whitespace (1+ eq)))))
1614
+ (cdr parts)))))
1615
+ (lambda (val)
1616
+ (match val
1617
+ (((? symbol?) ((? symbol?) . (? string?)) ...) #t)
1618
+ (_ #f)))
1619
+ (lambda (val port)
1620
+ (match val
1621
+ ((type . args)
1622
+ (put-symbol port type)
1623
+ (match args
1624
+ (() (values))
1625
+ (args
1626
+ (put-string port ";")
1627
+ (put-list
1628
+ port args
1629
+ (lambda (port pair)
1630
+ (match pair
1631
+ ((k . v)
1632
+ (put-symbol port k)
1633
+ (put-char port #\=)
1634
+ (put-string port v))))
1635
+ ";")))))))
1636
+
1637
+ ;; Expires = HTTP-date
1638
+ ;;
1639
+ (define *date-in-the-past* (parse-date "Thu, 01 Jan 1970 00:00:00 GMT"))
1640
+
1641
+ (declare-header! "Expires"
1642
+ (lambda (str)
1643
+ (if (member str '("0" "-1"))
1644
+ *date-in-the-past*
1645
+ (parse-date str)))
1646
+ date?
1647
+ write-date)
1648
+
1649
+ ;; Last-Modified = HTTP-date
1650
+ ;;
1651
+ (declare-date-header! "Last-Modified")
1652
+
1653
+
1654
+
1655
+
1656
+ ;;;
1657
+ ;;; Request headers
1658
+ ;;;
1659
+
1660
+ ;; Accept = #( media-range [ accept-params ] )
1661
+ ;; media-range = ( "*/*" | ( type "/" "*" ) | ( type "/" subtype ) )
1662
+ ;; *( ";" parameter )
1663
+ ;; accept-params = ";" "q" "=" qvalue *( accept-extension )
1664
+ ;; accept-extension = ";" token [ "=" ( token | quoted-string ) ]
1665
+ ;;
1666
+ (declare-param-list-header! "Accept"
1667
+ ;; -> (type/subtype (sym-prop . str-val) ...) ...)
1668
+ ;;
1669
+ ;; with the exception of prop `q', in which case the val will be a
1670
+ ;; valid quality value
1671
+ ;;
1672
+ (lambda (k v)
1673
+ (if (eq? k 'q)
1674
+ (parse-quality v)
1675
+ v))
1676
+ (lambda (k v)
1677
+ (if (eq? k 'q)
1678
+ (valid-quality? v)
1679
+ (or (not v) (string? v))))
1680
+ (lambda (k v port)
1681
+ (if (eq? k 'q)
1682
+ (write-quality v port)
1683
+ (default-val-writer k v port))))
1684
+
1685
+ ;; Accept-Charset = 1#( ( charset | "*" )[ ";" "q" "=" qvalue ] )
1686
+ ;;
1687
+ (declare-quality-list-header! "Accept-Charset")
1688
+
1689
+ ;; Accept-Encoding = 1#( codings [ ";" "q" "=" qvalue ] )
1690
+ ;; codings = ( content-coding | "*" )
1691
+ ;;
1692
+ (declare-quality-list-header! "Accept-Encoding")
1693
+
1694
+ ;; Accept-Language = 1#( language-range [ ";" "q" "=" qvalue ] )
1695
+ ;; language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
1696
+ ;;
1697
+ (declare-quality-list-header! "Accept-Language")
1698
+
1699
+ ;; Authorization = credentials
1700
+ ;; credentials = auth-scheme #auth-param
1701
+ ;; auth-scheme = token
1702
+ ;; auth-param = token "=" ( token | quoted-string )
1703
+ ;;
1704
+ (declare-credentials-header! "Authorization")
1705
+
1706
+ ;; Expect = 1#expectation
1707
+ ;; expectation = "100-continue" | expectation-extension
1708
+ ;; expectation-extension = token [ "=" ( token | quoted-string )
1709
+ ;; *expect-params ]
1710
+ ;; expect-params = ";" token [ "=" ( token | quoted-string ) ]
1711
+ ;;
1712
+ (declare-param-list-header! "Expect")
1713
+
1714
+ ;; From = mailbox
1715
+ ;;
1716
+ ;; Should be an email address; we just pass on the string as-is.
1717
+ ;;
1718
+ (declare-opaque-header! "From")
1719
+
1720
+ ;; Host = host [ ":" port ]
1721
+ ;;
1722
+ (declare-header! "Host"
1723
+ (lambda (str)
1724
+ (let* ((rbracket (string-index str #\]))
1725
+ (colon (string-index str #\: (or rbracket 0)))
1726
+ (host (cond
1727
+ (rbracket
1728
+ (unless (eqv? (string-ref str 0) #\[)
1729
+ (bad-header 'host str))
1730
+ (substring str 1 rbracket))
1731
+ (colon
1732
+ (substring str 0 colon))
1733
+ (else
1734
+ str)))
1735
+ (port (and colon
1736
+ (parse-non-negative-integer str (1+ colon)))))
1737
+ (cons host port)))
1738
+ (lambda (val)
1739
+ (match val
1740
+ (((? string?) . (or #f (? non-negative-integer?))) #t)
1741
+ (_ #f)))
1742
+ (lambda (val port)
1743
+ (match val
1744
+ ((host-name . host-port)
1745
+ (cond
1746
+ ((string-index host-name #\:)
1747
+ (put-char port #\[)
1748
+ (put-string port host-name)
1749
+ (put-char port #\]))
1750
+ (else
1751
+ (put-string port host-name)))
1752
+ (when host-port
1753
+ (put-char port #\:)
1754
+ (put-non-negative-integer port host-port))))))
1755
+
1756
+ ;; If-Match = ( "*" | 1#entity-tag )
1757
+ ;;
1758
+ (declare-entity-tag-list-header! "If-Match")
1759
+
1760
+ ;; If-Modified-Since = HTTP-date
1761
+ ;;
1762
+ (declare-date-header! "If-Modified-Since")
1763
+
1764
+ ;; If-None-Match = ( "*" | 1#entity-tag )
1765
+ ;;
1766
+ (declare-entity-tag-list-header! "If-None-Match")
1767
+
1768
+ ;; If-Range = ( entity-tag | HTTP-date )
1769
+ ;;
1770
+ (declare-header! "If-Range"
1771
+ (lambda (str)
1772
+ (if (or (string-prefix? "\"" str)
1773
+ (string-prefix? "W/" str))
1774
+ (parse-entity-tag str)
1775
+ (parse-date str)))
1776
+ (lambda (val)
1777
+ (or (date? val) (entity-tag? val)))
1778
+ (lambda (val port)
1779
+ (if (date? val)
1780
+ (write-date val port)
1781
+ (put-entity-tag port val))))
1782
+
1783
+ ;; If-Unmodified-Since = HTTP-date
1784
+ ;;
1785
+ (declare-date-header! "If-Unmodified-Since")
1786
+
1787
+ ;; Max-Forwards = 1*DIGIT
1788
+ ;;
1789
+ (declare-integer-header! "Max-Forwards")
1790
+
1791
+ ;; Proxy-Authorization = credentials
1792
+ ;;
1793
+ (declare-credentials-header! "Proxy-Authorization")
1794
+
1795
+ ;; Range = "Range" ":" ranges-specifier
1796
+ ;; ranges-specifier = byte-ranges-specifier
1797
+ ;; byte-ranges-specifier = bytes-unit "=" byte-range-set
1798
+ ;; byte-range-set = 1#( byte-range-spec | suffix-byte-range-spec )
1799
+ ;; byte-range-spec = first-byte-pos "-" [last-byte-pos]
1800
+ ;; first-byte-pos = 1*DIGIT
1801
+ ;; last-byte-pos = 1*DIGIT
1802
+ ;; suffix-byte-range-spec = "-" suffix-length
1803
+ ;; suffix-length = 1*DIGIT
1804
+ ;;
1805
+ (declare-header! "Range"
1806
+ (lambda (str)
1807
+ (unless (string-prefix? "bytes=" str)
1808
+ (bad-header 'range str))
1809
+ (cons
1810
+ 'bytes
1811
+ (map (lambda (x)
1812
+ (let ((dash (string-index x #\-)))
1813
+ (cond
1814
+ ((not dash)
1815
+ (bad-header 'range str))
1816
+ ((zero? dash)
1817
+ (cons #f (parse-non-negative-integer x 1)))
1818
+ ((= dash (1- (string-length x)))
1819
+ (cons (parse-non-negative-integer x 0 dash) #f))
1820
+ (else
1821
+ (cons (parse-non-negative-integer x 0 dash)
1822
+ (parse-non-negative-integer x (1+ dash)))))))
1823
+ (string-split (substring str 6) #\,))))
1824
+ (lambda (val)
1825
+ (match val
1826
+ (((? symbol?)
1827
+ (or (#f . (? non-negative-integer?))
1828
+ ((? non-negative-integer?) . (? non-negative-integer?))
1829
+ ((? non-negative-integer?) . #f))
1830
+ ...) #t)
1831
+ (_ #f)))
1832
+ (lambda (val port)
1833
+ (match val
1834
+ ((unit . ranges)
1835
+ (put-symbol port unit)
1836
+ (put-char port #\=)
1837
+ (put-list
1838
+ port ranges
1839
+ (lambda (port range)
1840
+ (match range
1841
+ ((start . end)
1842
+ (when start (put-non-negative-integer port start))
1843
+ (put-char port #\-)
1844
+ (when end (put-non-negative-integer port end)))))
1845
+ ",")))))
1846
+
1847
+ ;; Referer = URI-reference
1848
+ ;;
1849
+ (declare-uri-reference-header! "Referer")
1850
+
1851
+ ;; TE = #( t-codings )
1852
+ ;; t-codings = "trailers" | ( transfer-extension [ accept-params ] )
1853
+ ;;
1854
+ (declare-param-list-header! "TE")
1855
+
1856
+ ;; User-Agent = 1*( product | comment )
1857
+ ;;
1858
+ (declare-opaque-header! "User-Agent")
1859
+
1860
+
1861
+
1862
+
1863
+ ;;;
1864
+ ;;; Reponse headers
1865
+ ;;;
1866
+
1867
+ ;; Accept-Ranges = acceptable-ranges
1868
+ ;; acceptable-ranges = 1#range-unit | "none"
1869
+ ;;
1870
+ (declare-symbol-list-header! "Accept-Ranges")
1871
+
1872
+ ;; Age = age-value
1873
+ ;; age-value = delta-seconds
1874
+ ;;
1875
+ (declare-integer-header! "Age")
1876
+
1877
+ ;; ETag = entity-tag
1878
+ ;;
1879
+ (declare-header! "ETag"
1880
+ parse-entity-tag
1881
+ entity-tag?
1882
+ (lambda (val port)
1883
+ (put-entity-tag port val)))
1884
+
1885
+ ;; Location = URI-reference
1886
+ ;;
1887
+ ;; In RFC 2616, Location was specified as being an absolute URI. This
1888
+ ;; was changed in RFC 7231 to permit URI references generally, which
1889
+ ;; matches web reality.
1890
+ ;;
1891
+ (declare-uri-reference-header! "Location")
1892
+
1893
+ ;; Proxy-Authenticate = 1#challenge
1894
+ ;;
1895
+ (declare-challenge-list-header! "Proxy-Authenticate")
1896
+
1897
+ ;; Retry-After = ( HTTP-date | delta-seconds )
1898
+ ;;
1899
+ (declare-header! "Retry-After"
1900
+ (lambda (str)
1901
+ (if (and (not (string-null? str))
1902
+ (char-numeric? (string-ref str 0)))
1903
+ (parse-non-negative-integer str)
1904
+ (parse-date str)))
1905
+ (lambda (val)
1906
+ (or (date? val) (non-negative-integer? val)))
1907
+ (lambda (val port)
1908
+ (if (date? val)
1909
+ (write-date val port)
1910
+ (put-non-negative-integer port val))))
1911
+
1912
+ ;; Server = 1*( product | comment )
1913
+ ;;
1914
+ (declare-opaque-header! "Server")
1915
+
1916
+ ;; Vary = ( "*" | 1#field-name )
1917
+ ;;
1918
+ (declare-header! "Vary"
1919
+ (lambda (str)
1920
+ (if (equal? str "*")
1921
+ '*
1922
+ (split-header-names str)))
1923
+ (lambda (val)
1924
+ (or (eq? val '*) (list-of-header-names? val)))
1925
+ (lambda (val port)
1926
+ (if (eq? val '*)
1927
+ (put-string port "*")
1928
+ (write-header-list val port))))
1929
+
1930
+ ;; WWW-Authenticate = 1#challenge
1931
+ ;;
1932
+ (declare-challenge-list-header! "WWW-Authenticate")
1933
+
1934
+
1935
+ ;; Chunked Responses
1936
+ (define (read-chunk-header port)
1937
+ "Read a chunk header from PORT and return the size in bytes of the
1938
+ upcoming chunk."
1939
+ (match (read-line port)
1940
+ ((? eof-object?)
1941
+ ;; Connection closed prematurely: there's nothing left to read.
1942
+ 0)
1943
+ (str
1944
+ (let ((extension-start (string-index str
1945
+ (lambda (c)
1946
+ (or (char=? c #\;)
1947
+ (char=? c #\return))))))
1948
+ (string->number (if extension-start ; unnecessary?
1949
+ (substring str 0 extension-start)
1950
+ str)
1951
+ 16)))))
1952
+
1953
+ (define* (make-chunked-input-port port #:key (keep-alive? #f))
1954
+ "Returns a new port which translates HTTP chunked transfer encoded
1955
+ data from PORT into a non-encoded format. Returns eof when it has
1956
+ read the final chunk from PORT. This does not necessarily mean
1957
+ that there is no more data on PORT. When the returned port is
1958
+ closed it will also close PORT, unless the KEEP-ALIVE? is true."
1959
+ (define (close)
1960
+ (unless keep-alive?
1961
+ (close-port port)))
1962
+
1963
+ (define chunk-size 0) ;size of the current chunk
1964
+ (define remaining 0) ;number of bytes left from the current chunk
1965
+ (define finished? #f) ;did we get all the chunks?
1966
+
1967
+ (define (read! bv idx to-read)
1968
+ (define (loop to-read num-read)
1969
+ (cond ((or finished? (zero? to-read))
1970
+ num-read)
1971
+ ((zero? remaining) ;get a new chunk
1972
+ (let ((size (read-chunk-header port)))
1973
+ (set! chunk-size size)
1974
+ (set! remaining size)
1975
+ (cond
1976
+ ((zero? size)
1977
+ (set! finished? #t)
1978
+ num-read)
1979
+ (else
1980
+ (loop to-read num-read)))))
1981
+ (else ;read from the current chunk
1982
+ (let* ((ask-for (min to-read remaining))
1983
+ (read (get-bytevector-n! port bv (+ idx num-read)
1984
+ ask-for)))
1985
+ (cond
1986
+ ((eof-object? read) ;premature termination
1987
+ (set! finished? #t)
1988
+ num-read)
1989
+ (else
1990
+ (let ((left (- remaining read)))
1991
+ (set! remaining left)
1992
+ (when (zero? left)
1993
+ ;; We're done with this chunk; read CR and LF.
1994
+ (get-u8 port) (get-u8 port))
1995
+ (loop (- to-read read)
1996
+ (+ num-read read)))))))))
1997
+ (loop to-read 0))
1998
+
1999
+ (make-custom-binary-input-port "chunked input port" read! #f #f close))
2000
+
2001
+ (define* (make-chunked-output-port port #:key (keep-alive? #f)
2002
+ (buffering 1200))
2003
+ "Returns a new port which translates non-encoded data into a HTTP
2004
+ chunked transfer encoded data and writes this to PORT. Data written to
2005
+ this port is buffered until the port is flushed, at which point it is
2006
+ all sent as one chunk. The port will otherwise be flushed every
2007
+ BUFFERING bytes, which defaults to 1200. Take care to close the port
2008
+ when done, as it will output the remaining data, and encode the final
2009
+ zero chunk. When the port is closed it will also close PORT, unless
2010
+ KEEP-ALIVE? is true."
2011
+ (define (q-for-each f q)
2012
+ (while (not (q-empty? q))
2013
+ (f (deq! q))))
2014
+ (define queue (make-q))
2015
+ (define (%put-char c)
2016
+ (enq! queue c))
2017
+ (define (%put-string s)
2018
+ (string-for-each (lambda (c) (enq! queue c))
2019
+ s))
2020
+ (define (flush)
2021
+ ;; It is important that we do _not_ write a chunk if the queue is
2022
+ ;; empty, since it will be treated as the final chunk.
2023
+ (unless (q-empty? queue)
2024
+ (let ((len (q-length queue)))
2025
+ (put-string port (number->string len 16))
2026
+ (put-string port "\r\n")
2027
+ (q-for-each (lambda (elem) (put-char port elem))
2028
+ queue)
2029
+ (put-string port "\r\n"))))
2030
+ (define (close)
2031
+ (flush)
2032
+ (put-string port "0\r\n")
2033
+ (force-output port)
2034
+ (unless keep-alive?
2035
+ (close-port port)))
2036
+ (let ((ret (make-soft-port (vector %put-char %put-string flush #f close) "w")))
2037
+ (setvbuf ret 'block buffering)
2038
+ ret))
2039
+
2040
+ (define %http-proxy-port? (make-object-property))
2041
+ (define (http-proxy-port? port) (%http-proxy-port? port))
2042
+ (define (set-http-proxy-port?! port flag)
2043
+ (set! (%http-proxy-port? port) flag))