コード例 #1
0
ファイル: sq_axtls.c プロジェクト: mingodad/squilu
/* This defines a function that opens up your library. */
SQRESULT sqext_register_axtls (HSQUIRRELVM v) {
    //add a namespace axtls
	sq_pushstring(v, SQ_LIBNAME, -1);
	sq_newtable(v);

	sq_insert_reg_funcs(v, axtls_obj_funcs);

    //add constants
    KeyIntPtrType KeyIntPtr;
    for (KeyIntPtr = axtls_constants; KeyIntPtr->Str; KeyIntPtr++) {
        sq_pushstring(v, KeyIntPtr->Str, -1);    //first the key
        sq_pushinteger(v, KeyIntPtr->Val);       //then the value
        sq_newslot(v, -3, SQFalse);              //store then
    }

    //now create the SSL Context class
	sq_pushstring(v,ssl_ctx_NAME,-1);
	sq_newclass(v,SQFalse);
	sq_settypetag(v,-1,(void*)SSL_CTX_Tag);
	sq_insert_reg_funcs(v, ssl_ctx_obj_funcs);
	sq_newslot(v,-3,SQFalse);

    //now create the SSL class
	sq_pushstring(v,ssl_NAME,-1);
	sq_newclass(v,SQFalse);
	sq_settypetag(v,-1,(void*)SSL_Tag);
	sq_insert_reg_funcs(v, ssl_obj_funcs);
	sq_newslot(v,-3,SQFalse);

	sq_newslot(v,-3,SQFalse); //add axtls table to the root table

    return SQ_OK;
}
コード例 #2
0
ファイル: sq_mysql.cpp プロジェクト: mingodad/squilu
SQRESULT sqext_register_MySQL(HSQUIRRELVM v)
{
    sq_pushstring(v,MySQL_TAG,-1);
    sq_newclass(v,SQFalse);
    sq_settypetag(v,-1,(void*)MySQL_TAG);
    sq_insert_reg_funcs(v, sq_mysql_methods);
    sq_newslot(v,-3,SQTrue);

    sq_pushstring(v,MySQL_Statement_TAG,-1);
    sq_newclass(v,SQFalse);
    sq_settypetag(v,-1,(void*)MySQL_Statement_TAG);
    sq_insert_reg_funcs(v, sq_mysql_statement_methods);
    sq_newslot(v,-3,SQTrue);

    sq_pushstring(v,MySQL_Result_TAG,-1);
    sq_newclass(v,SQFalse);
    sq_settypetag(v,-1,(void*)MySQL_Result_TAG);
    sq_insert_reg_funcs(v, sq_mysql_result_methods);
    sq_pushstring(v, _curr_row_key, -1);
    sq_pushnull(v);
    sq_newslot(v, -3, SQFalse);
    sq_newslot(v,-3,SQTrue);

    return 0;
}
コード例 #3
0
ファイル: sqglm.cpp プロジェクト: jiro-t/sqglm
HSQOBJECT class_init(HSQUIRRELVM v,SQFUNCTION c,const SQChar * p_name)
{	
	HSQOBJECT class_id;
	sq_pushroottable(v);
	sq_pushstring(v,p_name,-1);

	sq_newclass(v,SQFalse);
	sq_getstackobj(v,-1,&class_id);		
	sq_settypetag(v,-1,&class_id);		

	HSQOBJECT string_constructor;
	sq_pushstring(v,_SC("constructor"),-1);
	sq_resetobject(&string_constructor);
	sq_getstackobj(v,-1,&string_constructor);
	sq_newclosure(v,c,0);
	sq_newslot(v,-3,false);
		
	sq_pushstring(v,_SC("_cloned"),-1);
	sq_newclosure(v,clone<T>,0);
	sq_newslot(v,-3,false);
		
	sq_newslot(v,-3,false);
	sq_pop(v,1);

	return class_id;
}
コード例 #4
0
ファイル: sqstdstream.cpp プロジェクト: Eiyeron/squirrel
void init_streamclass(HSQUIRRELVM v)
{
    sq_pushregistrytable(v);
    sq_pushstring(v,_SC("std_stream"),-1);
    if(SQ_FAILED(sq_get(v,-2))) {
        sq_pushstring(v,_SC("std_stream"),-1);
        sq_newclass(v,SQFalse);
        sq_settypetag(v,-1,(SQUserPointer)SQSTD_STREAM_TYPE_TAG);
        SQInteger i = 0;
        while(_stream_methods[i].name != 0) {
            const SQRegFunction &f = _stream_methods[i];
            sq_pushstring(v,f.name,-1);
            sq_newclosure(v,f.f,0);
            sq_setparamscheck(v,f.nparamscheck,f.typemask);
            sq_newslot(v,-3,SQFalse);
            i++;
        }
        sq_newslot(v,-3,SQFalse);
        sq_pushroottable(v);
        sq_pushstring(v,_SC("stream"),-1);
        sq_pushstring(v,_SC("std_stream"),-1);
        sq_get(v,-4);
        sq_newslot(v,-3,SQFalse);
        sq_pop(v,1);
    }
    else {
        sq_pop(v,1); //result
    }
    sq_pop(v,1);
}
コード例 #5
0
ファイル: CSquirrelVM.cpp プロジェクト: RAG20/IV-Network
void CSquirrelVM::BeginRegisterScriptClass(const char* className, scriptFunction pfnFunction, void* userPointer, const char* baseClass)
{

	iFuncIndex = 0;
#if 1
	int n = 0;
	oldtop = sq_gettop(m_pVM);
	sq_pushroottable(m_pVM);
	sq_pushstring(m_pVM, className, -1);

	if(baseClass) {
		sq_pushstring(m_pVM, baseClass, -1);
		if(SQ_FAILED(sq_get(m_pVM, -3))) { // make sure base exists
			sq_settop(m_pVM, oldtop);
			return;
		}
	}
	if(SQ_FAILED(sq_newclass(m_pVM, baseClass ? 1 : 0))) {
		sq_settop(m_pVM, oldtop);
		return;
	}

	sq_pushstring(m_pVM, _SC("constructor"), -1);
	if (userPointer != nullptr)
	{
		sq_pushuserpointer(m_pVM, userPointer);
		sq_newclosure(m_pVM, (SQFUNCTION) pfnFunction, 1);
	}
	else
		sq_newclosure(m_pVM, (SQFUNCTION)pfnFunction, 0);
	sq_newslot(m_pVM, -3, false); // Add the constructor method
#endif
}
コード例 #6
0
ファイル: sq_ffi.cpp プロジェクト: gdos/squilu-1
SQRESULT sqext_register_ffi(HSQUIRRELVM v)
{
    int saved_top = sq_gettop(v);
    //add a namespace ffi
	sq_pushstring(v,_SC("ffi"),-1);
    sq_newclass(v,SQFalse);
    sq_settypetag(v,-1,(void*)FFI_LIB_TAG);
    sq_insert_reg_funcs(v, sq_ffi_methods);

    int i;
    for (i = 0; ffi_types_wrap[i].name != 0; i++) {
        struct FFI_type_name *e = &ffi_types_wrap[i];
        sq_pushstring(v, e->name, -1);
        sq_pushuserpointer(v, e->type);
        sq_newslot(v, -3, SQFalse);
    }
    sq_newslot(v,-3,SQTrue); //add ffi table to the root table


    sq_create_delegate_table(v, sq_lib_methods, FFI_LIB_LIB_TAG);
    sq_create_delegate_table(v, sq_func_methods, FFI_LIB_FUNC_TAG);
    sq_create_delegate_table(v, sq_var_methods, FFI_LIB_VAR_TAG);

    sq_settop(v, saved_top);

    return SQ_OK;
}
コード例 #7
0
ファイル: VmFunc.cpp プロジェクト: pandazheng/emo-framework
/*
 * Register new class.
 * Must be called before loading script files
 */
