Exemplo n.º 1
0
Arquivo: parser.c Projeto: waruqi/vm86
tb_bool_t vm86_parser_get_number_value(tb_char_t const** pp, tb_char_t const* e, tb_uint32_t* value)
{ 
    // check
    tb_assert(pp && e && value);

    // done
    tb_bool_t           ok = tb_false;
    tb_char_t const*    p = *pp;
    do
    {
        // check
        tb_check_break(p < e && (tb_isdigit16(*p) || *p == '-'));

        // is sign?
        tb_bool_t is_sign = tb_false;
        if (*p == '-')
        {
            is_sign = tb_true;
            p++;
        }

        // save the base
        tb_char_t const* b = p;

        // skip the value
        while (p < e && tb_isdigit16(*p)) p++;
        
        // is hex?
        tb_bool_t is_hex = tb_false;
        if (p < e && *p == 'h') 
        {
            is_hex = tb_true;
            p++;
        }

        // check end, exclude variable name
        tb_check_break(!tb_isalpha(*p) && *p != '_');

        // save value
        *value = is_hex? tb_s16tou32(b) : tb_s10tou32(b);
        if (is_sign) *value = (tb_uint32_t)(((tb_sint32_t)*value) * -1);

        // skip the space
        while (p < e && tb_isspace(*p)) p++;

        // ok
        ok = tb_true;

    } while (0);

    // update the code pointer if ok
    if (ok) *pp = p;

    // ok?
    return ok;
}
Exemplo n.º 2
0
tb_bool_t tb_hwaddr_cstr_set(tb_hwaddr_ref_t hwaddr, tb_char_t const* cstr)
{
    // check
    tb_assert_and_check_return_val(cstr, tb_false);

    // done
    tb_uint32_t         v = 0;
    tb_char_t           c = '\0';
    tb_size_t           i = 0;
    tb_char_t const*    p = cstr;
    tb_bool_t           ok = tb_true;
    tb_hwaddr_t         temp;
    do
    {
        // the character
        c = *p++;

        // digit?
        if (tb_isdigit16(c) && v <= 0xff)
        {
            // update value
            if (tb_isdigit10(c))
                v = (v << 4) + (c - '0');
            else if (c > ('a' - 1) && c < ('f' + 1))
                v = (v << 4) + (c - 'a') + 10;
            else if (c > ('A' - 1) && c < ('F' + 1))
                v = (v << 4) + (c - 'A') + 10;
            else 
            {
                // abort
                tb_assert(0);

                // failed
                ok = tb_false;
                break;
            }
        }
        // ':' or "-" or '\0'?
        else if (i < 6 && (c == ':' || c == '-' || !c) && v <= 0xff)
        {
            // save value
            temp.u8[i++] = v;

            // clear value
            v = 0;
        }
        // failed?
        else 
        {
            ok = tb_false;
            break;
        }

    } while (c);

    // failed
    if (i != 6) ok = tb_false;

    // save it if ok
    if (ok && hwaddr) *hwaddr = temp;

    // trace
//    tb_assertf(ok, "invalid hwaddr: %s", cstr);

    // ok?
    return ok;
}