Index: head/stand/liblua/lstd.c =================================================================== --- head/stand/liblua/lstd.c (revision 329473) +++ head/stand/liblua/lstd.c (revision 329474) @@ -1,182 +1,218 @@ /*- * Copyright (c) 2014 Pedro Souza * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */ #include __FBSDID("$FreeBSD$"); #include "lstd.h" #include "math.h" FILE * fopen(const char *filename, const char *mode) { struct stat st; int fd; FILE *f; if (mode == NULL || mode[0] != 'r') return NULL; fd = open(filename, O_RDONLY); if (fd < 0) return NULL; f = malloc(sizeof(FILE)); if (f == NULL) { close(fd); return NULL; } if (fstat(fd, &st) != 0) { free(f); close(fd); return (NULL); } f->fd = fd; f->offset = 0; f->size = st.st_size; return (f); } FILE * freopen(const char *filename, const char *mode, FILE *stream) { fclose(stream); return (fopen(filename, mode)); } size_t fread(void *ptr, size_t size, size_t count, FILE *stream) { size_t r; if (stream == NULL) return 0; r = (size_t)read(stream->fd, ptr, size * count); stream->offset += r; return (r); } int fclose(FILE *stream) { if (stream == NULL) return EOF; close(stream->fd); free(stream); return (0); } int ferror(FILE *stream) { return (stream == NULL || stream->fd < 0); } int feof(FILE *stream) { if (stream == NULL) return 1; return (stream->offset >= stream->size); } int getc(FILE *stream) { char ch; size_t r; if (stream == NULL) return EOF; r = read(stream->fd, &ch, 1); if (r == 1) return ch; return EOF; } +DIR * +opendir(const char *name) +{ + DIR *dp; + int fd; + + fd = open(name, O_RDONLY); + if (fd < 0) + return NULL; + dp = fdopendir(fd); + if (dp == NULL) + close(fd); + return dp; +} + +DIR * +fdopendir(int fd) +{ + DIR *dp; + + dp = malloc(sizeof(*dp)); + if (dp == NULL) + return NULL; + dp->fd = fd; + return dp; +} + +int +closedir(DIR *dp) +{ + close(dp->fd); + dp->fd = -1; + free(dp); + return 0; +} + void luai_writestring(const char *s, int i) { while (i-- > 0) putchar(*s++); } /* * These routines from here on down are to implement the lua math * library, but that's not presently included by default. They are * little more than placeholders to allow compilation due to linkage * issues with upstream Lua. */ int64_t lstd_pow(int64_t x, int64_t y) { int64_t rv = 1; if (y < 0) return 0; rv = x; while (--y) rv *= x; return rv; } int64_t lstd_floor(int64_t x) { return (x); } int64_t lstd_fmod(int64_t a, int64_t b) { return (a % b); } /* * This can't be implemented, so maybe it should just abort. */ int64_t lstd_frexp(int64_t a, int *y) { *y = 0; return 0; } Index: head/stand/liblua/lstd.h =================================================================== --- head/stand/liblua/lstd.h (revision 329473) +++ head/stand/liblua/lstd.h (revision 329474) @@ -1,74 +1,82 @@ /*- * Copyright (c) 2014 Pedro Souza * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD$ */ #ifndef LSTD_H #define LSTD_H #include #include #include #include #include #include typedef struct FILE { int fd; size_t offset; size_t size; } FILE; +typedef struct DIR +{ + int fd; +} DIR; + FILE *fopen(const char *filename, const char *mode); FILE *freopen( const char *filename, const char *mode, FILE *stream); size_t fread(void *ptr, size_t size, size_t count, FILE *stream); int fclose(FILE *stream); int ferror(FILE *stream); int feof(FILE *stream); int getc(FILE * stream); +DIR *opendir(const char *name); +DIR *fdopendir(int fd); +int closedir(DIR *); #ifndef EOF #define EOF (-1) #endif #define stdin ((FILE*)NULL) #define stdout 1 #ifndef BUFSIZ #define BUFSIZ 512 #endif #define lua_writestringerror(s, p) do { printf((s), (p)); } while (0) void luai_writestring(const char *, int); #define lua_writestring(s,l) luai_writestring(s,l) #define fflush /* */ #define fgets(b, l, s) fgetstr((b), (l), 0) #endif /* LSTD_H */