rufus-lua-win 5.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +69 -0
- data/Rakefile +1 -0
- data/lib/rufus/lua/win.rb +18 -0
- data/lib/rufus/lua/win/version.rb +7 -0
- data/rufus-lua-win.gemspec +23 -0
- data/vendor/lua/bin/liblua.dll +0 -0
- data/vendor/lua/lib/lua/LuaXml.lua +119 -0
- data/vendor/lua/lib/lua/alien.lua +250 -0
- data/vendor/lua/lib/lua/alien/core.dll +0 -0
- data/vendor/lua/lib/lua/alien/struct.dll +0 -0
- data/vendor/lua/lib/lua/base.lua +536 -0
- data/vendor/lua/lib/lua/bin.lua +20 -0
- data/vendor/lua/lib/lua/bit.dll +0 -0
- data/vendor/lua/lib/lua/cdlua.dll +0 -0
- data/vendor/lua/lib/lua/cdluacontextplus.dll +0 -0
- data/vendor/lua/lib/lua/cdluagl.dll +0 -0
- data/vendor/lua/lib/lua/cdluaim.dll +0 -0
- data/vendor/lua/lib/lua/cdluapdf.dll +0 -0
- data/vendor/lua/lib/lua/copas.lua +543 -0
- data/vendor/lua/lib/lua/coxpcall.lua +57 -0
- data/vendor/lua/lib/lua/date.lua +745 -0
- data/vendor/lua/lib/lua/debug_ext.lua +84 -0
- data/vendor/lua/lib/lua/debug_init.lua +2 -0
- data/vendor/lua/lib/lua/des56.dll +0 -0
- data/vendor/lua/lib/lua/dist/config.lua +109 -0
- data/vendor/lua/lib/lua/dist/constraints.lua +271 -0
- data/vendor/lua/lib/lua/dist/depends.lua +601 -0
- data/vendor/lua/lib/lua/dist/git.lua +307 -0
- data/vendor/lua/lib/lua/dist/init.lua +278 -0
- data/vendor/lua/lib/lua/dist/manifest.lua +225 -0
- data/vendor/lua/lib/lua/dist/package.lua +583 -0
- data/vendor/lua/lib/lua/dist/sys.lua +367 -0
- data/vendor/lua/lib/lua/dist/utils.lua +130 -0
- data/vendor/lua/lib/lua/ex.dll +0 -0
- data/vendor/lua/lib/lua/fstable.lua +116 -0
- data/vendor/lua/lib/lua/getopt.lua +273 -0
- data/vendor/lua/lib/lua/git.lua +5 -0
- data/vendor/lua/lib/lua/git/core.dll +0 -0
- data/vendor/lua/lib/lua/git/objects.lua +121 -0
- data/vendor/lua/lib/lua/git/pack.lua +316 -0
- data/vendor/lua/lib/lua/git/protocol.lua +188 -0
- data/vendor/lua/lib/lua/git/repo.lua +283 -0
- data/vendor/lua/lib/lua/git/util.lua +233 -0
- data/vendor/lua/lib/lua/gzio.dll +0 -0
- data/vendor/lua/lib/lua/gzip.lua +81 -0
- data/vendor/lua/lib/lua/iconv.dll +0 -0
- data/vendor/lua/lib/lua/imlua.dll +0 -0
- data/vendor/lua/lib/lua/imlua_fftw.dll +0 -0
- data/vendor/lua/lib/lua/imlua_jp2.dll +0 -0
- data/vendor/lua/lib/lua/imlua_process.dll +0 -0
- data/vendor/lua/lib/lua/imlua_process_omp.dll +0 -0
- data/vendor/lua/lib/lua/io_ext.lua +115 -0
- data/vendor/lua/lib/lua/iuplua.dll +0 -0
- data/vendor/lua/lib/lua/iuplua_mglplot.dll +0 -0
- data/vendor/lua/lib/lua/iuplua_pplot.dll +0 -0
- data/vendor/lua/lib/lua/iupluacd.dll +0 -0
- data/vendor/lua/lib/lua/iupluacontrols.dll +0 -0
- data/vendor/lua/lib/lua/iupluagl.dll +0 -0
- data/vendor/lua/lib/lua/iupluaim.dll +0 -0
- data/vendor/lua/lib/lua/iupluaimglib.dll +0 -0
- data/vendor/lua/lib/lua/iupluatuio.dll +0 -0
- data/vendor/lua/lib/lua/lanes-keeper.lua +302 -0
- data/vendor/lua/lib/lua/lanes.lua +591 -0
- data/vendor/lua/lib/lua/lanes/core.dll +0 -0
- data/vendor/lua/lib/lua/lcs.lua +55 -0
- data/vendor/lua/lib/lua/lemock.lua +659 -0
- data/vendor/lua/lib/lua/lfs.dll +0 -0
- data/vendor/lua/lib/lua/list.lua +375 -0
- data/vendor/lua/lib/lua/logging.lua +189 -0
- data/vendor/lua/lib/lua/logging/console.lua +22 -0
- data/vendor/lua/lib/lua/logging/email.lua +44 -0
- data/vendor/lua/lib/lua/logging/file.lua +55 -0
- data/vendor/lua/lib/lua/logging/rolling_file.lua +81 -0
- data/vendor/lua/lib/lua/logging/socket.lua +35 -0
- data/vendor/lua/lib/lua/logging/sql.lua +64 -0
- data/vendor/lua/lib/lua/loop/base.lua +68 -0
- data/vendor/lua/lib/lua/loop/cached.lua +312 -0
- data/vendor/lua/lib/lua/loop/collection/MapWithArrayOfKeys.lua +64 -0
- data/vendor/lua/lib/lua/loop/collection/ObjectCache.lua +39 -0
- data/vendor/lua/lib/lua/loop/collection/OrderedSet.lua +164 -0
- data/vendor/lua/lib/lua/loop/collection/PriorityQueue.lua +86 -0
- data/vendor/lua/lib/lua/loop/collection/UnorderedArray.lua +32 -0
- data/vendor/lua/lib/lua/loop/collection/UnorderedArraySet.lua +56 -0
- data/vendor/lua/lib/lua/loop/compiler/Arguments.lua +108 -0
- data/vendor/lua/lib/lua/loop/compiler/Conditional.lua +50 -0
- data/vendor/lua/lib/lua/loop/compiler/Expression.lua +215 -0
- data/vendor/lua/lib/lua/loop/component/base.lua +221 -0
- data/vendor/lua/lib/lua/loop/component/contained.lua +71 -0
- data/vendor/lua/lib/lua/loop/component/dynamic.lua +223 -0
- data/vendor/lua/lib/lua/loop/component/intercepted.lua +354 -0
- data/vendor/lua/lib/lua/loop/component/wrapped.lua +195 -0
- data/vendor/lua/lib/lua/loop/debug/Inspector.lua +521 -0
- data/vendor/lua/lib/lua/loop/debug/Matcher.lua +192 -0
- data/vendor/lua/lib/lua/loop/debug/Verbose.lua +266 -0
- data/vendor/lua/lib/lua/loop/debug/Viewer.lua +200 -0
- data/vendor/lua/lib/lua/loop/multiple.lua +105 -0
- data/vendor/lua/lib/lua/loop/object/Exception.lua +57 -0
- data/vendor/lua/lib/lua/loop/object/Publisher.lua +43 -0
- data/vendor/lua/lib/lua/loop/object/Wrapper.lua +39 -0
- data/vendor/lua/lib/lua/loop/scoped.lua +585 -0
- data/vendor/lua/lib/lua/loop/serial/FileStream.lua +48 -0
- data/vendor/lua/lib/lua/loop/serial/Serializer.lua +291 -0
- data/vendor/lua/lib/lua/loop/serial/SocketStream.lua +51 -0
- data/vendor/lua/lib/lua/loop/serial/StringStream.lua +47 -0
- data/vendor/lua/lib/lua/loop/simple.lua +75 -0
- data/vendor/lua/lib/lua/loop/table.lua +71 -0
- data/vendor/lua/lib/lua/loop/thread/CoSocket.lua +416 -0
- data/vendor/lua/lib/lua/loop/thread/IOScheduler.lua +170 -0
- data/vendor/lua/lib/lua/loop/thread/Scheduler.lua +327 -0
- data/vendor/lua/lib/lua/loop/thread/SocketScheduler.lua +88 -0
- data/vendor/lua/lib/lua/loop/thread/Timer.lua +54 -0
- data/vendor/lua/lib/lua/lpeg.dll +0 -0
- data/vendor/lua/lib/lua/ltn12.lua +292 -0
- data/vendor/lua/lib/lua/luaXML_lib.dll +0 -0
- data/vendor/lua/lib/lua/luacurl.dll +0 -0
- data/vendor/lua/lib/lua/luadoc/config.lua +34 -0
- data/vendor/lua/lib/lua/luadoc/doclet/debug.lua +46 -0
- data/vendor/lua/lib/lua/luadoc/doclet/formatter.lua +84 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html.lua +289 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/file.lp +113 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/function.lp +64 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/index.lp +70 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/luadoc.css +286 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/menu.lp +55 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/module.lp +109 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/table.lp +15 -0
- data/vendor/lua/lib/lua/luadoc/doclet/raw.lua +12 -0
- data/vendor/lua/lib/lua/luadoc/init.lua +58 -0
- data/vendor/lua/lib/lua/luadoc/lp.lua +130 -0
- data/vendor/lua/lib/lua/luadoc/taglet/standard.lua +495 -0
- data/vendor/lua/lib/lua/luadoc/taglet/standard/tags.lua +171 -0
- data/vendor/lua/lib/lua/luadoc/util.lua +233 -0
- data/vendor/lua/lib/lua/luagl.dll +0 -0
- data/vendor/lua/lib/lua/luaglu.dll +0 -0
- data/vendor/lua/lib/lua/luaidl.lua +113 -0
- data/vendor/lua/lib/lua/luaidl/lex.lua +793 -0
- data/vendor/lua/lib/lua/luaidl/pre.lua +149 -0
- data/vendor/lua/lib/lua/luaidl/sin.lua +3631 -0
- data/vendor/lua/lib/lua/luarocks/add.lua +108 -0
- data/vendor/lua/lib/lua/luarocks/admin_remove.lua +87 -0
- data/vendor/lua/lib/lua/luarocks/build.lua +330 -0
- data/vendor/lua/lib/lua/luarocks/build/builtin.lua +253 -0
- data/vendor/lua/lib/lua/luarocks/build/cmake.lua +54 -0
- data/vendor/lua/lib/lua/luarocks/build/command.lua +32 -0
- data/vendor/lua/lib/lua/luarocks/build/make.lua +92 -0
- data/vendor/lua/lib/lua/luarocks/cache.lua +85 -0
- data/vendor/lua/lib/lua/luarocks/cfg.lua +449 -0
- data/vendor/lua/lib/lua/luarocks/command_line.lua +163 -0
- data/vendor/lua/lib/lua/luarocks/deps.lua +654 -0
- data/vendor/lua/lib/lua/luarocks/dir.lua +69 -0
- data/vendor/lua/lib/lua/luarocks/download.lua +90 -0
- data/vendor/lua/lib/lua/luarocks/fetch.lua +321 -0
- data/vendor/lua/lib/lua/luarocks/fetch/cvs.lua +44 -0
- data/vendor/lua/lib/lua/luarocks/fetch/git.lua +81 -0
- data/vendor/lua/lib/lua/luarocks/fetch/git_file.lua +17 -0
- data/vendor/lua/lib/lua/luarocks/fetch/hg.lua +54 -0
- data/vendor/lua/lib/lua/luarocks/fetch/sscm.lua +42 -0
- data/vendor/lua/lib/lua/luarocks/fetch/svn.lua +53 -0
- data/vendor/lua/lib/lua/luarocks/fs.lua +40 -0
- data/vendor/lua/lib/lua/luarocks/fs/lua.lua +676 -0
- data/vendor/lua/lib/lua/luarocks/fs/unix.lua +88 -0
- data/vendor/lua/lib/lua/luarocks/fs/unix/tools.lua +325 -0
- data/vendor/lua/lib/lua/luarocks/fs/win32.lua +107 -0
- data/vendor/lua/lib/lua/luarocks/fs/win32/tools.lua +334 -0
- data/vendor/lua/lib/lua/luarocks/help.lua +101 -0
- data/vendor/lua/lib/lua/luarocks/index.lua +172 -0
- data/vendor/lua/lib/lua/luarocks/install.lua +151 -0
- data/vendor/lua/lib/lua/luarocks/list.lua +35 -0
- data/vendor/lua/lib/lua/luarocks/loader.lua +228 -0
- data/vendor/lua/lib/lua/luarocks/make.lua +71 -0
- data/vendor/lua/lib/lua/luarocks/make_manifest.lua +34 -0
- data/vendor/lua/lib/lua/luarocks/manif.lua +360 -0
- data/vendor/lua/lib/lua/luarocks/manif_core.lua +75 -0
- data/vendor/lua/lib/lua/luarocks/new_version.lua +141 -0
- data/vendor/lua/lib/lua/luarocks/pack.lua +205 -0
- data/vendor/lua/lib/lua/luarocks/path.lua +315 -0
- data/vendor/lua/lib/lua/luarocks/persist.lua +173 -0
- data/vendor/lua/lib/lua/luarocks/refresh_cache.lua +30 -0
- data/vendor/lua/lib/lua/luarocks/remove.lua +135 -0
- data/vendor/lua/lib/lua/luarocks/rep.lua +313 -0
- data/vendor/lua/lib/lua/luarocks/require.lua +6 -0
- data/vendor/lua/lib/lua/luarocks/search.lua +399 -0
- data/vendor/lua/lib/lua/luarocks/show.lua +138 -0
- data/vendor/lua/lib/lua/luarocks/site_config.lua +23 -0
- data/vendor/lua/lib/lua/luarocks/tools/patch.lua +712 -0
- data/vendor/lua/lib/lua/luarocks/tools/tar.lua +144 -0
- data/vendor/lua/lib/lua/luarocks/tools/zip.lua +245 -0
- data/vendor/lua/lib/lua/luarocks/type_check.lua +267 -0
- data/vendor/lua/lib/lua/luarocks/unpack.lua +151 -0
- data/vendor/lua/lib/lua/luarocks/util.lua +420 -0
- data/vendor/lua/lib/lua/luarocks/validate.lua +164 -0
- data/vendor/lua/lib/lua/luars232.dll +0 -0
- data/vendor/lua/lib/lua/luasql/mysql.dll +0 -0
- data/vendor/lua/lib/lua/luasql/postgres.dll +0 -0
- data/vendor/lua/lib/lua/luasql/sqlite3.dll +0 -0
- data/vendor/lua/lib/lua/luaunit.lua +601 -0
- data/vendor/lua/lib/lua/lxp.dll +0 -0
- data/vendor/lua/lib/lua/lxp/lom.lua +60 -0
- data/vendor/lua/lib/lua/math_ext.lua +27 -0
- data/vendor/lua/lib/lua/mbox.lua +53 -0
- data/vendor/lua/lib/lua/md5.lua +19 -0
- data/vendor/lua/lib/lua/md5/core.dll +0 -0
- data/vendor/lua/lib/lua/metalua.lua +0 -0
- data/vendor/lua/lib/lua/metalua/ast_to_string.mlua +553 -0
- data/vendor/lua/lib/lua/metalua/base.lua +104 -0
- data/vendor/lua/lib/lua/metalua/bytecode.lua +0 -0
- data/vendor/lua/lib/lua/metalua/clopts.mlua +204 -0
- data/vendor/lua/lib/lua/metalua/compiler.lua +3 -0
- data/vendor/lua/lib/lua/metalua/dollar.mlua +24 -0
- data/vendor/lua/lib/lua/metalua/extension/H-runtime.mlua +216 -0
- data/vendor/lua/lib/lua/metalua/extension/H.mlua +22 -0
- data/vendor/lua/lib/lua/metalua/extension/anaphoric.mlua +54 -0
- data/vendor/lua/lib/lua/metalua/extension/clist.mlua +149 -0
- data/vendor/lua/lib/lua/metalua/extension/continue.mlua +53 -0
- data/vendor/lua/lib/lua/metalua/extension/localin.mlua +2 -0
- data/vendor/lua/lib/lua/metalua/extension/log.mlua +39 -0
- data/vendor/lua/lib/lua/metalua/extension/match.mlua +374 -0
- data/vendor/lua/lib/lua/metalua/extension/ternary.mlua +10 -0
- data/vendor/lua/lib/lua/metalua/extension/trycatch.mlua +189 -0
- data/vendor/lua/lib/lua/metalua/extension/types-runtime.mlua +159 -0
- data/vendor/lua/lib/lua/metalua/extension/types.mlua +352 -0
- data/vendor/lua/lib/lua/metalua/extension/withdo.mlua +30 -0
- data/vendor/lua/lib/lua/metalua/extension/xglobal-runtime.lua +41 -0
- data/vendor/lua/lib/lua/metalua/extension/xglobal.mlua +20 -0
- data/vendor/lua/lib/lua/metalua/extension/xloop.mlua +100 -0
- data/vendor/lua/lib/lua/metalua/extension/xmatch.mlua +216 -0
- data/vendor/lua/lib/lua/metalua/metaloop.mlua +76 -0
- data/vendor/lua/lib/lua/metalua/mlc.lua +0 -0
- data/vendor/lua/lib/lua/metalua/mlc_xcall.lua +119 -0
- data/vendor/lua/lib/lua/metalua/mlp.lua +0 -0
- data/vendor/lua/lib/lua/metalua/package2.lua +101 -0
- data/vendor/lua/lib/lua/metalua/runtime.lua +3 -0
- data/vendor/lua/lib/lua/metalua/string2.lua +44 -0
- data/vendor/lua/lib/lua/metalua/table2.lua +372 -0
- data/vendor/lua/lib/lua/metalua/walk.mlua +304 -0
- data/vendor/lua/lib/lua/metalua/walk/bindings.mlua +41 -0
- data/vendor/lua/lib/lua/metalua/walk/id.mlua +186 -0
- data/vendor/lua/lib/lua/metalua/walk/scope.lua +54 -0
- data/vendor/lua/lib/lua/mime.lua +87 -0
- data/vendor/lua/lib/lua/mime/core.dll +0 -0
- data/vendor/lua/lib/lua/mobdebug.lua +1484 -0
- data/vendor/lua/lib/lua/modules.lua +16 -0
- data/vendor/lua/lib/lua/object.lua +56 -0
- data/vendor/lua/lib/lua/oil/Exception.lua +26 -0
- data/vendor/lua/lib/lua/oil/arch.lua +27 -0
- data/vendor/lua/lib/lua/oil/arch/basic/client.lua +29 -0
- data/vendor/lua/lib/lua/oil/arch/basic/common.lua +13 -0
- data/vendor/lua/lib/lua/oil/arch/basic/server.lua +27 -0
- data/vendor/lua/lib/lua/oil/arch/cooperative/common.lua +10 -0
- data/vendor/lua/lib/lua/oil/arch/cooperative/server.lua +16 -0
- data/vendor/lua/lib/lua/oil/arch/corba/client.lua +39 -0
- data/vendor/lua/lib/lua/oil/arch/corba/common.lua +58 -0
- data/vendor/lua/lib/lua/oil/arch/corba/intercepted/client.lua +9 -0
- data/vendor/lua/lib/lua/oil/arch/corba/intercepted/server.lua +9 -0
- data/vendor/lua/lib/lua/oil/arch/corba/server.lua +35 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/byref.lua +18 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/client.lua +19 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/common.lua +18 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/server.lua +19 -0
- data/vendor/lua/lib/lua/oil/arch/typed/client.lua +27 -0
- data/vendor/lua/lib/lua/oil/arch/typed/common.lua +9 -0
- data/vendor/lua/lib/lua/oil/arch/typed/server.lua +18 -0
- data/vendor/lua/lib/lua/oil/assert.lua +87 -0
- data/vendor/lua/lib/lua/oil/builder.lua +45 -0
- data/vendor/lua/lib/lua/oil/builder/basic/client.lua +31 -0
- data/vendor/lua/lib/lua/oil/builder/basic/common.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/basic/server.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/cooperative/common.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/cooperative/server.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/corba/client.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/corba/common.lua +24 -0
- data/vendor/lua/lib/lua/oil/builder/corba/gencode.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/corba/intercepted/client.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/corba/intercepted/server.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/corba/server.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/lua/client.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/lua/server.lua +12 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/byref.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/client.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/common.lua +14 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/server.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/typed/client.lua +16 -0
- data/vendor/lua/lib/lua/oil/builder/typed/server.lua +12 -0
- data/vendor/lua/lib/lua/oil/compat.lua +846 -0
- data/vendor/lua/lib/lua/oil/component.lua +1 -0
- data/vendor/lua/lib/lua/oil/corba/giop.lua +301 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Codec.lua +1568 -0
- data/vendor/lua/lib/lua/oil/corba/giop/CodecGen.lua +589 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Exception.lua +25 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Indexer.lua +63 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Listener.lua +343 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Messenger.lua +228 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Referrer.lua +180 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Requester.lua +462 -0
- data/vendor/lua/lib/lua/oil/corba/idl.lua +597 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Compiler.lua +133 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Importer.lua +235 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Indexer.lua +95 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Registry.lua +1821 -0
- data/vendor/lua/lib/lua/oil/corba/idl/ir.lua +847 -0
- data/vendor/lua/lib/lua/oil/corba/idl/sysex.lua +21 -0
- data/vendor/lua/lib/lua/oil/corba/iiop/Profiler.lua +200 -0
- data/vendor/lua/lib/lua/oil/corba/intercepted/Listener.lua +158 -0
- data/vendor/lua/lib/lua/oil/corba/intercepted/Requester.lua +181 -0
- data/vendor/lua/lib/lua/oil/corba/services/event.lua +126 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/ConsumerAdmin.lua +50 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/EventFactory.lua +15 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/EventQueue.lua +37 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushConsumer.lua +75 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushSupplier.lua +62 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/SingleDeferredDispatcher.lua +60 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/SingleSynchronousDispatcher.lua +39 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/SupplierAdmin.lua +50 -0
- data/vendor/lua/lib/lua/oil/corba/services/naming.lua +436 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Acceptor.lua +268 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Channels.lua +121 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Connector.lua +147 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Dispatcher.lua +99 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies.lua +86 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/asynchronous.lua +56 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/protected.lua +17 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/synchronous.lua +17 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/utils.lua +29 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Receiver.lua +110 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Servants.lua +207 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Sockets.lua +44 -0
- data/vendor/lua/lib/lua/oil/kernel/cooperative/Receiver.lua +139 -0
- data/vendor/lua/lib/lua/oil/kernel/intercepted/Listener.lua +47 -0
- data/vendor/lua/lib/lua/oil/kernel/intercepted/Requester.lua +58 -0
- data/vendor/lua/lib/lua/oil/kernel/lua/Dispatcher.lua +76 -0
- data/vendor/lua/lib/lua/oil/kernel/lua/Proxies.lua +69 -0
- data/vendor/lua/lib/lua/oil/kernel/typed/Dispatcher.lua +91 -0
- data/vendor/lua/lib/lua/oil/kernel/typed/Proxies.lua +153 -0
- data/vendor/lua/lib/lua/oil/kernel/typed/Servants.lua +137 -0
- data/vendor/lua/lib/lua/oil/ludo/Codec.lua +66 -0
- data/vendor/lua/lib/lua/oil/ludo/CodecByRef.lua +103 -0
- data/vendor/lua/lib/lua/oil/ludo/Listener.lua +151 -0
- data/vendor/lua/lib/lua/oil/ludo/Referrer.lua +72 -0
- data/vendor/lua/lib/lua/oil/ludo/Requester.lua +107 -0
- data/vendor/lua/lib/lua/oil/oo.lua +1 -0
- data/vendor/lua/lib/lua/oil/port.lua +1 -0
- data/vendor/lua/lib/lua/oil/properties.lua +57 -0
- data/vendor/lua/lib/lua/oil/verbose.lua +133 -0
- data/vendor/lua/lib/lua/package_ext.lua +15 -0
- data/vendor/lua/lib/lua/parser.lua +268 -0
- data/vendor/lua/lib/lua/pl/Date.lua +555 -0
- data/vendor/lua/lib/lua/pl/List.lua +613 -0
- data/vendor/lua/lib/lua/pl/Map.lua +113 -0
- data/vendor/lua/lib/lua/pl/MultiMap.lua +62 -0
- data/vendor/lua/lib/lua/pl/OrderedMap.lua +151 -0
- data/vendor/lua/lib/lua/pl/Set.lua +153 -0
- data/vendor/lua/lib/lua/pl/app.lua +165 -0
- data/vendor/lua/lib/lua/pl/array2d.lua +501 -0
- data/vendor/lua/lib/lua/pl/class.lua +180 -0
- data/vendor/lua/lib/lua/pl/comprehension.lua +286 -0
- data/vendor/lua/lib/lua/pl/config.lua +176 -0
- data/vendor/lua/lib/lua/pl/data.lua +606 -0
- data/vendor/lua/lib/lua/pl/dir.lua +475 -0
- data/vendor/lua/lib/lua/pl/file.lua +70 -0
- data/vendor/lua/lib/lua/pl/func.lua +376 -0
- data/vendor/lua/lib/lua/pl/init.lua +68 -0
- data/vendor/lua/lib/lua/pl/input.lua +173 -0
- data/vendor/lua/lib/lua/pl/lapp.lua +407 -0
- data/vendor/lua/lib/lua/pl/lexer.lua +456 -0
- data/vendor/lua/lib/lua/pl/luabalanced.lua +264 -0
- data/vendor/lua/lib/lua/pl/operator.lua +201 -0
- data/vendor/lua/lib/lua/pl/path.lua +398 -0
- data/vendor/lua/lib/lua/pl/permute.lua +63 -0
- data/vendor/lua/lib/lua/pl/platf/luajava.lua +101 -0
- data/vendor/lua/lib/lua/pl/pretty.lua +285 -0
- data/vendor/lua/lib/lua/pl/seq.lua +551 -0
- data/vendor/lua/lib/lua/pl/sip.lua +344 -0
- data/vendor/lua/lib/lua/pl/strict.lua +70 -0
- data/vendor/lua/lib/lua/pl/stringio.lua +158 -0
- data/vendor/lua/lib/lua/pl/stringx.lua +440 -0
- data/vendor/lua/lib/lua/pl/tablex.lua +817 -0
- data/vendor/lua/lib/lua/pl/template.lua +103 -0
- data/vendor/lua/lib/lua/pl/test.lua +135 -0
- data/vendor/lua/lib/lua/pl/text.lua +243 -0
- data/vendor/lua/lib/lua/pl/utils.lua +550 -0
- data/vendor/lua/lib/lua/pl/xml.lua +689 -0
- data/vendor/lua/lib/lua/profiler.dll +0 -0
- data/vendor/lua/lib/lua/re.lua +248 -0
- data/vendor/lua/lib/lua/rex_onig.dll +0 -0
- data/vendor/lua/lib/lua/rex_pcre.dll +0 -0
- data/vendor/lua/lib/lua/rex_posix.dll +0 -0
- data/vendor/lua/lib/lua/rings.dll +0 -0
- data/vendor/lua/lib/lua/serialize.lua +193 -0
- data/vendor/lua/lib/lua/set.lua +149 -0
- data/vendor/lua/lib/lua/socket.lua +133 -0
- data/vendor/lua/lib/lua/socket/core.dll +0 -0
- data/vendor/lua/lib/lua/socket/ftp.lua +281 -0
- data/vendor/lua/lib/lua/socket/http.lua +350 -0
- data/vendor/lua/lib/lua/socket/smtp.lua +251 -0
- data/vendor/lua/lib/lua/socket/tp.lua +123 -0
- data/vendor/lua/lib/lua/socket/url.lua +297 -0
- data/vendor/lua/lib/lua/ssl.dll +0 -0
- data/vendor/lua/lib/lua/ssl.lua +93 -0
- data/vendor/lua/lib/lua/ssl/https.lua +138 -0
- data/vendor/lua/lib/lua/stable.lua +28 -0
- data/vendor/lua/lib/lua/std.lua +16 -0
- data/vendor/lua/lib/lua/strbuf.lua +32 -0
- data/vendor/lua/lib/lua/strict.lua +45 -0
- data/vendor/lua/lib/lua/string_ext.lua +274 -0
- data/vendor/lua/lib/lua/table_ext.lua +117 -0
- data/vendor/lua/lib/lua/tar.lua +262 -0
- data/vendor/lua/lib/lua/task.dll +0 -0
- data/vendor/lua/lib/lua/tree.lua +81 -0
- data/vendor/lua/lib/lua/unicode.dll +0 -0
- data/vendor/lua/lib/lua/verbose_require.lua +11 -0
- data/vendor/lua/lib/lua/vstruct.lua +86 -0
- data/vendor/lua/lib/lua/vstruct/ast.lua +192 -0
- data/vendor/lua/lib/lua/vstruct/ast/Bitpack.lua +33 -0
- data/vendor/lua/lib/lua/vstruct/ast/Generator.lua +174 -0
- data/vendor/lua/lib/lua/vstruct/ast/IO.lua +45 -0
- data/vendor/lua/lib/lua/vstruct/ast/List.lua +56 -0
- data/vendor/lua/lib/lua/vstruct/ast/Name.lua +20 -0
- data/vendor/lua/lib/lua/vstruct/ast/Repeat.lua +23 -0
- data/vendor/lua/lib/lua/vstruct/ast/Root.lua +19 -0
- data/vendor/lua/lib/lua/vstruct/ast/Table.lua +65 -0
- data/vendor/lua/lib/lua/vstruct/cursor.lua +81 -0
- data/vendor/lua/lib/lua/vstruct/io.lua +45 -0
- data/vendor/lua/lib/lua/vstruct/io/a.lua +24 -0
- data/vendor/lua/lib/lua/vstruct/io/b.lua +28 -0
- data/vendor/lua/lib/lua/vstruct/io/bigendian.lua +21 -0
- data/vendor/lua/lib/lua/vstruct/io/c.lua +25 -0
- data/vendor/lua/lib/lua/vstruct/io/defaults.lua +24 -0
- data/vendor/lua/lib/lua/vstruct/io/endianness.lua +41 -0
- data/vendor/lua/lib/lua/vstruct/io/f.lua +129 -0
- data/vendor/lua/lib/lua/vstruct/io/hostendian.lua +21 -0
- data/vendor/lua/lib/lua/vstruct/io/i.lua +42 -0
- data/vendor/lua/lib/lua/vstruct/io/littleendian.lua +21 -0
- data/vendor/lua/lib/lua/vstruct/io/m.lua +62 -0
- data/vendor/lua/lib/lua/vstruct/io/p.lua +23 -0
- data/vendor/lua/lib/lua/vstruct/io/s.lua +27 -0
- data/vendor/lua/lib/lua/vstruct/io/seekb.lua +18 -0
- data/vendor/lua/lib/lua/vstruct/io/seekf.lua +18 -0
- data/vendor/lua/lib/lua/vstruct/io/seekto.lua +18 -0
- data/vendor/lua/lib/lua/vstruct/io/u.lua +54 -0
- data/vendor/lua/lib/lua/vstruct/io/x.lua +34 -0
- data/vendor/lua/lib/lua/vstruct/io/z.lua +63 -0
- data/vendor/lua/lib/lua/vstruct/lexer.lua +100 -0
- data/vendor/lua/lib/lua/vstruct/pack.lua +142 -0
- data/vendor/lua/lib/lua/vstruct/test.lua +47 -0
- data/vendor/lua/lib/lua/vstruct/test/basic.lua +73 -0
- data/vendor/lua/lib/lua/vstruct/test/common.lua +100 -0
- data/vendor/lua/lib/lua/vstruct/test/fp-bigendian.lua +56 -0
- data/vendor/lua/lib/lua/vstruct/test/fp-littleendian.lua +56 -0
- data/vendor/lua/lib/lua/vstruct/test/struct-test-gen.lua +1230 -0
- data/vendor/lua/lib/lua/vstruct/unpack.lua +126 -0
- data/vendor/lua/lib/lua/wx.dll +0 -0
- data/vendor/lua/lib/lua/xml.lua +75 -0
- data/vendor/lua/lib/lua/zip.dll +0 -0
- data/vendor/lua/lib/lua/zlib.dll +0 -0
- metadata +529 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
-- Additions to the package module.
|
|
2
|
+
module ("package", package.seeall)
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
--- Make named constants for <code>package.config</code> (undocumented
|
|
6
|
+
-- in 5.1; see luaconf.h for C equivalents).
|
|
7
|
+
-- @class table
|
|
8
|
+
-- @name package
|
|
9
|
+
-- @field dirsep directory separator
|
|
10
|
+
-- @field pathsep path separator
|
|
11
|
+
-- @field path_mark string that marks substitution points in a path template
|
|
12
|
+
-- @field execdir (Windows only) replaced by the executable's directory in a path
|
|
13
|
+
-- @field igmark Mark to ignore all before it when building <code>luaopen_</code> function name.
|
|
14
|
+
dirsep, pathsep, path_mark, execdir, igmark =
|
|
15
|
+
string.match (package.config, "^([^\n]+)\n([^\n]+)\n([^\n]+)\n([^\n]+)\n([^\n]+)")
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
--- Parser generator.
|
|
2
|
+
-- <p>A parser is created by</p>
|
|
3
|
+
-- <blockquote>
|
|
4
|
+
-- <p><code>p = Parser {grammar}</code></p>
|
|
5
|
+
-- </blockquote>
|
|
6
|
+
-- <p>and called with</p>
|
|
7
|
+
-- <blockquote>
|
|
8
|
+
-- <p><code>result = p:parse (start_token, token_list[,
|
|
9
|
+
-- from])</code></p>
|
|
10
|
+
-- </blockquote>
|
|
11
|
+
-- <p>where start_token is the non-terminal at which to start parsing
|
|
12
|
+
-- in the grammar, token_list is a list of tokens of the form</p>
|
|
13
|
+
-- <blockquote>
|
|
14
|
+
-- <p><code>{ty = "token_type", tok = "token_text"}</code></p>
|
|
15
|
+
-- </blockquote>
|
|
16
|
+
-- <p>and from is the token in the list from which to start (the
|
|
17
|
+
-- default value is 1).</p>
|
|
18
|
+
-- <p>The output of the parser is a tree, each of whose
|
|
19
|
+
-- nodes is of the form:</p>
|
|
20
|
+
-- <blockquote>
|
|
21
|
+
-- <p><code>{ty = symbol, node<sub>1</sub> = tree<sub>1</sub>,
|
|
22
|
+
-- node<sub>2</sub> = tree<sub>2</sub>, ... [, list]}</code></p>
|
|
23
|
+
-- </blockquote>
|
|
24
|
+
-- <p>where each <code>node<sub>i</sub></code> is a symbolic name, and
|
|
25
|
+
-- list is the list of trees returned if the corresponding token was a
|
|
26
|
+
-- list token.</p>
|
|
27
|
+
-- <p>A grammar is a table of rules of the form</p>
|
|
28
|
+
-- <blockquote>
|
|
29
|
+
-- <p><code>non-terminal = {production<sub>1</sub>,
|
|
30
|
+
-- production<sub>2</sub>, ...}</code></p>
|
|
31
|
+
-- </blockquote>
|
|
32
|
+
-- <p>plus a special item</p>
|
|
33
|
+
-- <blockquote>
|
|
34
|
+
-- <p><code>lexemes = Set {"class<sub>1</sub>", "class<sub>2</sub>",
|
|
35
|
+
-- ...}</code></p>
|
|
36
|
+
-- </blockquote>
|
|
37
|
+
-- <p>Each production gives a form that a non-terminal may take. A
|
|
38
|
+
-- production has the form</p>
|
|
39
|
+
-- <blockquote>
|
|
40
|
+
-- <p><code>production = {"token<sub>1</sub>", "token<sub>2</sub>",
|
|
41
|
+
-- ..., [action][,abstract]}</code></p>
|
|
42
|
+
-- </blockquote>
|
|
43
|
+
-- <p>A production</p>
|
|
44
|
+
-- <ul>
|
|
45
|
+
-- <li>must not start with the non-terminal being defined (it must not
|
|
46
|
+
-- be left-recursive)</li>
|
|
47
|
+
-- <li>must not be a prefix of a later production in the same
|
|
48
|
+
-- non-terminal</li>
|
|
49
|
+
-- </ul>
|
|
50
|
+
-- <p>Each token may be</p>
|
|
51
|
+
-- <ul>
|
|
52
|
+
-- <li>a non-terminal, i.e. a token defined by the grammar</li>
|
|
53
|
+
-- <ul>
|
|
54
|
+
-- <li>an optional symbol is indicated by the suffix <code>_opt</code></li>
|
|
55
|
+
-- <li>a list is indicated by the suffix <code>_list</code>, and may be
|
|
56
|
+
-- followed by <code>_≤separator-symbol></code> (default is no separator)</li>
|
|
57
|
+
-- </ul>
|
|
58
|
+
-- <li>a lexeme class</li>
|
|
59
|
+
-- <li>a string to match literally</li>
|
|
60
|
+
-- </ul>
|
|
61
|
+
-- <p>The parse tree for a literal string or lexeme class is the string
|
|
62
|
+
-- that was matched. The parse tree for a non-terminal is a table of
|
|
63
|
+
-- the form</p>
|
|
64
|
+
-- <blockquote>
|
|
65
|
+
-- <p><code>{ty = "non_terminal_name", tree<sub>1</sub>,
|
|
66
|
+
-- tree<sub>2</sub>, ...}</code></p>
|
|
67
|
+
-- </blockquote>
|
|
68
|
+
-- <p>where the <code>tree<sub>i</sub></code> are the parse trees for the
|
|
69
|
+
-- corresponding terminals and non-terminals.</p>
|
|
70
|
+
-- <p>An action is of the form</p>
|
|
71
|
+
-- <blockquote>
|
|
72
|
+
-- <p><code>action = function (tree, token, pos) ... return tree_
|
|
73
|
+
-- end</code></p>
|
|
74
|
+
-- </blockquote>
|
|
75
|
+
-- <p>It is passed the parse tree for the current node, the token list,
|
|
76
|
+
-- and the current position in the token list, and returns a new parse
|
|
77
|
+
-- tree.</p>
|
|
78
|
+
-- <p>An abstract syntax rule is of the form</p>
|
|
79
|
+
-- <blockquote>
|
|
80
|
+
-- <p><code>name = {i<sub>1</sub>, i<sub>2</sub>, ...}</code></p>
|
|
81
|
+
-- </blockquote>
|
|
82
|
+
-- <p>where <code>i<sub>1</sub></code>, <code>i<sub>2</sub></code>,
|
|
83
|
+
-- ... are numbers. This results in a parse tree of the form</p>
|
|
84
|
+
-- <blockquote>
|
|
85
|
+
-- <p><code>{ty = "name"; tree<sub>i<sub>1</sub></sub>,
|
|
86
|
+
-- tree<sub>i<sub>2</sub></sub>, ...}</code></p>
|
|
87
|
+
-- </blockquote>
|
|
88
|
+
-- <p>If a production has no abstract syntax rule, the result is the
|
|
89
|
+
-- parse node for the current node.</p>
|
|
90
|
+
-- <p>FIXME: Give lexemes as an extra argument to <code>Parser</code>?
|
|
91
|
+
-- <br>FIXME: Rename second argument to parse method to "tokens"?
|
|
92
|
+
-- <br>FIXME: Make start_token an optional argument to parse? (swap with
|
|
93
|
+
-- token list) and have it default to the first non-terminal?</p>
|
|
94
|
+
module ("parser", package.seeall)
|
|
95
|
+
|
|
96
|
+
require "object"
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
Parser = Object {_init = {"grammar"}}
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
--- Parser constructor
|
|
103
|
+
-- @param grammar parser grammar
|
|
104
|
+
-- @return parser
|
|
105
|
+
function Parser:_init (grammar)
|
|
106
|
+
local init = table.clone_rename (self._init, grammar)
|
|
107
|
+
-- Reformat the abstract syntax rules
|
|
108
|
+
for rname, rule in pairs (init.grammar) do
|
|
109
|
+
if name ~= "lexemes" then
|
|
110
|
+
for pnum, prod in ipairs (rule) do
|
|
111
|
+
local abstract
|
|
112
|
+
for i, v in pairs (prod) do
|
|
113
|
+
if type (i) == "string" and i ~= "action" then
|
|
114
|
+
if abstract then
|
|
115
|
+
print (prod)
|
|
116
|
+
die ("more than one abstract rule for " .. rname .. "."
|
|
117
|
+
.. tostring (pnum))
|
|
118
|
+
else
|
|
119
|
+
if type (v) ~= "table" then
|
|
120
|
+
die ("bad abstract syntax rule of type " .. type (v))
|
|
121
|
+
end
|
|
122
|
+
abstract = {ty = i, template = v}
|
|
123
|
+
prod[i] = nil
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
if abstract then
|
|
128
|
+
prod.abstract = abstract
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
return table.merge (self, init)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
--- Parse a token list.
|
|
137
|
+
-- @param start the token at which to start
|
|
138
|
+
-- @param token the list of tokens
|
|
139
|
+
-- @param from the index of the token to start from (default: 1)
|
|
140
|
+
-- @return parse tree
|
|
141
|
+
function Parser:parse (start, token, from)
|
|
142
|
+
|
|
143
|
+
local grammar = self.grammar -- for consistency and brevity
|
|
144
|
+
local rule, symbol -- functions called before they are defined
|
|
145
|
+
|
|
146
|
+
-- Try to parse an optional symbol.
|
|
147
|
+
-- @param sym the symbol being tried
|
|
148
|
+
-- @param from the index of the token to start from
|
|
149
|
+
-- @return the resulting parse tree, or false if empty
|
|
150
|
+
-- @return the index of the first unused token, or false to
|
|
151
|
+
-- indicate failure
|
|
152
|
+
local function optional (sym, from)
|
|
153
|
+
local tree, to = symbol (sym, from)
|
|
154
|
+
if to then
|
|
155
|
+
return tree, to
|
|
156
|
+
else
|
|
157
|
+
return false, from
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
-- Try to parse a list of symbols.
|
|
162
|
+
-- @param sym the symbol being tried
|
|
163
|
+
-- @param sep the list separator
|
|
164
|
+
-- @param from the index of the token to start from
|
|
165
|
+
-- @return the resulting parse tree, or false if empty
|
|
166
|
+
-- @return the index of the first unused token, or false to
|
|
167
|
+
-- indicate failure
|
|
168
|
+
local function list (sym, sep, from)
|
|
169
|
+
local tree, to
|
|
170
|
+
tree, from = symbol (sym, from)
|
|
171
|
+
local list = {tree}
|
|
172
|
+
if from == false then
|
|
173
|
+
return list, false
|
|
174
|
+
end
|
|
175
|
+
to = from
|
|
176
|
+
repeat
|
|
177
|
+
if sep ~= "" then
|
|
178
|
+
tree, from = symbol (sep, from)
|
|
179
|
+
end
|
|
180
|
+
if from then
|
|
181
|
+
tree, from = symbol (sym, from)
|
|
182
|
+
if from then
|
|
183
|
+
table.insert (list, tree)
|
|
184
|
+
to = from
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
until from == false
|
|
188
|
+
return list, to
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
-- Try to parse a given symbol.
|
|
192
|
+
-- @param sym the symbol being tried
|
|
193
|
+
-- @param from the index of the token to start from
|
|
194
|
+
-- @return tree the resulting parse tree, or false if empty
|
|
195
|
+
-- @return the index of the first unused token, or false to
|
|
196
|
+
-- indicate failure
|
|
197
|
+
symbol = function (sym, from) -- declared at the top
|
|
198
|
+
if string.sub (sym, -4, -1) == "_opt" then -- optional symbol
|
|
199
|
+
return optional (string.sub (sym, 1, -5), from)
|
|
200
|
+
elseif string.find (sym, "_list.-$") then -- list
|
|
201
|
+
local _, _, subsym, sep = string.find (sym, "^(.*)_list_?(.-)$")
|
|
202
|
+
return list (subsym, sep, from)
|
|
203
|
+
elseif grammar[sym] then -- non-terminal
|
|
204
|
+
return rule (sym, from)
|
|
205
|
+
elseif token[from] and -- not end of token list
|
|
206
|
+
((grammar.lexemes[sym] and sym == token[from].ty) or
|
|
207
|
+
-- lexeme
|
|
208
|
+
sym == token[from].tok) -- literal terminal
|
|
209
|
+
then
|
|
210
|
+
return token[from].tok, from + 1 -- advance to next token
|
|
211
|
+
else
|
|
212
|
+
return false, false
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
-- Try a production.
|
|
217
|
+
-- @param name the name of the current rule
|
|
218
|
+
-- @param prod the production (list of symbols) being tried
|
|
219
|
+
-- @param from the index of the token to start from
|
|
220
|
+
-- @return the parse tree (incomplete if to is false)
|
|
221
|
+
-- @return the index of the first unused token, or false to
|
|
222
|
+
-- indicate failure
|
|
223
|
+
local function production (name, prod, from)
|
|
224
|
+
local tree = {ty = name}
|
|
225
|
+
local to = from
|
|
226
|
+
for prod in list.elems (prod) do
|
|
227
|
+
local sym
|
|
228
|
+
sym, to = symbol (prod, to)
|
|
229
|
+
if to then
|
|
230
|
+
table.insert (tree, sym)
|
|
231
|
+
else
|
|
232
|
+
return tree, false
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
if prod.action then
|
|
236
|
+
tree = prod.action (tree, token, to)
|
|
237
|
+
end
|
|
238
|
+
if prod.abstract then
|
|
239
|
+
local ntree = {}
|
|
240
|
+
ntree.ty = prod.abstract.ty
|
|
241
|
+
for i, n in prod.abstract.template do
|
|
242
|
+
ntree[i] = tree[n]
|
|
243
|
+
end
|
|
244
|
+
tree = ntree
|
|
245
|
+
end
|
|
246
|
+
return tree, to
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
-- Parse according to a particular rule.
|
|
250
|
+
-- @param name the name of the rule to try
|
|
251
|
+
-- @param from the index of the token to start from
|
|
252
|
+
-- @return parse tree
|
|
253
|
+
-- @return the index of the first unused token, or false to
|
|
254
|
+
-- indicate failure
|
|
255
|
+
rule = function (name, from) -- declared at the top
|
|
256
|
+
local alt = grammar[name]
|
|
257
|
+
local tree, to
|
|
258
|
+
for alt in list.elems (alt) do
|
|
259
|
+
tree, to = production (name, alt, from)
|
|
260
|
+
if to then
|
|
261
|
+
return tree, to
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
return tree, false
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
return rule (start, 1, from or 1)
|
|
268
|
+
end
|
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
--- Date and Date Format classes.
|
|
2
|
+
-- See @{05-dates.md|the Guide}.
|
|
3
|
+
--
|
|
4
|
+
-- Dependencies: `pl.class`, `pl.stringx`
|
|
5
|
+
-- @module pl.Date
|
|
6
|
+
-- @pragma nostrip
|
|
7
|
+
|
|
8
|
+
local class = require 'pl.class'
|
|
9
|
+
local os_time, os_date = os.time, os.date
|
|
10
|
+
local stringx = require 'pl.stringx'
|
|
11
|
+
local utils = require 'pl.utils'
|
|
12
|
+
local assert_arg,assert_string,raise = utils.assert_arg,utils.assert_string,utils.raise
|
|
13
|
+
|
|
14
|
+
local Date = class()
|
|
15
|
+
Date.Format = class()
|
|
16
|
+
|
|
17
|
+
--- Date constructor.
|
|
18
|
+
-- @param t this can be either
|
|
19
|
+
--
|
|
20
|
+
-- * `nil` or empty - use current date and time
|
|
21
|
+
-- * number - seconds since epoch (as returned by @{os.time})
|
|
22
|
+
-- * `Date` - copy constructor
|
|
23
|
+
-- * table - table containing year, month, etc as for `os.time`. You may leave out year, month or day,
|
|
24
|
+
-- in which case current values will be used.
|
|
25
|
+
-- *three to six numbers: year, month, day, hour, min, sec
|
|
26
|
+
--
|
|
27
|
+
-- @function Date
|
|
28
|
+
function Date:_init(t,...)
|
|
29
|
+
local time
|
|
30
|
+
if select('#',...) > 2 then
|
|
31
|
+
local extra = {...}
|
|
32
|
+
local year = t
|
|
33
|
+
t = {
|
|
34
|
+
year = year,
|
|
35
|
+
month = extra[1],
|
|
36
|
+
day = extra[2],
|
|
37
|
+
hour = extra[3],
|
|
38
|
+
min = extra[4],
|
|
39
|
+
sec = extra[5]
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
if t == nil then
|
|
43
|
+
time = os_time()
|
|
44
|
+
elseif type(t) == 'number' then
|
|
45
|
+
time = t
|
|
46
|
+
local next = ...
|
|
47
|
+
self.interval = next == true or next == 'interval'
|
|
48
|
+
elseif type(t) == 'table' then
|
|
49
|
+
if getmetatable(t) == Date then -- copy ctor
|
|
50
|
+
time = t.time
|
|
51
|
+
else
|
|
52
|
+
if not (t.year and t.month and t.year) then
|
|
53
|
+
local lt = os.date('*t')
|
|
54
|
+
if not t.year and not t.month and not t.day then
|
|
55
|
+
t.year = lt.year
|
|
56
|
+
t.month = lt.month
|
|
57
|
+
t.day = lt.day
|
|
58
|
+
else
|
|
59
|
+
t.year = t.year or lt.year
|
|
60
|
+
t.month = t.month or (t.day and lt.month or 1)
|
|
61
|
+
t.day = t.day or 1
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
time = os_time(t)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
self:set(time)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
local tzone_
|
|
71
|
+
|
|
72
|
+
--- get the time zone offset from UTC.
|
|
73
|
+
-- @return seconds ahead of UTC
|
|
74
|
+
function Date.tzone ()
|
|
75
|
+
if not tzone_ then
|
|
76
|
+
local now = os.time()
|
|
77
|
+
local utc = os.date('!*t',now)
|
|
78
|
+
local lcl = os.date('*t',now)
|
|
79
|
+
local unow = os.time(utc)
|
|
80
|
+
tzone_ = os.difftime(now,unow)
|
|
81
|
+
if lcl.isdst then
|
|
82
|
+
if tzone_ > 0 then
|
|
83
|
+
tzone_ = tzone_ - 3600
|
|
84
|
+
else
|
|
85
|
+
tzone_ = tzone_ + 3600
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
return tzone_
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
--- convert this date to UTC.
|
|
93
|
+
function Date:toUTC ()
|
|
94
|
+
self:add { sec = -Date.tzone() }
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
--- convert this UTC date to local.
|
|
98
|
+
function Date:toLocal ()
|
|
99
|
+
self:add { sec = Date.tzone() }
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
--- set the current time of this Date object.
|
|
103
|
+
-- @param t seconds since epoch
|
|
104
|
+
function Date:set(t)
|
|
105
|
+
self.time = t
|
|
106
|
+
if self.interval then
|
|
107
|
+
self.tab = os_date('!*t',self.time)
|
|
108
|
+
else
|
|
109
|
+
self.tab = os_date('*t',self.time)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
--- set the year.
|
|
114
|
+
-- @param y Four-digit year
|
|
115
|
+
-- @class function
|
|
116
|
+
-- @name Date:year
|
|
117
|
+
|
|
118
|
+
--- set the month.
|
|
119
|
+
-- @param m month
|
|
120
|
+
-- @class function
|
|
121
|
+
-- @name Date:month
|
|
122
|
+
|
|
123
|
+
--- set the day.
|
|
124
|
+
-- @param d day
|
|
125
|
+
-- @class function
|
|
126
|
+
-- @name Date:day
|
|
127
|
+
|
|
128
|
+
--- set the hour.
|
|
129
|
+
-- @param h hour
|
|
130
|
+
-- @class function
|
|
131
|
+
-- @name Date:hour
|
|
132
|
+
|
|
133
|
+
--- set the minutes.
|
|
134
|
+
-- @param min minutes
|
|
135
|
+
-- @class function
|
|
136
|
+
-- @name Date:min
|
|
137
|
+
|
|
138
|
+
--- set the seconds.
|
|
139
|
+
-- @param sec seconds
|
|
140
|
+
-- @class function
|
|
141
|
+
-- @name Date:sec
|
|
142
|
+
|
|
143
|
+
--- set the day of year.
|
|
144
|
+
-- @class function
|
|
145
|
+
-- @param yday day of year
|
|
146
|
+
-- @name Date:yday
|
|
147
|
+
|
|
148
|
+
--- get the year.
|
|
149
|
+
-- @param y Four-digit year
|
|
150
|
+
-- @class function
|
|
151
|
+
-- @name Date:year
|
|
152
|
+
|
|
153
|
+
--- get the month.
|
|
154
|
+
-- @class function
|
|
155
|
+
-- @name Date:month
|
|
156
|
+
|
|
157
|
+
--- get the day.
|
|
158
|
+
-- @class function
|
|
159
|
+
-- @name Date:day
|
|
160
|
+
|
|
161
|
+
--- get the hour.
|
|
162
|
+
-- @class function
|
|
163
|
+
-- @name Date:hour
|
|
164
|
+
|
|
165
|
+
--- get the minutes.
|
|
166
|
+
-- @class function
|
|
167
|
+
-- @name Date:min
|
|
168
|
+
|
|
169
|
+
--- get the seconds.
|
|
170
|
+
-- @class function
|
|
171
|
+
-- @name Date:sec
|
|
172
|
+
|
|
173
|
+
--- get the day of year.
|
|
174
|
+
-- @class function
|
|
175
|
+
-- @name Date:yday
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
for _,c in ipairs{'year','month','day','hour','min','sec','yday'} do
|
|
179
|
+
Date[c] = function(self,val)
|
|
180
|
+
if val then
|
|
181
|
+
assert_arg(1,val,"number")
|
|
182
|
+
self.tab[c] = val
|
|
183
|
+
self:set(os_time(self.tab))
|
|
184
|
+
return self
|
|
185
|
+
else
|
|
186
|
+
return self.tab[c]
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
--- name of day of week.
|
|
192
|
+
-- @param full abbreviated if true, full otherwise.
|
|
193
|
+
-- @return string name
|
|
194
|
+
function Date:weekday_name(full)
|
|
195
|
+
return os_date(full and '%A' or '%a',self.time)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
--- name of month.
|
|
199
|
+
-- @param full abbreviated if true, full otherwise.
|
|
200
|
+
-- @return string name
|
|
201
|
+
function Date:month_name(full)
|
|
202
|
+
return os_date(full and '%B' or '%b',self.time)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
--- is this day on a weekend?.
|
|
206
|
+
function Date:is_weekend()
|
|
207
|
+
return self.tab.wday == 0 or self.tab.wday == 6
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
--- add to a date object.
|
|
211
|
+
-- @param t a table containing one of the following keys and a value:<br>
|
|
212
|
+
-- year,month,day,hour,min,sec
|
|
213
|
+
-- @return this date
|
|
214
|
+
function Date:add(t)
|
|
215
|
+
local key,val = next(t)
|
|
216
|
+
self.tab[key] = self.tab[key] + val
|
|
217
|
+
self:set(os_time(self.tab))
|
|
218
|
+
return self
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
--- last day of the month.
|
|
222
|
+
-- @return int day
|
|
223
|
+
function Date:last_day()
|
|
224
|
+
local d = 28
|
|
225
|
+
local m = self.tab.month
|
|
226
|
+
while self.tab.month == m do
|
|
227
|
+
d = d + 1
|
|
228
|
+
self:add{day=1}
|
|
229
|
+
end
|
|
230
|
+
self:add{day=-1}
|
|
231
|
+
return self
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
--- difference between two Date objects.
|
|
235
|
+
-- Note: currently the result is a regular @{Date} object,
|
|
236
|
+
-- but also has `interval` field set, which means a more
|
|
237
|
+
-- appropriate string rep is used.
|
|
238
|
+
-- @param other Date object
|
|
239
|
+
-- @return a Date object
|
|
240
|
+
function Date:diff(other)
|
|
241
|
+
local dt = self.time - other.time
|
|
242
|
+
if dt < 0 then error("date difference is negative!",2) end
|
|
243
|
+
return Date(dt,true)
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
--- long numerical ISO data format version of this date.
|
|
247
|
+
-- If it's an interval then the format is '2 hours 29 sec' etc.
|
|
248
|
+
function Date:__tostring()
|
|
249
|
+
if not self.interval then
|
|
250
|
+
return os_date('%Y-%m-%d %H:%M:%S',self.time)
|
|
251
|
+
else
|
|
252
|
+
local t, res = self.tab, ''
|
|
253
|
+
local y,m,d = t.year - 1970, t.month - 1, t.day - 1
|
|
254
|
+
if y > 0 then res = res .. y .. ' years ' end
|
|
255
|
+
if m > 0 then res = res .. m .. ' months ' end
|
|
256
|
+
if d > 0 then res = res .. d .. ' days ' end
|
|
257
|
+
if y == 0 and m == 0 then
|
|
258
|
+
local h = t.hour
|
|
259
|
+
if h > 0 then res = res .. h .. ' hours ' end
|
|
260
|
+
if t.min > 0 then res = res .. t.min .. ' min ' end
|
|
261
|
+
if t.sec > 0 then res = res .. t.sec .. ' sec ' end
|
|
262
|
+
end
|
|
263
|
+
return res
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
--- equality between Date objects.
|
|
268
|
+
function Date:__eq(other)
|
|
269
|
+
return self.time == other.time
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
--- equality between Date objects.
|
|
273
|
+
function Date:__lt(other)
|
|
274
|
+
return self.time < other.time
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
------------ Date.Format class: parsing and renderinig dates ------------
|
|
279
|
+
|
|
280
|
+
-- short field names, explicit os.date names, and a mask for allowed field repeats
|
|
281
|
+
local formats = {
|
|
282
|
+
d = {'day',{true,true}},
|
|
283
|
+
y = {'year',{false,true,false,true}},
|
|
284
|
+
m = {'month',{true,true}},
|
|
285
|
+
H = {'hour',{true,true}},
|
|
286
|
+
M = {'min',{true,true}},
|
|
287
|
+
S = {'sec',{true,true}},
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
--
|
|
291
|
+
|
|
292
|
+
--- Date.Format constructor.
|
|
293
|
+
-- @param fmt. A string where the following fields are significant: <ul>
|
|
294
|
+
-- <li>d day (either d or dd)</li>
|
|
295
|
+
-- <li>y year (either yy or yyy)</li>
|
|
296
|
+
-- <li>m month (either m or mm)</li>
|
|
297
|
+
-- <li>H hour (either H or HH)</li>
|
|
298
|
+
-- <li>M minute (either M or MM)</li>
|
|
299
|
+
-- <li>S second (either S or SS)</li>
|
|
300
|
+
-- </ul>
|
|
301
|
+
-- Alternatively, if fmt is nil then this returns a flexible date parser
|
|
302
|
+
-- that tries various date/time schemes in turn:
|
|
303
|
+
-- <ol>
|
|
304
|
+
-- <li> <a href="http://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a>,
|
|
305
|
+
-- like 2010-05-10 12:35:23Z or 2008-10-03T14:30+02<li>
|
|
306
|
+
-- <li> times like 15:30 or 8.05pm (assumed to be today's date)</li>
|
|
307
|
+
-- <li> dates like 28/10/02 (European order!) or 5 Feb 2012 </li>
|
|
308
|
+
-- <li> month name like march or Mar (case-insensitive, first 3 letters);
|
|
309
|
+
-- here the day will be 1 and the year this current year </li>
|
|
310
|
+
-- </ol>
|
|
311
|
+
-- A date in format 3 can be optionally followed by a time in format 2.
|
|
312
|
+
-- Please see test-date.lua in the tests folder for more examples.
|
|
313
|
+
-- @usage df = Date.Format("yyyy-mm-dd HH:MM:SS")
|
|
314
|
+
-- @class function
|
|
315
|
+
-- @name Date.Format
|
|
316
|
+
function Date.Format:_init(fmt)
|
|
317
|
+
if not fmt then return end
|
|
318
|
+
local append = table.insert
|
|
319
|
+
local D,PLUS,OPENP,CLOSEP = '\001','\002','\003','\004'
|
|
320
|
+
local vars,used = {},{}
|
|
321
|
+
local patt,outf = {},{}
|
|
322
|
+
local i = 1
|
|
323
|
+
while i < #fmt do
|
|
324
|
+
local ch = fmt:sub(i,i)
|
|
325
|
+
local df = formats[ch]
|
|
326
|
+
if df then
|
|
327
|
+
if used[ch] then error("field appeared twice: "..ch,2) end
|
|
328
|
+
used[ch] = true
|
|
329
|
+
-- this field may be repeated
|
|
330
|
+
local _,inext = fmt:find(ch..'+',i+1)
|
|
331
|
+
local cnt = not _ and 1 or inext-i+1
|
|
332
|
+
if not df[2][cnt] then error("wrong number of fields: "..ch,2) end
|
|
333
|
+
-- single chars mean 'accept more than one digit'
|
|
334
|
+
local p = cnt==1 and (D..PLUS) or (D):rep(cnt)
|
|
335
|
+
append(patt,OPENP..p..CLOSEP)
|
|
336
|
+
append(vars,ch)
|
|
337
|
+
if ch == 'y' then
|
|
338
|
+
append(outf,cnt==2 and '%y' or '%Y')
|
|
339
|
+
else
|
|
340
|
+
append(outf,'%'..ch)
|
|
341
|
+
end
|
|
342
|
+
i = i + cnt
|
|
343
|
+
else
|
|
344
|
+
append(patt,ch)
|
|
345
|
+
append(outf,ch)
|
|
346
|
+
i = i + 1
|
|
347
|
+
end
|
|
348
|
+
end
|
|
349
|
+
-- escape any magic characters
|
|
350
|
+
fmt = table.concat(patt):gsub('[%-%.%+%[%]%(%)%$%^%%%?%*]','%%%1')
|
|
351
|
+
-- replace markers with their magic equivalents
|
|
352
|
+
fmt = fmt:gsub(D,'%%d'):gsub(PLUS,'+'):gsub(OPENP,'('):gsub(CLOSEP,')')
|
|
353
|
+
self.fmt = fmt
|
|
354
|
+
self.outf = table.concat(outf)
|
|
355
|
+
self.vars = vars
|
|
356
|
+
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
local parse_date
|
|
360
|
+
|
|
361
|
+
--- parse a string into a Date object.
|
|
362
|
+
-- @param str a date string
|
|
363
|
+
-- @return date object
|
|
364
|
+
function Date.Format:parse(str)
|
|
365
|
+
assert_string(1,str)
|
|
366
|
+
if not self.fmt then
|
|
367
|
+
return parse_date(str,self.us)
|
|
368
|
+
end
|
|
369
|
+
local res = {str:match(self.fmt)}
|
|
370
|
+
if #res==0 then return nil, 'cannot parse '..str end
|
|
371
|
+
local tab = {}
|
|
372
|
+
for i,v in ipairs(self.vars) do
|
|
373
|
+
local name = formats[v][1] -- e.g. 'y' becomes 'year'
|
|
374
|
+
tab[name] = tonumber(res[i])
|
|
375
|
+
end
|
|
376
|
+
-- os.date() requires these fields; if not present, we assume
|
|
377
|
+
-- that the time set is for the current day.
|
|
378
|
+
if not (tab.year and tab.month and tab.year) then
|
|
379
|
+
local today = Date()
|
|
380
|
+
tab.year = tab.year or today:year()
|
|
381
|
+
tab.month = tab.month or today:month()
|
|
382
|
+
tab.day = tab.day or today:month()
|
|
383
|
+
end
|
|
384
|
+
local Y = tab.year
|
|
385
|
+
if Y < 100 then -- classic Y2K pivot
|
|
386
|
+
tab.year = Y + (Y < 35 and 2000 or 1999)
|
|
387
|
+
elseif not Y then
|
|
388
|
+
tab.year = 1970
|
|
389
|
+
end
|
|
390
|
+
--dump(tab)
|
|
391
|
+
return Date(tab)
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
--- convert a Date object into a string.
|
|
395
|
+
-- @param d a date object, or a time value as returned by @{os.time}
|
|
396
|
+
-- @return string
|
|
397
|
+
function Date.Format:tostring(d)
|
|
398
|
+
local tm = type(d) == 'number' and d or d.time
|
|
399
|
+
if self.outf then
|
|
400
|
+
return os.date(self.outf,tm)
|
|
401
|
+
else
|
|
402
|
+
return tostring(Date(d))
|
|
403
|
+
end
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
function Date.Format:US_order(yesno)
|
|
407
|
+
self.us = yesno
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
local months = {jan=1,feb=2,mar=3,apr=4,may=5,jun=6,jul=7,aug=8,sep=9,oct=10,nov=11,dec=12}
|
|
411
|
+
|
|
412
|
+
--[[
|
|
413
|
+
Allowed patterns:
|
|
414
|
+
- [day] [monthname] [year] [time]
|
|
415
|
+
- [day]/[month][/year] [time]
|
|
416
|
+
|
|
417
|
+
]]
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
local is_word = stringx.isalpha
|
|
421
|
+
local is_number = stringx.isdigit
|
|
422
|
+
local function tonum(s,l1,l2,kind)
|
|
423
|
+
kind = kind or ''
|
|
424
|
+
local n = tonumber(s)
|
|
425
|
+
if not n then error(("%snot a number: '%s'"):format(kind,s)) end
|
|
426
|
+
if n < l1 or n > l2 then
|
|
427
|
+
error(("%s out of range: %s is not between %d and %d"):format(kind,s,l1,l2))
|
|
428
|
+
end
|
|
429
|
+
return n
|
|
430
|
+
end
|
|
431
|
+
|
|
432
|
+
local function parse_iso_end(p,ns,sec)
|
|
433
|
+
-- may be fractional part of seconds
|
|
434
|
+
local _,nfrac,secfrac = p:find('^%.%d+',ns+1)
|
|
435
|
+
if secfrac then
|
|
436
|
+
sec = sec .. secfrac
|
|
437
|
+
p = p:sub(nfrac+1)
|
|
438
|
+
else
|
|
439
|
+
p = p:sub(ns+1)
|
|
440
|
+
end
|
|
441
|
+
-- ISO 8601 dates may end in Z (for UTC) or [+-][isotime]
|
|
442
|
+
-- (we're working with the date as lower case, hence 'z')
|
|
443
|
+
if p:match 'z$' then return sec, {h=0,m=0} end -- we're UTC!
|
|
444
|
+
p = p:gsub(':','') -- turn 00:30 to 0030
|
|
445
|
+
local _,_,sign,offs = p:find('^([%+%-])(%d+)')
|
|
446
|
+
if not sign then return sec, nil end -- not UTC
|
|
447
|
+
|
|
448
|
+
if #offs == 2 then offs = offs .. '00' end -- 01 to 0100
|
|
449
|
+
local tz = { h = tonumber(offs:sub(1,2)), m = tonumber(offs:sub(3,4)) }
|
|
450
|
+
if sign == '-' then tz.h = -tz.h; tz.m = -tz.m end
|
|
451
|
+
return sec, tz
|
|
452
|
+
end
|
|
453
|
+
|
|
454
|
+
local function parse_date_unsafe (s,US)
|
|
455
|
+
s = s:gsub('T',' ') -- ISO 8601
|
|
456
|
+
local parts = stringx.split(s:lower())
|
|
457
|
+
local i,p = 1,parts[1]
|
|
458
|
+
local function nextp() i = i + 1; p = parts[i] end
|
|
459
|
+
local year,min,hour,sec,apm
|
|
460
|
+
local tz
|
|
461
|
+
local _,nxt,day, month = p:find '^(%d+)/(%d+)'
|
|
462
|
+
if day then
|
|
463
|
+
-- swop for US case
|
|
464
|
+
if US then
|
|
465
|
+
day, month = month, day
|
|
466
|
+
end
|
|
467
|
+
_,_,year = p:find('^/(%d+)',nxt+1)
|
|
468
|
+
nextp()
|
|
469
|
+
else -- ISO
|
|
470
|
+
year,month,day = p:match('^(%d+)%-(%d+)%-(%d+)')
|
|
471
|
+
if year then
|
|
472
|
+
nextp()
|
|
473
|
+
end
|
|
474
|
+
end
|
|
475
|
+
if p and not year and is_number(p) then -- has to be date
|
|
476
|
+
day = p
|
|
477
|
+
nextp()
|
|
478
|
+
end
|
|
479
|
+
if p and is_word(p) then
|
|
480
|
+
p = p:sub(1,3)
|
|
481
|
+
local mon = months[p]
|
|
482
|
+
if mon then
|
|
483
|
+
month = mon
|
|
484
|
+
else error("not a month: " .. p) end
|
|
485
|
+
nextp()
|
|
486
|
+
end
|
|
487
|
+
if p and not year and is_number(p) then
|
|
488
|
+
year = p
|
|
489
|
+
nextp()
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
if p then -- time is hh:mm[:ss], hhmm[ss] or H.M[am|pm]
|
|
493
|
+
_,nxt,hour,min = p:find '^(%d+):(%d+)'
|
|
494
|
+
local ns
|
|
495
|
+
if nxt then -- are there seconds?
|
|
496
|
+
_,ns,sec = p:find ('^:(%d+)',nxt+1)
|
|
497
|
+
--if ns then
|
|
498
|
+
sec,tz = parse_iso_end(p,ns or nxt,sec)
|
|
499
|
+
--end
|
|
500
|
+
else -- might be h.m
|
|
501
|
+
_,ns,hour,min = p:find '^(%d+)%.(%d+)'
|
|
502
|
+
if ns then
|
|
503
|
+
apm = p:match '[ap]m$'
|
|
504
|
+
else -- or hhmm[ss]
|
|
505
|
+
local hourmin
|
|
506
|
+
_,nxt,hourmin = p:find ('^(%d+)')
|
|
507
|
+
if nxt then
|
|
508
|
+
hour = hourmin:sub(1,2)
|
|
509
|
+
min = hourmin:sub(3,4)
|
|
510
|
+
sec = hourmin:sub(5,6)
|
|
511
|
+
if #sec == 0 then sec = nil end
|
|
512
|
+
sec,tz = parse_iso_end(p,nxt,sec)
|
|
513
|
+
end
|
|
514
|
+
end
|
|
515
|
+
end
|
|
516
|
+
end
|
|
517
|
+
local today
|
|
518
|
+
if not (year and month and day) then
|
|
519
|
+
today = Date()
|
|
520
|
+
end
|
|
521
|
+
day = day and tonum(day,1,31,'day') or (month and 1 or today:day())
|
|
522
|
+
month = month and tonum(month,1,12,'month') or today:month()
|
|
523
|
+
year = year and tonumber(year) or today:year()
|
|
524
|
+
if year < 100 then -- two-digit year pivot around year < 2035
|
|
525
|
+
year = year + (year < 35 and 2000 or 1900)
|
|
526
|
+
end
|
|
527
|
+
hour = hour and tonum(hour,0,apm and 12 or 24,'hour') or 12
|
|
528
|
+
if apm == 'pm' then
|
|
529
|
+
hour = hour + 12
|
|
530
|
+
end
|
|
531
|
+
min = min and tonum(min,0,59) or 0
|
|
532
|
+
sec = sec and tonum(sec,0,60) or 0 --60 used to indicate leap second
|
|
533
|
+
local res = Date {year = year, month = month, day = day, hour = hour, min = min, sec = sec}
|
|
534
|
+
if tz then -- ISO 8601 UTC time
|
|
535
|
+
res:add {hour = -tz.h}
|
|
536
|
+
if tz.m ~= 0 then res:add {min = -tz.m} end
|
|
537
|
+
-- we're in UTC, so let's go local...
|
|
538
|
+
res:toLocal()
|
|
539
|
+
end
|
|
540
|
+
return res
|
|
541
|
+
end
|
|
542
|
+
|
|
543
|
+
function parse_date (s)
|
|
544
|
+
local ok, d = pcall(parse_date_unsafe,s)
|
|
545
|
+
if not ok then -- error
|
|
546
|
+
d = d:gsub('.-:%d+: ','')
|
|
547
|
+
return nil, d
|
|
548
|
+
else
|
|
549
|
+
return d
|
|
550
|
+
end
|
|
551
|
+
end
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
return Date
|
|
555
|
+
|