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