void register_class(HSQUIRRELVM v, const char *cname) {
    sq_pushroottable(v);
    sq_pushstring(v, cname, -1);
    sq_newclass(v, false);
    sq_createslot(v, -3);
    sq_pop(v, 1);
}
コード例 #8
0
BOOL SbuCreateClass(HSQUIRRELVM v,SquirrelClassDecl *cd)
{
	int n = 0;
	int oldtop = sq_gettop(v);
	sq_pushroottable(v);
	sq_pushstring(v,cd->name,-1);
	if(cd->base) {
		sq_pushstring(v,cd->base,-1);
		if(SQ_FAILED(sq_get(v,-3))) {
			sq_settop(v,oldtop);
			return FALSE;
		}
	}
	if(SQ_FAILED(sq_newclass(v,cd->base?1:0))) {
		sq_settop(v,oldtop);
		return FALSE;
	}
	sq_settypetag(v,-1,(SQUserPointer)cd);
	const ScriptClassMemberDecl *members = cd->members;
	const ScriptClassMemberDecl *m = NULL;
	while(members[n].name) {
		m = &members[n];
		sq_pushstring(v,m->name,-1);
		sq_newclosure(v,m->func,0);
		sq_setparamscheck(v,m->params,m->typemask);
		sq_setnativeclosurename(v,-1,m->name);
		sq_createslot(v,-3);
		n++;
	}
	sq_createslot(v,-3);
	sq_pop(v,1);
	return TRUE;
}
コード例 #9
0
ファイル: sqstdstring.cpp プロジェクト: q4a/scourge
SQInteger sqstd_register_stringlib( HSQUIRRELVM v ) {
	sq_pushstring( v, _SC( "regexp" ), -1 );
	sq_newclass( v, SQFalse );
	SQInteger i = 0;
	while ( rexobj_funcs[i].name != 0 ) {
		SQRegFunction &f = rexobj_funcs[i];
		sq_pushstring( v, f.name, -1 );
		sq_newclosure( v, f.f, 0 );
		sq_setparamscheck( v, f.nparamscheck, f.typemask );
		sq_setnativeclosurename( v, -1, f.name );
		sq_createslot( v, -3 );
		i++;
	}
	sq_createslot( v, -3 );

	i = 0;
	while ( stringlib_funcs[i].name != 0 ) {
		sq_pushstring( v, stringlib_funcs[i].name, -1 );
		sq_newclosure( v, stringlib_funcs[i].f, 0 );
		sq_setparamscheck( v, stringlib_funcs[i].nparamscheck, stringlib_funcs[i].typemask );
		sq_setnativeclosurename( v, -1, stringlib_funcs[i].name );
		sq_createslot( v, -3 );
		i++;
	}
	return 1;
}
コード例 #10
0
bool SquirrelScriptContext::RegisterUserClass(ClassDesc* desc)
{
	MultiScriptAssert(desc->m_constructor);
	MultiScriptAssert(desc->m_destructor);

	SquirrelClassInfo* classInfo = new SquirrelClassInfo();
	classInfo->m_desc = desc;
	classInfo->m_context = this;

	// Create class
	sq_pushstring(m_vm, desc->m_name, -1);

	// TODO: Handle subclass via 2nd parameter
	sq_newclass(m_vm, SQFalse);

	// Add methods
	for (unsigned int i = 0; i < desc->m_methods.size(); ++i)
	{
		sq_pushstring(m_vm, desc->m_methods[i].m_name, -1);
		sq_pushuserpointer(m_vm, classInfo);
		sq_pushinteger(m_vm, i);
		sq_newclosure(m_vm, SquirrelClassMethodCallback, 2);
		sq_createslot(m_vm, -3);
	}

	// Add constructor
	sq_pushstring(m_vm, "constructor", -1);
	sq_pushuserpointer(m_vm, classInfo);
	sq_newclosure(m_vm, SquirrelClassConstructorCallback, 1);
	sq_createslot(m_vm, -3);

	// Add to-string method
	sq_pushstring(m_vm, "AsString", -1);
	sq_pushuserpointer(m_vm, classInfo);
	sq_newclosure(m_vm, SquirrelClassToStringMethodCallback, 1);
	sq_createslot(m_vm, -3);

	// Add optional destructor
	if (!desc->m_garbageCollect)
	{
		// Add destructor
		sq_pushstring(m_vm, "Destroy", -1);
		sq_pushuserpointer(m_vm, classInfo);
		sq_newclosure(m_vm, SquirrelClassDestructorCallback, 1);
		sq_createslot(m_vm, -3);
	}
	else
	{
		// TODO: Add garbage collection callback here
	}

	// Add class to root table
	sq_createslot(m_vm, -3);

	// Add class info
	m_classes.push_back(classInfo);
	return true;
}
コード例 #11
0
ファイル: sq_fossil.cpp プロジェクト: mingodad/squilu
/* This defines a function that opens up your library. */
SQRESULT sqext_register_fossil (HSQUIRRELVM sqvm) {
    //add a namespace sqmix
	sq_pushstring(sqvm,_SC("sqfossil"),-1);
	sq_newclass(sqvm,SQFalse);
    sq_insert_reg_funcs(sqvm, fossil_obj_funcs);
	sq_newslot(sqvm,-3,SQTrue); //add sq_fossil table to the root table

	return SQ_OK;
}
コード例 #12
0
ファイル: sqstdstring.cpp プロジェクト: noriter/nit
SQInteger sqstd_register_stringlib(HSQUIRRELVM v)
{
	sq_pushstring(v,_SC("regexp"),-1);
	sq_newclass(v,SQFalse,"regexp");
	SQInteger i = 0;
	while(rexobj_funcs[i].name != 0) {
		SQRegFunction &f = rexobj_funcs[i];
		sq_pushstring(v,f.name,-1);
		sq_newclosure(v,f.f,0);
		sq_setparamscheck(v,f.nparamscheck,f.typemask);
		sq_setnativeclosureinfo(v,-1,f.name,f.file);
		if (f.help)
		{
			sq_pushstring(v,f.help,-1);
			sq_sethelp(v, -2);
		}
		sq_createslot(v,-3);
		i++;
	}
	sq_createslot(v,-3);

	i = 0;
	while(stringlib_funcs[i].name!=0)
	{
		sq_pushstring(v,stringlib_funcs[i].name,-1);
		sq_newclosure(v,stringlib_funcs[i].f,0);
		sq_setparamscheck(v,stringlib_funcs[i].nparamscheck,stringlib_funcs[i].typemask);
		sq_setnativeclosureinfo(v,-1,stringlib_funcs[i].name,stringlib_funcs[i].file);
		if (stringlib_funcs[i].help)
		{
			sq_pushstring(v,stringlib_funcs[i].help,-1);
			sq_sethelp(v, -2);
		}
		sq_createslot(v,-3);
		i++;
	}

	sq_getdefaultdelegate(v, OT_STRING);
	i = 0;
	while(stringextdeleg_funcs[i].name!=0)
	{
		sq_pushstring(v,stringextdeleg_funcs[i].name,-1);
		sq_newclosure(v,stringextdeleg_funcs[i].f,0);
		sq_setparamscheck(v,stringextdeleg_funcs[i].nparamscheck,stringextdeleg_funcs[i].typemask);
		sq_setnativeclosureinfo(v,-1,stringextdeleg_funcs[i].name,stringextdeleg_funcs[i].file);
		if (stringextdeleg_funcs[i].help)
		{
			sq_pushstring(v,stringextdeleg_funcs[i].help,-1);
			sq_sethelp(v,-2);
		}
		sq_createslot(v,-3);
		i++;
	}
	sq_pop(v, 1);
	return 1;
}
コード例 #13
0
ファイル: VmFunc.cpp プロジェクト: pandazheng/emo-framework
/*
 * Register new class with namespace.
 * Must be called before loading script files
 */
