/
apr.lua.html
189 lines (176 loc) · 24.8 KB
/
apr.lua.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
<html>
<head>
<style type="text/css">
html, body { margin: 0; padding: 0; }
pre { margin: 0; padding: 1em; }
</style>
<link rel="alternate stylesheet" type="text/css" href="http://peterodding.com/code/lua/lxsh/styles/earendel.css" title="Earendel">
<link rel="alternate stylesheet" type="text/css" href="http://peterodding.com/code/lua/lxsh/styles/slate.css" title="Slate">
<link rel="stylesheet" type="text/css" href="http://peterodding.com/code/lua/lxsh/styles/wiki.css" title="Wiki">
<script type="text/javascript" src="http://peterodding.com/code/lua/lxsh/styleswitcher.js"></script>
</head>
<body>
<pre class="sourcecode lua"><span class="comment">--[[
Lua source code for the Lua/APR binding.
Author: Peter Odding <peter@peterodding.com>
Last Change: January 8, 2011
Homepage: <a href="http://peterodding.com/code/lua/apr/">http://peterodding.com/code/lua/apr/</a>
License: MIT
Version: 0.9.29
This Lua script is executed on require("apr"), loads the binary module using
require("apr.core"), defines several library functions implemented on top of
the binary module and returns the module table as the result of require().
--]]</span>
<span class="keyword">local</span> <span class="identifier">apr</span> <span class="operator">=</span> <a href="http://www.lua.org/manual/5.1/manual.html#pdf-require" class="library">require</a> <span class="constant">'apr.core'</span>
<span class="identifier">apr._VERSION</span> <span class="operator">=</span> <span class="constant">'0.9.29'</span>
<span class="comment">-- apr.md5(input [, binary]) -> digest {{{1
</span><span class="comment">--
</span><span class="comment">-- Calculate the [MD5] [md5] message digest of the string @input. On success
</span><span class="comment">-- the digest is returned as a string of 32 hexadecimal characters, or a string
</span><span class="comment">-- of 16 bytes if @binary evaluates to true. Otherwise a nil followed by an
</span><span class="comment">-- error message is returned.
</span><span class="comment">--
</span><span class="comment">-- *This function is binary safe.*
</span><span class="comment">--
</span><span class="comment">-- Part of the "Cryptography routines" module.
</span>
<span class="keyword">function</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.md5" class="library">apr.md5</a><span class="operator">(</span><span class="identifier">input</span><span class="operator">,</span> <span class="identifier">binary</span><span class="operator">)</span>
<a href="http://www.lua.org/manual/5.1/manual.html#pdf-assert" class="library">assert</a><span class="operator">(</span><a href="http://www.lua.org/manual/5.1/manual.html#pdf-type" class="library">type</a><span class="operator">(</span><span class="identifier">input</span><span class="operator">)</span> <span class="operator">==</span> <span class="constant">'string'</span><span class="operator">,</span> <span class="constant">"bad argument #1 to apr.md5() (string expected)"</span><span class="operator">)</span>
<span class="keyword">local</span> <span class="identifier">context</span><span class="operator">,</span> <span class="identifier">digest</span><span class="operator">,</span> <span class="identifier">status</span><span class="operator">,</span> <span class="identifier">errmsg</span><span class="operator">,</span> <span class="identifier">errcode</span>
<span class="identifier">context</span><span class="operator">,</span> <span class="identifier">errmsg</span><span class="operator">,</span> <span class="identifier">errcode</span> <span class="operator">=</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.md5_init" class="library">apr.md5_init</a><span class="operator">(</span><span class="operator">)</span>
<span class="keyword">if</span> <span class="identifier">context</span> <span class="keyword">then</span>
<span class="identifier">status</span><span class="operator">,</span> <span class="identifier">errmsg</span><span class="operator">,</span> <span class="identifier">errcode</span> <span class="operator">=</span> <span class="identifier">context</span><span class="operator">:</span><span class="identifier">update</span><span class="operator">(</span><span class="identifier">input</span><span class="operator">)</span>
<span class="keyword">if</span> <span class="identifier">status</span> <span class="keyword">then</span>
<span class="identifier">digest</span><span class="operator">,</span> <span class="identifier">errmsg</span><span class="operator">,</span> <span class="identifier">errcode</span> <span class="operator">=</span> <span class="identifier">context</span><span class="operator">:</span><span class="identifier">digest</span><span class="operator">(</span><span class="identifier">binary</span><span class="operator">)</span>
<span class="keyword">if</span> <span class="identifier">digest</span> <span class="keyword">then</span> <span class="keyword">return</span> <span class="identifier">digest</span> <span class="keyword">end</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="keyword">return</span> <span class="constant">nil</span><span class="operator">,</span> <span class="identifier">errmsg</span><span class="operator">,</span> <span class="identifier">errcode</span>
<span class="keyword">end</span>
<span class="comment">-- apr.sha1(input [, binary]) -> digest {{{1
</span><span class="comment">--
</span><span class="comment">-- Calculate the [SHA1] [sha1] message digest of the string @input. On success
</span><span class="comment">-- the digest is returned as a string of 40 hexadecimal characters, or a string
</span><span class="comment">-- of 20 bytes if @binary evaluates to true. Otherwise a nil followed by an
</span><span class="comment">-- error message is returned.
</span><span class="comment">--
</span><span class="comment">-- *This function is binary safe.*
</span><span class="comment">--
</span><span class="comment">-- Part of the "Cryptography routines" module.
</span>
<span class="keyword">function</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.sha1" class="library">apr.sha1</a><span class="operator">(</span><span class="identifier">input</span><span class="operator">,</span> <span class="identifier">binary</span><span class="operator">)</span>
<a href="http://www.lua.org/manual/5.1/manual.html#pdf-assert" class="library">assert</a><span class="operator">(</span><a href="http://www.lua.org/manual/5.1/manual.html#pdf-type" class="library">type</a><span class="operator">(</span><span class="identifier">input</span><span class="operator">)</span> <span class="operator">==</span> <span class="constant">'string'</span><span class="operator">,</span> <span class="constant">"bad argument #1 to apr.sha1() (string expected)"</span><span class="operator">)</span>
<span class="keyword">local</span> <span class="identifier">context</span><span class="operator">,</span> <span class="identifier">digest</span><span class="operator">,</span> <span class="identifier">status</span><span class="operator">,</span> <span class="identifier">errmsg</span><span class="operator">,</span> <span class="identifier">errcode</span>
<span class="identifier">context</span><span class="operator">,</span> <span class="identifier">errmsg</span><span class="operator">,</span> <span class="identifier">errcode</span> <span class="operator">=</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.sha1_init" class="library">apr.sha1_init</a><span class="operator">(</span><span class="operator">)</span>
<span class="keyword">if</span> <span class="identifier">context</span> <span class="keyword">then</span>
<span class="identifier">status</span><span class="operator">,</span> <span class="identifier">errmsg</span><span class="operator">,</span> <span class="identifier">errcode</span> <span class="operator">=</span> <span class="identifier">context</span><span class="operator">:</span><span class="identifier">update</span><span class="operator">(</span><span class="identifier">input</span><span class="operator">)</span>
<span class="keyword">if</span> <span class="identifier">status</span> <span class="keyword">then</span>
<span class="identifier">digest</span><span class="operator">,</span> <span class="identifier">errmsg</span><span class="operator">,</span> <span class="identifier">errcode</span> <span class="operator">=</span> <span class="identifier">context</span><span class="operator">:</span><span class="identifier">digest</span><span class="operator">(</span><span class="identifier">binary</span><span class="operator">)</span>
<span class="keyword">if</span> <span class="identifier">digest</span> <span class="keyword">then</span> <span class="keyword">return</span> <span class="identifier">digest</span> <span class="keyword">end</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="keyword">return</span> <span class="constant">nil</span><span class="operator">,</span> <span class="identifier">errmsg</span><span class="operator">,</span> <span class="identifier">errcode</span>
<span class="keyword">end</span>
<span class="comment">-- apr.filepath_which(program [, find_all]) -> pathname {{{1
</span><span class="comment">--
</span><span class="comment">-- Find the full pathname of @program by searching the directories in the
</span><span class="comment">-- [$PATH] [path_var] environment variable and return the pathname of the
</span><span class="comment">-- first program that's found. If @find_all is true then a list with the
</span><span class="comment">-- pathnames of all matching programs is returned instead.
</span><span class="comment">--
</span><span class="comment">-- [path_var]: <a href="http://en.wikipedia.org/wiki/PATH_%28variable%29">http://en.wikipedia.org/wiki/PATH_%28variable%29</a>
</span><span class="comment">--
</span><span class="comment">-- Part of the "File path manipulation" module.
</span>
<span class="keyword">function</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.filepath_which" class="library">apr.filepath_which</a><span class="operator">(</span><span class="identifier">program</span><span class="operator">,</span> <span class="identifier">find_all</span><span class="operator">)</span>
<span class="keyword">local</span> <span class="identifier">split</span> <span class="operator">=</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.filepath_list_split" class="library">apr.filepath_list_split</a>
<span class="keyword">local</span> <span class="identifier">is_windows</span> <span class="operator">=</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.platform_get" class="library">apr.platform_get</a><span class="operator">(</span><span class="operator">)</span> <span class="operator">==</span> <span class="constant">'WIN32'</span>
<span class="keyword">local</span> <span class="identifier">extensions</span> <span class="operator">=</span> <span class="identifier">is_windows</span> <span class="operator">and</span> <span class="identifier">split</span><span class="operator">(</span><a href="http://peterodding.com/code/lua/apr/docs/#apr.env_get" class="library">apr.env_get</a> <span class="constant">'PATHEXT'</span><span class="operator">)</span>
<span class="keyword">local</span> <span class="identifier">results</span> <span class="operator">=</span> <span class="identifier">find_all</span> <span class="operator">and</span> <span class="operator">{</span><span class="operator">}</span>
<span class="keyword">for</span> <span class="identifier">_</span><span class="operator">,</span> <span class="identifier">directory</span> <span class="keyword">in</span> <a href="http://www.lua.org/manual/5.1/manual.html#pdf-ipairs" class="library">ipairs</a><span class="operator">(</span><span class="identifier">split</span><span class="operator">(</span><a href="http://peterodding.com/code/lua/apr/docs/#apr.env_get" class="library">apr.env_get</a> <span class="constant">'PATH'</span><span class="operator">)</span><span class="operator">)</span> <span class="keyword">do</span>
<span class="keyword">local</span> <span class="identifier">candidate</span> <span class="operator">=</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.filepath_merge" class="library">apr.filepath_merge</a><span class="operator">(</span><span class="identifier">directory</span><span class="operator">,</span> <span class="identifier">program</span><span class="operator">)</span>
<span class="keyword">if</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.stat" class="library">apr.stat</a><span class="operator">(</span><span class="identifier">candidate</span><span class="operator">,</span> <span class="constant">'type'</span><span class="operator">)</span> <span class="operator">==</span> <span class="constant">'file'</span> <span class="keyword">then</span>
<span class="comment">-- <span class="marker">TODO</span> if not is_windows check executable bits
</span> <span class="keyword">if</span> <span class="operator">not</span> <span class="identifier">find_all</span> <span class="keyword">then</span> <span class="keyword">return</span> <span class="identifier">candidate</span> <span class="keyword">end</span>
<span class="identifier">results</span><span class="operator">[</span><span class="operator">#</span><span class="identifier">results</span> <span class="operator">+</span> <span class="number">1</span><span class="operator">]</span> <span class="operator">=</span> <span class="identifier">candidate</span>
<span class="keyword">end</span>
<span class="keyword">if</span> <span class="identifier">is_windows</span> <span class="operator">and</span> <span class="operator">#</span><span class="identifier">extensions</span> <span class="operator">>=</span> <span class="number">1</span> <span class="keyword">then</span>
<span class="keyword">for</span> <span class="identifier">_</span><span class="operator">,</span> <span class="identifier">extension</span> <span class="keyword">in</span> <a href="http://www.lua.org/manual/5.1/manual.html#pdf-ipairs" class="library">ipairs</a><span class="operator">(</span><span class="identifier">extensions</span><span class="operator">)</span> <span class="keyword">do</span>
<span class="identifier">candidate</span> <span class="operator">=</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.filepath_merge" class="library">apr.filepath_merge</a><span class="operator">(</span><span class="identifier">directory</span><span class="operator">,</span> <span class="identifier">program</span> <span class="operator">..</span> <span class="constant">'.'</span> <span class="operator">..</span> <span class="identifier">extension</span><span class="operator">)</span>
<span class="keyword">if</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.stat" class="library">apr.stat</a><span class="operator">(</span><span class="identifier">candidate</span><span class="operator">,</span> <span class="constant">'type'</span><span class="operator">)</span> <span class="operator">==</span> <span class="constant">'file'</span> <span class="keyword">then</span>
<span class="keyword">if</span> <span class="operator">not</span> <span class="identifier">find_all</span> <span class="keyword">then</span> <span class="keyword">return</span> <span class="identifier">candidate</span> <span class="keyword">end</span>
<span class="identifier">results</span><span class="operator">[</span><span class="operator">#</span><span class="identifier">results</span> <span class="operator">+</span> <span class="number">1</span><span class="operator">]</span> <span class="operator">=</span> <span class="identifier">candidate</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="keyword">return</span> <span class="identifier">results</span>
<span class="keyword">end</span>
<span class="comment">-- apr.glob(pattern [, ignorecase]) -> iterator {{{1
</span><span class="comment">--
</span><span class="comment">-- Split @pattern into a directory path and a filename pattern and return an
</span><span class="comment">-- iterator which returns all filenames in the directory that match the
</span><span class="comment">-- extracted filename pattern. The `apr.fnmatch()` function is used for
</span><span class="comment">-- filename matching so the documentation there applies.
</span><span class="comment">--
</span><span class="comment">-- *This function is not binary safe.*
</span><span class="comment">--
</span><span class="comment">-- Part of the "Filename matching" module.
</span>
<span class="keyword">function</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.glob" class="library">apr.glob</a><span class="operator">(</span><span class="identifier">pattern</span><span class="operator">,</span> <span class="identifier">ignorecase</span><span class="operator">)</span>
<span class="keyword">local</span> <span class="identifier">fnmatch</span> <span class="operator">=</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.fnmatch" class="library">apr.fnmatch</a>
<span class="keyword">local</span> <span class="identifier">yield</span> <span class="operator">=</span> <a href="http://www.lua.org/manual/5.1/manual.html#pdf-coroutine.yield" class="library">coroutine.yield</a>
<span class="keyword">local</span> <span class="identifier">directory</span><span class="operator">,</span> <span class="identifier">pattern</span> <span class="operator">=</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.filepath_parent" class="library">apr.filepath_parent</a><span class="operator">(</span><span class="identifier">pattern</span><span class="operator">)</span>
<span class="keyword">local</span> <span class="identifier">handle</span> <span class="operator">=</span> <a href="http://www.lua.org/manual/5.1/manual.html#pdf-assert" class="library">assert</a><span class="operator">(</span><a href="http://peterodding.com/code/lua/apr/docs/#apr.dir_open" class="library">apr.dir_open</a><span class="operator">(</span><span class="identifier">directory</span><span class="operator">)</span><span class="operator">)</span>
<span class="keyword">return</span> <a href="http://www.lua.org/manual/5.1/manual.html#pdf-coroutine.wrap" class="library">coroutine.wrap</a><span class="operator">(</span><span class="keyword">function</span><span class="operator">(</span><span class="operator">)</span>
<span class="keyword">for</span> <span class="identifier">path</span><span class="operator">,</span> <span class="identifier">name</span> <span class="keyword">in</span> <span class="identifier">handle</span><span class="operator">:</span><span class="identifier">entries</span><span class="operator">(</span><span class="constant">'path'</span><span class="operator">,</span> <span class="constant">'name'</span><span class="operator">)</span> <span class="keyword">do</span>
<span class="keyword">if</span> <span class="identifier">fnmatch</span><span class="operator">(</span><span class="identifier">pattern</span><span class="operator">,</span> <span class="identifier">name</span><span class="operator">,</span> <span class="identifier">ignorecase</span><span class="operator">)</span> <span class="keyword">then</span>
<span class="identifier">yield</span><span class="operator">(</span><span class="identifier">path</span><span class="operator">)</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="identifier">handle</span><span class="operator">:</span><span class="identifier">close</span><span class="operator">(</span><span class="operator">)</span>
<span class="keyword">end</span><span class="operator">)</span>
<span class="keyword">end</span>
<span class="comment">-- apr.uri_encode(string) -> encoded {{{1
</span><span class="comment">--
</span><span class="comment">-- Encode all unsafe bytes in @string using [percent-encoding] [percenc] so
</span><span class="comment">-- that the string can be embedded in a [URI] [uri] query string.
</span><span class="comment">--
</span><span class="comment">-- [percenc]: <a href="http://en.wikipedia.org/wiki/Percent-encoding">http://en.wikipedia.org/wiki/Percent-encoding</a>
</span><span class="comment">--
</span><span class="comment">-- Part of the "Uniform resource identifier parsing" module.
</span>
<span class="keyword">function</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.uri_encode" class="library">apr.uri_encode</a><span class="operator">(</span><span class="identifier">s</span><span class="operator">)</span>
<span class="keyword">local</span> <span class="identifier">byte</span> <span class="operator">=</span> <a href="http://www.lua.org/manual/5.1/manual.html#pdf-string.byte" class="library">string.byte</a>
<span class="keyword">local</span> <span class="identifier">format</span> <span class="operator">=</span> <a href="http://www.lua.org/manual/5.1/manual.html#pdf-string.format" class="library">string.format</a>
<span class="keyword">return</span> <span class="operator">(</span><span class="identifier">s</span><span class="operator">:</span><span class="identifier">gsub</span><span class="operator">(</span><span class="constant">'[^A-Za-z0-9_.-]'</span><span class="operator">,</span> <span class="keyword">function</span><span class="operator">(</span><span class="identifier">c</span><span class="operator">)</span>
<span class="keyword">if</span> <span class="identifier">c</span> <span class="operator">==</span> <span class="constant">' '</span> <span class="keyword">then</span>
<span class="keyword">return</span> <span class="constant">'+'</span>
<span class="keyword">else</span>
<span class="keyword">return</span> <span class="identifier">format</span><span class="operator">(</span><span class="constant">'<span class="escape">%%</span><span class="escape">%0</span>2x'</span><span class="operator">,</span> <span class="identifier">byte</span><span class="operator">(</span><span class="identifier">c</span><span class="operator">)</span><span class="operator">)</span>
<span class="keyword">end</span>
<span class="keyword">end</span><span class="operator">)</span><span class="operator">)</span>
<span class="keyword">end</span>
<span class="comment">-- apr.uri_decode(encoded) -> string {{{1
</span><span class="comment">--
</span><span class="comment">-- Decode all [percent-encoded] [percenc] bytes in the string @encoded.
</span><span class="comment">--
</span><span class="comment">-- [percenc]: <a href="http://en.wikipedia.org/wiki/Percent-encoding">http://en.wikipedia.org/wiki/Percent-encoding</a>
</span><span class="comment">--
</span><span class="comment">-- Part of the "Uniform resource identifier parsing" module.
</span>
<span class="keyword">function</span> <a href="http://peterodding.com/code/lua/apr/docs/#apr.uri_decode" class="library">apr.uri_decode</a><span class="operator">(</span><span class="identifier">s</span><span class="operator">)</span>
<span class="keyword">local</span> <span class="identifier">char</span> <span class="operator">=</span> <a href="http://www.lua.org/manual/5.1/manual.html#pdf-string.char" class="library">string.char</a>
<span class="keyword">local</span> <a href="http://www.lua.org/manual/5.1/manual.html#pdf-tonumber" class="library">tonumber</a> <span class="operator">=</span> <a href="http://www.lua.org/manual/5.1/manual.html#pdf-tonumber" class="library">tonumber</a>
<span class="identifier">s</span> <span class="operator">=</span> <span class="identifier">s</span><span class="operator">:</span><span class="identifier">gsub</span><span class="operator">(</span><span class="constant">'+'</span><span class="operator">,</span> <span class="constant">' '</span><span class="operator">)</span>
<span class="keyword">return</span> <span class="operator">(</span><span class="identifier">s</span><span class="operator">:</span><span class="identifier">gsub</span><span class="operator">(</span><span class="constant">'<span class="escape">%%</span>(<span class="escape">%x</span><span class="escape">%x</span>?)'</span><span class="operator">,</span> <span class="keyword">function</span><span class="operator">(</span><span class="identifier">code</span><span class="operator">)</span>
<span class="keyword">return</span> <span class="identifier">char</span><span class="operator">(</span><a href="http://www.lua.org/manual/5.1/manual.html#pdf-tonumber" class="library">tonumber</a><span class="operator">(</span><span class="identifier">code</span><span class="operator">,</span> <span class="number">16</span><span class="operator">)</span><span class="operator">)</span>
<span class="keyword">end</span><span class="operator">)</span><span class="operator">)</span>
<span class="keyword">end</span>
<span class="comment">-- }}}1
</span>
<span class="keyword">return</span> <span class="identifier">apr</span>
<span class="comment">-- vim: ts=2 sw=2 et tw=79 fen fdm=marker
</span></pre>
</body>
</html>