Exemplo n.º 1
0
Arquivo: xpath.c Projeto: jetaber/XML
static SEXP
convertNodeSetToR(xmlNodeSetPtr obj, SEXP fun, int encoding, SEXP manageMemory)
{
  SEXP ans, expr = NULL, arg = NULL, ref;
  int i;

  if(!obj)
     return(NULL_USER_OBJECT);

  PROTECT(ans = NEW_LIST(obj->nodeNr));

  if(GET_LENGTH(fun) && (TYPEOF(fun) == CLOSXP || TYPEOF(fun) == BUILTINSXP)) {
    PROTECT(expr = allocVector(LANGSXP, 2));
    SETCAR(expr, fun);
    arg = CDR(expr);
  } else if(TYPEOF(fun) == LANGSXP) {
    expr = fun;
    arg = CDR(expr);
  }

  for(i = 0; i < obj->nodeNr; i++) {
      xmlNodePtr el;
      el = obj->nodeTab[i];
      if(el->type == XML_ATTRIBUTE_NODE) {
#if 0
	  PROTECT(ref = mkString((el->children && el->children->content) ? XMLCHAR_TO_CHAR(el->children->content) : ""));
	  SET_NAMES(ref, mkString(el->name));
#else
	  PROTECT(ref = ScalarString(mkCharCE((el->children && el->children->content) ? XMLCHAR_TO_CHAR(el->children->content) : "", encoding)));
	  SET_NAMES(ref, ScalarString(mkCharCE(el->name, encoding)));
#endif
	  SET_CLASS(ref, mkString("XMLAttributeValue"));
	  UNPROTECT(1);
      } else if(el->type == XML_NAMESPACE_DECL)
	  ref = R_createXMLNsRef((xmlNsPtr) el);
      else
        ref = R_createXMLNodeRef(el, manageMemory);

    if(expr) {
      PROTECT(ref);
      SETCAR(arg, ref);
      PROTECT(ref = Rf_eval(expr, R_GlobalEnv)); /*XXX do we want to catch errors here? Maybe to release the namespaces. */
      SET_VECTOR_ELT(ans, i, ref);
      UNPROTECT(2);
    } else
      SET_VECTOR_ELT(ans, i, ref);
  }

  if(expr) {
    if(TYPEOF(fun) == CLOSXP || TYPEOF(fun) == BUILTINSXP)
      UNPROTECT(1);
  } else
    SET_CLASS(ans, mkString("XMLNodeSet"));

  UNPROTECT(1);

  return(ans);
}
Exemplo n.º 2
0
USER_OBJECT_
toRPointer(void *val, const char *typeName)
{
    USER_OBJECT_ ans, klass = NULL;
	GType type = 0;
	
    if(val == NULL)
       return(NULL_USER_OBJECT);

    PROTECT(ans = R_MakeExternalPtr(val, Rf_install(typeName), NULL_USER_OBJECT));
	
	if (typeName)
        type = g_type_from_name(typeName);
    if(type) {
        if (G_TYPE_IS_INSTANTIATABLE(type) || G_TYPE_IS_INTERFACE(type))
            type = G_TYPE_FROM_INSTANCE(val);
        if (G_TYPE_IS_DERIVED(type)) {
            setAttrib(ans, install("interfaces"), R_internal_getInterfaces(type));
            PROTECT(klass = R_internal_getGTypeHierarchy(type));
        }
    }
    if (!klass && typeName) {
        PROTECT(klass = asRString(typeName));
    }
	
    if(klass) {
		SET_CLASS(ans, klass);
		UNPROTECT(1);
    }
	
    UNPROTECT(1);
  
    return(ans);
}
Exemplo n.º 3
0
USER_OBJECT_
asREnum(int value, GType etype)
{
    USER_OBJECT_ ans, names;
    GEnumValue *evalue;
    PROTECT(ans = NEW_INTEGER(1));
    INTEGER_DATA(ans)[0] = value;

    if (!(evalue = g_enum_get_value(g_type_class_ref(etype), value))) {
        PROBLEM "Unknown enum value %d", value
        ERROR;
    }

    PROTECT(names = NEW_CHARACTER(1));
    SET_STRING_ELT(names, 0, COPY_TO_USER_STRING(evalue->value_name));
    SET_NAMES(ans, names);

    PROTECT(names = NEW_CHARACTER(2));
    SET_STRING_ELT(names, 0, COPY_TO_USER_STRING(g_type_name(etype)));
    SET_STRING_ELT(names, 1, COPY_TO_USER_STRING("enum"));
    SET_CLASS(ans, names);

    UNPROTECT(3);

    return(ans);
}
Exemplo n.º 4
0
SEXP
R_connect(SEXP className, SEXP raiseError)
{
  IUnknown *unknown = NULL;
  HRESULT hr;
  SEXP ans = R_NilValue;
  CLSID classId;

  if(R_getCLSIDFromString(className, &classId) == S_OK) {
    hr = GetActiveObject(classId, NULL, &unknown);
    if(SUCCEEDED(hr)) {
      void *ptr;
      hr = unknown->QueryInterface(IID_IDispatch, &ptr);
      ans = R_createRCOMUnknownObject((void *) ptr, "COMIDispatch");
    } else {
      if(LOGICAL(raiseError)[0]) {
	/* From COMError.cpp  - COMError */
	TCHAR buf[512];
	GetScodeString(hr, buf, sizeof(buf)/sizeof(buf[0]));
	PROTECT(ans = mkString(buf));
	SET_CLASS(ans, mkString("COMErrorString"));
	UNPROTECT(1);
        return(ans);
      } else
	return(R_NilValue);
    }
  } else {
      PROBLEM "Couldn't get clsid from the string"
	WARN;
  }
  return(ans);
}
Exemplo n.º 5
0
SEXP
R_connect_hWnd(SEXP className, SEXP excel_hWnd, SEXP raiseError)
{
  IUnknown *unknown = NULL;
  HRESULT hr;
  SEXP ans = R_NilValue;
  CLSID classId;
  LONG_PTR l_hwnd;
  HWND temp_hwdn;
  if(R_getCLSIDFromString(className, &classId) == S_OK) {
	l_hwnd = (LONG_PTR)INTEGER(excel_hWnd)[0];
	temp_hwdn = (HWND)l_hwnd;
    hr = AccessibleObjectFromWindow(temp_hwdn, OBJID_NATIVEOM, classId, (void**)&unknown);
    if(hr == S_OK) {
      void *ptr;
      hr = unknown->QueryInterface(IID_IDispatch, &ptr);
      ans = R_createRCOMUnknownObject((void *) ptr, "COMIDispatch");
    } else {
      if(LOGICAL(raiseError)[0]) {
	/* From COMError.cpp  - COMError */
	TCHAR buf[512];
	GetScodeString(hr, buf, sizeof(buf)/sizeof(buf[0]));
	PROTECT(ans = mkString(buf));
	SET_CLASS(ans, mkString("COMErrorString"));
	UNPROTECT(1);
        return(ans);
      } else
	return(R_NilValue);
    }
  } else {
      PROBLEM "Couldn't get clsid from the string"
	WARN;
  }
  return(ans);
}
Exemplo n.º 6
0
SEXP
R_makeEnumValue(int val, const char *elName, const char *className)
{
    SEXP ans, klass;
    #if defined(USE_S4_ENUMS)
    
    SEXP tmp;
    PROTECT(klass = MAKE_CLASS(className));
    PROTECT(ans = NEW(klass));
    PROTECT(tmp = ScalarInteger(val));
    SET_NAMES(tmp, mkString(elName));
    ans = SET_SLOT(ans, Rf_install(".Data"), tmp);
    UNPROTECT(3);
    
    #else
    
    PROTECT(ans = ScalarInteger(val));
    SET_NAMES(ans, mkString(elName));
    PROTECT(klass = NEW_CHARACTER(2));
    SET_STRING_ELT(klass, 0, mkChar(className));
    SET_STRING_ELT(klass, 1, mkChar("EnumValue"));
    SET_CLASS(ans, klass);
    UNPROTECT(2);
    
    #endif
    
    return(ans);
}
Exemplo n.º 7
0
SEXP
createREnumerationValue(int val, const char * const *names, const int *values, int namesLength, const char *name)
{
    SEXP ans;
    int i;

    PROTECT(ans =allocVector(INTSXP, 1));
    INTEGER(ans)[0] = val;
    
    for(i = 0; i < namesLength; i++) {
	if(val == values[i]) {
	    SET_NAMES(ans, mkString(names[i]));
	    break;
	}
    }

    if(i == namesLength) {
	PROBLEM "Unrecognized value (%d) in enumeration %s", val, name
        ERROR;
    }
    /* Do we want an enumeration value element here also. */
    SET_CLASS(ans, mkString(name));

    Rf_PrintValue(ans);

    UNPROTECT(1);
    return(ans);
}
Exemplo n.º 8
0
USER_OBJECT_
toRPointerWithFinalizer(gconstpointer val, const gchar *typeName, RPointerFinalizer finalizer)
{
    USER_OBJECT_ ans;
    USER_OBJECT_ r_finalizer = NULL_USER_OBJECT;
    USER_OBJECT_ klass = NULL, rgtk_class;
    int i = 0;
    GType type = 0;

    if(!val)
       return(NULL_USER_OBJECT);

    if (finalizer) {
        PROTECT(r_finalizer = R_MakeExternalPtr(finalizer, NULL_USER_OBJECT, NULL_USER_OBJECT));
    }
    PROTECT(ans = R_MakeExternalPtr((gpointer)val, r_finalizer, NULL_USER_OBJECT));
    if (finalizer) {
        R_RegisterCFinalizer(ans, RGtk_finalizer);
    }
    if (typeName)
        type = g_type_from_name(typeName);
    if(type) {
        if (G_TYPE_IS_INSTANTIATABLE(type) || G_TYPE_IS_INTERFACE(type))
            type = G_TYPE_FROM_INSTANCE(val);
        if (G_TYPE_IS_DERIVED(type)) {
            setAttrib(ans, install("interfaces"), R_internal_getInterfaces(type));
            PROTECT(klass = R_internal_getGTypeAncestors(type));
        }
    }
    if (!klass && typeName) {
        PROTECT(klass = asRString(typeName));
    }

    if (klass) { /* so much trouble just to add "RGtkObject" onto the end */
        PROTECT(rgtk_class = NEW_CHARACTER(GET_LENGTH(klass)+1));
        for (i = 0; i < GET_LENGTH(klass); i++)
            SET_STRING_ELT(rgtk_class, i, STRING_ELT(klass, i));
    } else {
        PROTECT(rgtk_class = NEW_CHARACTER(1));
    }

    SET_STRING_ELT(rgtk_class, i, COPY_TO_USER_STRING("RGtkObject"));
    SET_CLASS(ans, rgtk_class);

    if (g_type_is_a(type, S_TYPE_G_OBJECT)) {
      USER_OBJECT_ public_sym = install(".public");
      setAttrib(ans, public_sym, findVar(public_sym, S_GOBJECT_GET_ENV(val)));
    }
        
    if (klass)
        UNPROTECT(1);
    if (finalizer)
        UNPROTECT(1);
    UNPROTECT(2);

    return(ans);
}
Exemplo n.º 9
0
SEXP 
makeNodeRef(JSONNODE *node)
{
    SEXP ans;
    PROTECT(ans = R_MakeExternalPtr(node, Rf_install("JSONNODE"), R_NilValue));
    SET_CLASS(ans, ScalarString(mkChar("JSONNODE")));
    UNPROTECT(1);
    return(ans);

}
Exemplo n.º 10
0
Arquivo: Utils.c Projeto: cran/XML
/*
  Set the class of the target object to be the character vector containing
  just the specified name.
 */
