1 Commits

Author SHA1 Message Date
tomas
b848b63be4 Importando 2004-07-27 14:15:24 +00:00
29 changed files with 774 additions and 2666 deletions

View File

@@ -1,78 +0,0 @@
name: ci
on:
pull_request:
push:
branches:
- master
jobs:
TestMatrix:
strategy:
matrix:
lua-version: ["5.4", "5.3", "5.2", "5.1", "luajit"]
os: ["ubuntu-latest"]
libflag: ["-shared --coverage"]
include:
- os: "macos-latest"
lua-version: "5.4"
libflag: "-bundle -undefined dynamic_lookup -all_load --coverage"
- os: "windows-latest"
toolchain: "msvc"
lua-version: "5.4"
- os: "windows-latest"
lua-version: "luajit"
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@master
- name: Setup MSVC
# 'luarocks/gh-actions-lua' step requires msvc to build PUC-Rio Lua
# versions on Windows (LuaJIT will be built using MinGW/gcc).
if: ${{ matrix.toolchain == 'msvc' }}
uses: ilammy/msvc-dev-cmd@v1
- uses: luarocks/gh-actions-lua@master
with:
luaVersion: ${{ matrix.lua-version }}
- uses: luarocks/gh-actions-luarocks@master
- name: Prep luacov
run: |
luarocks install luacov
- name: Prep luacov-coveralls
# TODO Windows coverage
if: ${{ matrix.os != 'windows-latest' }}
run: |
pip install --user cpp-coveralls
# install luacov-coveralls, but avoid installing luafilesystem
luarocks install lua-path
luarocks install dkjson
luarocks install luacov-coveralls --server=https://luarocks.org/dev --deps-mode=none
- name: Unix Build
if: ${{ matrix.os != 'windows-latest' }}
run: |
luarocks make CFLAGS="-O2 -fPIC -ftest-coverage -fprofile-arcs" LIBFLAG="${{ matrix.libflag }}"
- name: Windows Build
# TODO Windows coverage
if: ${{ matrix.os == 'windows-latest' }}
run: |
luarocks make
- name: Test
run: |
lua -lluacov tests/test.lua
- name: Coverage
# TODO Windows coverage
if: ${{ matrix.os != 'windows-latest' }}
run: |
export MY_PYTHON_VER=$(python -c 'import sys; print(".".join(sys.version.split(".")[0:2]))')
export PATH="/Users/runner/Library/Python/$MY_PYTHON_VER/bin:$PATH"
coveralls -b . -i src --dump c.report.json
luacov-coveralls -j c.report.json -v -t ${{ secrets.GITHUB_TOKEN }}

2
.gitignore vendored
View File

@@ -1,2 +0,0 @@
*.so

22
LICENSE
View File

@@ -1,22 +0,0 @@
Copyright © 2003-2010 Kepler Project.
Copyright © 2010-2022 The LuaFileSystem authors.
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.

View File

@@ -1,25 +1,35 @@
# $Id: Makefile,v 1.36 2009/09/21 17:02:44 mascarenhas Exp $
# $Id: Makefile,v 1.1.1.1 2004/07/27 14:15:24 tomas Exp $
T= lfs
T= luafilesystem
CONFIG= ./config
include ./config
include $(CONFIG)
V= 1.0a
LIBNAME= lib$T.$V$(LIB_EXT)
L= $T.lua
TL= t_$T.lua
SRCS= src/$T.c
OBJS= src/$T.o
SRCS= $T.c
OBJS= $T.o
lib: src/lfs.so
src/lfs.so: $(OBJS)
MACOSX_DEPLOYMENT_TARGET=$(MACOSX_DEPLOYMENT_TARGET); export MACOSX_DEPLOYMENT_TARGET; $(CC) $(LIB_OPTION) -o src/lfs.so $(OBJS)
lib: $(LIBNAME)
test: lib
LUA_CPATH=./src/?.so lua tests/test.lua
$(LIBNAME): $(OBJS) $(TL)
$(CC) $(CFLAGS) $(LIB_OPTION) -o $(LIBNAME) $(OBJS) $(LIBS)
sed -e "s|LIB_NAME|$(LIB_DIR)/$(LIBNAME)|" $(TL) > $L
install:
mkdir -p $(DESTDIR)$(LUA_LIBDIR)
cp src/lfs.so $(DESTDIR)$(LUA_LIBDIR)
$(LUA_DIR)/$L: $L
mkdir -p $(LUA_DIR)
cp $L $(LUA_DIR)
install: $(LUA_DIR)/$L $(LIBNAME)
mkdir -p $(LIB_DIR)
cp $(LIBNAME) $(LIB_DIR)
clean:
rm -f src/lfs.so $(OBJS)
rm -f $L $(LIBNAME) $(OBJS)
dist:
mkdir -p $(DIST_DIR)
cp config $(SRCS) $T.h $(TL) Makefile $(DIST_DIR)

View File

@@ -1,25 +0,0 @@
# $Id: Makefile.win,v 1.11 2008/05/07 19:06:37 carregal Exp $
T= lfs
include config.win
SRCS= src\$T.c
OBJS= src\$T.obj
lib: src\lfs.dll
.c.obj:
$(CC) /c /Fo$@ $(CFLAGS) $<
src\lfs.dll: $(OBJS)
link /dll /def:src\$T.def /out:src\lfs.dll $(OBJS) "$(LUA_LIB)"
IF EXIST src\lfs.dll.manifest mt -manifest src\lfs.dll.manifest -outputresource:src\lfs.dll;2
install: src\lfs.dll
IF NOT EXIST "$(LUA_LIBDIR)" mkdir "$(LUA_LIBDIR)"
copy src\lfs.dll "$(LUA_LIBDIR)"
clean:
del src\lfs.dll $(OBJS) src\$T.lib src\$T.exp
IF EXIST src\lfs.dll.manifest del src\lfs.dll.manifest

View File

