Mark Edgar 17 years ago
parent 8a083102cc
commit 0b41064bab

@ -2,7 +2,7 @@ This software is licensed under the terms of the MIT license reproduced below.
=============================================================================== ===============================================================================
Copyright 2006-2007 Mark Edgar <medgar@student.gc.maricopa.edu> Copyright 2006-2007 Mark Edgar <medgar123@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

47
JUST

@ -0,0 +1,47 @@
There are several reasons for using the existing ''io'' and ''os'' namespaces.
The ''io.pipe'' function depends on the Lua core in order to return
newly-constructed file userdata. The ''io.lock'' and ''io.unlock'' functions
are both available as metamethods of file userdata (e.g. ''f:lock("r")''),
which seems a natural extension.
overloading file metatable, may as well overload io table too
Adding a function to change environment variables requires that the
implementation of the ''os.getenv'' function be changed, at least on the
Windows implementation. If it is not, then unexpected behavior occurs:
{{{require "ex"
assert( os.getenv"NEWVAR" == nil )
ex.setenv("NEWVAR", "value")
print( os.getenv"NEWVAR" ) -- prints "nil"
print( ex.getenv"NEWVAR" ) -- prints "value"
}}}
Another is that require "ex" changes the semantics of some standard functions,
notably os.remove.
The ''os.remove'' has similar requirements since on Windows, ''os.remove'' will
only remove non-directories unless ''require "ex"'' replaces its
implementation.
Even if none of the above implementation details mattered, it is the purpose of
this API to extend the Lua standard namespaces with additional functions.
It seems there are only two major concerns about using the existing namespaces.
First, there is concern that a future version of Lua might want to use one of
these names. This should not be a concern for one simple reason: this proposal
intends to be that future version. While it may not be the case that this
library would be distributed as part of the Lua core, it is the goal of this
proposal that this extension be recognized to be as much of a standard as
''package.loadlib'' which cannot be implemented in standard C.
The other major concern is that extending the existing namespaces would be
confusing to Lua users. The best solution to this issue is to make this API
(and its major implementations) a part of the standard Lua distribution.
Similarly to both ''io.popen'' and ''package.loadlib'', the functions proposed
here would be documented in the reference manual and clearly noted that they
are not supported on all platforms. Likewise, these functions would throw an
error when called on platforms which cannot provide an implementation.
goal: have standard methods when available

@ -1,6 +1,6 @@
"ex" API implementation "ex" API implementation
http://lua-users.org/wiki/ExtensionProposal http://lua-users.org/wiki/ExtensionProposal
Copyright 2007 Mark Edgar < medgar at student gc maricopa edu > Copyright 2007 Mark Edgar < medgar at gmail com >
-- Environment -- Environment
os.getenv(name) -- get environment variable os.getenv(name) -- get environment variable

@ -0,0 +1,6 @@
luaL_Buffer usage in posix/spawn.c and w32api/spawn.c is broken (reported by Rici Lake)
w32api/spawn.c spawn_param_args should properly quote arguments according to CommandLineToArgv(quote) (reported by Rici Lake)
os.sleep(math.huge) returns immediately on Windows (reported by David Manura)
os.dir() with no parameter should use the . working directory (reported by David Manura)
Bug in Windows? require "ex"; assert(io.open("234", "w")):lock("w") (reported by David Manura)
run in a tight loop, os.dir() leaks handles faster than garbage collection will collect them (reported by m.i.)

@ -10,8 +10,3 @@ LUALIB= -L$(LUA)/src -llua51
### Comment these if your system actually has posix_spawn() ### Comment these if your system actually has posix_spawn()
POSIX_SPAWN= -DMISSING_POSIX_SPAWN POSIX_SPAWN= -DMISSING_POSIX_SPAWN
EXTRA= posix_spawn.o EXTRA= posix_spawn.o
### Change this if your system properly declares environ.
#ENVIRON= -DENVIRON_DECL=
ENVIRON= -DENVIRON_DECL="extern char **environ;"

@ -1,7 +1,7 @@
include ../conf include ../conf
CFLAGS= $(WARNINGS) $(DEFINES) $(INCLUDES) CFLAGS= $(WARNINGS) $(DEFINES) $(INCLUDES)
DEFINES= -D_XOPEN_SOURCE=600 $(POSIX_SPAWN) $(ENVIRON) DEFINES= -D_XOPEN_SOURCE=600 $(POSIX_SPAWN)
INCLUDES= $(LUAINC) INCLUDES= $(LUAINC)
WARNINGS= -W -Wall WARNINGS= -W -Wall
LIBS= $(LUALIB) LIBS= $(LUALIB)

