コード例 #1
0
ファイル: cqpserver.c プロジェクト: cran/rcqp
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 */
}
コード例 #2
0
ファイル: rcqpCommands.c プロジェクト: rforge/rcwb
/* 
 * ------------------------------------------------------------------------
 * 
 * "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;
}