@@ -1,26 +0,0 @@
[![License](http://img.shields.io/badge/Licence-MIT-brightgreen.svg)](LICENSE)
[![Build Status](https://github.com/lunarmodules/luafilesystem/actions/workflows/ci.yml/badge.svg)](https://github.com/lunarmodules/luafilesystem/actions)
[![Build status](https://ci.appveyor.com/api/projects/status/y04s4ms7u16trw8e?svg=true)](https://ci.appveyor.com/project/ignacio/luafilesystem)
[![Coverage Status](https://coveralls.io/repos/lunarmodules/luafilesystem/badge.png)](https://coveralls.io/r/lunarmodules/luafilesystem)
# LuaFileSystem - File System Library for Lua
https://lunarmodules.github.io/luafilesystem
# Description
LuaFileSystem is a Lua library developed to complement the set of functions
related to file systems offered by the standard Lua distribution.
LuaFileSystem offers a portable way to access the underlying directory structure and file attributes.
LuaFileSystem is free software and uses the same license as Lua 5.x (MIT).
# LuaRocks Installation
```
luarocks install luafilesystem
```
# Documentation
Please check the at `docs/` for more information, also available at the [project website](https://lunarmodules.github.io/luafilesystem).

View File

@@ -1,53 +0,0 @@
version: 0.0.1.{build}-test
shallow_clone: true
matrix:
fast_finish: true
environment:
matrix:
- LUAT: "lua"
LUAV: "5.1"
- LUAT: "lua"
LUAV: "5.2"
HEREROCKS_FLAGS: "--compat none"
- LUAT: "lua"
LUAV: "5.3"
HEREROCKS_FLAGS: "--compat none"
- LUAT: "lua"
LUAV: "5.4"
HEREROCKS_FLAGS: "--compat none"
- LUAT: "luajit"
LUAV: "2.1"
# Abuse this section so we can have a matrix with different Compiler versions
configuration:
- mingw
- vs_32
- vs_64
before_build:
- set PATH=C:\MinGW\bin;%PATH%
- set PATH=C:\Python37;C:\Python37\Scripts;%PATH% # Add directory containing 'pip' to PATH
- IF NOT EXIST lua_install-%LUAV%\bin\activate.bat ( pip install --upgrade certifi )
- FOR /F "tokens=* USEBACKQ" %%F IN (`python -c "import certifi;print(certifi.where())"`) DO ( SET SSL_CERT_FILE=%%F )
- IF NOT EXIST lua_install-%LUAV%\bin\activate.bat ( pip install hererocks )
- IF NOT EXIST lua_install-%LUAV%\bin\activate.bat ( hererocks lua_install-%LUAV% --%LUAT% %LUAV% %HEREROCKS_FLAGS% --luarocks latest --target=%configuration% )
- call lua_install-%LUAV%\bin\activate
build_script:
- luarocks make
before_test:
test_script:
- echo "Testing..."
- lua tests/test.lua
cache:
- lua_install-5.4
- lua_install-5.3
- lua_install-5.2
- lua_install-5.1
- lua_install-2.1

33
config
View File

@@ -1,28 +1,21 @@
# Installation directories
# Default installation prefix
PREFIX=/usr/local
LUA_VERSION = 5.1
# System's libraries directory (where binary libraries are installed)
LUA_LIBDIR= $(PREFIX)/lib/lua/$(LUA_VERSION)
# Lua includes directory
LUA_INC += -I$(PREFIX)/include
LUA_INC += -I/usr/include/lua$(LUA_VERSION) -I/usr/include/lua/$(LUA_VERSION)
# System's libraries directory (where Lua libraries are installed)
LIB_DIR= /usr/local/lib
LUA_DIR= /usr/local/lua
# OS dependent
LIB_OPTION= -shared #for Linux
#LIB_OPTION= -bundle -undefined dynamic_lookup #for MacOS X
# Minimum runtime OS version on macOS
MACOSX_DEPLOYMENT_TARGET= 10.5
LIB_EXT= .dylib
#LIB_EXT= .so
LIB_OPTION= -dynamiclib #for MacOS X
#LIB_OPTION= -shared #for Linux
# Compilation directives
WARN= -O2 -Wall -fPIC -W -Waggregate-return -Wcast-align -Wmissing-prototypes -Wnested-externs -Wshadow -Wwrite-strings -pedantic
INCS= $(LUA_INC)
# pre-compile and include mod2.lua into mod_lua.c
# On FreeBSD systems, the following line should be commented
DLLIB= -ldl
WARN= -O2 -Wall -fPIC -W -Waggregate-return -Wcast-align -Wmissing-prototypes -Wnested-externs -Wshadow -Wwrite-strings
INCS= -I/usr/local/include/lua5
LIBS= -L$(LIB_DIR) -llua -llualib -lm $(DLLIB)
CFLAGS= $(WARN) $(INCS)
CC= gcc
# $Id: config,v 1.21 2007/10/27 22:42:32 carregal Exp $

View File

@@ -1,19 +0,0 @@
LUA_VERSION= 5.1
# Installation directories
# System's libraries directory (where binary libraries are installed)
LUA_LIBDIR= "c:\lua$(LUA_VERSION)"
# Lua includes directory
LUA_INC= "c:\lua$(LUA_VERSION)\include"
# Lua library
LUA_LIB= "c:\lua$(LUA_VERSION)\lua$(LUA_VERSION).lib"
# Compilation directives
WARN= /O2
INCS= /I$(LUA_INC)
CFLAGS= /MD $(WARN) $(INCS)
CC= cl
# $Id: config.win,v 1.7 2008/03/25 17:39:29 mascarenhas Exp $

114
doc/us/index.html Normal file
View File

@@ -0,0 +1,114 @@
<html>
<head>
<title>LuaFileSystem</title>
<style type="text/css">
ul { list-style-type: disc };
</style>
</head>
<body bgcolor="#FFFFFF">
<center>
<table border=0 cellspacing=2 cellpadding=2>
<tr><td align=center><a href="http://www.keplerproject.org">
<img border=0 alt="LuaFileSystem" src="luafilesystem.png"></a>
<tr><td align=center><big><b>LuaFileSystem</b></big>
<tr><td align=center valign=top>File system library for the
<a href="http://www.lua.org">Lua</a>
programming language
</table>
</center>
<p>
<center><small>
<a href="#over">overview</a> &middot;
<a href="#download">download</a> &middot;
<a href="manual.html">manual</a> &middot;
<a href="#credits">credits</a> &middot;
<a href="#contact">contact us</a>
</small></center>
<p>
<hr>
<h2>Contents</h2>
<p>
<ul>
<li> <a href="#over">Overview</a>
<li> <a href="#version">Current Version</a>
<li> <a href="#download">Download</a>
<li> <a href="#manual">Manual</a>
<li> <a href="#credits">Credits</a>
<li> <a href="#contact">Contact us</a>
</ul>
<a name="over"></a>
<h2>Overview</h2>
<p>
LuaFileSystem is a library developed to complement the set of functions
related to file systems offered by the standard Lua distribution.
One of its goals is to be as portable as Lua.
<p>
LuaFileSystem is free software and uses the same
<a href="license.html">license</a>
as Lua 5.0.
<a name="version"></a>
<h2>Current version</h2>
<p>
Current version is 1.0 alpha.
It was developed for Lua 5.0.
</p>
<a name="download"></a>
<h2>Download</h2>
<p>
LuaFileSystem can be downloaded in source code from the following links:
<p>
<ul>
<li><a href="luafilesystem-1.0a.tar.gz">luafilesystem-1.0a.tar.gz</a>.
<li><a href="luafilesystem-1.0a.zip">luafilesystem-1.0a.zip</a>.
</ul>
<a name="new"></a>
<h2>What's new</h2>
<p>
<ul>
<li>[2/Aug/2004] Version 1.0 alpha released
</ul>
<a name="credits"></a>
<h2>Credits</h2>
<p>
LuaFileSystem was designed by Roberto Ierusalimschy,
Andr&eacute; Carregal and Tom&aacute;s Guisasola as part of
<a href="http://www.keplerproject.org">The Kepler Project</a>
which holds its copyright.
</p>
<a name="contact"></a>
<h2>Contact us</h2>
<p>
For more information please
<a href="mailto:tomas-NO-SPAM-THANKS@keplerproject.org">contact us</a>.
Comments are welcome!
</p>
<p>
<hr>
<small>
$Id: index.html,v 1.1.1.1 2004/07/27 14:15:24 tomas Exp $
</small>
</body>
</html>

78
doc/us/license.html Normal file
View File

@@ -0,0 +1,78 @@
<! See Copyright Notice at the end of this file>
<HTML>
<HEAD>
<TITLE>LuaFileSystem: license</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<HR>
<H1>
License
</H1>
LuaFileSystem
is free software:
it can be used for both academic and commercial purposes at absolutely no cost.
There are no royalties or GNU-like "copyleft" restrictions.
LuaFileSystem qualifies as
<A HREF="http://www.opensource.org/docs/definition.html">Open Source</A>
software.
Its licenses are compatible with
<A HREF="http://www.gnu.org/licenses/gpl.html">GPL</A>.
LuaFileSystem is not in the public domain and
<a href="http://www.keplerproject.org">The Kepler Project</a>
keep its copyright.
The legal details are below.
<P>
The spirit of the license is that
you are free to use LuaFileSystem for any purpose at no cost without having to ask us.
The only requirement is that
if you do use LuaFileSystem,
then you should give us credit by including the appropriate copyright notice
somewhere in your product or its documentation.
<P>
The LuaFileSystem library is designed and implemented
by
Roberto Ierusalimschy,
Andr&eacute; Carregal and
Tom&aacute;s Guisasola.
The implementation is not derived from licensed software.
<P>
<!-- ===================================================================== -->
<HR>
Copyright &copy; 2004 The Kepler Project.
<P>
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:
<P>
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
<P>
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.
<P>
<!-- ===================================================================== -->
<HR>
<SMALL>
$Id: license.html,v 1.1.1.1 2004/07/27 14:15:24 tomas Exp $
</SMALL>
</BODY>
</HTML>

144
doc/us/manual.html Normal file
View File

@@ -0,0 +1,144 @@
<! See Copyright Notice in license.html>
<html>
<head>
<title>LuaFileSystem</title>
<style type="text/css">
ul { list-style-type: disc };
</style>
</head>
<body bgcolor="#FFFFFF">
<hr>
<center>
<table border=0 cellspacing=2 cellpadding=2>
<tr><td align=center><a href="http://www.keplerproject.org/luafilesystem">
<img border=0 alt="LuaFileSystem logo" src="luafilesystem.png"></a>
<tr><td align=center><big><b>LuaFileSystem Reference Manual</b></big>
<tr><td align=center valign=top>File system library for the
<a href="http://www.lua.org">Lua</a>
programming language
</table>
</center>
<p>
<center><small>
<a href="index.html">home</a> &middot;
<a href="#introduction">introduction</a> &middot;
<a href="#reference">reference</a> &middot;
<a href="#example">example</a>
</small></center>
<p>
<hr>
<a name="introduction"></a>
<h2>Introduction</h2>
<p>
LuaFileSystem is a <a href="http://www.lua.org">Lua</a> library
developed to complement the set of functions related to file systems offered
by the standard Lua distribution.
<p>
LuaFileSystem is free software and uses the same
<a href="license.html">license</a>
as Lua 5.0.
</p>
<a name="reference"></a>
<h2>Reference</h2>
<p>
LuaFileSystem offers the following functions:
<ul>
<a name="chdir"></a>
<li> <b><tt>luafilesystem.chdir (path)</tt></b> <br>
Changes the current
working directory to the given <tt>path</tt>.
<a name="getcwd"></a>
<li> <b><tt>luafilesystem.currentdir ()</tt></b> <br>
Returns the current
working directory or <code>nil</code> plus an error string.
<a name="dir"></a>
<li> <b><tt>luafilesystem.dir (path)</tt></b> <br>
Lua iterator over the entries
of a given directory.
<a name="lock"></a>
<li> <b><tt>luafilesystem.lock (filehandle, mode[, start[, length]])</tt></b> <br>
Locks a file or a part of it.
This function works on <em>open files</em>;
the file handle should be specified as the first argument.
The string <code>mode</code> could be either <code>r</code> (for a
read/shared lock) or <code>w</code> (for a write/exclusive lock).
The optional arguments <code>start</code> and <code>length</code> can be
used to specify a starting point and its length;
both should be numbers.
This function returns a boolean indicating if the operation was successful;
in case of error, it returns <code>false</code> plus a string describing the
error.
<a name="mkdir"></a>
<li> <b><tt>luafilesystem.mkdir (dirname)</tt></b> <br>
Creates a new directory.
The argument is the name of the new directory.
<a name="unlock"></a>
<li> <b><tt>luafilesystem.unlock (filehandle[, start[, length]])</tt></b> <br>
Unlocks a file or a part of it.
This function works on <em>open files</em>;
the file handle should be specified as the first argument.
The optional arguments <code>start</code> and <code>length</code> can be
used to specify a starting point and its length;
both should be numbers.
This function returns a boolean indicating if the operation was successful;
in case of error, it returns <code>false</code> plus a string describing the
error.
</ul>
<a name="example"></a>
<h2>Example</h2>
<a name="contents"></a>
<h2>Contents</h2>
<p>
<ul>
<li> <a href="#introduction">Introduction</a>
<li> <a href="#reference">Reference</a>
<ul>
<li> <a href="#chdir">chdir</a>
<li> <a href="#currentdir">currentdir</a>
<li> <a href="#dir">dir</a>
<li> <a href="#lock">lock</a>
<li> <a href="#mkdir">mkdir</a>
<li> <a href="#unlock">unlock</a>
</ul>
<li> <a href="#examples">Examples</a>
</ul>
</p>
<p>
<center><small>
<a href="index.html">home</a> &middot;
<a href="#introduction">introduction</a> &middot;
<a href="#reference">reference</a> &middot;
<a href="#example">example</a>
</small></center>
<p>
<hr>
<small>
$Id: manual.html,v 1.1.1.1 2004/07/27 14:15:24 tomas Exp $
</small>
</body>
</html>

View File

@@ -1,209 +0,0 @@
body {
color: #47555c;
font-size: 16px;
font-family: "Open Sans", sans-serif;
margin: 0;
padding: 0;
background: #eff4ff;
}
a:link { color: #008fee; }
a:visited { color: #008fee; }
a:hover { color: #22a7ff; }
h1 { font-size:26px; }
h2 { font-size:24px; }
h3 { font-size:18px; }
h4 { font-size:16px; }
hr {
height: 1px;
background: #c1cce4;
border: 0px;
margin: 20px 0;
}
code {
font-family: "Open Sans Mono", "Andale Mono", monospace;
}
tt {
font-family: "Open Sans Mono", "Andale Mono", monospace;
}
body, td, th {
}
textarea, pre, tt {
font-family: "Open Sans Mono", "Andale Mono", monospace;
}
img {
border-width: 0px;
}
.example {
background-color: #323744;
color: white;
font-size: 16px;
padding: 16px 24px;
border-radius: 2px;
}
div.header, div.footer {
}
#container {
}
#product {
background-color: white;
padding: 10px;
height: 130px;
border-bottom: solid #d3dbec 1px;
}
#product big {
font-size: 42px;
}
#product strong {
font-weight: normal;
}
#product_logo {
float: right;
}
#product_name {
padding-top: 15px;
padding-left: 30px;
font-size: 42px;
font-weight: normal;
}
#product_description {
padding-left: 30px;
color: #757779;
}
#main {
background: #eff4ff;
margin: 0;
}
#navigation {
width: 100%;
background-color: rgb(44,62,103);
padding: 10px;
margin: 0;
}
#navigation h1 {
display: none;
}
#navigation a:hover {
text-decoration: underline;
}
#navigation ul li a {
color: rgb(136, 208, 255);
font-weight: bold;
text-decoration: none;
}
#navigation ul li li a {
color: rgb(136, 208, 255);
font-weight: normal;
text-decoration: none;
}
#navigation ul {
display: inline;
color: white;
padding: 0px;
padding-top: 10px;
padding-bottom: 10px;
}
#navigation li {
display: inline;
list-style-type: none;
padding-left: 5px;
padding-right: 5px;
}
#navigation li {
padding: 10px;
padding: 10px;
}
#navigation li li {
}
#navigation li:hover a {
color: rgb(166, 238, 255);
}
#content {
padding: 20px;
width: 800px;
margin-left: auto;
margin-right: auto;
}
#about {
display: none;
}
dl.reference {
background-color: white;
padding: 20px;
border: solid #d3dbec 1px;
}
dl.reference dt {
padding: 5px;
padding-top: 25px;
color: #637bbc;
}
dl.reference dl dt {
padding-top: 5px;
color: #637383;
}
dl.reference dd {
}
@media print {
body {
font: 10pt "Times New Roman", "TimeNR", Times, serif;
}
a {
font-weight:bold; color: #004080; text-decoration: underline;
}
#main {
background-color: #ffffff; border-left: 0px;
}
#container {
margin-left: 2%; margin-right: 2%; background-color: #ffffff;
}
#content {
margin-left: 0px; padding: 1em; border-left: 0px; border-right: 0px; background-color: #ffffff;
}
#navigation {
display: none;
}
#product_logo {
display: none;
}
#about img {
display: none;
}
.example {
font-family: "Andale Mono", monospace;
font-size: 8pt;
page-break-inside: avoid;
}
}

