1f9cf239a4e331c4aa194be86e3d4fb30496e6f9
[supertux.git] / src / squirrel / sqstdlib / sqstdsystem.cpp
1 /* see copyright notice in squirrel.h */
2 #include <squirrel.h>
3 #include <time.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <sqstdsystem.h>
7
8 #ifdef SQUNICODE
9 #include <wchar.h>
10 #define scgetenv _wgetenv
11 #define scsystem _wsystem
12 #define scasctime _wasctime
13 #define scremove _wremove
14 #define screname _wrename
15 #else
16 #define scgetenv getenv
17 #define scsystem system
18 #define scasctime asctime
19 #define scremove remove
20 #define screname rename
21 #endif
22
23 static int _system_getenv(HSQUIRRELVM v)
24 {
25         const SQChar *s;
26         if(SQ_SUCCEEDED(sq_getstring(v,2,&s))){
27         sq_pushstring(v,scgetenv(s),-1);
28                 return 1;
29         }
30         return 0;
31 }
32
33
34 static int _system_system(HSQUIRRELVM v)
35 {
36         const SQChar *s;
37         if(SQ_SUCCEEDED(sq_getstring(v,2,&s))){
38                 sq_pushinteger(v,scsystem(s));
39                 return 1;
40         }
41         return sq_throwerror(v,_SC("wrong param"));
42 }
43
44
45 static int _system_clock(HSQUIRRELVM v)
46 {
47         sq_pushfloat(v,((SQFloat)clock())/(SQFloat)CLOCKS_PER_SEC);
48         return 1;
49 }
50
51 static int _system_time(HSQUIRRELVM v)
52 {
53         time_t t;
54         time(&t);
55         sq_pushinteger(v,*((SQInteger *)&t));
56         return 1;
57 }
58
59 static int _system_remove(HSQUIRRELVM v)
60 {
61         const SQChar *s;
62         sq_getstring(v,2,&s);
63         if(scremove(s)==-1)
64                 return sq_throwerror(v,_SC("remove() failed"));
65         return 0;
66 }
67
68 static int _system_rename(HSQUIRRELVM v)
69 {
70         const SQChar *oldn,*newn;
71         sq_getstring(v,2,&oldn);
72         sq_getstring(v,3,&newn);
73         if(screname(oldn,newn)==-1)
74                 return sq_throwerror(v,_SC("rename() failed"));
75         return 0;
76 }
77
78 static void _set_integer_slot(HSQUIRRELVM v,const SQChar *name,SQInteger val)
79 {
80         sq_pushstring(v,name,-1);
81         sq_pushinteger(v,val);
82         sq_rawset(v,-3);
83 }
84
85 static int _system_date(HSQUIRRELVM v)
86 {
87         time_t t;
88         SQInteger format = 'l';
89         if(sq_gettop(v) > 1) {
90                 sq_getinteger(v,2,(SQInteger*)&t);
91                 if(sq_gettop(v) > 2) {
92                         sq_getinteger(v,3,(SQInteger*)&format);
93                 }
94         }
95         else {
96                 time(&t);
97         }
98         tm *date;
99     if(format == 'u')
100                 date = gmtime(&t);
101         else
102                 date = localtime(&t);
103         if(!date)
104                 return sq_throwerror(v,_SC("crt api failure"));
105         sq_newtable(v);
106         _set_integer_slot(v, _SC("sec"), date->tm_sec);
107     _set_integer_slot(v, _SC("min"), date->tm_min);
108     _set_integer_slot(v, _SC("hour"), date->tm_hour);
109     _set_integer_slot(v, _SC("day"), date->tm_mday);
110     _set_integer_slot(v, _SC("month"), date->tm_mon);
111     _set_integer_slot(v, _SC("year"), date->tm_year+1900);
112     _set_integer_slot(v, _SC("wday"), date->tm_wday);
113     _set_integer_slot(v, _SC("yday"), date->tm_yday);
114         return 1;
115 }
116
117
118
119 #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_system_##name,nparams,pmask}
120 static SQRegFunction systemlib_funcs[]={
121         _DECL_FUNC(getenv,2,_SC(".s")),
122         _DECL_FUNC(system,2,_SC(".s")),
123         _DECL_FUNC(clock,1,NULL),
124         _DECL_FUNC(time,1,NULL),
125         _DECL_FUNC(date,-1,_SC(".nn")),
126         _DECL_FUNC(remove,2,_SC(".s")),
127         _DECL_FUNC(rename,3,_SC(".ss")),
128         {0,0,0,0}
129 };
130
131
132 int sqstd_register_systemlib(HSQUIRRELVM v)
133 {
134         int i=0;
135         while(systemlib_funcs[i].name!=0)
136         {
137                 sq_pushstring(v,systemlib_funcs[i].name,-1);
138                 sq_newclosure(v,systemlib_funcs[i].f,0);
139                 sq_setparamscheck(v,systemlib_funcs[i].nparamscheck,systemlib_funcs[i].typemask);
140                 sq_setnativeclosurename(v,-1,systemlib_funcs[i].name);
141                 sq_createslot(v,-3);
142                 i++;
143         }
144         return 1;
145 }