jarray jri_putSEXPLArray(JNIEnv *env, SEXP e) { _dbg(rjprintf(" general vector of length %d\n",LENGTH(e))); { unsigned len=LENGTH(e); jlongArray da=(*env)->NewLongArray(env,len); jlong *dae; if (!da) { jri_error("newLongArray.new(%d) failed",len); return 0; } if (len>0) { int i=0; dae=(*env)->GetLongArrayElements(env, da, 0); if (!dae) { (*env)->DeleteLocalRef(env,da); jri_error("newLongArray.GetLongArrayElements failed"); return 0; } while (i<len) { dae[i] = SEXP2L(VECTOR_ELT(e, i)); i++; } (*env)->ReleaseLongArrayElements(env, da, dae, 0); } return da; } }
long r_parse(const char *s){ ParseStatus ps; SEXP pstr, cv; PROTECT(cv=allocVector(STRSXP,1)); SET_STRING_ELT(cv, 0, mkChar(s)); UNPROTECT(1); printf("parsing \"%s\"\n", CHAR(STRING_ELT(cv,0))); pstr=R_ParseVector(cv, 1, &ps, R_NilValue); printf("%d\n",TYPEOF(pstr)); printf("parse status=%d, result=%x, type=%d\n", ps, (int) pstr, (pstr!=0)?TYPEOF(pstr):0); return SEXP2L(pstr); }
long r_eval(long exp, int *er){ SEXP es, exps=L2SEXP(exp); int i=0, l; if (TYPEOF(exps)==EXPRSXP) { /* if the object is a list of exps, eval them one by one */ l=LENGTH(exps); while (i<l) { es=R_tryEval(VECTOR_ELT(exps,i), R_GlobalEnv, er); i++; } } else es=R_tryEval(exps, R_GlobalEnv, er); return SEXP2L(es); }