/* toType* functions with a bonus error message */
void* expectType(lua_State* luaSt, int idx, const char* typeName)
{
    void* p;

    p = mw_tonamedudata(luaSt, idx, typeName);
    if (!p)
        mw_lua_typecheck(luaSt, idx, LUA_TUSERDATA, typeName);

    return p;
}
static int evaluateConstants(lua_State* luaSt)
{
    const SeparationConstant* p = constants;

    while (p->name)
    {
        lua_getglobal(luaSt, p->name);
        if (mw_lua_typecheck(luaSt, -1, LUA_TNUMBER, NULL))
        {
            return luaL_error(luaSt, "Expected constant '%s' to be a number\n", p->name);
        }

        *p->value = lua_tonumber(luaSt, -1);
        ++p;
    }

    return 0;
}
static int evaluateConstants(lua_State* luaSt)
{
    const SeparationConstant* c = constants;

    while (c->name)
    {
        lua_getglobal(luaSt, c->name);
        if (mw_lua_typecheck(luaSt, -1, LUA_TNUMBER, NULL))
        {
            return luaL_error(luaSt,
                              "constant '%s': %s",
                              c->name,
                              lua_tostring(luaSt, -1));
        }

        *c->value = lua_tonumber(luaSt, -1);
        ++c;
    }

    return 0;
}
int expectTable(lua_State* luaSt, int idx)
{
    return mw_lua_typecheck(luaSt, idx, LUA_TTABLE, NULL);
}