Exemplo n.º 1
0
hash_t obj_hash(obj_ptr obj)
{
    switch (TYPE(obj))
    {
    case TYPE_INT:
    case TYPE_BOOL:
        return (hash_t) INT(obj);

    case TYPE_SYMBOL:
        return string_hash_imp(SYMBOL(obj));
            
    case TYPE_STRING:
        return string_hash(&STRING(obj));

    case TYPE_CONS:
    {
        hash_t res = 0;

        for (;;)
        {
            if (NTYPEP(obj, TYPE_CONS))
            {
                res += obj_hash(obj);
                break;
            }

            res += obj_hash(CAR(obj));
            obj = CDR(obj);
        }

        return res;
    }

    case TYPE_VEC:
        return vec_hash(&obj->data.as_vec);

    /* These types shouldn't be keys anyway ... */
    case TYPE_FLOAT:
        assert(TYPE(obj) != TYPE_FLOAT);
        break;
    case TYPE_MAP:
        assert(TYPE(obj) != TYPE_MAP);
        break;
    case TYPE_CLOSURE:
        assert(TYPE(obj) != TYPE_CLOSURE);
        break;
    case TYPE_PRIMITIVE:
        assert(TYPE(obj) != TYPE_PRIMITIVE);
        break;
    case TYPE_ERROR:
        assert(TYPE(obj) != TYPE_ERROR);
        break;
    case TYPE_PORT:
        assert(TYPE(obj) != TYPE_PORT);
        break;
    }

    return 0;
}
Exemplo n.º 2
0
Arquivo: gd.c Projeto: suprit/stuff
gdImagePtr get_gdImagePtr(LISP ptr)
{   gdImagePtr im;
    if (NTYPEP(ptr,tc_gdimage))
        err("not a gdImage",ptr);
    if (!(im = (gdImagePtr) ptr->storage_as.string.data))
        err("gd Image deallocated",ptr);
    return(im);
}
Exemplo n.º 3
0
Arquivo: gd.c Projeto: suprit/stuff
gdFontPtr get_gdFontPtr(LISP ptr)
{   gdFontPtr fn;
    if (NTYPEP(ptr,tc_gdfont))
        err("not a gdFont",ptr);
    if (!(fn = (gdFontPtr) ptr->storage_as.string.data))
        err("gd Font deallocated",ptr);
    return(fn);
}
Exemplo n.º 4
0
Arquivo: gd.c Projeto: suprit/stuff
gdPointPtr get_gdPointPtr(LISP ptr,long *n)
{   gdPointPtr pt;
    if (NTYPEP(ptr,tc_gdpoint))
        err("not a gdPoint",ptr);
    if (!(pt = (gdPointPtr) ptr->storage_as.string.data))
        err("gd point deallocated",ptr);
    *n = ptr->storage_as.string.dim;
    return(pt);
}
Exemplo n.º 5
0
int obj_compare(obj_ptr left, obj_ptr right)
{
    /* TODO
    if (NUMP(left) && NUMP(right))
        ...
    */

    if (TYPE(left) < TYPE(right))
        return -1;
    
    if (TYPE(left) > TYPE(right))
        return 1;

    switch (TYPE(left))
    {
    case TYPE_INT:
    case TYPE_BOOL:
        return _int_compare(INT(left), INT(right));

    case TYPE_FLOAT:
        return _float_compare(FLOAT(left), FLOAT(right), 0.00000001); /* TODO: Better epsilon? */

    case TYPE_SYMBOL:
        return strcmp(SYMBOL(left), SYMBOL(right));

    case TYPE_STRING:
        return string_compare(&STRING(left), &STRING(right));

    case TYPE_CONS:
    {
        int res = 0;

        for (;;)
        {
            if (NTYPEP(left, TYPE(right)))
                return obj_compare(left, right);

            if (NTYPEP(left, TYPE_CONS))
                return obj_compare(left, right);

            res = obj_compare(CAR(left), CAR(right));

            if (res != 0)
                return res;
            
            left = CDR(left);
            right = CDR(right);
        }

        assert(0); /* unreachable */
        break;
    }

    case TYPE_VEC:
        return vec_compare(&left->data.as_vec, &right->data.as_vec);

    /* TODO */
    case TYPE_MAP:
        assert(TYPE(left) != TYPE_MAP);
        break;
    case TYPE_CLOSURE:
        assert(TYPE(left) != TYPE_CLOSURE);
        break;
    case TYPE_PRIMITIVE:
        assert(TYPE(left) != TYPE_PRIMITIVE);
        break;
    case TYPE_ERROR:
        assert(TYPE(left) != TYPE_ERROR);
        break;
    case TYPE_PORT:
        assert(TYPE(left) != TYPE_PORT);
        break;
    }

    return 0;
}