void register_class_with_namespace(HSQUIRRELVM v, const char *nname, const char *cname) {
    sq_pushroottable(v);
    sq_pushstring(v, nname, -1);
    if(SQ_SUCCEEDED(sq_get(v, -2))) {
        sq_pushstring(v, cname, -1);
        sq_newclass(v, false);
        sq_createslot(v, -3);
    }
    sq_pop(v, 1);
}
コード例 #14
0
ファイル: sq_libclang.cpp プロジェクト: mingodad/squilu
SQRESULT sqext_register_libclang(HSQUIRRELVM v)
{
    sq_pushstring(v,LibClang_TAG,-1);
    sq_newclass(v,SQFalse);
    sq_settypetag(v,-1,(void*)LibClang_TAG);
    sq_insert_reg_funcs(v, sq_libclang_methods);
    sq_newslot(v,-3,SQTrue);

    return 0;
}
コード例 #15
0
ファイル: sq_bitvector.cpp プロジェクト: mingodad/squilu
    /* This defines a function that opens up your library. */
    SQRESULT sqext_register_BitVector (HSQUIRRELVM v) {
        //add a namespace BitVector
        sq_pushstring(v, SQ_LIBNAME, -1);
        sq_newclass(v,SQFalse);
        sq_settypetag(v,-1,(SQUserPointer)BitVector_Tag);

        sq_insert_reg_funcs(v, BitVector_obj_funcs);

        sq_newslot(v,-3,SQFalse); //add BitVector table to the root table

        return SQ_OK;
    }