View File

@@ -1,101 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>LuaFileSystem</title>
<link rel="stylesheet" href="doc.css" type="text/css"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<div id="container">
<div id="product">
<div id="product_logo">
<a href="http://lunarmodules.github.io/luafilesystem">
<img alt="LuaFileSystem" src="luafilesystem.png"/>
</a>
</div>
<div id="product_name"><big><strong>LuaFileSystem</strong></big></div>
<div id="product_description">File System Library for the Lua Programming Language</div>
</div> <!-- id="product" -->
<div id="main">
<div id="navigation">
<h1>LuaFileSystem</h1>
<ul>
<li><a href="index.html">Home</a>
<ul>
<li><a href="index.html#overview">Overview</a></li>
<li><a href="index.html#status">Status</a></li>
<li><a href="index.html#download">Download</a></li>
<li><a href="index.html#history">History</a></li>
<li><a href="index.html#credits">Credits</a></li>
</ul>
</li>
<li><a href="manual.html">Manual</a>
<ul>
<li><a href="manual.html#introduction">Introduction</a></li>
<li><a href="manual.html#building">Building</a></li>
<li><a href="manual.html#installation">Installation</a></li>
<li><a href="manual.html#reference">Reference</a></li>
</ul>
</li>
<li><strong>Examples</strong></li>
<li><a href="https://github.com/lunarmodules/luafilesystem">Project</a>
<ul>
<li><a href="https://github.com/lunarmodules/luafilesystem/issues">Bug Tracker</a></li>
<li><a href="https://github.com/lunarmodules/luafilesystem">Git</a></li>
</ul>
</li>
<li><a href="license.html">License</a></li>
</ul>
</div> <!-- id="navigation" -->
<div id="content">
<h2><a name="example"></a>Examples</h2>
<h3>Directory iterator</h3>
<p>The following example iterates over a directory and recursively lists the
attributes for each file inside it.</p>
<pre class="example">
local lfs = require"lfs"
function attrdir (path)
for file in lfs.dir(path) do
if file ~= "." and file ~= ".." then
local f = path..'/'..file
print ("\t "..f)
local attr = lfs.attributes (f)
assert (type(attr) == "table")
if attr.mode == "directory" then
attrdir (f)
else
for name, value in pairs(attr) do
print (name, value)
end
end
end
end
end
attrdir (".")
</pre>
</div> <!-- id="content" -->
</div> <!-- id="main" -->
<div id="about">
<p><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0!</a></p>
</div> <!-- id="about" -->
</div> <!-- id="container" -->
</body>
</html>

