diff options
author | Khaled Hosny <khaledhosny@eglug.org> | 2010-03-28 08:03:36 +0200 |
---|---|---|
committer | Khaled Hosny <khaledhosny@eglug.org> | 2010-03-28 08:03:36 +0200 |
commit | 82314cf9a737149e2359daedcf864c73d5ce303a (patch) | |
tree | 65d50933d453da2d9ea582faeb038252927733de | |
parent | 0f6c01ed2aba62330d4f37e1da43197e8df6f36d (diff) | |
download | luaotfload-82314cf9a737149e2359daedcf864c73d5ce303a.tar.gz |
Include alt_getopt.lua for now
-rwxr-xr-x | alt_getopt.lua | 166 | ||||
-rw-r--r-- | luaotfload.dtx | 10 |
2 files changed, 168 insertions, 8 deletions
diff --git a/alt_getopt.lua b/alt_getopt.lua new file mode 100755 index 0000000..7a6591a --- /dev/null +++ b/alt_getopt.lua @@ -0,0 +1,166 @@ +-- Copyright (c) 2009 Aleksey Cheusov <vle@gmx.net> +-- +-- Permission is hereby granted, free of charge, to any person obtaining +-- a copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: +-- +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +-- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +-- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +-- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +local type, pairs, ipairs, io, os = type, pairs, ipairs, io, os + +module ("alt_getopt") + +local function convert_short2long (opts) + local i = 1 + local len = #opts + local ret = {} + + for short_opt, accept_arg in opts:gmatch("(%w)(:?)") do + ret[short_opt]=#accept_arg + end + + return ret +end + +local function exit_with_error (msg, exit_status) + io.stderr:write (msg) + os.exit (exit_status) +end + +local function err_unknown_opt (opt) + exit_with_error ("Unknown option `-" .. + (#opt > 1 and "-" or "") .. opt .. "'\n", 1) +end + +local function canonize (options, opt) + if not options [opt] then + err_unknown_opt (opt) + end + + while type (options [opt]) == "string" do + opt = options [opt] + + if not options [opt] then + err_unknown_opt (opt) + end + end + + return opt +end + +function get_ordered_opts (arg, sh_opts, long_opts) + local i = 1 + local count = 1 + local opts = {} + local optarg = {} + + local options = convert_short2long (sh_opts) + for k,v in pairs (long_opts) do + options [k] = v + end + + while i <= #arg do + local a = arg [i] + + if a == "--" then + i = i + 1 + break + + elseif a == "-" then + break + + elseif a:sub (1, 2) == "--" then + local pos = a:find ("=", 1, true) + + if pos then + local opt = a:sub (3, pos-1) + + opt = canonize (options, opt) + + if options [opt] == 0 then + exit_with_error ("Bad usage of option `" .. a .. "'\n", 1) + end + + optarg [count] = a:sub (pos+1) + opts [count] = opt + else + local opt = a:sub (3) + + opt = canonize (options, opt) + + if options [opt] == 0 then + opts [count] = opt + else + if i == #arg then + exit_with_error ("Missed value for option `" .. a .. "'\n", 1) + end + + optarg [count] = arg [i+1] + opts [count] = opt + i = i + 1 + end + end + count = count + 1 + + elseif a:sub (1, 1) == "-" then + local j + for j=2,a:len () do + local opt = canonize (options, a:sub (j, j)) + + if options [opt] == 0 then + opts [count] = opt + count = count + 1 + elseif a:len () == j then + if i == #arg then + exit_with_error ("Missed value for option `-" .. opt .. "'\n", 1) + end + + optarg [count] = arg [i+1] + opts [count] = opt + i = i + 1 + count = count + 1 + break + else + optarg [count] = a:sub (j+1) + opts [count] = opt + count = count + 1 + break + end + end + else + break + end + + i = i + 1 + end + + return opts,i,optarg +end + +function get_opts (arg, sh_opts, long_opts) + local ret = {} + + local opts,optind,optarg = get_ordered_opts (arg, sh_opts, long_opts) + for i,v in ipairs (opts) do + if optarg [i] then + ret [v] = optarg [i] + else + ret [v] = 1 + end + end + + return ret,optind +end diff --git a/luaotfload.dtx b/luaotfload.dtx index ffe4d73..ce1f76c 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -184,14 +184,8 @@ and the derived files % % Prefixes are either |file| or |name|; |file| prefix forces searching font % based on filename, while a |name| prefix will result in consulting name -% database. Name database can be generated with\footnote{|mtxrun| tool and -% scripts are part of \ConTeXt}: -% -% \begin{center} -% |mtxrun --script fonts --names| -% \footnote{|mtxrun --script fonts --reload --simple| in recent -% \ConTeXt releases} -% \end{center} +% database. Name database can be generated with |mkluatexfontdb.lua| script +% shipped with \textsf{luaotfload}. % % \noindent Which will generate a file named |luatex-fonts-names.lua| that is % to be placed somewhere in your \textsc{texmf} tree where \textsf{kpathsea} can |