コード例 #16
0
ファイル: squirrel.cpp プロジェクト: dolly22/openttd-sai
void Squirrel::AddClassBegin(const char *class_name, const char *parent_class)
{
	sq_pushroottable(this->vm);
	sq_pushstring(this->vm, OTTD2SQ(class_name), -1);
	sq_pushstring(this->vm, OTTD2SQ(parent_class), -1);
	if (SQ_FAILED(sq_get(this->vm, -3))) {
		DEBUG(misc, 0, "[squirrel] Failed to initialize class '%s' based on parent class '%s'", class_name, parent_class);
		DEBUG(misc, 0, "[squirrel] Make sure that '%s' exists before trying to define '%s'", parent_class, class_name);
		return;
	}
	sq_newclass(this->vm, SQTrue);
}
コード例 #17
0
ファイル: sqstdstream.cpp プロジェクト: Eiyeron/squirrel
SQRESULT declare_stream(HSQUIRRELVM v,const SQChar* name,SQUserPointer typetag,const SQChar* reg_name,const SQRegFunction *methods,const SQRegFunction *globals)
{
    if(sq_gettype(v,-1) != OT_TABLE)
        return sq_throwerror(v,_SC("table expected"));
    SQInteger top = sq_gettop(v);
    //create delegate
    init_streamclass(v);
    sq_pushregistrytable(v);
    sq_pushstring(v,reg_name,-1);
    sq_pushstring(v,_SC("std_stream"),-1);
    if(SQ_SUCCEEDED(sq_get(v,-3))) {
        sq_newclass(v,SQTrue);
        sq_settypetag(v,-1,typetag);
        SQInteger i = 0;
        while(methods[i].name != 0) {
            const SQRegFunction &f = methods[i];
            sq_pushstring(v,f.name,-1);
            sq_newclosure(v,f.f,0);
            sq_setparamscheck(v,f.nparamscheck,f.typemask);
            sq_setnativeclosurename(v,-1,f.name);
            sq_newslot(v,-3,SQFalse);
            i++;
        }
        sq_newslot(v,-3,SQFalse);
        sq_pop(v,1);

        i = 0;
        while(globals[i].name!=0)
        {
            const SQRegFunction &f = globals[i];
            sq_pushstring(v,f.name,-1);
            sq_newclosure(v,f.f,0);
            sq_setparamscheck(v,f.nparamscheck,f.typemask);
            sq_setnativeclosurename(v,-1,f.name);
            sq_newslot(v,-3,SQFalse);
            i++;
        }
        //register the class in the target table
        sq_pushstring(v,name,-1);
        sq_pushregistrytable(v);
        sq_pushstring(v,reg_name,-1);
        sq_get(v,-2);
        sq_remove(v,-2);
        sq_newslot(v,-3,SQFalse);

        sq_settop(v,top);
        return SQ_OK;
    }
    sq_settop(v,top);
    return SQ_ERROR;
}
コード例 #18
0
ファイル: CResourceScript.cpp プロジェクト: LeeHM/etmp
bool CResourceScript::CreateClass(SquirrelClassDecl * pClassDecl)
{
	// Get script VM Top
	int iTop = sq_gettop ( m_pVM );

	// Push class name.
	sq_pushstring ( m_pVM, pClassDecl->name, -1 );

	// Check class 
	if ( pClassDecl->base )
	{
		// Push class base name.
		sq_pushstring ( m_pVM, pClassDecl->base, -1 );

		// Check sq_get state.
		if(SQ_FAILED(sq_get(m_pVM, -3)))
		{
			// Set default top.
			sq_settop(m_pVM, iTop);
			return false;
		}
	}

	// Register class
	if ( SQ_FAILED ( sq_newclass ( m_pVM, pClassDecl->base ? 1 : 0 ) ) )
	{
		// If class register failed - back to top.
		sq_settop ( m_pVM, iTop );
		return false;
	}

	// Register class functions.
	const ScriptClassMemberDecl * pMembers = pClassDecl->members;

	for(int x = 0; pMembers[x].szFunctionName; x++)
		RegisterFunction(pMembers[x].szFunctionName, pMembers[x].sqFunc, pMembers[x].iParameterCount, 
			pMembers[x].szFunctionTemplate);

	// Register slot for class.
	sq_createslot(m_pVM, -3);
	return true;
}
コード例 #19
0
bool CSquirrel::RegisterClass(SquirrelClassDecl * pClassDecl)
{
	// Get the stack top
	int oldtop = sq_gettop(m_pVM);

	// Push the class name onto the stack
	sq_pushstring(m_pVM, pClassDecl->name, -1);

	// Do we have a base class?
	if(pClassDecl->base)
	{
		// Push the base class name onto the stack
		sq_pushstring(m_pVM, pClassDecl->base, -1);

		// Attempt to get the base class
		if(SQ_FAILED(sq_get(m_pVM, -3)))
		{
			// Failed to get the base class
			sq_settop(m_pVM, oldtop);
			return false;
		}
	}

	// Create the class
	if(SQ_FAILED(sq_newclass(m_pVM, pClassDecl->base ? 1 : 0)))
	{
		// Failed to create the class, Restore the stack top
		sq_settop(m_pVM, oldtop);
		return false;
	}

	// Register the class members
	const ScriptClassMemberDecl * pMembers = pClassDecl->members;

	for(int x = 0; pMembers[x].szFunctionName; x++)
		RegisterFunction(pMembers[x].szFunctionName, pMembers[x].sqFunc, pMembers[x].iParameterCount, 
			pMembers[x].szFunctionTemplate);

	// Create a new slot
	sq_createslot(m_pVM, -3);
	return true;
}
コード例 #20
0
ファイル: sq_slave_vm.cpp プロジェクト: The-Mad-Pirate/squilu
    SQRESULT sqext_register_sq_slave_vm(HSQUIRRELVM v)
    {
        const SQChar get_set_validation_mask[] = _SC("x s|n|p s|n|b|a|t|p|o");
        sq_pushstring(v,sq_slave_vm_TAG, -1);
        sq_newclass(v, SQFalse);
        sq_settypetag(v,-1,(void*)sq_slave_vm_TAG);
        sq_insertfunc(v, _SC("constructor"), sq_slave_vm_constructor, -1, _SC("xi"), SQFalse);
        sq_insertfunc(v, _SC("_tostring"), sq_slave_vm__tostring, 1, _SC("x"), SQFalse);
        sq_insertfunc(v, _SC("close"), sq_slave_vm_close, 1, _SC("x"), SQFalse);
        sq_insertfunc(v, _SC("set"), sq_slave_vm_set, 3, get_set_validation_mask, SQFalse);
        sq_insertfunc(v, _SC("_set"), sq_slave_vm_set, 3, get_set_validation_mask, SQFalse);
        sq_insertfunc(v, _SC("get"), sq_slave_vm_get, -2, get_set_validation_mask, SQFalse);
        sq_insertfunc(v, _SC("_get"), sq_slave_vm_get, -2, get_set_validation_mask, SQFalse);
        sq_insertfunc(v, _SC("dofile"), sq_slave_vm_dofile, -2, _SC("xsbbb"), SQFalse);
        sq_insertfunc(v, _SC("loadfile"), sq_slave_vm_loadfile, -3, _SC("xssbb"), SQFalse);
        sq_insertfunc(v, _SC("compilestring"), sq_slave_vm_compilestring, -3, _SC("xssbb"), SQFalse);
        sq_insertfunc(v, _SC("call"), sq_slave_vm_call, -3, _SC("xbs"), SQFalse);

        sq_newslot(v,-3,SQTrue); //push sq_slave_vm class
        return 0;
    }