View File

@@ -1,237 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>LuaFileSystem</title>
<link rel="stylesheet" href="doc.css" type="text/css"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<div id="container">
<div id="product">
<div id="product_logo">
<a href="http://lunarmodules.github.io/luafilesystem">
<img alt="LuaFileSystem" src="luafilesystem.png"/>
</a>
</div>
<div id="product_name"><big><strong>LuaFileSystem</strong></big></div>
<div id="product_description">File System Library for the Lua Programming Language</div>
</div> <!-- id="product" -->
<div id="main">
<div id="navigation">
<h1>LuaFileSystem</h1>
<ul>
<li><strong>Home</strong>
<ul>
<li><a href="index.html#overview">Overview</a></li>
<li><a href="index.html#status">Status</a></li>
<li><a href="index.html#download">Download</a></li>
<li><a href="index.html#history">History</a></li>
<li><a href="index.html#credits">Credits</a></li>
</ul>
</li>
<li><a href="manual.html">Manual</a>
<ul>
<li><a href="manual.html#introduction">Introduction</a></li>
<li><a href="manual.html#building">Building</a></li>
<li><a href="manual.html#installation">Installation</a></li>
<li><a href="manual.html#reference">Reference</a></li>
</ul>
</li>
<li><a href="examples.html">Examples</a></li>
<li><a href="https://github.com/lunarmodules/luafilesystem">Project</a>
<ul>
<li><a href="https://github.com/lunarmodules/luafilesystem/issues">Bug Tracker</a></li>
<li><a href="https://github.com/lunarmodules/luafilesystem">Git</a></li>
</ul>
</li>
<li><a href="license.html">License</a></li>
</ul>
</div> <!-- id="navigation" -->
<div id="content">
<h2><a name="overview"></a>Overview</h2>
<p>LuaFileSystem is a <a href="http://www.lua.org">Lua</a> library
developed to complement the set of functions related to file
systems offered by the standard Lua distribution.</p>
<p>LuaFileSystem offers a portable way to access
the underlying directory structure and file attributes.</p>
<p>LuaFileSystem is free software and uses the same
<a href="license.html">license</a> as Lua 5.x (MIT).</p>
<h2><a name="status"></a>Status</h2>
<p>Current version is 1.9.0. It works with Lua 5.1 to Lua 5.5, and it runs on various
flavors of Unix (including Linux, BSDs, macOS) and Windows.</p>
<h2><a name="download"></a>Download</h2>
<p>LuaFileSystem can be installed using <a href="https://luarocks.org">LuaRocks</a>:
<pre class="example">
$ luarocks install luafilesystem
</pre>
<p>Its source can be found at its <a href="http://github.com/lunarmodules/luafilesystem">GitHub</a> page.</p>
<h2><a name="history"></a>History</h2>
<dl class="history">
<dt><strong>Version 1.9.0</strong> [28/Dec/2025]</dt>
<dd><ul>
<li>Lua 5.5 support</li>
<li>Fixed some compiler warnings</li>
<li>Assorted improvements for Windows</li>
</ul></dd>
<dt><strong>Version 1.8.0</strong> [22/Apr/2020]</dt>
<dd><ul>
<li>Lua 5.4 support</li>
<li>lfs.link and lfs.symlinkattributes now work on Windows</li>
<li>MACOSX_DEPLOYMENT_TARGET is configurable in the Makefile</li>
<li>Fallback to _POSIX_PATH_MAX when MAXPATHLEN is not avaliable</li>
<li>Fixed memory leak in case of realloc failure</li>
</ul></dd>
<dt><strong>Version 1.7.0</strong> [15/Sep/2017]</dt>
<dd><ul>
<li>symlinkattributes function now provides 'target' field, containing name of the file that the symlink points to.</li>
<li>attributes, symlinkattributes, touch, mkdir, and rmdir functions now return system-dependent error code as the third value on error.</li>
<li>Fixed detection of closed files for Lua 5.2+ in setmode, lock, and unlock functions.</li>
<li>Fixed various compiler warnings.</li>
</ul></dd>
<dt><strong>Version 1.6.3</strong> [15/Jan/2015]</dt>
<dd><ul>
<li>Lua 5.3 support.</li>
<li>Assorted bugfixes.</li>
</ul></dd>
<dt><strong>Version 1.6.2</strong> [??/Oct/2012]</dt>
<dd><ul>
<li>Full Lua 5.2 compatibility (with Lua 5.1 fallbacks)</li>
</ul></dd>
<dt><strong>Version 1.6.1</strong> [01/Oct/2012]</dt>
<dd><ul>
<li>fix build for Lua 5.2</li>
</ul></dd>
<dt><strong>Version 1.6.0</strong> [26/Sep/2012]</dt>
<dd><ul>
<li>getcwd fix for Android</li>
<li>support for Lua 5.2</li>
<li>add lfs.link</li>
<li>other bug fixes</li>
</ul></dd>
<dt><strong>Version 1.5.0</strong> [20/Oct/2009]</dt>
<dd><ul>
<li>Added explicit next and close methods to second return value of lfs.dir
(the directory object), for explicit iteration or explicit closing.</li>
<li>Added directory locking via lfs.lock_dir function (see the <a href="manual.html">manual</a>).</li>
</ul></dd>
<dt><strong>Version 1.4.2</strong> [03/Feb/2009]</dt>
<dd>
<ul>
<li>fixed bug
<code>lfs.attributes(filename, 'size')</code> overflow on files > 2 Gb again (bug report and patch by KUBO Takehiro).</li>
<li>fixed bug
Compile error on Solaris 10 (bug report and patch by Aaron B).</li>
<li>fixed compilation problems with Borland C.</li>
</ul>
</dd>
<dt><strong>Version 1.4.1</strong> [07/May/2008]</dt>
<dd>
<ul>
<li>documentation review</li>
<li>fixed Windows compilation issues</li>
<li>fixed bug in the Windows tests (patch by Shmuel Zeigerman)</li>
<li>fixed bug
<code>lfs.attributes(filename, 'size')</code> overflow on files > 2 Gb
</li>
</ul>
</dd>
<dt><strong>Version 1.4.0</strong> [13/Feb/2008]</dt>
<dd>
<ul>
<li>added function
<a href="manual.html#setmode"><code>lfs.setmode</code></a>
(works only in Windows systems).</li>
<li><a href="manual.html#attributes"><code>lfs.attributes</code></a>
raises an error if attribute does not exist</li>
</ul>
</dd>
<dt><strong>Version 1.3.0</strong> [26/Oct/2007]</dt>
<dd>
<ul>
<li>added function
<a href="manual.html#symlinkattributes"><code>lfs.symlinkattributes</code></a>
(works only in non Windows systems).</li>
</ul>
</dd>
<dt><strong>Version 1.2.1</strong> [08/May/2007]</dt>
<dd>
<ul>
<li>compatible only with Lua 5.1 (Lua 5.0 support was dropped)</li>
</ul>
</dd>
<dt><strong>Version 1.2</strong> [15/Mar/2006]</dt>
<dd>
<ul>
<li>added optional argument to
<a href="manual.html#attributes"><code>lfs.attributes</code></a></li>
<li>added function
<a href="manual.html#rmdir"><code>lfs.rmdir</code></a></li>
<li>bug correction on <a href="manual.html#dir"><code>lfs.dir</code></a></li>
</ul>
</dd>
<dt><strong>Version 1.1</strong> [30/May/2005]</dt>
<dd>
<ul>
<li>added function <a href="manual.html#touch"><code>lfs.touch</code></a>.</li>
</ul>
</dd>
<dt><strong>Version 1.0</strong> [21/Jan/2005]</dt>
<dd />
<dt><strong>Version 1.0 Beta</strong> [10/Nov/2004]</dt>
<dd />
</dl>
<h2><a name="credits"></a>Credits</h2>
<p>The LuaFileSystem library was originally designed and
implemented by Roberto Ierusalimschy, Andr&eacute; Carregal and
Tom&aacute;s Guisasola. It was then maintained by F&aacute;bio
Mascarenhas for several years and has since been maintained
by many contributors -- see the Git history for detailed credits.</p>
</div> <!-- id="content" -->
</div> <!-- id="main" -->
<div id="about">
<p><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0!</a></p>
</div> <!-- id="about" -->
</div> <!-- id="container" -->
</body>
</html>

