Back to home page

Enduro/X

 
 

    


0001 /* see copyright notice in pscript.h */
0002 #include <pscript.h>
0003 #include <time.h>
0004 #include <stdlib.h>
0005 #include <stdio.h>
0006 #include <psstdsystem.h>
0007 
0008 #ifdef PSUNICODE
0009 #include <wchar.h>
0010 #define scgetenv _wgetenv
0011 #define scsystem _wsystem
0012 #define scasctime _wasctime
0013 #define scremove _wremove
0014 #define screname _wrename
0015 #else
0016 #define scgetenv getenv
0017 #define scsystem system
0018 #define scasctime asctime
0019 #define scremove remove
0020 #define screname rename
0021 #endif
0022 
0023 static PSInteger _system_getenv(HPSCRIPTVM v)
0024 {
0025     const PSChar *s;
0026     if(PS_SUCCEEDED(ps_getstring(v,2,&s))){
0027         ps_pushstring(v,scgetenv(s),-1);
0028         return 1;
0029     }
0030     return 0;
0031 }
0032 
0033 
0034 static PSInteger _system_system(HPSCRIPTVM v)
0035 {
0036     const PSChar *s;
0037     if(PS_SUCCEEDED(ps_getstring(v,2,&s))){
0038         ps_pushinteger(v,scsystem(s));
0039         return 1;
0040     }
0041     return ps_throwerror(v,_SC("wrong param"));
0042 }
0043 
0044 
0045 static PSInteger _system_clock(HPSCRIPTVM v)
0046 {
0047     ps_pushfloat(v,((PSFloat)clock())/(PSFloat)CLOCKS_PER_SEC);
0048     return 1;
0049 }
0050 
0051 static PSInteger _system_time(HPSCRIPTVM v)
0052 {
0053     PSInteger t = (PSInteger)time(NULL);
0054     ps_pushinteger(v,t);
0055     return 1;
0056 }
0057 
0058 static PSInteger _system_remove(HPSCRIPTVM v)
0059 {
0060     const PSChar *s;
0061     ps_getstring(v,2,&s);
0062     if(scremove(s)==-1)
0063         return ps_throwerror(v,_SC("remove() failed"));
0064     return 0;
0065 }
0066 
0067 static PSInteger _system_rename(HPSCRIPTVM v)
0068 {
0069     const PSChar *oldn,*newn;
0070     ps_getstring(v,2,&oldn);
0071     ps_getstring(v,3,&newn);
0072     if(screname(oldn,newn)==-1)
0073         return ps_throwerror(v,_SC("rename() failed"));
0074     return 0;
0075 }
0076 
0077 static void _set_integer_slot(HPSCRIPTVM v,const PSChar *name,PSInteger val)
0078 {
0079     ps_pushstring(v,name,-1);
0080     ps_pushinteger(v,val);
0081     ps_rawset(v,-3);
0082 }
0083 
0084 static PSInteger _system_date(HPSCRIPTVM v)
0085 {
0086     time_t t;
0087     PSInteger it;
0088     PSInteger format = 'l';
0089     if(ps_gettop(v) > 1) {
0090         ps_getinteger(v,2,&it);
0091         t = it;
0092         if(ps_gettop(v) > 2) {
0093             ps_getinteger(v,3,(PSInteger*)&format);
0094         }
0095     }
0096     else {
0097         time(&t);
0098     }
0099     tm *date;
0100     tm date_stor;
0101     if(format == 'u')
0102         date = gmtime_r(&t, &date_stor);
0103     else
0104         date = localtime_r(&t, &date_stor);
0105     if(!date)
0106         return ps_throwerror(v,_SC("crt api failure"));
0107     ps_newtable(v);
0108     _set_integer_slot(v, _SC("sec"), date->tm_sec);
0109     _set_integer_slot(v, _SC("min"), date->tm_min);
0110     _set_integer_slot(v, _SC("hour"), date->tm_hour);
0111     _set_integer_slot(v, _SC("day"), date->tm_mday);
0112     _set_integer_slot(v, _SC("month"), date->tm_mon);
0113     _set_integer_slot(v, _SC("year"), date->tm_year+1900);
0114     _set_integer_slot(v, _SC("wday"), date->tm_wday);
0115     _set_integer_slot(v, _SC("yday"), date->tm_yday);
0116     return 1;
0117 }
0118 
0119 
0120 
0121 #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_system_##name,nparams,pmask}
0122 static const PSRegFunction systemlib_funcs[]={
0123     _DECL_FUNC(getenv,2,_SC(".s")),
0124     _DECL_FUNC(system,2,_SC(".s")),
0125     _DECL_FUNC(clock,0,NULL),
0126     _DECL_FUNC(time,1,NULL),
0127     _DECL_FUNC(date,-1,_SC(".nn")),
0128     _DECL_FUNC(remove,2,_SC(".s")),
0129     _DECL_FUNC(rename,3,_SC(".ss")),
0130     {NULL,(PSFUNCTION)0,0,NULL}
0131 };
0132 #undef _DECL_FUNC
0133 
0134 PSInteger psstd_register_systemlib(HPSCRIPTVM v)
0135 {
0136     PSInteger i=0;
0137     while(systemlib_funcs[i].name!=0)
0138     {
0139         ps_pushstring(v,systemlib_funcs[i].name,-1);
0140         ps_newclosure(v,systemlib_funcs[i].f,0);
0141         ps_setparamscheck(v,systemlib_funcs[i].nparamscheck,systemlib_funcs[i].typemask);
0142         ps_setnativeclosurename(v,-1,systemlib_funcs[i].name);
0143         ps_newslot(v,-3,PSFalse);
0144         i++;
0145     }
0146     return 1;
0147 }