コード例 #21
0
ファイル: sq_zlib.cpp プロジェクト: The-Mad-Pirate/squilu
    SQRESULT sqext_register_sq_zlib(HSQUIRRELVM v)
    {
        sq_pushliteral(v,_SC("zlib"));
        sq_newtable(v);
        INT_CONST(v, Z_DEFAULT_COMPRESSION);
        INT_CONST(v, Z_BEST_SPEED);
        INT_CONST(v, Z_BEST_COMPRESSION);

        sq_insertfunc(v, _SC("version"), sq_zlib_version, 1, _SC("."), SQTrue);
        sq_insertfunc(v, _SC("deflate"), sq_zlib_deflate, -2, _SC(".si"), SQTrue);
        sq_insertfunc(v, _SC("inflate"), sq_zlib_inflate, -2, _SC(".si"), SQTrue);

        sq_pushliteral(v,_SC("Unzip"));
        sq_newclass(v,SQFalse);
        sq_settypetag(v,-1,(void*)sq_minizip_unzip_TAG);
        sq_insert_reg_funcs(v, sq_minizip_unzip_methods);
        sq_newslot(v,-3,SQTrue);

        sq_newslot(v,-3,SQTrue); //push zlib table
        return 0;
    }
コード例 #22
0
ファイル: SqPlus.cpp プロジェクト: Hiroyuki-Nagata/mona
BOOL CreateClass(HSQUIRRELVM v,SquirrelObject & newClass,SQUserPointer classType,const SQChar * name,const SQChar * baseName) {
  int n = 0;
  int oldtop = sq_gettop(v);
  sq_pushroottable(v);
  sq_pushstring(v,name,-1);
  if (baseName) {
    sq_pushstring(v,baseName,-1);
    if (SQ_FAILED(sq_get(v,-3))) { // Make sure the base exists if specified by baseName.
      sq_settop(v,oldtop);
      return FALSE;
    } // if
  } // if
  if (SQ_FAILED(sq_newclass(v,baseName ? 1 : 0))) { // Will inherit from base class on stack from sq_get() above.
    sq_settop(v,oldtop);
    return FALSE;
  } // if
  newClass.AttachToStackObject(-1);
  sq_settypetag(v,-1,classType);
  sq_createslot(v,-3);
  sq_pop(v,1);
  return TRUE;
} // CreateClass
コード例 #23
0
ファイル: CSquirrel.cpp プロジェクト: B2O/IV-Network
bool CSquirrel::RegisterClassStart(const char * szClassName, const char * szBaseClassName)
{
	// Get the stack top
	int oldtop = sq_gettop(m_pVM);

	// Push the root table onto the stack
	sq_pushroottable(m_pVM);

	// Push the class name onto the stack
	sq_pushstring(m_pVM, szClassName, -1);

	// Do we have a base class name?
	if(szBaseClassName)
	{
		// Push the base class name onto the stack
		sq_pushstring(m_pVM, szBaseClassName, -1);

		// Attempt to get the base class
		if(SQ_FAILED(sq_get(m_pVM, -3)))
		{
			// Failed to get the base class, Restore the stack top
			sq_settop(m_pVM, oldtop);
			return false;
		}
	}

	// Create the class
	if(SQ_FAILED(sq_newclass(m_pVM, (szBaseClassName == NULL) ? 0 : 1)))
	{
		// Failed to create the class, Restore the stack top
		sq_settop(m_pVM, oldtop);
		return false;
	}

	// Set the class type tag
	//sq_settypetag(m_pVM, -1, NULL);
	return true;
}
コード例 #24
0
ファイル: sq_xml-2.cpp プロジェクト: The-Mad-Pirate/squilu
SQRESULT sqext_register_sqxml(HSQUIRRELVM v)
{
    sq_pushstring(v,_SC("SQXml"),-1);
    sq_newclass(v,SQFalse);
    sq_insert_reg_funcs(v, xml_methods);
    sq_newslot(v,-3,SQTrue);

	// register default codes:
	if(!sv_code) {
		sv_code=(SQChar**)sq_malloc(sv_code_capacity*sizeof(SQChar*));
		sv_code[sv_code_size++]=_SC("&");
		sv_code[sv_code_size++]=_SC("&amp;");
		sv_code[sv_code_size++]=_SC("<");
		sv_code[sv_code_size++]=_SC("&lt;");
		sv_code[sv_code_size++]=_SC(">");
		sv_code[sv_code_size++]=_SC("&gt;");
		sv_code[sv_code_size++]=_SC("\"");
		sv_code[sv_code_size++]=_SC("&quot;");
		sv_code[sv_code_size++]=_SC("'");
		sv_code[sv_code_size++]=_SC("&apos;");
	}
    return 1;
}
コード例 #25
0
bool AIScanner::ImportLibrary(const char *library, const char *class_name, int version, HSQUIRRELVM vm, AIController *controller)
{
	/* Internally we store libraries as 'library.version' */
	char library_name[1024];
	snprintf(library_name, sizeof(library_name), "%s.%d", library, version);
	strtolower(library_name);

	/* Check if the library + version exists */
	AILibraryList::iterator iter = this->library_list.find(library_name);
	if (iter == this->library_list.end()) {
		char error[1024];

		/* Now see if the version doesn't exist, or the library */
		iter = this->library_list.find(library);
		if (iter == this->library_list.end()) {
			snprintf(error, sizeof(error), "couldn't find library '%s'", library);
		} else {
			snprintf(error, sizeof(error), "couldn't find library '%s' version %d. The latest version available is %d", library, version, (*iter).second->GetVersion());
		}
		sq_throwerror(vm, OTTD2SQ(error));
		return false;
	}

	/* Get the current table/class we belong to */
	HSQOBJECT parent;
	sq_getstackobj(vm, 1, &parent);

	char fake_class[1024];
	int next_number;

	if (!controller->LoadedLibrary(library_name, &next_number, &fake_class[0], sizeof(fake_class))) {
		/* Create a new fake internal name */
		snprintf(fake_class, sizeof(fake_class), "_internalNA%d", next_number);

		/* Load the library in a 'fake' namespace, so we can link it to the name the user requested */
		sq_pushroottable(vm);
		sq_pushstring(vm, OTTD2SQ(fake_class), -1);
		sq_newclass(vm, SQFalse);
		/* Load the library */
		if (!Squirrel::LoadScript(vm, (*iter).second->GetMainScript(), false)) {
			char error[1024];
			snprintf(error, sizeof(error), "there was a compile error when importing '%s' version %d", library, version);
			sq_throwerror(vm, OTTD2SQ(error));
			return false;
		}
		/* Create the fake class */
		sq_newslot(vm, -3, SQFalse);
		sq_pop(vm, 1);

		controller->AddLoadedLibrary(library_name, fake_class);
	}

	/* Find the real class inside the fake class (like 'sets.Vector') */
	sq_pushroottable(vm);
	sq_pushstring(vm, OTTD2SQ(fake_class), -1);
	if (SQ_FAILED(sq_get(vm, -2))) {
		sq_throwerror(vm, _SC("internal error assigning library class"));
		return false;
	}
	sq_pushstring(vm, OTTD2SQ((*iter).second->GetInstanceName()), -1);
	if (SQ_FAILED(sq_get(vm, -2))) {
		char error[1024];
		snprintf(error, sizeof(error), "unable to find class '%s' in the library '%s' version %d", (*iter).second->GetInstanceName(), library, version);
		sq_throwerror(vm, OTTD2SQ(error));
		return false;
	}
	HSQOBJECT obj;
	sq_getstackobj(vm, -1, &obj);
	sq_pop(vm, 3);

	if (StrEmpty(class_name)) {
		sq_pushobject(vm, obj);
		return true;
	}

	/* Now link the name the user wanted to our 'fake' class */
	sq_pushobject(vm, parent);
	sq_pushstring(vm, OTTD2SQ(class_name), -1);
	sq_pushobject(vm, obj);
	sq_newclass(vm, SQTrue);
	sq_newslot(vm, -3, SQFalse);
	sq_pop(vm, 1);

	sq_pushobject(vm, obj);
	return true;
}
コード例 #26
0
ファイル: squirrel.cpp プロジェクト: dolly22/openttd-sai
void Squirrel::AddClassBegin(const char *class_name)
{
	sq_pushroottable(this->vm);
	sq_pushstring(this->vm, OTTD2SQ(class_name), -1);
	sq_newclass(this->vm, SQFalse);
}
コード例 #27
0
/* static */ HSQOBJECT ScriptController::Import(const char *library, const char *class_name, int version)
{
	ScriptController *controller = ScriptObject::GetActiveInstance()->GetController();
	Squirrel *engine = ScriptObject::GetActiveInstance()->engine;
	HSQUIRRELVM vm = engine->GetVM();

	/* Internally we store libraries as 'library.version' */
	char library_name[1024];
	snprintf(library_name, sizeof(library_name), "%s.%d", library, version);
	strtolower(library_name);

	ScriptInfo *lib = ScriptObject::GetActiveInstance()->FindLibrary(library, version);
	if (lib == NULL) {
		char error[1024];
		snprintf(error, sizeof(error), "couldn't find library '%s' with version %d", library, version);
		throw sq_throwerror(vm, OTTD2SQ(error));
	}

	/* Get the current table/class we belong to */
	HSQOBJECT parent;
	sq_getstackobj(vm, 1, &parent);

	char fake_class[1024];

	LoadedLibraryList::iterator iter = controller->loaded_library.find(library_name);
	if (iter != controller->loaded_library.end()) {
		ttd_strlcpy(fake_class, (*iter).second, sizeof(fake_class));
	} else {
		int next_number = ++controller->loaded_library_count;

		/* Create a new fake internal name */
		snprintf(fake_class, sizeof(fake_class), "_internalNA%d", next_number);

		/* Load the library in a 'fake' namespace, so we can link it to the name the user requested */
		sq_pushroottable(vm);
		sq_pushstring(vm, OTTD2SQ(fake_class), -1);
		sq_newclass(vm, SQFalse);
		/* Load the library */
		if (!engine->LoadScript(vm, lib->GetMainScript(), false)) {
			char error[1024];
			snprintf(error, sizeof(error), "there was a compile error when importing '%s' version %d", library, version);
			throw sq_throwerror(vm, OTTD2SQ(error));
		}
		/* Create the fake class */
		sq_newslot(vm, -3, SQFalse);
		sq_pop(vm, 1);

		controller->loaded_library[strdup(library_name)] = strdup(fake_class);
	}

	/* Find the real class inside the fake class (like 'sets.Vector') */
	sq_pushroottable(vm);
	sq_pushstring(vm, OTTD2SQ(fake_class), -1);
	if (SQ_FAILED(sq_get(vm, -2))) {
		throw sq_throwerror(vm, _SC("internal error assigning library class"));
	}
	sq_pushstring(vm, OTTD2SQ(lib->GetInstanceName()), -1);
	if (SQ_FAILED(sq_get(vm, -2))) {
		char error[1024];
		snprintf(error, sizeof(error), "unable to find class '%s' in the library '%s' version %d", lib->GetInstanceName(), library, version);
		throw sq_throwerror(vm, OTTD2SQ(error));
	}
	HSQOBJECT obj;
	sq_getstackobj(vm, -1, &obj);
	sq_pop(vm, 3);

	if (StrEmpty(class_name)) return obj;

	/* Now link the name the user wanted to our 'fake' class */
	sq_pushobject(vm, parent);
	sq_pushstring(vm, OTTD2SQ(class_name), -1);
	sq_pushobject(vm, obj);
	sq_newclass(vm, SQTrue);
	sq_newslot(vm, -3, SQFalse);
	sq_pop(vm, 1);

	return obj;
}
コード例 #28
0
ファイル: bindtransport.cpp プロジェクト: bipscript/bipscript
void bindTransport(HSQUIRRELVM vm)
{
    // create package table
    sq_pushstring(vm, "Transport", -1);
    sq_newtable(vm);

    // static method schedule
    sq_pushstring(vm, _SC("schedule"), -1);
    sq_newclosure(vm, &Transportschedule, 0);
    sq_newslot(vm, -3, false);

    // static method start
    sq_pushstring(vm, _SC("start"), -1);
    sq_newclosure(vm, &Transportstart, 0);
    sq_newslot(vm, -3, false);

    // static method stop
    sq_pushstring(vm, _SC("stop"), -1);
    sq_newclosure(vm, &Transportstop, 0);
    sq_newslot(vm, -3, false);

    // create class Transport.Master
    sq_pushstring(vm, "Master", -1);
    sq_newclass(vm, false);
    sq_getstackobj(vm, -1, &TransportMasterObject);
    sq_settypetag(vm, -1, &TransportMasterObject);

    // ctor for class Master
    sq_pushstring(vm, _SC("constructor"), -1);
    sq_newclosure(vm, &TransportMasterCtor, 0);
    sq_newslot(vm, -3, false);

    // clone for class Master
    sq_pushstring(vm, _SC("_cloned"), -1);
    sq_newclosure(vm, &unclonable, 0);
    sq_newslot(vm, -3, false);

    // methods for class Master
    sq_pushstring(vm, _SC("timeSignature"), -1);
    sq_newclosure(vm, &TransportMastertimeSignature, 0);
    sq_newslot(vm, -3, false);

    // push Master to Transport package table
    sq_newslot(vm, -3, false);

    // create class Transport.Position
    sq_pushstring(vm, "Position", -1);
    sq_newclass(vm, false);
    sq_getstackobj(vm, -1, &TransportPositionObject);
    sq_settypetag(vm, -1, &TransportPositionObject);

    // ctor for class Position
    sq_pushstring(vm, _SC("constructor"), -1);
    sq_newclosure(vm, &TransportPositionCtor, 0);
    sq_newslot(vm, -3, false);

    // clone for class Position
    sq_pushstring(vm, _SC("_cloned"), -1);
    sq_newclosure(vm, &TransportPositionClone, 0);
    sq_newslot(vm, -3, false);

    // methods for class Position
    sq_pushstring(vm, _SC("bar"), -1);
    sq_newclosure(vm, &TransportPositionbar, 0);
    sq_newslot(vm, -3, false);

    sq_pushstring(vm, _SC("div"), -1);
    sq_newclosure(vm, &TransportPositiondiv, 0);
    sq_newslot(vm, -3, false);

    sq_pushstring(vm, _SC("num"), -1);
    sq_newclosure(vm, &TransportPositionnum, 0);
    sq_newslot(vm, -3, false);

    sq_pushstring(vm, _SC("time"), -1);
    sq_newclosure(vm, &TransportPositiontime, 0);
    sq_newslot(vm, -3, false);

    // push Position to Transport package table
    sq_newslot(vm, -3, false);

    // create class Transport.TimeSignature
    sq_pushstring(vm, "TimeSignature", -1);
    sq_newclass(vm, false);
    sq_getstackobj(vm, -1, &TransportTimeSignatureObject);
    sq_settypetag(vm, -1, &TransportTimeSignatureObject);

    // ctor for class TimeSignature
    sq_pushstring(vm, _SC("constructor"), -1);
    sq_newclosure(vm, &TransportTimeSignatureCtor, 0);
    sq_newslot(vm, -3, false);

    // clone for class TimeSignature
    sq_pushstring(vm, _SC("_cloned"), -1);
    sq_newclosure(vm, &TransportTimeSignatureClone, 0);
    sq_newslot(vm, -3, false);

    // methods for class TimeSignature
    sq_pushstring(vm, _SC("denominator"), -1);
    sq_newclosure(vm, &TransportTimeSignaturedenominator, 0);
    sq_newslot(vm, -3, false);

    sq_pushstring(vm, _SC("numerator"), -1);
    sq_newclosure(vm, &TransportTimeSignaturenumerator, 0);
    sq_newslot(vm, -3, false);

    // push TimeSignature to Transport package table
    sq_newslot(vm, -3, false);

    // push package "Transport" to root table
    sq_newslot(vm, -3, false);
}
コード例 #29
0
ファイル: sqtjsobj.cpp プロジェクト: shivanshs9/krkrz
/**
 * クラスの登録
 * @param HSQUIRRELVM v
 */