View File

@@ -1,108 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>LuaFileSystem</title>
<link rel="stylesheet" href="doc.css" type="text/css"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<div id="container">
<div id="product">
<div id="product_logo">
<a href="http://lunarmodules.github.io/luafilesystem">
<img alt="LuaFileSystem" src="luafilesystem.png"/>
</a>
</div>
<div id="product_name"><big><strong>LuaFileSystem</strong></big></div>
<div id="product_description">File System Library for the Lua Programming Language</div>
</div> <!-- id="product" -->
<div id="main">
<div id="navigation">
<h1>LuaFileSystem</h1>
<ul>
<li><a href="index.html">Home</a>
<ul>
<li><a href="index.html#overview">Overview</a></li>
<li><a href="index.html#status">Status</a></li>
<li><a href="index.html#download">Download</a></li>
<li><a href="index.html#history">History</a></li>
<li><a href="index.html#credits">Credits</a></li>
</ul>
</li>
<li><a href="manual.html">Manual</a>
<ul>
<li><a href="manual.html#introduction">Introduction</a></li>
<li><a href="manual.html#building">Building</a></li>
<li><a href="manual.html#installation">Installation</a></li>
<li><a href="manual.html#reference">Reference</a></li>
</ul>
</li>
<li><a href="examples.html">Examples</a></li>
<li><a href="https://github.com/lunarmodules/luafilesystem">Project</a>
<ul>
<li><a href="https://github.com/lunarmodules/luafilesystem/issues">Bug Tracker</a></li>
<li><a href="https://github.com/lunarmodules/luafilesystem">Git</a></li>
</ul>
</li>
<li><strong>License</strong></li>
</ul>
</div> <!-- id="navigation" -->
<div id="content">
<h1>License</h1>
<p>The spirit of the license is that you are free to use
LuaFileSystem for any purpose at no cost without having to ask us.
The only requirement is that if you do use LuaFileSystem, then you
should give us credit by including the appropriate copyright notice
somewhere in your product or its documentation.</p>
<p>The LuaFileSystem library was originally designed and
implemented by Roberto Ierusalimschy, Andr&eacute; Carregal and
Tom&aacute;s Guisasola, and has since been maintained over the years
by many people -- see the Git history for detailed credits.
The implementation is not derived from any other licensed software.</p>
<hr/>
<p>Copyright &copy; 2003 - 2010 Kepler Project.</p>
<p>Copyright &copy; 2010 - 2022 The LuaFileSystem authors.</p>
<p>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:</p>
<p>The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.</p>
<p>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.</p>
</div> <!-- id="content" -->
</div> <!-- id="main" -->
<div id="about">
<p><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0!</a></p>
</div><!-- id="about" -->
</div><!-- id="container" -->
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

View File

@@ -1,286 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>LuaFileSystem</title>
<link rel="stylesheet" href="doc.css" type="text/css"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<div id="container">
<div id="product">
<div id="product_logo">
<a href="http://lunarmodules.github.io/luafilesystem">
<img alt="LuaFileSystem" src="luafilesystem.png"/>
</a>
</div>
<div id="product_name"><big><strong>LuaFileSystem</strong></big></div>
<div id="product_description">File System Library for the Lua Programming Language</div>
</div> <!-- id="product" -->
<div id="main">
<div id="navigation">
<h1>LuaFileSystem</h1>
<ul>
<li><a href="index.html">Home</a>
<ul>
<li><a href="index.html#overview">Overview</a></li>
<li><a href="index.html#status">Status</a></li>
<li><a href="index.html#download">Download</a></li>
<li><a href="index.html#history">History</a></li>
<li><a href="index.html#credits">Credits</a></li>
</ul>
</li>
<li><strong>Manual</strong>
<ul>
<li><a href="manual.html#introduction">Introduction</a></li>
<li><a href="manual.html#building">Building</a></li>
<li><a href="manual.html#installation">Installation</a></li>
<li><a href="manual.html#reference">Reference</a></li>
</ul>
</li>
<li><a href="examples.html">Examples</a></li>
<li><a href="https://github.com/lunarmodules/luafilesystem">Project</a>
<ul>
<li><a href="https://github.com/lunarmodules/luafilesystem/issues">Bug Tracker</a></li>
<li><a href="https://github.com/lunarmodules/luafilesystem">Git</a></li>
</ul>
</li>
<li><a href="license.html">License</a></li>
</ul>
</div> <!-- id="navigation" -->
<div id="content">
<h2><a name="introduction"></a>Introduction</h2>
<p>LuaFileSystem is a <a href="http://www.lua.org">Lua</a> library
developed to complement the set of functions related to file
systems offered by the standard Lua distribution.</p>
<p>LuaFileSystem offers a portable way to access
the underlying directory structure and file attributes.</p>
<h2><a name="building"></a>Building</h2>
<p>
LuaFileSystem should be built with Lua 5.1 so the language library
and header files for the target version must be installed properly.
</p>
<p>
LuaFileSystem offers a Makefile and a separate configuration file,
<code>config</code>,
which should be edited to suit your installation before running
<code>make</code>.
The file has some definitions like paths to the external libraries,
compiler options and the like.
</p>
<p>On Windows, the C runtime used to compile LuaFileSystem must be the same
runtime that Lua uses, or some LuaFileSystem functions will not work.</p>
<h2><a name="installation"></a>Installation</h2>
<p>The easiest way to install LuaFileSystem is to use LuaRocks:</p>
<pre class="example">
luarocks install luafilesystem
</pre>
<p>If you prefer to install LuaFileSystem manually, the compiled binary should be copied to a directory in your
<a href="http://www.lua.org/manual/5.1/manual.html#pdf-package.cpath">C path</a>.</p>
<h2><a name="reference"></a>Reference</h2>
<p>
LuaFileSystem offers the following functions:
</p>
<dl class="reference">
<dt><a name="attributes"></a><strong><code>lfs.attributes (filepath [, request_name | result_table])</code></strong></dt>
<dd>Returns a table with the file attributes corresponding to
<code>filepath</code> (or <code>nil</code> followed by an error message and a system-dependent error code
in case of error).
If the second optional argument is given and is a string, then only the value of the
named attribute is returned (this use is equivalent to
<code>lfs.attributes(filepath)[request_name]</code>, but the table is not created
and only one attribute is retrieved from the O.S.).
if a table is passed as the second argument, it (<code>result_table</code>) is filled with attributes and returned instead of a new table.
The attributes are described as follows;
attribute <code>mode</code> is a string, all the others are numbers,
and the time related attributes use the same time reference of
<a href="http://www.lua.org/manual/5.1/manual.html#pdf-os.time"><code>os.time</code></a>:
<dl>
<dt><strong><code>dev</code></strong></dt>
<dd>on Unix systems, this represents the device that the inode resides on. On Windows systems,
represents the drive number of the disk containing the file</dd>
<dt><strong><code>ino</code></strong></dt>
<dd>on Unix systems, this represents the inode number. On Windows systems this has no meaning</dd>
<dt><strong><code>mode</code></strong></dt>
<dd>string representing the associated protection mode (the values could be
<code>file</code>, <code>directory</code>, <code>link</code>, <code>socket</code>,
<code>named pipe</code>, <code>char device</code>, <code>block device</code> or
<code>other</code>)</dd>
<dt><strong><code>nlink</code></strong></dt>
<dd>number of hard links to the file</dd>
<dt><strong><code>uid</code></strong></dt>
<dd>user-id of owner (Unix only, always 0 on Windows)</dd>
<dt><strong><code>gid</code></strong></dt>
<dd>group-id of owner (Unix only, always 0 on Windows)</dd>
<dt><strong><code>rdev</code></strong></dt>
<dd>on Unix systems, represents the device type, for special file inodes.
On Windows systems represents the same as <code>dev</code></dd>
<dt><strong><code>access</code></strong></dt>
<dd>time of last access</dd>
<dt><strong><code>modification</code></strong></dt>
<dd>time of last data modification</dd>
<dt><strong><code>change</code></strong></dt>
<dd>time of last file status change</dd>
<dt><strong><code>size</code></strong></dt>
<dd>file size, in bytes</dd>
<dt><strong><code>permissions</code></strong></dt>
<dd>file permissions string</dd>
<dt><strong><code>blocks</code></strong></dt>
<dd>block allocated for file; (Unix only)</dd>
<dt><strong><code>blksize</code></strong></dt>
<dd>optimal file system I/O blocksize; (Unix only)</dd>
</dl>
This function uses <code>stat</code> internally thus if the given
<code>filepath</code> is a symbolic link, it is followed (if it points to
another link the chain is followed recursively) and the information
is about the file it refers to.
To obtain information about the link itself, see function
<a href="#symlinkattributes">lfs.symlinkattributes</a>.
</dd>
<dt><a name="chdir"></a><strong><code>lfs.chdir (path)</code></strong></dt>
<dd>Changes the current working directory to the given
<code>path</code>.<br />
Returns <code>true</code> in case of success or <code>nil</code> plus an
error string.</dd>
<dt><a name="lock_dir"></a><strong><code>lfs.lock_dir(path, [seconds_stale])</code></strong></dt>
<dd>Creates a lockfile (called lockfile.lfs) in <code>path</code> if it does not
exist and returns the lock. If the lock already exists checks if
it's stale, using the second parameter (default for the second
parameter is <code>INT_MAX</code>, which in practice means the lock will never
be stale. To free the the lock call <code>lock:free()</code>. <br/>
In case of any errors it returns nil and the error message. In
particular, if the lock exists and is not stale it returns the
"File exists" message.</dd>
<dt><a name="currentdir"></a><strong><code>lfs.currentdir ()</code></strong></dt>
<dd>Returns a string with the current working directory or <code>nil</code>
plus an error string.</dd>
<dt><a name="dir"></a><strong><code>iter, dir_obj = lfs.dir (path)</code></strong></dt>
<dd>
Lua iterator over the entries of a given directory.
Each time the iterator is called with <code>dir_obj</code> it returns a directory entry's name as a string, or
<code>nil</code> if there are no more entries. You can also iterate by calling <code>dir_obj:next()</code>, and
explicitly close the directory before the iteration finished with <code>dir_obj:close()</code>.
Raises an error if <code>path</code> is not a directory.
</dd>
<dt><a name="lock"></a><strong><code>lfs.lock (filehandle, mode[, start[, length]])</code></strong></dt>
<dd>Locks a file or a part of it. This function works on <em>open files</em>; the
file handle should be specified as the first argument.
The string <code>mode</code> could be either
<code>r</code> (for a read/shared lock) or <code>w</code> (for a
write/exclusive lock). The optional arguments <code>start</code>
and <code>length</code> can be used to specify a starting point and
its length; both should be numbers.<br />
Returns <code>true</code> if the operation was successful; in
case of error, it returns <code>nil</code> plus an error string.
</dd>
<dt><a name="link"></a><strong><code>lfs.link (old, new[, symlink])</code></strong></dt>
<dd>Creates a link. The first argument is the object to link to
and the second is the name of the link. If the optional third
argument is true, the link will by a symbolic link (by default, a
hard link is created).
</dd>
<dt><a name="mkdir"></a><strong><code>lfs.mkdir (dirname)</code></strong></dt>
<dd>Creates a new directory. The argument is the name of the new
directory.<br />
Returns <code>true</code> in case of success or <code>nil</code>, an error message and
a system-dependent error code in case of error.
</dd>
<dt><a name="rmdir"></a><strong><code>lfs.rmdir (dirname)</code></strong></dt>
<dd>Removes an existing directory. The argument is the name of the directory.<br />
Returns <code>true</code> in case of success or <code>nil</code>, an error message and
a system-dependent error code in case of error.
<dt><a name="setmode"></a><strong><code>lfs.setmode (file, mode)</code></strong></dt>
<dd>Sets the writing mode for a file. The mode string can be either <code>"binary"</code> or <code>"text"</code>.
Returns <code>true</code> followed the previous mode string for the file, or
<code>nil</code> followed by an error string in case of errors.
On non-Windows platforms, where the two modes are identical,
setting the mode has no effect, and the mode is always returned as <code>binary</code>.
</dd>
<dt><a name="symlinkattributes"></a><strong><code>lfs.symlinkattributes (filepath [, request_name])</code></strong></dt>
<dd>Identical to <a href="#attributes">lfs.attributes</a> except that
it obtains information about the link itself (not the file it refers to).
It also adds a <strong><code>target</code></strong> field, containing
the file name that the symlink points to.
On Windows this function does not yet support links, and is identical to
<code>lfs.attributes</code>.
</dd>
<dt><a name="touch"></a><strong><code>lfs.touch (filepath [, atime [, mtime]])</code></strong></dt>
<dd>Set access and modification times of a file. This function is
a bind to <code>utime</code> function. The first argument is the
filename, the second argument (<code>atime</code>) is the access time,
and the third argument (<code>mtime</code>) is the modification time.
Both times are provided in seconds (which should be generated with
Lua standard function <code>os.time</code>).
If the modification time is omitted, the access time provided is used;
if both times are omitted, the current time is used.<br />
Returns <code>true</code> in case of success or <code>nil</code>, an error message and
a system-dependent error code in case of error.
</dd>
<dt><a name="unlock"></a><strong><code>lfs.unlock (filehandle[, start[, length]])</code></strong></dt>
<dd>Unlocks a file or a part of it. This function works on
<em>open files</em>; the file handle should be specified as the first
argument. The optional arguments <code>start</code> and
<code>length</code> can be used to specify a starting point and its
length; both should be numbers.<br />
Returns <code>true</code> if the operation was successful;
in case of error, it returns <code>nil</code> plus an error string.
</dd>
</dl>
</div> <!-- id="content" -->
</div> <!-- id="main" -->
<div id="about">
<p><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0!</a></p>
</div> <!-- id="about" -->
</div> <!-- id="container" -->
</body>
</html>

