int PyCOMPSDict_set(PyObject *self, PyObject *key, PyObject *val) {
    char *ckey;
    COMPS_Object *ret = NULL;
    for (unsigned i = 0; i < _INFO_->item_types_len; i++) {
        if (Py_TYPE(val) != _INFO_->itemtypes[i])
            continue;
        if (_INFO_->in_convert_funcs[i]) {
            ret = _INFO_->in_convert_funcs[i](val);
            break;
        }
    }
    if (__pycomps_stringable_to_char(key, &ckey))
        return -1;

    if (!ret && val) {
        PyErr_Format(PyExc_TypeError, "Cannot set %s to %s",
                     Py_TYPE(val)->tp_name,
                     Py_TYPE(self)->tp_name);
        free(ckey);
        return -1;
    } else if (val)
        comps_objdict_set_x(_DICT_->dict, ckey, ret);
    else if (!val)
        comps_objdict_unset(_DICT_->dict, ckey);

    free(ckey);
    return 0;
}
Esempio n. 2
0
int pycomps_group_boolattr_setter(PyObject *self, PyObject *val, void *closure) {
    long tmp;
    COMPS_Object *tmp_prop;
    if (!val) {
        PyErr_Format(PyExc_TypeError, "Can't delete %s", (char*)closure);
        return -1;
    }
    if (val && !PyBool_Check(val)) {
        PyErr_SetString(PyExc_TypeError, "Not bool object");
        return -1;
    }
    tmp = (val == Py_True)?1:0;
    tmp_prop = (COMPS_Object*) comps_num(tmp);
    comps_objdict_set_x(((PyCOMPS_Group*)self)->group->properties,
                   (char*)closure, tmp_prop);
    return 0;
}