SQRESULT
TJSObject::createTJSClass(HSQUIRRELVM v)
{
    SQInteger top = sq_gettop(v);
    if (top < 2) {
        return sq_throwerror(v, _SC("invalid param"));
    }

    // クラスを生成
    sq_pushobject(v, SQClassType<TJSObject>::ClassObject());
    sq_newclass(v, true); // 継承する

    // メンバ登録
    const tjs_char *tjsClassName = NULL;
    tTJSVariant tjsClassObj;
    for (SQInteger i=top; i>1; i--) {
        if ((tjsClassName = sqobject::getString(v,i))) {
            TVPExecuteExpression(tjsClassName, &tjsClassObj);
            if (tjsClassObj.Type() == tvtObject &&
                    TJS_SUCCEEDED(tjsClassObj.AsObjectClosureNoAddRef().IsInstanceOf(0,NULL,NULL,L"Class",NULL))) {
                MemberRegister *r = new MemberRegister(v, tjsClassObj);
                tTJSVariantClosure closure(r);
                tjsClassObj.AsObjectClosureNoAddRef().EnumMembers(TJS_IGNOREPROP, &closure, NULL);
                r->Release();
            }
        }
    }

    if (tjsClassName) {
        // コンストラクタ登録
        sq_pushstring(v, _SC("constructor"), -1);
        sq_pushvariant(v, tjsClassObj);
        sq_newclosure(v, tjsConstructor, 1);
        sq_createslot(v, -3);
        // クラス属性に tjsクラスを登録
        sq_pushnull(v);
        sq_newtable(v);
        if (SQ_SUCCEEDED(sq_setattributes(v,-3))) {
            sq_pop(v,1);
            sq_pushnull(v);
            if (SQ_SUCCEEDED(sq_getattributes(v, -2))) {
                sq_pushstring(v, tjsClassAttrName, -1);
                sq_pushvariant(v, tjsClassObj);
                if (SQ_SUCCEEDED(sq_createslot(v, -3))) {
                    sq_pop(v,1);
                } else {
                    sq_pop(v,2);
                }
            } else {
                // XXX
                sq_pop(v,1);
            }
        } else {
            // XXX
            sq_pop(v,2);
        }

        // TJS機能メソッドを登録
        sq_pushstring(v, _SC("tjsIsValid"), -1);
        sq_newclosure(v, TJSObject::tjsIsValid, 0);
        sq_createslot(v, -3);
        sq_pushstring(v, _SC("tjsOverride"), -1);
        sq_newclosure(v, TJSObject::tjsOverride, 0);
        sq_setparamscheck(v, -2, _SC(".sc"));
        sq_createslot(v, -3);
    }

    return 1;
}