View File

@@ -1,28 +0,0 @@
package = "luafilesystem"
version = "scm-1"
source = {
url = "git+https://github.com/lunarmodules/luafilesystem"
}
description = {
summary = "File System Library for the Lua Programming Language",
detailed = [[
LuaFileSystem is a Lua library developed to complement the set of
functions related to file systems offered by the standard Lua
distribution. LuaFileSystem offers a portable way to access the
underlying directory structure and file attributes.
]],
license = "MIT/X11"
}
dependencies = {
"lua >= 5.1"
}
build = {
type = "builtin",
modules = {
lfs = "src/lfs.c"
},
copy_directories = {
"docs",
"tests"
}
}

351
luafilesystem.c Normal file
View File

@@ -0,0 +1,351 @@
/*
** File system manipulation library.
** This library offers these functions:
** luafilesystem.attributes (filepath [, attributename])
** luafilesystem.chdir (path)
** luafilesystem.currentdir ()
** luafilesystem.dir (path)
** luafilesystem.mkdir (path)
** luafilesystem.lock (fh, mode)
** luafilesystem.unlock (fh)
**
** $Id: luafilesystem.c,v 1.1.1.1 2004/07/27 14:15:24 tomas Exp $
*/
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#ifdef WIN32
#include <direct.h>
#include <io.h>
#include <sys/locking.h>
#else
#include <unistd.h>
#include <dirent.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#endif
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include "luafilesystem.h"
/* Define 'strerror' for systems that do not implement it */
#ifdef NO_STRERROR
#define strerror(_) "System unable to describe the error"
#endif
/* Define 'getcwd' for systems that do not implement it */
#ifdef NO_GETCWD
#define getcwd(p,s) NULL
#define getcwd_error "Function 'getcwd' not provided by system"
#else
#define getcwd_error strerror(errno)
#endif
#define DIR_METATABLE "directory metatable"
#define MAX_DIR_LENGTH 1023
#ifdef _WIN32
typedef struct dir_data {
long hFile;
char pattern[MAX_DIR_LENGTH+1];
} dir_data;
#endif
/*
** This function changes the working (current) directory
*/
static int change_dir (lua_State *L) {
const char *path = luaL_checkstring(L, 1);
if (chdir(path))
luaL_error(L,"Unable to change working directory to '%s'\n%s\n",
path, chdir_error);
return 0;
}
/*
** This function returns the current directory
** If unable to get the current directory, it returns nil
** and a string describing the error
*/
static int get_dir (lua_State *L) {
char path[255+2];
if (getcwd(path, 255) == NULL) {
lua_pushnil(L);
lua_pushstring(L, getcwd_error);
return 2;
}
else {
lua_pushstring(L, path);
return 1;
}
}
/*
** Check if the given element on the stack is a file and returns it.
*/
static FILE *check_file (lua_State *L, int idx, const char *funcname) {
FILE **fh = (FILE **)luaL_checkudata (L, idx, "FILE*");
if (fh == NULL) {
luaL_error (L, "%s: not a file", funcname);
return 0;
} else if (*fh == NULL) {
luaL_error (L, "%s: closed file", funcname);
return 0;
} else
return *fh;
}
/*
**
*/
static int _file_lock (lua_State *L, FILE *fh, const char *mode, const long start, long len, const char *funcname) {
int code;
#ifdef WIN32
/* lkmode valid values are:
_LK_LOCK Locks the specified bytes. If the bytes cannot be locked, the program immediately tries again after 1 second. If, after 10 attempts, the bytes cannot be locked, the constant returns an error.
_LK_NBLCK Locks the specified bytes. If the bytes cannot be locked, the constant returns an error.
_LK_NBRLCK Same as _LK_NBLCK.
_LK_RLCK Same as _LK_LOCK.
_LK_UNLCK Unlocks the specified bytes, which must have been previously locked.
Regions should be locked only briefly and should be unlocked before closing a file or exiting the program.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt__locking.asp
*/
int lkmode;
switch (*mode) {
case 'r': lkmode = _LK_NBLCK; break;
case 'w': lkmode = _LK_NBLCK; break;
case 'u': lkmode = _LK_UNLCK; break;
default : luaL_error (L, "%s: invalid mode", funcname);
}
if (!len) {
fseek (fh, 0L, SEEK_END);
len = ftell (fh);
}
fseek (fh, start, SEEK_SET);
code = _locking (fileno(fh), lkmode, len);
#else
struct flock f;
switch (*mode) {
case 'w': f.l_type = F_WRLCK; break;
case 'r': f.l_type = F_RDLCK; break;
case 'u': f.l_type = F_UNLCK; break;
default : luaL_error (L, "%s: invalid mode", funcname);
}
f.l_whence = SEEK_SET;
f.l_start = (off_t)start;
f.l_len = (off_t)len;
code = fcntl (fileno(fh), F_SETLK, &f);
#endif
return (code != -1);
}
/*
** Locks a file.
** @param #1 File handle.
** @param #2 String with lock mode ('w'rite, 'r'ead).
** @param #3 Number with start position (optional).
** @param #4 Number with length (optional).
*/
static int file_lock (lua_State *L) {
FILE *fh = check_file (L, 1, "lock");
const char *mode = luaL_checkstring (L, 2);
const long start = luaL_optlong (L, 3, 0);
long len = luaL_optlong (L, 4, 0);
if (_file_lock (L, fh, mode, start, len, "lock")) {
lua_pushboolean (L, 1);
return 1;
} else {
lua_pushboolean (L, 0);
lua_pushfstring (L, "%s", strerror(errno));
return 2;
}
}
/*
** Unlocks a file.
** @param #1 File handle.
** @param #2 Number with start position (optional).
** @param #3 Number with length (optional).
*/
static int file_unlock (lua_State *L) {
FILE *fh = check_file (L, 1, "unlock");
const long start = luaL_optlong (L, 2, 0);
long len = luaL_optlong (L, 3, 0);
if (_file_lock (L, fh, "u", start, len, "unlock")) {
lua_pushboolean (L, 1);
return 1;
} else {
lua_pushboolean (L, 0);
lua_pushfstring (L, "%s", strerror(errno));
return 2;
}
}
/*
static void cgilua_sleep( lua_State *L )
{
unsigned int usec = (unsigned int)luaL_check_number( L, 1 );
#ifndef WIN32
sleep( (unsigned int)ceil( usec/1000.0 ));
#else
Sleep( (DWORD)usec );
#endif
}
static void cgilua_filesize( lua_State *L )
{
struct stat info;
char *file = luaL_check_string( L, 1 );
if (stat(file, &info))
{
lua_pushnil( L );
lua_pushstring( L, "Cannot retrieve stat info from file" );
return;
}
lua_pushnumber(L, info.st_size);
}
*/
static int make_dir (lua_State *L) {
const char *path = luaL_checkstring (L, 1);
int fail;
#ifdef WIN32
int oldmask = umask (0);
fail = _mkdir (path);
#else
mode_t oldmask = umask( (mode_t)0 );
fail = mkdir (path, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP |
S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH );
#endif
lua_pushboolean (L, fail);
umask (oldmask);
return 1;
}
/*
** Directory iterator
*/
static int dir_iter (lua_State *L) {
#ifdef _WIN32
dir_data *d = (dir_data *)lua_touserdata (L, lua_upvalueindex (1));
struct _finddata_t c_file;
if (d->hFile == 0L) { /* first entry */
if ((d->hFile = _findfirst (d->pattern, &c_file)) == -1L) {
lua_pushnil (L);
lua_pushstring (L, strerror (errno));
return 2;
} else {
lua_pushstring (L, c_file.name);
return 1;
}
} else { /* next entry */
if (_findnext (d->hFile, &c_file) == -1L)
return 0;
else {
lua_pushstring (L, c_file.name);
return 1;
}
}
#else
DIR *d = *(DIR **) lua_touserdata (L, lua_upvalueindex (1));
struct dirent *entry;
if ((entry = readdir (d)) != NULL) {
lua_pushstring (L, entry->d_name);
return 1;
}
else
return 0;
#endif
}
/*
** Closes directory iterators
*/
static int dir_close (lua_State *L) {
#ifdef _WIN32
dir_data *d = (dir_data *)lua_touserdata (L, 1);
if (d->hFile) {
_findclose (d->hFile);
}
#else
DIR *d = *(DIR **)lua_touserdata (L, 1);
if (d)
closedir (d);
#endif
return 0;
}
/*
** Factory of directory iterators
*/
static int dir_iter_factory (lua_State *L) {
const char *path = luaL_checkstring (L, 1);
#ifdef _WIN32
dir_data *dir = (dir_data *) lua_newuserdata (L, sizeof(dir_data));
dir->hFile = 0L;
if (strlen(path) > MAX_DIR_LENGTH)
luaL_error (L, "path too long: %s", path);
else
sprintf (dir->pattern, "%s/*", path);
luaL_getmetatable (L, DIR_METATABLE);
lua_setmetatable (L, -2);
#else
DIR **d = (DIR **) lua_newuserdata (L, sizeof(DIR *));
luaL_getmetatable (L, DIR_METATABLE);
lua_setmetatable (L, -2);
*d = opendir (path);
if (*d == NULL)
luaL_error (L, "cannot open %s: %s", path, strerror (errno));
#endif
lua_pushcclosure (L, dir_iter, 1);
return 1;
}
/*
** Creates directory metatable.
*/
static int dir_create_meta (lua_State *L) {
luaL_newmetatable (L, DIR_METATABLE);
/* set its __gc field */
lua_pushstring (L, "__gc");
lua_pushcfunction (L, dir_close);
lua_settable (L, -3);
return 1;
}
static const struct luaL_reg fslib[] = {
{"chdir", change_dir},
{"currentdir", get_dir},
{"dir", dir_iter_factory},
{"lock", file_lock},
{"mkdir", make_dir},
{"unlock", file_unlock},
{NULL, NULL},
};
int luaopen_luafilesystem (lua_State *L) {
dir_create_meta (L);
luaL_openlib (L, "luafilesystem", fslib, 0);
return 1;
}

