XPT_Do16(XPTCursor *cursor, uint16_t *u16p) { union { uint8_t b8[2]; uint16_t b16; } u; if (!CHECK_COUNT(cursor, 2)) return PR_FALSE; if (ENCODING(cursor)) { u.b16 = XPT_SWAB16(*u16p); CURS_POINT(cursor) = u.b8[0]; cursor->offset++; CURS_POINT(cursor) = u.b8[1]; } else { u.b8[0] = CURS_POINT(cursor); cursor->offset++; u.b8[1] = CURS_POINT(cursor); *u16p = XPT_SWAB16(u.b16); } cursor->offset++; return PR_TRUE; }
void get_unistate(int sidx, int *val, int count) { CHECK_INDEX(sidx); CHECK_COUNT(count, state[sidx].type); memcpy(val, state[sidx].ival, count * sizeof *val); }
XPT_Do32(XPTCursor *cursor, uint32_t *u32p) { union { uint8_t b8[4]; uint32_t b32; } u; if (!CHECK_COUNT(cursor, 4)) return PR_FALSE; if (ENCODING(cursor)) { u.b32 = XPT_SWAB32(*u32p); CURS_POINT(cursor) = u.b8[0]; cursor->offset++; CURS_POINT(cursor) = u.b8[1]; cursor->offset++; CURS_POINT(cursor) = u.b8[2]; cursor->offset++; CURS_POINT(cursor) = u.b8[3]; } else { u.b8[0] = CURS_POINT(cursor); cursor->offset++; u.b8[1] = CURS_POINT(cursor); cursor->offset++; u.b8[2] = CURS_POINT(cursor); cursor->offset++; u.b8[3] = CURS_POINT(cursor); *u32p = XPT_SWAB32(u.b32); } cursor->offset++; return PR_TRUE; }
void set_unistate(int sidx, const float *val, int count) { CHECK_INDEX(sidx); CHECK_COUNT(count, state[sidx].type); memcpy(state[sidx].fval, val, count * sizeof *state[sidx].fval); state[sidx].transpose = 0; }
XPT_Do8(NotNull<XPTCursor*> cursor, uint8_t *u8p) { if (!CHECK_COUNT(cursor, 1)) return false; *u8p = CURS_POINT(cursor); cursor->offset++; return true; }
XPT_Do8(XPTCursor *cursor, uint8_t *u8p) { if (!CHECK_COUNT(cursor, 1)) return PR_FALSE; if (cursor->state->mode == XPT_ENCODE) CURS_POINT(cursor) = *u8p; else *u8p = CURS_POINT(cursor); cursor->offset++; return PR_TRUE; }
void ScriptManager::init() { addExtension("ScriptHooks", [this](asIScriptEngine* eng) { eng->SetDefaultNamespace("Hooks"); eng->RegisterGlobalFunction("void Add(const string&in, const string&in)", asMETHOD(ScriptManager, addHookFromScript), asCALL_THISCALL_ASGLOBAL, this); eng->RegisterGlobalFunction("void Remove(const string&in, const string&in = \"\")", asMETHOD(ScriptManager, removeHookFromScript), asCALL_THISCALL_ASGLOBAL, this); eng->SetDefaultNamespace(""); }); asIScriptEngine* eng = asCreateScriptEngine(ANGELSCRIPT_VERSION); eng->SetUserData(this, 0x4547); eng->SetMessageCallback(asFUNCTION(error), this, asCALL_CDECL_OBJFIRST); #ifndef NDEBUG std::unordered_map<std::string, uint32_t> counts; #define CHECK_COUNT(Name, Check) do { \ auto cnt = eng->Get ## Check ## Count(); \ if (counts.count(Name) > 0 && cnt != counts.at(Name)) \ { \ std::cout << "> " << (cnt - counts.at(Name)) << " new " Name "(s)" << std::endl; \ } \ counts[Name] = cnt; \ } while (false); #else #define CHECK_COUNT(A, B) #endif for (auto& ext : mExtensions) { std::cout << "Registering " << std::get<0>(ext) << "..." << std::endl; try { std::get<1>(ext)(eng); CHECK_COUNT("enum", Enum); CHECK_COUNT("funcdef", Funcdef); CHECK_COUNT("global function", GlobalFunction); CHECK_COUNT("global property", GlobalProperty); CHECK_COUNT("object type", ObjectType); CHECK_COUNT("typedef", Typedef); } catch (const std::runtime_error& ex) { std::cerr << std::string(ex.what()) << std::endl; std::cout << "Failed to register " << std::get<0>(ext) << std::endl; } } #undef CHECK_COUNT //eng->ClearMessageCallback(); mEngine = eng; }
XPT_Do16(NotNull<XPTCursor*> cursor, uint16_t *u16p) { union { uint8_t b8[2]; uint16_t b16; } u; if (!CHECK_COUNT(cursor, 2)) return false; u.b8[0] = CURS_POINT(cursor); cursor->offset++; u.b8[1] = CURS_POINT(cursor); *u16p = XPT_SWAB16(u.b16); cursor->offset++; return true; }
XPT_MakeCursor(XPTState *state, XPTPool pool, uint32_t len, XPTCursor *cursor) { cursor->state = state; cursor->pool = pool; cursor->bits = 0; cursor->offset = state->next_cursor[pool]; if (!(CHECK_COUNT(cursor, len))) return PR_FALSE; /* this check should be in CHECK_CURSOR */ if (pool == XPT_DATA && !state->data_offset) { fprintf(stderr, "no data offset for XPT_DATA cursor!\n"); return PR_FALSE; } state->next_cursor[pool] += len; return PR_TRUE; }
XPT_Do32(NotNull<XPTCursor*> cursor, uint32_t *u32p) { union { uint8_t b8[4]; uint32_t b32; } u; if (!CHECK_COUNT(cursor, 4)) return false; u.b8[0] = CURS_POINT(cursor); cursor->offset++; u.b8[1] = CURS_POINT(cursor); cursor->offset++; u.b8[2] = CURS_POINT(cursor); cursor->offset++; u.b8[3] = CURS_POINT(cursor); *u32p = XPT_SWAB32(u.b32); cursor->offset++; return true; }