mp_string mp_rtsl(MP mp,const char*s,size_t l){ mp_string str,nstr; str= new_strings_entry(mp); str->str= (unsigned char*)mp_xstrldup(mp,s,l); str->len= l; nstr= (mp_string)avl_find(str,mp->strings); if(nstr==NULL){ assert(avl_ins(str,mp->strings,avl_false)> 0); nstr= (mp_string)avl_find(str,mp->strings); } (void)delete_strings_entry(str); add_str_ref(nstr); return nstr; }
Py_LOCAL(PyObject *) avl_tree_ins(avl_tree_Object * self, PyObject * args) { PyObject *arg1, *arg2 = NULL; avl_code_t rv; if (!PyArg_ParseTuple(args, "O|O:insert", &arg1, &arg2)) return NULL; if (arg2 == NULL) { rv = avl_ins((void *) arg1, self->tree, avl_true); /* compare failed and insertion was prevented */ if (rv == -2) return NULL; } else if (PyInt_Check(arg2) || PyLong_Check(arg2)) { long idx = PyInt_AsLong(arg2); /*PyInt_AsUnsignedLongMask(arg2) */ avl_size_t rank; if (idx < 0) rank = idx + avl_size(self->tree); else rank = idx; if ((rv = avl_ins_index((void *) arg1, rank + 1, self->tree)) == 0) { PyErr_SetString(PyExc_IndexError, "insertion index out of range"); return NULL; } } else { PyErr_SetString(PyExc_TypeError, "insertion index expected (argument 2)"); return NULL; } if (rv < 0) { PyErr_SetString(avlErrorObject, "Sorry, couldn't insert item"); return NULL; } Py_INCREF(Py_None); return Py_None; }
mp_string mp_make_string(MP mp){ mp_string str; mp_lstring tmp; tmp.str= mp->cur_string; tmp.len= mp->cur_length; str= (mp_string)avl_find(&tmp,mp->strings); if(str==NULL){ str= mp_xmalloc(mp,1,sizeof(mp_lstring)); str->str= mp->cur_string; str->len= tmp.len; assert(avl_ins(str,mp->strings,avl_false)> 0); str= (mp_string)avl_find(&tmp,mp->strings); mp->pool_in_use= mp->pool_in_use+(integer)str->len; if(mp->pool_in_use> mp->max_pl_used) mp->max_pl_used= mp->pool_in_use; mp->strs_in_use++; if(mp->strs_in_use> mp->max_strs_used) mp->max_strs_used= mp->strs_in_use; } add_str_ref(str); mp_reset_cur_string(mp); return str; }
avl_tree_load_list(avl_tree_Object * self, PyObject * list, avl_bool_t unique) { PyObject *iter; int err = 0; if ((iter = PyObject_GetIter(list)) == NULL) { PyErr_Clear(); PyErr_SetString(avlErrorObject, "Couldn't get list iterator !"); err = 1; } else { PyObject *val; int rc; self->compare_err = 0; while ((val = PyIter_Next(iter)) != NULL) { rc = avl_ins((void *) val, self->tree, !unique); Py_DECREF(val); /* PyIter_Next returns a new reference */ if (rc < 0) { if (self->compare_err == 0) PyErr_SetString(avlErrorObject, "Couldn't insert item retrieved from list !"); # if 0==1 avl_empty(self->tree); # endif err = 1; break; } } Py_DECREF(iter); } return err; }