5
luafilesystem.def Normal file
View File

@@ -0,0 +1,5 @@
LIBRARY luafilesystem.dll
DESCRIPTION "LuaFilesystem"
VERSION 1.0
EXPORTS
luaopen_luafilesystem

10
luafilesystem.h Normal file
View File

@@ -0,0 +1,10 @@
/* Define 'chdir' for systems that do not implement it */
/* $Id: luafilesystem.h,v 1.1.1.1 2004/07/27 14:15:24 tomas Exp $ */
#ifdef NO_CHDIR
#define chdir(p) (-1)
#define chdir_error "Function 'chdir' not provided by system"
#else
#define chdir_error strerror(errno)
#endif
int luaopen_filesystem (lua_State *L);

2
src/.gitignore vendored
View File

@@ -1,2 +0,0 @@
*.o
*.so

1167
src/lfs.c

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +0,0 @@
LIBRARY lfs.dll
VERSION 1.9
EXPORTS
luaopen_lfs

View File

@@ -1,38 +0,0 @@
/*
** LuaFileSystem
** File system manipulation library
**
** Copyright (C) 2003-2010 Kepler Project.
** Copyright (C) 2010-2022 The LuaFileSystem authors.
** (http://lunarmodules.github.io/luafilesystem)
*/
/* Define 'chdir' for systems that do not implement it */
#ifdef NO_CHDIR
#define chdir(p) (-1)
#define chdir_error "Function 'chdir' not provided by system"
#else
#define chdir_error strerror(errno)
#endif
#ifdef _WIN32
#define chdir(p) (_chdir(p))
#define getcwd(d, s) (_getcwd(d, s))
#define rmdir(p) (_rmdir(p))
#define LFS_EXPORT __declspec (dllexport)
#ifndef fileno
#define fileno(f) (_fileno(f))
#endif
#else
#define LFS_EXPORT
#endif
#ifdef __cplusplus
extern "C" {
#endif
LFS_EXPORT int luaopen_lfs(lua_State * L);
#ifdef __cplusplus
}
#endif

