sqstdsystem.cpp

00001 /* see copyright notice in squirrel.h */
00002 #include <squirrel.h>
00003 #include <time.h>
00004 #include <stdlib.h>
00005 #include <stdio.h>
00006 #include <sqstdsystem.h>
00007 
00008 #ifdef SQUNICODE
00009 #include <wchar.h>
00010 #define scgetenv _wgetenv
00011 #define scsystem _wsystem
00012 #define scasctime _wasctime
00013 #define scremove _wremove
00014 #define screname _wrename
00015 #else
00016 #define scgetenv getenv
00017 #define scsystem system
00018 #define scasctime asctime
00019 #define scremove remove
00020 #define screname rename
00021 #endif
00022 
00023 static SQInteger _system_getenv(HSQUIRRELVM v)
00024 {
00025   const SQChar *s;
00026   if(SQ_SUCCEEDED(sq_getstring(v,2,&s))){
00027         sq_pushstring(v,scgetenv(s),-1);
00028     return 1;
00029   }
00030   return 0;
00031 }
00032 
00033 
00034 static SQInteger _system_system(HSQUIRRELVM v)
00035 {
00036   const SQChar *s;
00037   if(SQ_SUCCEEDED(sq_getstring(v,2,&s))){
00038     sq_pushinteger(v,scsystem(s));
00039     return 1;
00040   }
00041   return sq_throwerror(v,_SC("wrong param"));
00042 }
00043 
00044 
00045 static SQInteger _system_clock(HSQUIRRELVM v)
00046 {
00047   sq_pushfloat(v,((SQFloat)clock())/(SQFloat)CLOCKS_PER_SEC);
00048   return 1;
00049 }
00050 
00051 static SQInteger _system_time(HSQUIRRELVM v)
00052 {
00053   time_t t;
00054   time(&t);
00055   sq_pushinteger(v,*((SQInteger *)&t));
00056   return 1;
00057 }
00058 
00059 static SQInteger _system_remove(HSQUIRRELVM v)
00060 {
00061   const SQChar *s;
00062   sq_getstring(v,2,&s);
00063   if(scremove(s)==-1)
00064     return sq_throwerror(v,_SC("remove() failed"));
00065   return 0;
00066 }
00067 
00068 static SQInteger _system_rename(HSQUIRRELVM v)
00069 {
00070   const SQChar *oldn,*newn;
00071   sq_getstring(v,2,&oldn);
00072   sq_getstring(v,3,&newn);
00073   if(screname(oldn,newn)==-1)
00074     return sq_throwerror(v,_SC("rename() failed"));
00075   return 0;
00076 }
00077 
00078 static void _set_integer_slot(HSQUIRRELVM v,const SQChar *name,SQInteger val)
00079 {
00080   sq_pushstring(v,name,-1);
00081   sq_pushinteger(v,val);
00082   sq_rawset(v,-3);
00083 }
00084 
00085 static SQInteger _system_date(HSQUIRRELVM v)
00086 {
00087   time_t t;
00088   SQInteger it;
00089   SQInteger format = 'l';
00090   if(sq_gettop(v) > 1) {
00091     sq_getinteger(v,2,&it);
00092     t = it;
00093     if(sq_gettop(v) > 2) {
00094       sq_getinteger(v,3,(SQInteger*)&format);
00095     }
00096   }
00097   else {
00098     time(&t);
00099   }
00100   tm *date;
00101     if(format == 'u')
00102     date = gmtime(&t);
00103   else
00104     date = localtime(&t);
00105   if(!date)
00106     return sq_throwerror(v,_SC("crt api failure"));
00107   sq_newtable(v);
00108   _set_integer_slot(v, _SC("sec"), date->tm_sec);
00109     _set_integer_slot(v, _SC("min"), date->tm_min);
00110     _set_integer_slot(v, _SC("hour"), date->tm_hour);
00111     _set_integer_slot(v, _SC("day"), date->tm_mday);
00112     _set_integer_slot(v, _SC("month"), date->tm_mon);
00113     _set_integer_slot(v, _SC("year"), date->tm_year+1900);
00114     _set_integer_slot(v, _SC("wday"), date->tm_wday);
00115     _set_integer_slot(v, _SC("yday"), date->tm_yday);
00116   return 1;
00117 }
00118 
00119 
00120 
00121 #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_system_##name,nparams,pmask}
00122 static SQRegFunction systemlib_funcs[]={
00123   _DECL_FUNC(getenv,2,_SC(".s")),
00124   _DECL_FUNC(system,2,_SC(".s")),
00125   _DECL_FUNC(clock,1,NULL),
00126   _DECL_FUNC(time,1,NULL),
00127   _DECL_FUNC(date,-1,_SC(".nn")),
00128   _DECL_FUNC(remove,2,_SC(".s")),
00129   _DECL_FUNC(rename,3,_SC(".ss")),
00130   {0,0,0,0}
00131 };
00132 
00133 
00134 SQInteger sqstd_register_systemlib(HSQUIRRELVM v)
00135 {
00136   SQInteger i=0;
00137   while(systemlib_funcs[i].name!=0)
00138   {
00139     sq_pushstring(v,systemlib_funcs[i].name,-1);
00140     sq_newclosure(v,systemlib_funcs[i].f,0);
00141     sq_setparamscheck(v,systemlib_funcs[i].nparamscheck,systemlib_funcs[i].typemask);
00142     sq_setnativeclosurename(v,-1,systemlib_funcs[i].name);
00143     sq_createslot(v,-3);
00144     i++;
00145   }
00146   return 1;
00147 }

Generated on Wed Dec 23 20:12:45 2009 for OpenTTD by  doxygen 1.5.6