@ -0,0 +1,16 @@
/*
* "ex" API implementation
* http://lua-users.org/wiki/ExtensionProposal
* Copyright 2009 Mark Edgar < medgar123 at gmail com >
*/
#ifdef __APPLE__
#include <crt_externs.h>
#define environ (*_NSGetEnviron())
#else
extern char **environ;
#endif

@ -1,7 +1,7 @@
/* /*
* "ex" API implementation * "ex" API implementation
* http://lua-users.org/wiki/ExtensionProposal * http://lua-users.org/wiki/ExtensionProposal
* Copyright 2007 Mark Edgar < medgar at student gc maricopa edu > * Copyright 2007 Mark Edgar < medgar123 at gmail com >
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -10,12 +10,13 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
ENVIRON_DECL
#include <dirent.h> #include <dirent.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <limits.h> #include <limits.h>
#include "environ.h"
#include "lua.h" #include "lua.h"
#include "lualib.h" #include "lualib.h"
#include "lauxlib.h" #include "lauxlib.h"
@ -482,9 +483,9 @@ int luaopen_ex(lua_State *L)
if (lua_isnil(L, -1)) return luaL_error(L, "io not loaded"); if (lua_isnil(L, -1)) return luaL_error(L, "io not loaded");
copyfields(L, ex_iolib, ex, -1); copyfields(L, ex_iolib, ex, -1);
lua_getfield(L, ex, "pipe"); /* . io ex_pipe */ lua_getfield(L, ex, "pipe"); /* . io ex_pipe */
lua_getfield(L, -2, "stderr"); /* . io ex_pipe io_stderr */ lua_getfield(L, -2, "open"); /* . io ex_pipe io_open */
lua_getfenv(L, -1); /* . io ex_pipe io_stderr E */ lua_getfenv(L, -1); /* . io ex_pipe io_open E */
lua_setfenv(L, -3); /* . io ex_pipe io_stderr */ lua_setfenv(L, -3); /* . io ex_pipe io_open */
/* extend the io.file metatable */ /* extend the io.file metatable */
luaL_getmetatable(L, LUA_FILEHANDLE); /* . F */ luaL_getmetatable(L, LUA_FILEHANDLE); /* . F */
if (lua_isnil(L, -1)) return luaL_error(L, "can't find FILE* metatable"); if (lua_isnil(L, -1)) return luaL_error(L, "can't find FILE* metatable");

@ -1,17 +1,17 @@
/* /*
* "ex" API implementation * "ex" API implementation
* http://lua-users.org/wiki/ExtensionProposal * http://lua-users.org/wiki/ExtensionProposal
* Copyright 2007 Mark Edgar < medgar at student gc maricopa edu > * Copyright 2007 Mark Edgar < medgar at gmail com >
*/ */
#include <stdlib.h> #include <stdlib.h>
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
ENVIRON_DECL
#include <limits.h> #include <limits.h>
#include <sys/types.h> #include <sys/types.h>
#include "environ.h"
#include "posix_spawn.h" #include "posix_spawn.h"
#ifndef OPEN_MAX #ifndef OPEN_MAX

@ -1,7 +1,7 @@
/* /*
* "ex" API implementation * "ex" API implementation
* http://lua-users.org/wiki/ExtensionProposal * http://lua-users.org/wiki/ExtensionProposal
* Copyright 2007 Mark Edgar < medgar at student gc maricopa edu > * Copyright 2007 Mark Edgar < medgar at gmail com >
*/ */
#include <sched.h> #include <sched.h>
#include <signal.h> #include <signal.h>

@ -1,10 +1,9 @@
/* /*
* "ex" API implementation * "ex" API implementation
* http://lua-users.org/wiki/ExtensionProposal * http://lua-users.org/wiki/ExtensionProposal
* Copyright 2007 Mark Edgar < medgar at student gc maricopa edu > * Copyright 2007 Mark Edgar < medgar at gmail com >
*/ */
#include <unistd.h> #include <unistd.h>
ENVIRON_DECL
#include <sys/wait.h> #include <sys/wait.h>
#if MISSING_POSIX_SPAWN #if MISSING_POSIX_SPAWN
#include "posix_spawn.h" #include "posix_spawn.h"
@ -12,6 +11,8 @@ ENVIRON_DECL
#include <spawn.h> #include <spawn.h>
#endif #endif
#include "environ.h"
#include "lua.h" #include "lua.h"
#include "lauxlib.h" #include "lauxlib.h"

@ -1,7 +1,7 @@
/* /*
* "ex" API implementation * "ex" API implementation
* http://lua-users.org/wiki/ExtensionProposal * http://lua-users.org/wiki/ExtensionProposal
* Copyright 2007 Mark Edgar < medgar at student gc maricopa edu > * Copyright 2007 Mark Edgar < medgar at gmail com >
*/ */
#ifndef SPAWN_H #ifndef SPAWN_H
#define SPAWN_H #define SPAWN_H