8
t_luafilesystem.lua Normal file
View File

@@ -0,0 +1,8 @@
-- $Id: t_luafilesystem.lua,v 1.1.1.1 2004/07/27 14:15:24 tomas Exp $
if not luafilesystem and loadlib then
local libname = "LIB_NAME"
local libopen = "luaopen_luafilesystem"
local init, err1, err2 = loadlib (libname, libopen)
assert (init, (err1 or '')..(err2 or ''))
init ()
end

26
teste.lua Normal file
View File

@@ -0,0 +1,26 @@
#!/usr/local/bin/lua -i
require"luafilesystem"
print(luafilesystem.version)
function p ()
local fh = assert (io.open ("teste", 'r'))
assert (luafilesystem.lock (fh, 'r'))
print (fh:read"*a")
fh:close ()
end
function wr ()
fh = assert (io.open ("teste", 'w'))
assert (luafilesystem.lock (fh, 'w'))
end
function op ()
fh = assert (io.open ("teste", 'r'))
assert (luafilesystem.lock (fh, 'r'))
end
function fw (x)
assert (fh:write (x))
end

View File

@@ -1,226 +0,0 @@
#!/usr/bin/env lua5.1
local tmp = "/tmp"
local sep = string.match (package.config, "[^\n]+")
local upper = ".."
local is_unix = package.config:sub(1,1) == "/"
local lfs = require"lfs"
print (lfs._VERSION)
io.write(".")
io.flush()
function attrdir (path)
for file in lfs.dir(path) do
if file ~= "." and file ~= ".." then
local f = path..sep..file
print ("\t=> "..f.." <=")
local attr = lfs.attributes (f)
assert (type(attr) == "table")
if attr.mode == "directory" then
attrdir (f)
else
for name, value in pairs(attr) do
print (name, value)
end
end
end
end
end
-- Checking changing directories
local current = assert (lfs.currentdir())
local reldir = string.gsub (current, "^.*%"..sep.."([^"..sep.."])$", "%1")
assert (lfs.chdir (upper), "could not change to upper directory")
assert (lfs.chdir (reldir), "could not change back to current directory")
assert (lfs.currentdir() == current, "error trying to change directories")
assert (lfs.chdir ("this couldn't be an actual directory") == nil, "could change to a non-existent directory")
io.write(".")
io.flush()
-- Changing creating and removing directories
local tmpdir = current..sep.."lfs_tmp_dir"
local tmpfile = tmpdir..sep.."tmp_file"
-- Test for existence of a previous lfs_tmp_dir
-- that may have resulted from an interrupted test execution and remove it
if lfs.chdir (tmpdir) then
assert (lfs.chdir (upper), "could not change to upper directory")
assert (os.remove (tmpfile), "could not remove file from previous test")
assert (lfs.rmdir (tmpdir), "could not remove directory from previous test")
end
io.write(".")
io.flush()
-- tries to create a directory
assert (lfs.mkdir (tmpdir), "could not make a new directory")
local attrib, errmsg = lfs.attributes (tmpdir)
if not attrib then
error ("could not get attributes of file `"..tmpdir.."':\n"..errmsg)
end
local f = io.open(tmpfile, "w")
local data = "hello, file!"
f:write(data)
f:close()
io.write(".")
io.flush()
-- Change access time
local testdate = os.time({ year = 2007, day = 10, month = 2, hour=0})
assert (lfs.touch (tmpfile, testdate))
local new_att = assert (lfs.attributes (tmpfile))
assert (new_att.access == testdate, "could not set access time")
assert (new_att.modification == testdate, "could not set modification time")
io.write(".")
io.flush()
-- Change access and modification time
local testdate1 = os.time({ year = 2007, day = 10, month = 2, hour=0})
local testdate2 = os.time({ year = 2007, day = 11, month = 2, hour=0})
assert (lfs.touch (tmpfile, testdate2, testdate1))
local new_att = assert (lfs.attributes (tmpfile))
assert (new_att.access == testdate2, "could not set access time")
assert (new_att.modification == testdate1, "could not set modification time")
io.write(".")
io.flush()
if lfs.link (tmpfile, "_a_link_for_test_", true) then
assert (lfs.attributes"_a_link_for_test_".mode == "file")
assert (lfs.symlinkattributes"_a_link_for_test_".mode == "link")
assert (lfs.symlinkattributes"_a_link_for_test_".target == tmpfile)
assert (lfs.symlinkattributes("_a_link_for_test_", "target") == tmpfile)
assert (lfs.symlinkattributes(tmpfile).mode == "file")
assert (lfs.link (tmpfile, "_a_hard_link_for_test_"))
assert (lfs.symlinkattributes"_a_hard_link_for_test_".mode == "file")
local fd = io.open(tmpfile)
assert(fd:read("*a") == data)
fd:close()
fd = io.open("_a_link_for_test_")
assert(fd:read("*a") == data)
fd:close()
fd = io.open("_a_hard_link_for_test_")
assert(fd:read("*a") == data)
fd:close()
fd = io.open("_a_hard_link_for_test_", "w+")
local data2 = "write in hard link"
fd:write(data2)
fd:close()
fd = io.open(tmpfile)
assert(fd:read("*a") == data2)
fd:close()
if is_unix then
assert (lfs.attributes (tmpfile, "nlink") == 2)
end
assert (os.remove"_a_link_for_test_")
assert (os.remove"_a_hard_link_for_test_")
end
io.write(".")
io.flush()
-- Checking text/binary modes (only has an effect in Windows)
local f = io.open(tmpfile, "w")
local result, mode = lfs.setmode(f, "binary")
assert(result) -- on non-Windows platforms, mode is always returned as "binary"
result, mode = lfs.setmode(f, "text")
assert(result and mode == "binary")
f:close()
local ok, err = pcall(lfs.setmode, f, "binary")
assert(not ok, "could setmode on closed file")
assert(err:find("closed file"), "bad error message for setmode on closed file")
io.write(".")
io.flush()
-- Restore access time to current value
assert (lfs.touch (tmpfile, attrib.access, attrib.modification))
new_att = assert (lfs.attributes (tmpfile))
assert (new_att.access == attrib.access)
assert (new_att.modification == attrib.modification)
io.write(".")
io.flush()
-- Check consistency of lfs.attributes values
local attr = lfs.attributes (tmpfile)
for key, value in pairs(attr) do
assert (value == lfs.attributes (tmpfile, key),
"lfs.attributes values not consistent")
end
-- Check that lfs.attributes accepts a table as second argument
local attr2 = {}
lfs.attributes(tmpfile, attr2)
for key, value in pairs(attr2) do
assert (value == lfs.attributes (tmpfile, key),
"lfs.attributes values with table argument not consistent")
end
-- Check that extra arguments are ignored
lfs.attributes(tmpfile, attr2, nil)
-- Remove new file and directory
assert (os.remove (tmpfile), "could not remove new file")
assert (lfs.rmdir (tmpdir), "could not remove new directory")
assert (lfs.mkdir (tmpdir..sep.."lfs_tmp_dir") == nil, "could create a directory inside a non-existent one")
io.write(".")
io.flush()
-- Trying to get attributes of a non-existent file
local attr_ok, err, errno = lfs.attributes("this couldn't be an actual file")
assert(attr_ok == nil, "could get attributes of a non-existent file")
assert(type(err) == "string", "failed lfs.attributes did not return an error message")
assert(type(errno) == "number", "failed lfs.attributes did not return error code")
assert (type(lfs.attributes (upper)) == "table", "couldn't get attributes of upper directory")
io.write(".")
io.flush()
-- Stressing directory iterator
count = 0
for i = 1, 4000 do
for file in lfs.dir (tmp) do
count = count + 1
end
end
io.write(".")
io.flush()
-- Stressing directory iterator, explicit version
count = 0
for i = 1, 4000 do
local iter, dir = lfs.dir(tmp)
local file = dir:next()
while file do
count = count + 1
file = dir:next()
end
assert(not pcall(dir.next, dir))
end
io.write(".")
io.flush()
-- directory explicit close
local iter, dir = lfs.dir(tmp)
dir:close()
assert(not pcall(dir.next, dir))
print"Ok!"