int
RS_XML(SetClassName)(const char *localClassName, USER_OBJECT_ target)
{
    USER_OBJECT_ className;
     PROTECT(className = NEW_CHARACTER(1)); 

       SET_STRING_ELT(className, 0, mkChar(localClassName));
       SET_CLASS(target, className);
     UNPROTECT(1);
 
  return(1);
}
Exemplo n.º 11
0
void
R_schemaValidityFunctionCall(R_SchemaValidCallback *ctx, int warning, const char *msg, va_list args)
{
    SEXP arg;
    char buf[10000];
    vsnprintf(buf, sizeof(buf)/sizeof(buf[0]), msg, args);
    PROTECT(arg = mkString(buf));
    SET_CLASS(arg, mkString(warning ? "XMLSchemaWarning" : "XMLSchemaError"));
    SETCAR(CDR(ctx->fun), arg);
    Rf_eval(ctx->fun, R_GlobalEnv);
    UNPROTECT(1);
}
Exemplo n.º 12
0
Arquivo: doc.c Projeto: cran/rsbml
SEXP
rsbml_create_doc_ptr(SBMLDocument_t *doc)
{
  SEXP r_doc, class_vector;
  PROTECT(class_vector = NEW_CHARACTER(1));
  SET_STRING_ELT(class_vector, 0, mkChar("SBMLDocument"));
  r_doc = R_MakeExternalPtr(doc, R_NilValue, R_NilValue);
  R_RegisterCFinalizer(r_doc, (R_CFinalizer_t)rsbml_R_free_doc);
  SET_CLASS(r_doc, class_vector);
  UNPROTECT(1);
  return r_doc;
}
Exemplo n.º 13
0
void methctx_reference(STATE, OBJECT ctx) {
  struct fast_context *fc;

  /* Don't do it again. */
  if(!stack_context_p(ctx)) return;
  
  /* Has to be done first because this uses informated we're about
     to overwrite. */
  object_memory_context_referenced(state->om, ctx);
  
  CLEAR_FLAGS(ctx);
  ctx->gc_zone = YoungObjectZone;
  switch(FASTCTX(ctx)->type) {
  case FASTCTX_NORMAL:
    SET_CLASS(ctx, BASIC_CLASS(fastctx));
    ctx->obj_type = MContextType;
    ctx->CTXFast = TRUE;
    break;
  case FASTCTX_BLOCK:  
    SET_CLASS(ctx, BASIC_CLASS(blokctx));
    ctx->obj_type = BContextType;
    break;
  case FASTCTX_NMC:
    SET_CLASS(ctx, BASIC_CLASS(nmc));
    ctx->obj_type = MContextType;
    break;
  }
  SET_NUM_FIELDS(ctx, FASTCTX_FIELDS);
  ctx->StoresBytes = TRUE;
  ctx->ForeverYoung = TRUE;
  
  fc = FASTCTX(ctx);
  
  /* Fixup the locals tuple. */
  if(!NIL_P(fc->locals) && fc->locals->gc_zone == 0) {
    fc->locals->gc_zone = YoungObjectZone;
  }

}
Exemplo n.º 14
0
USER_OBJECT_
makeForeignPerlReference(SV *ref, USER_OBJECT_ classes, ForeignReferenceTable *table)
{
 int n;
 USER_OBJECT_ rsRef, el;
 char *key;
 dTHX;

#ifdef USE_NEW_PERL_REFERENCES

  SvREFCNT_inc(ref);
  /* We make this into a list with the external pointer inside it as the first element
     as some of the R code wants to treat it like a list. We will gradually remove this.*/
  rsRef = NEW_LIST(1);
  PROTECT(rsRef);
  SET_VECTOR_ELT(rsRef, 0, el = R_MakeExternalPtr((void *) ref, Rf_install("PerlReference"), R_NilValue));
  R_RegisterCFinalizer(el, Rperl_ReleaseReference);
  SET_NAMES(rsRef, mkString("ref"));
  if(GET_LENGTH(classes)) {
     SET_CLASS(rsRef, classes);
  }
  UNPROTECT(1);

#else

 if(table == NULL)
   table= &exportReferenceTable;

 if(table->entries == NULL) {
   table->entries = newHV();
   SvREFCNT_inc(table->entries);
   n = 0;
 } else
   n = table->numReferences;

 key = (char *) calloc(15, sizeof(char));
 if(!key) { 
   PROBLEM  "Cannot allocaate 15 bytes for perl foreign reference key"
   ERROR;
 }
 sprintf(key, "%ld", (long) n);
 hv_store(table->entries, key, strlen(key), ref, 0);
 SvREFCNT_inc(ref);

 table->numReferences++;

 rsRef = makeRSReferenceObject(key, classes, table);
#endif 

 return(rsRef);
}
Exemplo n.º 15
0
SEXP wrapPointer(void *ptr, QList<QByteArray> classNames,
                 R_CFinalizer_t finalizer)
{
  SEXP ans;
  PROTECT(ans = R_MakeExternalPtr(ptr, R_NilValue, R_NilValue));
  if (finalizer)
    R_RegisterCFinalizer(ans, finalizer);
  SEXP rclassNames = allocVector(STRSXP, classNames.size());
  SET_CLASS(ans, rclassNames);
  for (int i = 0; i < length(rclassNames); i++)
    SET_STRING_ELT(rclassNames, i, mkChar(classNames[i].constData()));
  UNPROTECT(1);
  return ans;
}
Exemplo n.º 16
0
USER_OBJECT_
asRFlag(guint value, GType ftype)
{
    USER_OBJECT_ ans, names;
    PROTECT(ans = NEW_INTEGER(1));
    INTEGER_DATA(ans)[0] = value;

    PROTECT(names = NEW_CHARACTER(2));
    SET_STRING_ELT(names, 0, COPY_TO_USER_STRING(g_type_name(ftype)));
    SET_STRING_ELT(names, 1, COPY_TO_USER_STRING("flag"));
    SET_CLASS(ans, names);

    UNPROTECT(2);
    return(ans);
}
Exemplo n.º 17
0
USER_OBJECT_
RGnumeric_createCellReference(Cell *cell, Sheet *sheet)
{
  USER_OBJECT_ ans, klass;
  const char *elNames[] = {"cell", "sheet"};
  PROTECT(ans = NEW_LIST(2));
    SET_VECTOR_ELT(ans, 0, RGnumeric_createInternalReference((void*)cell, "GnumericCellPtr"));
    SET_VECTOR_ELT(ans, 1, RGnumeric_sheetReference(sheet));
    Internal_setNames(elNames, 2, ans);
  PROTECT(klass = NEW_CHARACTER(1));
  SET_STRING_ELT(klass, 0, COPY_TO_USER_STRING("GnumericCellRef"));
  SET_CLASS(ans, klass);
  UNPROTECT(2);
  return(ans);
}
Exemplo n.º 18
0
USER_OBJECT_
RGnumeric_workbookReference(Workbook *sheet)
{
  USER_OBJECT_ ans, klass;
  double val = (double) (long) sheet;

  PROTECT(ans = NEW_NUMERIC(1));
   NUMERIC_DATA(ans)[0] = val;
  PROTECT(klass = NEW_CHARACTER(1)); 
   SET_STRING_ELT(klass, 0, COPY_TO_USER_STRING("GnumericWorkbookRef"));
  
  SET_CLASS(ans, klass);
  UNPROTECT(2);

  return(ans);
}
Exemplo n.º 19
0
SEXP
R_getEventLoop()
{
  SEXP ans, tmp;
  /* Will move to S4 classes very soon when we have a NEW() C symbol for these. */
  if(!R_eloop) {
     return(R_NilValue);
  }

#if S4_CLASSES

  PROTECT(ans = getREventLoopObject());
   /* Have to create _and populate_ the character vector before calling SET_SLOT().
      Otherwise, if we create it in the call to SET_SLOT() and populate later, it comes
      out empty.*/
  PROTECT(tmp = NEW_CHARACTER(1));
  if(R_eloop->name)
      SET_STRING_ELT(tmp, 0, mkChar(R_eloop->name));
  SET_SLOT(ans, Rf_install("name"), tmp);

  SET_SLOT(ans, Rf_install("address"), R_MakeExternalPtr(R_eloop, Rf_install("REventLoop"), R_NilValue));
  UNPROTECT(2);
#else

  PROTECT(ans = NEW_LIST(2));  
  SET_VECTOR_ELT(ans, ELOOP_NAME_SLOT, tmp = NEW_CHARACTER(1));
  if(R_eloop->name)
      SET_STRING_ELT(tmp, 0, mkChar(R_eloop->name));

  SET_VECTOR_ELT(ans, ELOOP_ADDRESS_SLOT, R_MakeExternalPtr(R_eloop, Rf_install("REventLoop"), R_NilValue));

  PROTECT(tmp = NEW_CHARACTER(2));
  SET_VECTOR_ELT(tmp, ELOOP_NAME_SLOT, mkChar("name"));
  SET_VECTOR_ELT(tmp, ELOOP_ADDRESS_SLOT, mkChar("address"));
  SET_NAMES(ans, tmp);

  PROTECT(tmp = NEW_CHARACTER(1));
  SET_VECTOR_ELT(tmp, 0, mkChar("REventLoop"));
  SET_CLASS(ans, tmp);

  UNPROTECT(3);
#endif

  return(ans);
}
Exemplo n.º 20
0
SEXP
makeXMLTextNode(zorba::Item child)
{
  SEXP ans, classes, names;
  const char * txt;

  txt = child.getStringValue().c_str();
  PROTECT(ans = NEW_LIST(5));
  SET_VECTOR_ELT(ans, 2, mkString(txt));
  PROTECT(names = makeRNames(nodeNames, sizeof(nodeNames)/sizeof(nodeNames[0])));
  SET_STRING_ELT(names, 2, mkChar("value"));
  SET_NAMES(ans, names);
  SET_VECTOR_ELT(ans, 0, mkString("text"));

  SET_CLASS(ans, makeXMLClassVector("XMLTextNode"));
  UNPROTECT(2);
  return(ans);
}
Exemplo n.º 21
0
SEXP 
newRClosureTable(SEXP handlers)
{
 R_ObjectTable *tb;
 SEXP val, klass, env;

  tb = (R_ObjectTable *) malloc(sizeof(R_ObjectTable));
  if(!tb)
      error("cannot allocate space for an internal R object table");

  tb->type = 15;
  tb->cachedNames = NULL;
  tb->active = TRUE;

  R_PreserveObject(handlers);
  tb->privateData = handlers;

  tb->exists = RClosureTable_exists;
  tb->get = RClosureTable_get;
  tb->remove = RClosureTable_remove;
  tb->assign = RClosureTable_assign;
  tb->objects = RClosureTable_objects;
  tb->canCache = RClosureTable_canCache;

  tb->onAttach = NULL;
  tb->onDetach = NULL;

  PROTECT(val = R_MakeExternalPtr(tb, Rf_install("UserDefinedDatabase"), R_NilValue));
  PROTECT(klass = NEW_CHARACTER(1));

  SET_STRING_ELT(klass, 0, COPY_TO_USER_STRING("UserDefinedDatabase"));
  SET_CLASS(val, klass);

  env = allocSExp(ENVSXP);
  SET_HASHTAB(env, val);
  SET_ENCLOS(env, R_GlobalEnv);
  setAttrib(env, R_ClassSymbol, getAttrib(HASHTAB(env), R_ClassSymbol));

  UNPROTECT(2);

  return(env);
}
Exemplo n.º 22
0
USER_OBJECT_
makeRSReferenceObject(char *id, USER_OBJECT_ classes, ForeignReferenceTable *table)
{
 USER_OBJECT_ ans, names, tmp;
 char *slotNames[] = {"id", "table", "pid", "class"};
 int i;
 
  if(classes && GET_LENGTH(classes)) {
    PROTECT(classes);
  }

  PROTECT(ans =  NEW_LIST(NUM_REF_SLOTS));
    SET_VECTOR_ELT(ans, ID_SLOT, tmp = NEW_CHARACTER(1));
      SET_STRING_ELT(tmp, 0, COPY_TO_USER_STRING(id));

    SET_VECTOR_ELT(ans, TABLE_SLOT, tmp = NEW_CHARACTER(1));
       /* No name yet. */
    SET_VECTOR_ELT(ans, PID_SLOT, tmp = NEW_NUMERIC(1));
      NUMERIC_DATA(tmp)[0] = getpid();

  PROTECT(names = NEW_CHARACTER(NUM_REF_SLOTS));
   for(i = 0; i < NUM_REF_SLOTS;  i++)
      SET_STRING_ELT(names, i, COPY_TO_USER_STRING(slotNames[i]));

   SET_NAMES(ans, names);
   if(classes && GET_LENGTH(classes))
       SET_CLASS(ans, classes);


  UNPROTECT(2);
  if(GET_LENGTH(classes)) {
   UNPROTECT(1);
  }

 return(ans);
}
Exemplo n.º 23
0
SEXP
R_json_dateStringOp(const char *value, cetype_t encoding)
{
    int withNew = 0, noNew = 0;

    if( (noNew = (strncmp(value, "/Date(", 6)  == 0)) ||
          (withNew = strncmp(value, "/new Date(", 10)) == 0) {
        double num;
	if(noNew) 
   	   sscanf(value + 6, "%lf)/", &num);
	else
   	   sscanf(value + 10, "%lf)/", &num);

	SEXP ans, classNames;
        PROTECT(ans = ScalarReal(num));
	PROTECT(classNames = NEW_CHARACTER(2));
	SET_STRING_ELT(classNames, 0, mkChar("POSIXct"));
	SET_STRING_ELT(classNames, 1, mkChar("POSIXt"));
	SET_CLASS(ans, classNames);
        UNPROTECT(2);
	return(ans);
    } else
       return(ScalarString(mkCharCE(value, encoding)));
}
Exemplo n.º 24
0
USER_OBJECT_
toRPangoAttribute(PangoAttribute *attr, gboolean owns)
{
    char *type = NULL;
    USER_OBJECT_ result;
    char *classes[] = { NULL, "PangoAttribute", "RGtkObject", NULL };

    if (!attr)
      return NULL_USER_OBJECT;
    
    switch(attr->klass->type) {
         case PANGO_ATTR_LANGUAGE:
            type = "PangoAttrLanguage";
         break;
		 case PANGO_ATTR_FAMILY:
            type = "PangoAttrString";
         break;
		 case PANGO_ATTR_STYLE:
         case PANGO_ATTR_WEIGHT:
         case PANGO_ATTR_VARIANT:
         case PANGO_ATTR_STRETCH:
		 case PANGO_ATTR_UNDERLINE:
		 case PANGO_ATTR_STRIKETHROUGH:
		 case PANGO_ATTR_RISE:
		 case PANGO_ATTR_FALLBACK:
         case PANGO_ATTR_LETTER_SPACING:
         	type = "PangoAttrInt";
         break;
		 case PANGO_ATTR_SIZE:
		 case PANGO_ATTR_ABSOLUTE_SIZE:
            type = "PangoAttrSize";
         break;
		 case PANGO_ATTR_FONT_DESC:
            type = "PangoAttrFontDesc";
         break;
		 case PANGO_ATTR_FOREGROUND:
		 case PANGO_ATTR_BACKGROUND:
		 case PANGO_ATTR_UNDERLINE_COLOR:
		 case PANGO_ATTR_STRIKETHROUGH_COLOR:
            type = "PangoAttrColor";
         break;		 
		 case PANGO_ATTR_SHAPE:
            type = "PangoAttrShape";
         break;
		 case PANGO_ATTR_SCALE:
            type = "PangoAttrFloat";
         break;
		 case PANGO_ATTR_INVALID:
		 	type = "PangoAttrInvalid";
		 break;
		 default:
		 	PROBLEM "Error converting PangoAttribute: unknown type %d", attr->klass->type
			ERROR;
	}
	
	classes[0] = type;
  
  if (!owns)
    attr = pango_attribute_copy(attr);
  
	PROTECT(result = toRPointerWithFinalizer(attr, NULL, (RPointerFinalizer)pango_attribute_destroy));
	
	SET_CLASS(result, asRStringArray(classes));
	
	UNPROTECT(1);
	
	return(result);
}
Exemplo n.º 25
0
SEXP
makeXMLNode(zorba::Item it, bool ref)
{
  SEXP ans;

  if(ref) {
      return(makeXMLNodeRef(it));
  }


  PROTECT(ans = NEW_LIST(sizeof(nodeNames)/sizeof(nodeNames[0])));

     zorba::Iterator_t kids, vals;
     unsigned int n = 0, i, numAttrs = 0;
     zorba::Item child, val;

     SEXP names, tmp;

     it.getNodeName(val);
     SET_VECTOR_ELT(ans, 0, mkString(val.getStringValue().c_str()));

     kids = it.getAttributes();
     kids->open();  while(kids->next(child)) n++;  kids->close();
     
     PROTECT(tmp = NEW_CHARACTER(n));
     PROTECT(names = NEW_CHARACTER(n));

        for(i = 0, kids->open(); i < n ; i++)  {
          kids->next(child);
	  child.getNodeName(val);
          SET_STRING_ELT(tmp, i, mkChar(child.getStringValue().c_str()));
          SET_STRING_ELT(names, i, mkChar(val.getStringValue().c_str()));
        }  
        numAttrs = n;
        SET_NAMES(tmp, names);
        SET_VECTOR_ELT(ans, 1, tmp);
    UNPROTECT(2);
      
  /* child nodes.*/

     n = 0;
     kids = it.getChildren();
     kids->open();  while(kids->next(child)) n++;  kids->close();

 
     SEXP r_kids;
     PROTECT(r_kids = NEW_LIST(n));
        kids->open();
        for(i = 0; i < n ; i++)  {
	  kids->next(child);

	  SEXP tmp = convertItemToR(child);
          PROTECT(tmp);
          if(TYPEOF(tmp) == STRSXP) {
              tmp = makeTextNode(tmp);
          }
	  SET_VECTOR_ELT(r_kids, i, tmp);
          UNPROTECT(1);
	}
	kids->close();
     
        SET_VECTOR_ELT(ans, 2, r_kids);
     UNPROTECT(1);

     RSetNames(ans, nodeNames);

  SET_CLASS(ans, makeRNames(nodeClassNames, sizeof(nodeClassNames)/sizeof(nodeClassNames[0])));
  // SET_CLASS(ans, mkString("XMLNode"));
  UNPROTECT(1);
  return(ans);
}
Exemplo n.º 26
0
SEXP 
processJSONNode(JSONNODE *n, int parentType, int simplify, SEXP nullValue, int simplifyWithNames, cetype_t charEncoding,
                 SEXP r_stringCall, StringFunctionType str_fun_type)
{
    
    if (n == NULL){
        PROBLEM "invalid JSON input"
	    ERROR;
    }
 
    JSONNODE *i;
    int len = 0, ctr = 0;
    int nprotect = 0;
    int numNulls = 0;
    len = json_size(n);
    char startType = parentType; // was 127
    
    int isNullHomogeneous = (TYPEOF(nullValue) == LGLSXP || TYPEOF(nullValue) == REALSXP ||
                                TYPEOF(nullValue) == STRSXP || TYPEOF(nullValue) == INTSXP);
    int numStrings = 0;
    int numLogicals = 0;
    int numNumbers = 0;

    SEXP ans, names = NULL;
    PROTECT(ans = NEW_LIST(len)); nprotect++;

    int homogeneous = 0;
    int elType = NILSXP;
    while (ctr < len){  // i != json_end(n)

	i = json_at(n, ctr);

        if (i == NULL){
            PROBLEM "Invalid JSON Node"
		ERROR;
        }

	json_char *node_name = json_name(i);
	
	char type = json_type(i);
	if(startType == 127)
	    startType = type;

	SEXP el;
	switch(type) {
   	   case JSON_NULL:
	       el = nullValue; /* R_NilValue; */
	       numNulls++;
	       if(isNullHomogeneous) {
		   homogeneous++;
		   elType = setType(elType, TYPEOF(nullValue));
	       } else
		   elType = TYPEOF(nullValue);
	       break;
   	   case JSON_ARRAY:
  	   case JSON_NODE:
	       el = processJSONNode(i, type, simplify, nullValue, simplifyWithNames, charEncoding, r_stringCall, str_fun_type);
	       if(Rf_length(el) > 1)
		   elType = VECSXP;
	       else
		   elType = setType(elType, TYPEOF(el));
	       break;
 	   case JSON_NUMBER:
	       el = ScalarReal(json_as_float(i));
	       homogeneous++;
	       elType = setType(elType, REALSXP);
	       numNumbers++;
	       break;
 	   case JSON_BOOL:
	       el = ScalarLogical(json_as_bool(i));
	       elType = setType(elType, LGLSXP);
	       numLogicals++;
	       break;
 	   case JSON_STRING:
	   {
//XXX Garbage collection
#if 0 //def JSON_UNICODE
	       wchar_t *wtmp = json_as_string(i);
	       char *tmp;
	       int len = wcslen(wtmp);
	       int size = sizeof(char) * (len * MB_LEN_MAX + 1);
	       tmp = (char *)malloc(size);
	       if (tmp == NULL) {
                   PROBLEM "Cannot allocate memory"
                   ERROR;
               }
	       wcstombs(tmp, wtmp, size);
#else
    char *tmp = json_as_string(i);
//    tmp = reEnc(tmp, CE_BYTES, CE_UTF8, 1);
#endif


    if(r_stringCall != NULL && TYPEOF(r_stringCall) == EXTPTRSXP) {
        if(str_fun_type == SEXP_STR_ROUTINE) {
	    SEXPStringRoutine fun;
	    fun = (SEXPStringRoutine) R_ExternalPtrAddr(r_stringCall);	    
	    el = fun(tmp, charEncoding);
	} else {
	    char *tmp1;
	    StringRoutine fun;
	    fun = (StringRoutine) R_ExternalPtrAddr(r_stringCall);
	    tmp1 = fun(tmp);
	    if(tmp1 != tmp)
		json_free(tmp);
	    tmp = tmp1;
	    el = ScalarString(mkCharCE(tmp, charEncoding));
	}
    } else {
	el = ScalarString(mkCharCE(tmp, charEncoding));
    	     /* Call the R function if there is one. */
	if(r_stringCall != NULL) {
	    SETCAR(CDR(r_stringCall), el);
	    el = Rf_eval(r_stringCall, R_GlobalEnv);
	}
	/* XXX compute with elType. */
    }

	       json_free(tmp);
	       
	       elType = setType(elType, 
   				     /* If we have a class, not a primitive type */
                                  Rf_length(getAttrib(el, Rf_install("class"))) ? LISTSXP : TYPEOF(el));
               if(r_stringCall != NULL && str_fun_type != NATIVE_STR_ROUTINE) {
		   switch(TYPEOF(el)) {
			  case REALSXP:
   			     numNumbers++;
			  break;
			  case LGLSXP:
   			     numLogicals++;
			  break;
			  case STRSXP:
   			     numStrings++;
			  break;
		   }
	       } else if(TYPEOF(el) == STRSXP) 
		   numStrings++;
      }
	       break;
	default:
	    PROBLEM "shouldn't be here"
		WARN;
	    el = R_NilValue;
	    break;
	}
	SET_VECTOR_ELT(ans, ctr, el);

	if(parentType == JSON_NODE || (node_name && node_name[0])) {
	    if(names == NULL) {
	        PROTECT(names = NEW_CHARACTER(len)); nprotect++;
	    }
	    if(node_name && node_name[0])
		SET_STRING_ELT(names, ctr, mkChar(node_name));
	}
	json_free(node_name);
	ctr++;
    }

    /* If we have an empty object, we try to make it into a form equivalent to emptyNamedList
       if it is a {},  or as an AsIs object in R if an empty array. */
    if(len == 0 && (parentType == -1 || parentType == JSON_ARRAY || parentType == JSON_NODE)) {
        if(parentType == -1) 
            parentType = startType;

        if(parentType == JSON_NODE)
	   SET_NAMES(ans, NEW_CHARACTER(0));
        else  {
	   SET_CLASS(ans, ScalarString(mkChar("AsIs")));
	}

    } else if(simplifyWithNames || names == NULL || Rf_length(names) == 0) {
	int allSame = (numNumbers == len || numStrings == len || numLogicals == len) || 
	    ((TYPEOF(nullValue) == LGLSXP && LOGICAL(nullValue)[0] == NA_INTEGER) && 
	     ((numNumbers + numNulls) == len || (numStrings + numNulls) == len || (numLogicals + numNulls) == len));
        homogeneous = allSame ||  ( (numNumbers + numStrings + numLogicals + numNulls) == len);
        if(simplify == NONE) {
	} else if(allSame && 
 		   (numNumbers == len && (simplify & STRICT_NUMERIC)) ||
  		      ((numLogicals == len) && (simplify & STRICT_LOGICAL)) ||
		      ( (numStrings == len) && (simplify & STRICT_CHARACTER))) {
   	       ans = makeVector(ans, len, elType, nullValue);
	} else if((simplify == ALL && homogeneous) || (simplify == STRICT && allSame)) {
   	       ans = makeVector(ans, len, elType, nullValue);
	}
    }
      

    if(names)
	SET_NAMES(ans, names);
	
    UNPROTECT(nprotect);
    return(ans);
}
Exemplo n.º 27
0
SEXP sdf_do_biglm(SEXP sdfx, SEXP svecy, SEXP sdfx_dim, SEXP intercept) {
    SEXP sdflm, qr, D, rbar, thetab, tmp;
    int np, nrbar, nprotect = 0, intrcpt, i, ier;
    double *xrow, y, *ptrD, *ptrrbar, *ptrthetab, sserr, weight;
    sqlite3_stmt *stmt1, *stmt2;
    const char *inamex, *inamey, *tblnamey, *varnamey;

    inamex = SDF_INAME(sdfx);

    inamey = SDF_INAME(svecy);
    tblnamey = SVEC_TBLNAME(svecy);
    varnamey = SVEC_VARNAME(svecy);

    if (!USE_SDF1(inamex, TRUE, TRUE)) return R_NilValue;
    if (!USE_SDF1(inamey, TRUE, TRUE)) return R_NilValue;

    /* get number of columns for sdfx */
    np = INTEGER(sdfx_dim)[1];
    intrcpt = (LOGICAL(intercept)[0]) ? 1 : 0;
    np += intrcpt;
    nrbar = (np*(np-1))/2;

    /* Rprintf("np: %d, nrbar %d\n", np, nrbar); */

    PROTECT(D = NEW_NUMERIC(np));
    nprotect++;
    PROTECT(rbar = NEW_NUMERIC(nrbar));
    nprotect++;
    PROTECT(thetab = NEW_NUMERIC(np));
    nprotect++;
    xrow = (double *)R_alloc(np, sizeof(double));

    /* initialize bigqr values */
    if (intrcpt) xrow[0] = 1.0;
    sserr = 0.0;
    ptrD = REAL(D);
    ptrrbar = REAL(rbar);
    ptrthetab = REAL(thetab);
    for (i = 0; i < np; i++) ptrD[i] = ptrrbar[i] = ptrthetab[i] = 0.0;
    for ( ; i < nrbar; i++) ptrrbar[i] = 0.0;

    /* setup sqlite_stmt's */
    sprintf(g_sql_buf[0], "select * from [%s].sdf_data", inamex);
    _sqlite_error(sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt1, NULL));
    sprintf(g_sql_buf[0], "select [%s] from [%s].[%s]", varnamey, inamey, tblnamey);
    _sqlite_error(sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt2, NULL));

    if (intrcpt) {
        while (sqlite3_step(stmt1) == SQLITE_ROW) {
            sqlite3_step(stmt2);
            for (i = 1; i < np; i++)
                xrow[i] = sqlite3_column_double(stmt1, i);
            y = sqlite3_column_double(stmt2, 0);
            weight = 1.0;
            /*__include(np, nrbar, ptrD, ptrrbar, ptrthetab, &sserr, xrow, y, 1.0); */
            F77_CALL(includ)(&np, &nrbar, &weight, xrow, &y, ptrD, ptrrbar, ptrthetab, &sserr, &ier);
        }
    } else {
        while (sqlite3_step(stmt1) == SQLITE_ROW) {
            sqlite3_step(stmt2);
            for (i = 0; i < np; i++)
                xrow[i] = sqlite3_column_double(stmt1, i+1);
            y = sqlite3_column_double(stmt2, 0);
            /*__include(np, nrbar, ptrD, ptrrbar, ptrthetab, &sserr, xrow, y, 1.0); */
            weight = 1;
            F77_CALL(includ)(&np, &nrbar, &weight, xrow, &y, ptrD, ptrrbar, ptrthetab, &sserr, &ier);
        }
    }

    sqlite3_finalize(stmt1);
    sqlite3_finalize(stmt2);

    /* setup bigqr SEXP */
    PROTECT(qr = NEW_LIST(6));
    nprotect++;

    /* set names */
    PROTECT(tmp = NEW_CHARACTER(6));
    nprotect++;
    SET_STRING_ELT(tmp, 0, mkChar("D"));
    SET_STRING_ELT(tmp, 1, mkChar("rbar"));
    SET_STRING_ELT(tmp, 2, mkChar("thetab"));
    SET_STRING_ELT(tmp, 3, mkChar("ss"));
    SET_STRING_ELT(tmp, 4, mkChar("checked"));
    SET_STRING_ELT(tmp, 5, mkChar("tol"));
    SET_NAMES(qr, tmp);

    /* set values */
    SET_VECTOR_ELT(qr, 0, D);
    SET_VECTOR_ELT(qr, 1, rbar);
    SET_VECTOR_ELT(qr, 2, thetab);
    SET_VECTOR_ELT(qr, 3, ScalarReal(sserr));
    SET_VECTOR_ELT(qr, 4, ScalarLogical(FALSE));
    PROTECT(tmp = NEW_NUMERIC(np));
    nprotect++;
    for (i = 0; i < np; i++) REAL(tmp)[i] = 0.0;
    SET_VECTOR_ELT(qr, 5, tmp);

    /* set class */
    SET_CLASS(qr, mkString("bigqr"));

    /* setup sdflm SEXP */
    PROTECT(sdflm = NEW_LIST(3));
    nprotect++;

    PROTECT(tmp = NEW_CHARACTER(3));
    nprotect++;
    SET_STRING_ELT(tmp, 0, mkChar("qr"));
    SET_STRING_ELT(tmp, 1, mkChar("X"));
    SET_STRING_ELT(tmp, 2, mkChar("intercept"));
    SET_NAMES(sdflm, tmp);

    SET_VECTOR_ELT(sdflm, 0, qr);
    SET_VECTOR_ELT(sdflm, 1, duplicate(sdfx));
    SET_VECTOR_ELT(sdflm, 2, ScalarLogical(intrcpt));

    PROTECT(tmp = NEW_CHARACTER(2));
    nprotect++;
    SET_STRING_ELT(tmp, 0, mkChar("sdflm"));
    SET_STRING_ELT(tmp, 1, mkChar("biglm"));
    SET_CLASS(sdflm, tmp);

    UNPROTECT(nprotect);
    UNUSE_SDF2(inamex);
    UNUSE_SDF2(inamey);
    return sdflm;
}