0001
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 }