samisalreadytaken 5e21095851 Move sqstdtime.h
2020-09-02 02:55:06 +03:00

89 lines
2.2 KiB
C

//-----------------------------------------------------------------------
// see copyright notice in squirrel.h
//
// Purpose : Squirrel time library cropped out from
// the system library as a safe include.
//
//-----------------------------------------------------------------------
#include "squirrel.h"
#include "time.h"
static SQInteger _system_clock(HSQUIRRELVM v)
{
sq_pushfloat(v, ((SQFloat)clock()) / (SQFloat)CLOCKS_PER_SEC);
return 1;
}
static SQInteger _system_time(HSQUIRRELVM v)
{
SQInteger t = (SQInteger)time(NULL);
sq_pushinteger(v, t);
return 1;
}
static void _set_integer_slot(HSQUIRRELVM v, const SQChar *name, SQInteger val)
{
sq_pushstring(v, name, -1);
sq_pushinteger(v, val);
sq_rawset(v, -3);
}
static SQInteger _system_date(HSQUIRRELVM v)
{
time_t t;
SQInteger it;
SQInteger format = 'l';
if (sq_gettop(v) > 1) {
sq_getinteger(v, 2, &it);
t = it;
if (sq_gettop(v) > 2) {
sq_getinteger(v, 3, (SQInteger*)&format);
}
}
else {
time(&t);
}
tm *date;
if (format == 'u')
date = gmtime(&t);
else
date = localtime(&t);
if (!date)
return sq_throwerror(v, _SC("crt api failure"));
sq_newtable(v);
_set_integer_slot(v, _SC("sec"), date->tm_sec);
_set_integer_slot(v, _SC("min"), date->tm_min);
_set_integer_slot(v, _SC("hour"), date->tm_hour);
_set_integer_slot(v, _SC("day"), date->tm_mday);
_set_integer_slot(v, _SC("month"), date->tm_mon);
_set_integer_slot(v, _SC("year"), date->tm_year + 1900);
_set_integer_slot(v, _SC("wday"), date->tm_wday);
_set_integer_slot(v, _SC("yday"), date->tm_yday);
return 1;
}
#define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_system_##name,nparams,pmask}
static const SQRegFunction timelib_funcs[] = {
_DECL_FUNC(clock, 0, NULL),
_DECL_FUNC(time, 1, NULL),
_DECL_FUNC(date, -1, _SC(".nn")),
{ NULL, (SQFUNCTION)0, 0, NULL }
};
#undef _DECL_FUNC
SQInteger sqstd_register_timelib(HSQUIRRELVM v)
{
SQInteger i = 0;
while (timelib_funcs[i].name != 0)
{
sq_pushstring(v, timelib_funcs[i].name, -1);
sq_newclosure(v, timelib_funcs[i].f, 0);
sq_setparamscheck(v, timelib_funcs[i].nparamscheck, timelib_funcs[i].typemask);
sq_setnativeclosurename(v, -1, timelib_funcs[i].name);
sq_newslot(v, -3, SQFalse);
i++;
}
return 1;
}