All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.luaj.vm2.lib.OsLib Maven / Gradle / Ivy

There is a newer version: 3.0.1
Show newest version
/*******************************************************************************
* Copyright (c) 2009 Luaj.org. All rights reserved.
*
* 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.
******************************************************************************/
package org.luaj.vm2.lib;

import java.io.IOException;

import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs;

/**
 * Subclass of {@link LibFunction} which implements the standard lua {@code os} library.
 * 

* It is a usable base with simplified stub functions * for library functions that cannot be implemented uniformly * on Jse and Jme. *

* This can be installed as-is on either platform, or extended * and refined to be used in a complete Jse implementation. *

* Because the nature of the {@code os} library is to encapsulate * os-specific features, the behavior of these functions varies considerably * from their counterparts in the C platform. *

* The following functions have limited implementations of features * that are not supported well on Jme: *

    *
  • {@code execute()}
  • *
  • {@code remove()}
  • *
  • {@code rename()}
  • *
  • {@code tmpname()}
  • *
*

* Typically, this library is included as part of a call to either * {@link JmePlatform#standardGlobals()} *

* To instantiate and use it directly, * link it into your globals table via {@link LuaValue#load(LuaValue)} using code such as: *

 {@code
 * LuaTable _G = new LuaTable();
 * LuaThread.setGlobals(_G);
 * _G.load(new BaseLib());
 * _G.load(new PackageLib());
 * _G.load(new OsLib());
 * System.out.println( _G.get("os").get("time").call() );
 * } 
* Doing so will ensure the library is properly initialized * and loaded into the globals table. *

* @see LibFunction * @see JseOsLib * @see JsePlatform * @see JmePlatform * @see http://www.lua.org/manual/5.1/manual.html#5.8 */ public class OsLib extends OneArgFunction { public static String TMP_PREFIX = ".luaj"; public static String TMP_SUFFIX = "tmp"; private static final int CLOCK = 0; private static final int DATE = 1; private static final int DIFFTIME = 2; private static final int EXECUTE = 3; private static final int EXIT = 4; private static final int GETENV = 5; private static final int REMOVE = 6; private static final int RENAME = 7; private static final int SETLOCALE = 8; private static final int TIME = 9; private static final int TMPNAME = 10; private static final String[] NAMES = { "clock", "date", "difftime", "execute", "exit", "getenv", "remove", "rename", "setlocale", "time", "tmpname", }; private static final long t0 = System.currentTimeMillis(); private static long tmpnames = t0; protected Globals globals; /** * Create and OsLib instance. */ public OsLib() { } public LuaValue call(LuaValue env) { globals = env.checkglobals(); LuaTable os = new LuaTable(); for (int i = 0; i < NAMES.length; ++i) os.set(NAMES[i], new OsLibFunc(i, NAMES[i])); env.set("os", os); globals.package_.loaded.set("os", os); return os; } class OsLibFunc extends VarArgFunction { public OsLibFunc(int opcode, String name) { this.opcode = opcode; this.name = name; } public Varargs invoke(Varargs args) { try { switch ( opcode ) { case CLOCK: return valueOf(clock()); case DATE: { String s = args.optjstring(1, null); double t = args.optdouble(2,-1); return valueOf( date(s, t==-1? System.currentTimeMillis()/1000.: t) ); } case DIFFTIME: return valueOf(difftime(args.checkdouble(1),args.checkdouble(2))); case EXECUTE: return execute(args.optjstring(1, null)); case EXIT: exit(args.optint(1, 0)); return NONE; case GETENV: { final String val = getenv(args.checkjstring(1)); return val!=null? valueOf(val): NIL; } case REMOVE: remove(args.checkjstring(1)); return LuaValue.TRUE; case RENAME: rename(args.checkjstring(1), args.checkjstring(2)); return LuaValue.TRUE; case SETLOCALE: { String s = setlocale(args.optjstring(1,null), args.optjstring(2, "all")); return s!=null? valueOf(s): NIL; } case TIME: return valueOf(time(args.arg1().isnil()? null: args.checktable(1))); case TMPNAME: return valueOf(tmpname()); } return NONE; } catch ( IOException e ) { return varargsOf(NIL, valueOf(e.getMessage())); } } } /** * @return an approximation of the amount in seconds of CPU time used by * the program. */ protected double clock() { return (System.currentTimeMillis()-t0) / 1000.; } /** * Returns the number of seconds from time t1 to time t2. * In POSIX, Windows, and some other systems, this value is exactly t2-t1. * @param t2 * @param t1 * @return diffeence in time values, in seconds */ protected double difftime(double t2, double t1) { return t2 - t1; } /** * If the time argument is present, this is the time to be formatted * (see the os.time function for a description of this value). * Otherwise, date formats the current time. * * If format starts with '!', then the date is formatted in Coordinated * Universal Time. After this optional character, if format is the string * "*t", then date returns a table with the following fields: year * (four digits), month (1--12), day (1--31), hour (0--23), min (0--59), * sec (0--61), wday (weekday, Sunday is 1), yday (day of the year), * and isdst (daylight saving flag, a boolean). * * If format is not "*t", then date returns the date as a string, * formatted according to the same rules as the C function strftime. * * When called without arguments, date returns a reasonable date and * time representation that depends on the host system and on the * current locale (that is, os.date() is equivalent to os.date("%c")). * * @param format * @param time time since epoch, or -1 if not supplied * @return a LString or a LTable containing date and time, * formatted according to the given string format. */ protected String date(String format, double time) { return new java.util.Date((long)(time*1000)).toString(); } /** * This function is equivalent to the C function system. * It passes command to be executed by an operating system shell. * It returns a status code, which is system-dependent. * If command is absent, then it returns nonzero if a shell * is available and zero otherwise. * @param command command to pass to the system */ protected Varargs execute(String command) { return varargsOf(NIL, valueOf("exit"), ONE); } /** * Calls the C function exit, with an optional code, to terminate the host program. * @param code */ protected void exit(int code) { System.exit(code); } /** * Returns the value of the process environment variable varname, * or null if the variable is not defined. * @param varname * @return String value, or null if not defined */ protected String getenv(String varname) { return System.getProperty(varname); } /** * Deletes the file or directory with the given name. * Directories must be empty to be removed. * If this function fails, it throws and IOException * * @param filename * @throws IOException if it fails */ protected void remove(String filename) throws IOException { throw new IOException( "not implemented" ); } /** * Renames file or directory named oldname to newname. * If this function fails,it throws and IOException * * @param oldname old file name * @param newname new file name * @throws IOException if it fails */ protected void rename(String oldname, String newname) throws IOException { throw new IOException( "not implemented" ); } /** * Sets the current locale of the program. locale is a string specifying * a locale; category is an optional string describing which category to change: * "all", "collate", "ctype", "monetary", "numeric", or "time"; the default category * is "all". * * If locale is the empty string, the current locale is set to an implementation- * defined native locale. If locale is the string "C", the current locale is set * to the standard C locale. * * When called with null as the first argument, this function only returns the * name of the current locale for the given category. * * @param locale * @param category * @return the name of the new locale, or null if the request * cannot be honored. */ protected String setlocale(String locale, String category) { return "C"; } /** * Returns the current time when called without arguments, * or a time representing the date and time specified by the given table. * This table must have fields year, month, and day, * and may have fields hour, min, sec, and isdst * (for a description of these fields, see the os.date function). * @param table * @return long value for the time */ protected long time(LuaTable table) { return System.currentTimeMillis(); } /** * Returns a string with a file name that can be used for a temporary file. * The file must be explicitly opened before its use and explicitly removed * when no longer needed. * * On some systems (POSIX), this function also creates a file with that name, * to avoid security risks. (Someone else might create the file with wrong * permissions in the time between getting the name and creating the file.) * You still have to open the file to use it and to remove it (even if you * do not use it). * * @return String filename to use */ protected String tmpname() { synchronized ( OsLib.class ) { return TMP_PREFIX+(tmpnames++)+TMP_SUFFIX; } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy