Revert "Update to SQUIRREL 3.0.4"
[supertux.git] / external / 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 SQInteger _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 SQInteger _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 SQInteger _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 SQInteger _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 SQInteger _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 SQInteger _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 SQInteger _system_date(HSQUIRRELVM v)\r
86 {\r
87         time_t t;\r
88         SQInteger it;\r
89         SQInteger format = 'l';\r
90         if(sq_gettop(v) > 1) {\r
91                 sq_getinteger(v,2,&it);\r
92                 t = it;\r
93                 if(sq_gettop(v) > 2) {\r
94                         sq_getinteger(v,3,(SQInteger*)&format);\r
95                 }\r
96         }\r
97         else {\r
98                 time(&t);\r
99         }\r
100         tm *date;\r
101     if(format == 'u')\r
102                 date = gmtime(&t);\r
103         else\r
104                 date = localtime(&t);\r
105         if(!date)\r
106                 return sq_throwerror(v,_SC("crt api failure"));\r
107         sq_newtable(v);\r
108         _set_integer_slot(v, _SC("sec"), date->tm_sec);\r
109     _set_integer_slot(v, _SC("min"), date->tm_min);\r
110     _set_integer_slot(v, _SC("hour"), date->tm_hour);\r
111     _set_integer_slot(v, _SC("day"), date->tm_mday);\r
112     _set_integer_slot(v, _SC("month"), date->tm_mon);\r
113     _set_integer_slot(v, _SC("year"), date->tm_year+1900);\r
114     _set_integer_slot(v, _SC("wday"), date->tm_wday);\r
115     _set_integer_slot(v, _SC("yday"), date->tm_yday);\r
116         return 1;\r
117 }\r
118 \r
119 \r
120 \r
121 #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_system_##name,nparams,pmask}\r
122 static SQRegFunction systemlib_funcs[]={\r
123         _DECL_FUNC(getenv,2,_SC(".s")),\r
124         _DECL_FUNC(system,2,_SC(".s")),\r
125         _DECL_FUNC(clock,1,NULL),\r
126         _DECL_FUNC(time,1,NULL),\r
127         _DECL_FUNC(date,-1,_SC(".nn")),\r
128         _DECL_FUNC(remove,2,_SC(".s")),\r
129         _DECL_FUNC(rename,3,_SC(".ss")),\r
130         {0,0}\r
131 };\r
132 \r
133 \r
134 SQInteger sqstd_register_systemlib(HSQUIRRELVM v)\r
135 {\r
136         SQInteger i=0;\r
137         while(systemlib_funcs[i].name!=0)\r
138         {\r
139                 sq_pushstring(v,systemlib_funcs[i].name,-1);\r
140                 sq_newclosure(v,systemlib_funcs[i].f,0);\r
141                 sq_setparamscheck(v,systemlib_funcs[i].nparamscheck,systemlib_funcs[i].typemask);\r
142                 sq_setnativeclosurename(v,-1,systemlib_funcs[i].name);\r
143                 sq_createslot(v,-3);\r
144                 i++;\r
145         }\r
146         return 1;\r
147 }\r