static int bindReturnList(prolog_term returnList, struct xsb_data** result, struct xsb_queryHandle* qHandle) { prolog_term element; char* temp; char c; int i, j; int rFlag; if (is_nil(returnList) && result == NULL) { rFlag = RESULT_NONEMPTY_OR_NOT_REQUESTED; } if (!is_nil(returnList) && result == NULL && qHandle->state == QUERY_BEGIN) { errorMesg = "XSB_DBI_ERROR: Invalid return list in query"; errorNumber = "XSB_DBI_013"; rFlag = INVALID_RETURN_LIST; } else if (!is_nil(returnList) && result == NULL) { while (!is_nil(returnList)) { element = p2p_car(returnList); c2p_nil(CTXTc element); returnList = p2p_cdr(returnList); } rFlag = RESULT_EMPTY_BUT_REQUESTED; } i = 0; if (result != NULL) { while (!is_nil(returnList)) { if (qHandle->numResultCols <= i) { errorMesg = "XSB_DBI ERROR: Number of requested columns exceeds the number of columns in the query"; errorNumber = "XSB_DBI_011"; rFlag = TOO_MANY_RETURN_COLS; return rFlag; } element = p2p_car(returnList); if (result == NULL) { c2p_nil(CTXTc element); } else if (is_var(element) && result[i]->type == STRING_TYPE) { if (result[i]->val == NULL) c2p_nil(CTXTc element); else { c = result[i]->val->str_val[0]; if (c == DB_INTERFACE_TERM_SYMBOL) { temp = (char *)malloc(strlen(result[i]->val->str_val) * sizeof(char)); for (j = 1 ; j < (int)strlen(result[i]->val->str_val) ; j++) { temp[j-1] = result[i]->val->str_val[j]; } temp[strlen(result[i]->val->str_val) - 1] = '\0'; c2p_functor(CTXTc "term", 1, element); c2p_string(CTXTc temp, p2p_arg(element, 1)); if (temp != NULL) { free(temp); temp = NULL; } } else { c2p_string(CTXTc result[i]->val->str_val, element); } } } else if (is_var(element) && result[i]->type == INT_TYPE) c2p_int(CTXTc result[i]->val->i_val, element); else if (is_var(element) && result[i]->type == FLOAT_TYPE) c2p_float(CTXTc result[i]->val->f_val, element); returnList = p2p_cdr(returnList); i++; } rFlag = RESULT_NONEMPTY_OR_NOT_REQUESTED; } if (result != NULL && qHandle->numResultCols > i) { errorMesg = "XSB_DBI ERROR: Number of requested columns is less than the number of returned columns"; errorNumber = "XSB_DBI_012"; rFlag = TOO_FEW_RETURN_COLS; return rFlag; } return rFlag; }
int convert_pyObj_prObj(PyObject *pyObj, prolog_term *prTerm) { if(pyObj == Py_None){ return 1;// todo: check this case for a list with a none in the list. how does prolog side react } if(PyInt_Check(pyObj)) { int result = PyInt_AS_LONG(pyObj); //extern_ctop_int(3, result); c2p_int(result, *prTerm); return 1; } else if(PyFloat_Check(pyObj)) { float result = PyFloat_AS_DOUBLE(pyObj); //extern_ctop_float(3, result); c2p_float(result, *prTerm); return 1; }else if(PyString_Check(pyObj)) { char *result = PyString_AS_STRING(pyObj); //extern_ctop_string(3, result); c2p_string(result, *prTerm); return 1; }else if(PyList_Check(pyObj)) { size_t size = PyList_Size(pyObj); size_t i = 0; prolog_term head, tail; prolog_term P = p2p_new(); tail = P; for(i = 0; i < size; i++) { c2p_list(CTXTc tail); head = p2p_car(CTXTc tail); PyObject *pyObjInner = PyList_GetItem(pyObj, i); //int temp = PyInt_AS_LONG(pyObj); //c2p_int(temp, head); convert_pyObj_prObj(pyObjInner, &head); tail = p2p_cdr(tail); } c2p_nil(CTXTc tail); //p2p_unify(P, reg_term(CTXTc 3)); return 1; }else { //returns an object refernce to prolog side. pyobj_ref_node *node = add_pyobj_ref_list(pyObj); //printf("node : %p", node); char str[30]; sprintf(str, "%p", node); //extern_ctop_string(3,str); prolog_term ref = p2p_new(); c2p_functor("pyObject", 1, ref); prolog_term ref_inner = p2p_arg(ref, 1); c2p_string(str, ref_inner); p2p_unify(ref, *prTerm); return 1; } }