@ -1,7 +1,7 @@
/* /*
* "ex" API implementation * "ex" API implementation
* http://lua-users.org/wiki/ExtensionProposal * http://lua-users.org/wiki/ExtensionProposal
* Copyright 2007 Mark Edgar < medgar at student gc maricopa edu > * Copyright 2007 Mark Edgar < medgar at gmail com >
*/ */
#include <windows.h> #include <windows.h>
#include <stdlib.h> #include <stdlib.h>

@ -1,7 +1,7 @@
/* /*
* "ex" API implementation * "ex" API implementation
* http://lua-users.org/wiki/ExtensionProposal * http://lua-users.org/wiki/ExtensionProposal
* Copyright 2007 Mark Edgar < medgar at student gc maricopa edu > * Copyright 2007 Mark Edgar < medgar at gmail com >
*/ */
#include <windows.h> #include <windows.h>

@ -1,7 +1,7 @@
/* /*
* "ex" API implementation * "ex" API implementation
* http://lua-users.org/wiki/ExtensionProposal * http://lua-users.org/wiki/ExtensionProposal
* Copyright 2007 Mark Edgar < medgar at student gc maricopa edu > * Copyright 2007 Mark Edgar < medgar at gmail com >
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -541,9 +541,9 @@ int luaopen_ex(lua_State *L)
if (lua_isnil(L, -1)) return luaL_error(L, "io not loaded"); if (lua_isnil(L, -1)) return luaL_error(L, "io not loaded");
copyfields(L, ex_iolib, ex, -1); copyfields(L, ex_iolib, ex, -1);
lua_getfield(L, ex, "pipe"); /* . io ex_pipe */ lua_getfield(L, ex, "pipe"); /* . io ex_pipe */
lua_getfield(L, -2, "stderr"); /* . io ex_pipe io_stderr */ lua_getfield(L, -2, "open"); /* . io ex_pipe io_open */
lua_getfenv(L, -1); /* . io ex_pipe io_stderr E */ lua_getfenv(L, -1); /* . io ex_pipe io_open E */
lua_setfenv(L, -3); /* . io ex_pipe io_stderr */ lua_setfenv(L, -3); /* . io ex_pipe io_open */
/* extend the io.file metatable */ /* extend the io.file metatable */
luaL_getmetatable(L, LUA_FILEHANDLE); /* . F */ luaL_getmetatable(L, LUA_FILEHANDLE); /* . F */
if (lua_isnil(L, -1)) return luaL_error(L, "can't find FILE* metatable"); if (lua_isnil(L, -1)) return luaL_error(L, "can't find FILE* metatable");

@ -1,7 +1,7 @@
/* /*
* "ex" API implementation * "ex" API implementation
* http://lua-users.org/wiki/ExtensionProposal * http://lua-users.org/wiki/ExtensionProposal
* Copyright 2007 Mark Edgar < medgar at student gc maricopa edu > * Copyright 2007 Mark Edgar < medgar at gmail com >
*/ */
#include <stdio.h> /* sprintf() */ #include <stdio.h> /* sprintf() */
#include <ctype.h> #include <ctype.h>

@ -1,7 +1,7 @@
/* /*
* "ex" API implementation * "ex" API implementation
* http://lua-users.org/wiki/ExtensionProposal * http://lua-users.org/wiki/ExtensionProposal
* Copyright 2007 Mark Edgar < medgar at student gc maricopa edu > * Copyright 2007 Mark Edgar < medgar at gmail com >
*/ */
#ifndef pusherror_h #ifndef pusherror_h
#define pusherror_h #define pusherror_h

@ -1,7 +1,7 @@
/* /*
* "ex" API implementation * "ex" API implementation
* http://lua-users.org/wiki/ExtensionProposal * http://lua-users.org/wiki/ExtensionProposal
* Copyright 2007 Mark Edgar < medgar at student gc maricopa edu > * Copyright 2007 Mark Edgar < medgar at gmail com >
*/ */
#include <stdlib.h> #include <stdlib.h>
#include <windows.h> #include <windows.h>

@ -1,7 +1,7 @@
/* /*
* "ex" API implementation * "ex" API implementation
* http://lua-users.org/wiki/ExtensionProposal * http://lua-users.org/wiki/ExtensionProposal
* Copyright 2007 Mark Edgar < medgar at student gc maricopa edu > * Copyright 2007 Mark Edgar < medgar at gmail com >
*/ */
#ifndef SPAWN_H #ifndef SPAWN_H
#define SPAWN_H #define SPAWN_H

Loading…
Cancel
Save