squirrel_std.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include <squirrel.h>
00013 #include <sqstdmath.h>
00014 #include "../stdafx.h"
00015 #include "../debug.h"
00016 #include "squirrel.hpp"
00017 #include "squirrel_std.hpp"
00018 #include "../core/alloc_func.hpp"
00019 #include "../core/math_func.hpp"
00020
00021
00022 SQInteger SquirrelStd::min(HSQUIRRELVM vm)
00023 {
00024 SQInteger tmp1, tmp2;
00025
00026 sq_getinteger(vm, 2, &tmp1);
00027 sq_getinteger(vm, 3, &tmp2);
00028 sq_pushinteger(vm, ::min(tmp1, tmp2));
00029 return 1;
00030 }
00031
00032 SQInteger SquirrelStd::max(HSQUIRRELVM vm)
00033 {
00034 SQInteger tmp1, tmp2;
00035
00036 sq_getinteger(vm, 2, &tmp1);
00037 sq_getinteger(vm, 3, &tmp2);
00038 sq_pushinteger(vm, ::max(tmp1, tmp2));
00039 return 1;
00040 }
00041
00042 SQInteger SquirrelStd::require(HSQUIRRELVM vm)
00043 {
00044 SQInteger top = sq_gettop(vm);
00045 const SQChar *filename;
00046 SQChar *real_filename;
00047
00048 sq_getstring(vm, 2, &filename);
00049
00050
00051 SQStackInfos si;
00052 sq_stackinfos(vm, 1, &si);
00053 if (si.source == NULL) {
00054 DEBUG(misc, 0, "[squirrel] Couldn't detect the script-name of the 'require'-caller; this should never happen!");
00055 return SQ_ERROR;
00056 }
00057 real_filename = scstrdup(si.source);
00058
00059 SQChar *s = scstrrchr(real_filename, PATHSEPCHAR);
00060 if (s != NULL) {
00061
00062 s++;
00063 *s = '\0';
00064 }
00065
00066
00067 real_filename = ReallocT(real_filename, scstrlen(real_filename) + scstrlen(filename) + 1);
00068 scstrcat(real_filename, filename);
00069
00070 char *filen = strdup(FS2OTTD(real_filename));
00071 #if (PATHSEPCHAR != '/')
00072 for (char *n = filen; *n != '\0'; n++) if (*n == '/') *n = PATHSEPCHAR;
00073 #endif
00074
00075 bool ret = Squirrel::LoadScript(vm, filen);
00076
00077
00078 sq_settop(vm, top);
00079 free(real_filename);
00080 free(filen);
00081
00082 return ret ? 0 : SQ_ERROR;
00083 }
00084
00085 SQInteger SquirrelStd::notifyallexceptions(HSQUIRRELVM vm)
00086 {
00087 SQBool b;
00088
00089 if (sq_gettop(vm) >= 1) {
00090 if (SQ_SUCCEEDED(sq_getbool(vm, -1, &b))) {
00091 sq_notifyallexceptions(vm, b);
00092 return 0;
00093 }
00094 }
00095
00096 return SQ_ERROR;
00097 }
00098
00099 void squirrel_register_global_std(Squirrel *engine)
00100 {
00101
00102
00103 engine->AddMethod("require", &SquirrelStd::require, 2, ".s");
00104 engine->AddMethod("notifyallexceptions", &SquirrelStd::notifyallexceptions, 2, ".b");
00105 }
00106
00107 void squirrel_register_std(Squirrel *engine)
00108 {
00109
00110
00111 engine->AddMethod("min", &SquirrelStd::min, 3, ".ii");
00112 engine->AddMethod("max", &SquirrelStd::max, 3, ".ii");
00113
00114 sqstd_register_mathlib(engine->GetVM());
00115 }