void do_cqi_cl_id2cpos(void) { int *cposlist; int len, id; char *a; Attribute *attribute; a = cqi_read_string(); id = cqi_read_int(); if (server_debug) Rprintf( "CQi: CQI_CL_ID2CPOS('%s', %d)\n", a, id); attribute = cqi_lookup_attribute(a, ATT_POS); if (attribute == NULL) { cqi_command(cqi_errno); } else { cposlist = cl_id2cpos(attribute, id, &len); if (cposlist == NULL) send_cl_error(); else { cqi_data_int_list(cposlist, len); free(cposlist); } } free(a); /* don't forget to free allocated space */ }
/* * ------------------------------------------------------------------------ * * "rcqpCmd_id2cpos(SEXP inAttribute, SEXP inId)" -- * * * * ------------------------------------------------------------------------ */ SEXP rcqpCmd_id2cpos(SEXP inAttribute, SEXP inId) { SEXP result = R_NilValue; int idx; int len, i; int * cposlist; char *a; Attribute * attribute; if (!isString(inAttribute) || length(inAttribute) != 1) error("argument 'attribute' must be a string"); PROTECT(inAttribute); if (!isVector(inId) || length(inId) != 1) error("argument 'id' must be an integer"); PROTECT(inId); a = (char*)CHAR(STRING_ELT(inAttribute,0)); idx = INTEGER(inId)[0]; attribute = cqi_lookup_attribute(a, ATT_POS); if (attribute == NULL) { UNPROTECT(2); rcqp_error_code(cqi_errno); } else { cposlist = cl_id2cpos(attribute, idx, &len); result = PROTECT(allocVector(INTSXP, len)); if (cposlist == NULL) { UNPROTECT(2); rcqp_error_code(cqi_errno); } else { for (i=0; i<len; i++) { INTEGER(result)[i] = cposlist[i]; } free(cposlist); } } UNPROTECT(3); return result; }