Example #1
0
static tb_bool_t xm_semver_select_from_branches(lua_State* lua, tb_int_t fromidx, tb_char_t const* range_str, tb_size_t range_len)
{
    lua_Integer i = 0;
    luaL_checktype(lua, fromidx, LUA_TTABLE);
    for (i = lua_objlen(lua, fromidx); i > 0; --i) 
    {
        lua_pushinteger(lua, i);
        lua_gettable(lua, fromidx);

        tb_char_t const* source_str = luaL_checkstring(lua, -1);
        tb_check_continue(source_str);

        tb_size_t source_len = tb_strlen(source_str);
        if (source_len == range_len && tb_memcmp(source_str, range_str, source_len) == 0) 
        {
            lua_createtable(lua, 0, 2);

            lua_pushlstring(lua, source_str, source_len);
            lua_setfield(lua, -2, "version");

            lua_pushstring(lua, "branches");
            lua_setfield(lua, -2, "source");

            // ok
            return tb_true;
        }
    }

    // no matches
    return tb_false;
}
Example #2
0
File: mem.c Project: siwuxian/xmake
static tb_long_t tb_iterator_mem_comp(tb_iterator_ref_t iterator, tb_cpointer_t litem, tb_cpointer_t ritem)
{
    // check
    tb_assert(litem && ritem);

    // compare it
    return tb_memcmp(litem, ritem, iterator->step);
}
Example #3
0
tb_bool_t tb_hwaddr_is_equal(tb_hwaddr_ref_t hwaddr, tb_hwaddr_ref_t other)
{
    // check
    tb_assert_and_check_return_val(hwaddr && other, tb_false);

    // is equal?
    return !tb_memcmp(hwaddr->u8, other->u8, sizeof(hwaddr->u8));
}
Example #4
0
static tb_long_t tb_iterator_init_mem_comp(tb_iterator_ref_t iterator, tb_cpointer_t ltem, tb_cpointer_t rtem)
{
    // check
    tb_assert_return_val(ltem && rtem, 0);

    // compare it
    return tb_memcmp(ltem, rtem, iterator->step);
}
Example #5
0
// satisfies wrapper
tb_int_t xm_semver_select(lua_State* lua)
{
    semver_t semver = {0};
    semvers_t matches = {0};
    semver_range_t range = {0};
    lua_Integer i;
    size_t range_len = 0, source_len;
    tb_char_t const* source_str;
    tb_char_t const* source;
    tb_bool_t is_range;

    lua_settop(lua, 4);

    // check
    tb_assert_and_check_return_val(lua, 0);

    // get the version string
    tb_char_t const* range_str = luaL_checkstring(lua, 1);
    tb_check_return_val(range_str, 0);
    range_len = tb_strlen(range_str);

    is_range = semver_rangen(&range, range_str, range_len) == 0;
    if (is_range) {
        source = "versions";
        luaL_checktype(lua, 2, LUA_TTABLE);
        for (i = lua_objlen(lua, 2); i > 0; --i) {
            lua_pushinteger(lua, i);
            lua_gettable(lua, 2);

            source_str = luaL_checkstring(lua, -1);
            tb_check_return_val(source_str, 0);

            if (semver_tryn(&semver, source_str, tb_strlen(source_str)) == 0) {
                if (semver_range_match(semver, range)) {
                    semvers_push(matches, semver);
                } else {
                    semver_dtor(&semver);
                }
            }
        }
        if (matches.length) {
            goto match;
        }
        semvers_clear(matches);
        source = "tags";
        luaL_checktype(lua, 3, LUA_TTABLE);
        for (i = lua_objlen(lua, 3); i > 0; --i) {
            lua_pushinteger(lua, i);
            lua_gettable(lua, 3);

            source_str = luaL_checkstring(lua, -1);
            tb_check_return_val(source_str, 0);

            if (semver_tryn(&semver, source_str, tb_strlen(source_str)) == 0) {
                if (semver_range_match(semver, range)) {
                    semvers_push(matches, semver);
                } else {
                    semver_dtor(&semver);
                }
            }
        }
        if (matches.length) {
            goto match;
        }
        semvers_dtor(matches);
        semver_range_dtor(&range);
    }

    source = "branches";
    luaL_checktype(lua, 4, LUA_TTABLE);
    for (i = lua_objlen(lua, 4); i > 0; --i) {
        lua_pushinteger(lua, i);
        lua_gettable(lua, 4);

        source_str = luaL_checkstring(lua, -1);
        tb_check_return_val(source_str, 0);
        source_len = tb_strlen(source_str);

        if (source_len == range_len && tb_memcmp(source_str, range_str, source_len) == 0) {
            lua_createtable(lua, 0, 2);

            lua_pushlstring(lua, source_str, source_len);
            lua_setfield(lua, -2, "version");

            lua_pushstring(lua, source);
            lua_setfield(lua, -2, "source");

            return 1;
        }
    }

    if (!is_range)  {
        lua_pushnil(lua);
        lua_pushfstring(lua, "Unable to parse semver range '%s'", range_str);

        return 2;
    }
    lua_pushnil(lua);
    lua_pushfstring(lua, "Unable to select version for range '%s'", range_str);

    return 2;
    match:
    semvers_sort(matches);
    semver = semvers_pop(matches);
    lua_createtable(lua, 0, 2);

    lua_pushstring(lua, semver.raw);
    lua_setfield(lua, -2, "version");

    lua_pushstring(lua, source);
    lua_setfield(lua, -2, "source");

    semvers_dtor(matches);
    semver_dtor(&semver);
    semver_range_dtor(&range);

    return 1;
}