static SQInteger _blob_resize(HSQUIRRELVM v) { SETUP_BLOB(v); SQInteger size; sq_getinteger(v,2,&size); if(!self->Resize(size)) return sq_throwerror(v,_SC("resize failed")); return 0; }
static SQInteger base_callee(HSQUIRRELVM v) { if(v->_callsstacksize > 1) { v->Push(v->_callsstack[v->_callsstacksize - 2]._closure); return 1; } return sq_throwerror(v,_SC("no closure in the calls stack")); }
// // Transport stop // SQInteger Transportstop(HSQUIRRELVM vm) { SQInteger numargs = sq_gettop(vm); // check parameter count if(numargs > 1) { return sq_throwerror(vm, "too many parameters, expected at most 0"); } // call the implementation try { AudioEngine::instance().transportStop(); } catch(std::exception const& e) { return sq_throwerror(vm, e.what()); } // void method, returns no value return 0; }
static SQInteger sqlang_sr_exit (HSQUIRRELVM J) { if(_sr_J_env.JJ==J) { _sr_J_env.JJ_exit = 1; } else { _sr_J_env.J_exit = 1; } return sq_throwerror(J, _SC("~~ksr~exit~~")); }
static SQInteger array_top(HSQUIRRELVM v) { SQObject &o=stack_get(v,1); if(_array(o)->Size()>0){ v->Push(_array(o)->Top()); return 1; } else return sq_throwerror(v,_SC("top() on a empty array")); }
static SQRESULT _blob_reserve(HSQUIRRELVM v) { SETUP_BLOB(v); SQInteger size; sq_getinteger(v,2,&size); if(!self->GrowBufOf(size)) return sq_throwerror(v,_SC("reserve failed")); return 0; }
static SQInteger _system_rename(HSQUIRRELVM v) { const SQChar *oldn,*newn; sq_getstring(v,2,&oldn); sq_getstring(v,3,&newn); if(screname(oldn,newn)==-1) return sq_throwerror(v,_SC("rename() failed")); return 0; }
static SQInteger _system_system(HSQUIRRELVM v) { const SQChar *s; if(SQ_SUCCEEDED(sq_getstring(v,2,&s))){ sq_pushinteger(v,scsystem(s)); return 1; } return sq_throwerror(v,_SC("wrong param")); }
SQRESULT sqstd_getfile(HSQUIRRELVM v, SQInteger idx, SQFILE *file) { SQFile *fileobj = NULL; if(SQ_SUCCEEDED(sq_getinstanceup(v,idx,(SQUserPointer*)&fileobj,(SQUserPointer)SQSTD_FILE_TYPE_TAG))) { *file = fileobj->GetHandle(); return SQ_OK; } return sq_throwerror(v,_SC("not a file")); }
static SQInteger array_insert(HSQUIRRELVM v) { SQObject &o=stack_get(v,1); SQObject &idx=stack_get(v,2); SQObject &val=stack_get(v,3); if(!_array(o)->Insert(tointeger(idx),val)) return sq_throwerror(v,_SC("index out of range")); return 0; }
static SQInteger validate_format(HSQUIRRELVM v, SQChar *fmt, const SQChar *src, SQInteger n,SQInteger &width) { SQChar *dummy; SQChar swidth[MAX_WFORMAT_LEN]; SQInteger wc = 0; SQInteger start = n; fmt[0] = '%'; while (isfmtchr(src[n])) n++; while (scisdigit(src[n])) { swidth[wc] = src[n]; n++; wc++; if(wc>=MAX_WFORMAT_LEN) return sq_throwerror(v,_SC("width format too long")); } swidth[wc] = '\0'; if(wc > 0) { width = scstrtol(swidth,&dummy,10); } else width = 0; if (src[n] == '.') { n++; wc = 0; while (scisdigit(src[n])) { swidth[wc] = src[n]; n++; wc++; if(wc>=MAX_WFORMAT_LEN) return sq_throwerror(v,_SC("precision format too long")); } swidth[wc] = '\0'; if(wc > 0) { width += scstrtol(swidth,&dummy,10); } } if (n-start > MAX_FORMAT_LEN ) return sq_throwerror(v,_SC("format too long")); memcpy(&fmt[1],&src[start],((n-start)+1)*sizeof(SQChar)); fmt[(n-start)+2] = '\0'; return n; }
static SQInteger _regexp_constructor(HSQUIRRELVM v) { const SQChar *error,*pattern; sq_getstring(v,2,&pattern); SQRex *rex = sqstd_rex_compile(pattern,&error); if(!rex) return sq_throwerror(v,error); sq_setinstanceup(v,1,rex); sq_setreleasehook(v,1,_rexobj_releasehook); return 0; }
static SQRESULT sq_mysql_statement_reset(HSQUIRRELVM v){ SQ_FUNC_VARS_NO_TOP(v); GET_mysql_statement_INSTANCE(); if (dlmysql_stmt_reset(self->stmt)) { return sq_throwerror(v, _SC("error reseting prepared statement. MySQL: %s"), dlmysql_stmt_error(self->stmt)); } return 0; }
static SQRESULT sq_mysql_result_col_name(HSQUIRRELVM v){ SQ_FUNC_VARS_NO_TOP(v); GET_mysql_result_INSTANCE(); SQ_GET_INTEGER(v, 2, col); if(col < 0 || col > dlmysql_num_fields(self)-1) return sq_throwerror(v, _SC("invalid col number (" _PRINT_INT_FMT ")"), col); MYSQL_FIELD *fields = dlmysql_fetch_fields(self); sq_pushstring(v, fields[col].name, -1); return 1; }
static SQInteger sqlang_sr_drop (HSQUIRRELVM J) { if(_sr_J_env.JJ==J) { _sr_J_env.JJ_exit = 1; } else { _sr_J_env.J_exit = 1; } sr_kemi_core_set_drop(NULL); return sq_throwerror(J, _SC("~~ksr~exit~~")); }
static SQInteger sq_lib_bind_func(HSQUIRRELVM v) { void **modbuf; void *mod; void *sym; const SQChar *symname; const char *rettype; sq_getuserdata(v, 1, (void**)&modbuf, NULL); mod = *modbuf; sq_getstring(v, 2, &rettype); sq_getstring(v, 3, &symname); sym = GET_SYM(mod, symname); if (!sym) return sq_throwerror(v, "Cannot find symbol"); int nparam = sq_getsize(v, 4); int size = sizeof(FFIFunc) + sizeof(ffi_type*) * nparam; FFIFunc *ffibuf = (FFIFunc*)sq_newuserdata(v, size); sq_push_delegate_table(v, FFI_LIB_FUNC_TAG); sq_setdelegate(v, -2); // printf("Allocated %d bytes at %p\n", size, ffibuf); ffibuf->func = sym; ffibuf->rettype = *rettype; int i; for (i = 0; i < nparam; i++) { sq_pushinteger(v, i); sq_get(v, 4); ffibuf->params[i] = get_ffi_type(v, -1); if (!ffibuf->params[i]) return SQ_ERROR; sq_poptop(v); } int res = ffi_prep_cif(&ffibuf->cif, FFI_DEFAULT_ABI, nparam, char2ffi_type(*rettype), ffibuf->params); if (res != FFI_OK) return sq_throwerror(v, "Error in ffi_prep_cif"); return 1; }
SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize) { sq_aux_paramscheck(v,1); SQObjectPtr *arr; _GETSAFE_OBJ(v, idx, OT_ARRAY,arr); if(newsize >= 0) { _array(*arr)->Resize(newsize); return SQ_OK; } return sq_throwerror(v,_SC("negative size")); }
static SQInteger program_main(HSQUIRRELVM v) { if(sq_gettop(v) != (1 + 3)){ //roottable, userpointer, co_cpu, co_ppu return sq_throwerror(v, wgT("argument number error")); } struct program_config *d; SQRESULT r = qr_userpointer_get(v, (SQUserPointer) &d); if(SQ_FAILED(r)){ return r; } HSQUIRRELVM co_cpu, co_ppu; if(SQ_FAILED(sq_getthread(v, 3, &co_cpu))){ return sq_throwerror(v, wgT("thread error")); } if(SQ_FAILED(sq_getthread(v, 4, &co_ppu))){ return sq_throwerror(v, wgT("thread error")); } SQInteger state_cpu = sq_getvmstate(co_cpu); SQInteger state_ppu = sq_getvmstate(co_ppu); const long sleepms = d->compare == true ? 6 : 2; //W29C040 で compare をすると、error が出るので出ない値に調整 (やっつけ対応) while((state_cpu != SQ_VMSTATE_IDLE) || (state_ppu != SQ_VMSTATE_IDLE)){ uint8_t s[2]; wait_msec(sleepms); d->control->flash_status(d->handle, s); if(state_cpu != SQ_VMSTATE_IDLE && s[0] == KAZZO_TASK_FLASH_IDLE){ if(program_memoryarea(co_cpu, d->handle, &d->cpu, d->compare, &state_cpu, &d->log) == false){ //sq_pushbool(v, SQFalse); return 0; } } if(state_ppu != SQ_VMSTATE_IDLE && s[1] == KAZZO_TASK_FLASH_IDLE){ if(program_memoryarea(co_ppu, d->handle, &d->ppu, d->compare, &state_ppu, &d->log) == false){ //sq_pushbool(v, SQFalse); return 0; } } } //sq_pushbool(v, SQTrue); return 0; }
SQInteger _stream_readn(HSQUIRRELVM v) { SETUP_STREAM(v); SQInteger format; sq_getinteger(v, 2, &format); switch(format) { case 'i': { SQInteger i; SAFE_READN(&i, sizeof(i)); sq_pushinteger(v, i); } break; case 's': { short s; SAFE_READN(&s, sizeof(short)); sq_pushinteger(v, s); } break; case 'w': { unsigned short w; SAFE_READN(&w, sizeof(unsigned short)); sq_pushinteger(v, w); } break; case 'c': { char c; SAFE_READN(&c, sizeof(char)); sq_pushinteger(v, c); } break; case 'b': { unsigned char c; SAFE_READN(&c, sizeof(unsigned char)); sq_pushinteger(v, c); } break; case 'f': { float f; SAFE_READN(&f, sizeof(float)); sq_pushfloat(v, f); } break; case 'd': { double d; SAFE_READN(&d, sizeof(double)); sq_pushfloat(v, (SQFloat)d); } break; default: return sq_throwerror(v, _SC("invalid format")); } return 1; }
static SQRESULT sq_mysql_exec_dml(HSQUIRRELVM v){ SQ_FUNC_VARS_NO_TOP(v); GET_mysql_INSTANCE(); SQ_GET_STRING(v, 2, szSQL); if (dlmysql_real_query(self, szSQL, szSQL_size)) /* error executing query */ return sq_throwerror(v, _SC("error executing query. MySQL: %s"), dlmysql_error(self)); sq_pushinteger(v, (SQInteger)dlmysql_affected_rows(self)); return 1; }
static SQRESULT sq_ssl_write(HSQUIRRELVM v){ SQ_FUNC_VARS(v); GET_ssl_INSTANCE(); SQ_GET_STRING(v, 2, out_data); if(_top_ > 2) { SQ_GET_INTEGER(v, 3, size); if(size > out_data_size) return sq_throwerror(v, _SC("parameter 2 size bigger than data size")); out_data_size = size; } sq_pushinteger(v, ssl_write(self, (const uint8_t *)out_data, out_data_size)); return 1; }
SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval) { sq_aux_paramscheck(v, 1); SQObjectPtr *arr; _GETSAFE_OBJ(v, idx, OT_ARRAY,arr); if(_array(*arr)->Size() > 0) { if(pushval != 0){ v->Push(_array(*arr)->Top()); } _array(*arr)->Pop(); return SQ_OK; } return sq_throwerror(v, _SC("empty array")); }
static SQInteger array_slice(HSQUIRRELVM v) { SQInteger sidx,eidx; SQObjectPtr o; if(get_slice_params(v,sidx,eidx,o)==-1)return -1; SQInteger alen = _array(o)->Size(); if(sidx < 0)sidx = alen + sidx; if(eidx < 0)eidx = alen + eidx; if(eidx < sidx)return sq_throwerror(v,_SC("wrong indexes")); if(eidx > alen)return sq_throwerror(v,_SC("slice out of range")); SQArray *arr=SQArray::Create(_ss(v),eidx-sidx); SQObjectPtr t; SQInteger count=0; for(SQInteger i=sidx;i<eidx;i++){ _array(o)->Get(i,t); arr->Set(count++,t); } v->Push(arr); return 1; }
static SQRESULT sq_minizip_unzip_constructor(HSQUIRRELVM v) { SQ_FUNC_VARS_NO_TOP(v); SQ_GET_STRING(v, 2, zip_fname); unzFile zip_archive = unzOpen64(zip_fname); if(!zip_archive) { return sq_throwerror(v, _SC("Cannot open %s\n"),zip_fname); } sq_setinstanceup(v, 1, zip_archive); sq_setreleasehook(v,1, sq_minizip_unzip_releasehook); return 1; }
static SQRESULT sq_minizip_unzip_get_num_files(HSQUIRRELVM v) { SQ_FUNC_VARS_NO_TOP(v); GET_minizip_unzip_INSTANCE(); unz_global_info64 gi; int err = unzGetGlobalInfo64(self,&gi); if(err != UNZ_OK) { return sq_throwerror(v, _SC("error %d with zipfile in unzGetGlobalInfo \n"), err); } sq_pushinteger(v, gi.number_entry); return 1; }
static SQRESULT sq_mysql_prepare(HSQUIRRELVM v){ SQ_FUNC_VARS_NO_TOP(v); GET_mysql_INSTANCE(); SQ_GET_STRING(v, 2, szSQL); MYSQL_STMT *stmt = dlmysql_stmt_init(self); if (!stmt) return sq_throwerror(v, _SC(" mysql_stmt_init(), out of memory\n")); if (dlmysql_stmt_prepare(stmt, szSQL, szSQL_size)) { SQRESULT res = sq_throwerror(v, dlmysql_stmt_error(stmt)); dlmysql_stmt_close(stmt); return res; } unsigned long expected_params = dlmysql_stmt_param_count(stmt); size_t bind_params_info_size = sizeof(MYSQL_BIND) * expected_params; size_t bind_params_data_size = sizeof(double) * expected_params; size_t bind_data_buffer_size = bind_params_info_size + bind_params_data_size; size_t st_mysq_stmt_size = sizeof(SQ_MysqlStatement) + bind_data_buffer_size; SQ_MysqlStatement *sq_stmt = (SQ_MysqlStatement*)sq_malloc(st_mysq_stmt_size); sq_stmt->stmt = stmt; sq_stmt->bind_data_buffer_size = bind_data_buffer_size; sq_stmt->param_count = expected_params; sq_stmt->bind_params_info = (MYSQL_BIND*)sq_stmt->bind_data_buffer; sq_stmt->bind_params_data = ((char*)sq_stmt->bind_params_info) + bind_params_info_size; sq_pushroottable(v); sq_pushstring(v, MySQL_Statement_TAG, -1); if(sq_get(v, -2) == SQ_OK){ if(sq_createinstance(v, -1) == SQ_OK){ sq_setinstanceup(v, -1, sq_stmt); sq_setreleasehook(v, -1, sq_mysql_statement_releasehook); return 1; } } return SQ_ERROR; }
SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror) { SQObjectPtr o; #ifndef NO_COMPILER if(Compile(v, read, p, sourcename, o, raiseerror?true:false, _ss(v)->_debuginfo)) { v->Push(SQClosure::Create(_ss(v), _funcproto(o))); return SQ_OK; } return SQ_ERROR; #else return sq_throwerror(v,_SC("this is a no compiler build")); #endif }
static SQInteger sq_func__call(HSQUIRRELVM v) { FFIFunc *ffibuf; sq_getuserdata(v, 1, (void**)&ffibuf, NULL); int top = sq_gettop(v); // printf("ffibuf %p top %d\n", ffibuf, top); if (ffibuf->cif.nargs != ((unsigned)(top - EXTRA_PARAMS))) return sq_throwerror(v, "Wrong number of args"); SQInteger values[top - EXTRA_PARAMS]; void *valueptrs[top - EXTRA_PARAMS]; int i; for (i = EXTRA_PARAMS + 1; i <= top; i++) { #define pi (i - (EXTRA_PARAMS + 1)) switch (sq_gettype(v, i)) { case OT_INTEGER: sq_getinteger(v, i, (SQInteger*)&values[pi]); break; case OT_STRING: sq_getstring(v, i, (const char**)&values[pi]); break; case OT_INSTANCE: { if (SQ_FAILED(sqstd_getblob(v, i, (SQUserPointer*)&values[pi]))) return SQ_ERROR; break; } default: return sq_throwerror(v, "Unimplemented type"); } valueptrs[pi] = &values[pi]; } ptrdiff_t rc; // printf("Before call, %p\n", ffibuf->func); ffi_call(&ffibuf->cif, (void(*)())ffibuf->func, &rc, valueptrs); return_ffi_value(v, rc, ffibuf->rettype); return 1; }
static SQRESULT sq_mysql_escape_string(HSQUIRRELVM v){ SQ_FUNC_VARS_NO_TOP(v); GET_mysql_INSTANCE(); SQ_GET_STRING(v, 2, str); SQInteger to_size = (str_size*2+1) * sizeof(SQChar); SQChar *to = sq_getscratchpad(v, to_size); if(to) { SQInteger new_size = (SQInteger)dlmysql_real_escape_string(self, to, str, str_size); sq_pushstring(v, to, new_size); return 1; } return sq_throwerror(v, _SC("could not allocate escaped string")); }
static SQInteger array_resize(HSQUIRRELVM v) { SQObject &o = stack_get(v, 1); SQObject &nsize = stack_get(v, 2); SQObjectPtr fill; if(sq_isnumeric(nsize)) { if(sq_gettop(v) > 2) fill = stack_get(v, 3); _array(o)->Resize(tointeger(nsize),fill); return 0; } return sq_throwerror(v, _SC("size must be a number")); }