[rkward-cvs] SF.net SVN: rkward:[3151] branches/2010_10_18_backend_restructuring_branch/ rkward/rbackend
tfry at users.sourceforge.net
tfry at users.sourceforge.net
Tue Oct 26 11:15:50 UTC 2010
Revision: 3151
http://rkward.svn.sourceforge.net/rkward/?rev=3151&view=rev
Author: tfry
Date: 2010-10-26 11:15:50 +0000 (Tue, 26 Oct 2010)
Log Message:
-----------
Move some support functions into the RKRSupport namespace
Modified Paths:
--------------
branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rembedinternal.cpp
branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rkrsupport.cpp
branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rkrsupport.h
branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rkstructuregetter.cpp
Modified: branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rembedinternal.cpp
===================================================================
--- branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rembedinternal.cpp 2010-10-26 08:15:17 UTC (rev 3150)
+++ branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rembedinternal.cpp 2010-10-26 11:15:50 UTC (rev 3151)
@@ -29,6 +29,7 @@
#include "../core/robject.h"
#include "../debug.h"
+#include "rkrsupport.h"
#include "rklocalesupport.h"
#include "rkpthreadsupport.h"
#include "rksignalsupport.h"
@@ -46,9 +47,7 @@
#include <sys/resource.h>
#include <sys/types.h>
#endif
-#include <math.h>
-
extern "C" {
#define R_INTERFACE_PTRS 1
// for R_CStackStart/Limit
@@ -102,15 +101,10 @@
#include <R_ext/eventloop.h>
}
-#include "rkrsupport.h"
#include "../rkglobals.h"
#include "rdata.h"
-SEXP RKWard_RData_Tag;
-QString *SEXPToStringList (SEXP from_exp, unsigned int *count);
-QString SEXPToString (SEXP from_exp);
-int *SEXPToIntArray (SEXP from_exp, unsigned int *count);
-int SEXPToInt (SEXP from_exp, int def_value = INT_MIN);
+extern SEXP RKWard_RData_Tag;
SEXP parseCommand (const QString &command_qstring, RThread::RKWardRError *error);
SEXP runCommandInternalBase (SEXP pr, RThread::RKWardRError *error);
@@ -231,7 +225,7 @@
// fully transmitted, but R is still asking for more? This looks like an incomplete statement.
// HOWEVER: It may also have been an empty statement such as " ", so let's check whether the prompt looks like a "continue" prompt
bool incomplete = false;
- if (RThread::this_pointer->current_locale_codec->toUnicode (prompt) == SEXPToString (Rf_GetOption (Rf_install ("continue"), R_BaseEnv))) {
+ if (RThread::this_pointer->current_locale_codec->toUnicode (prompt) == RKRSupport::SEXPToString (Rf_GetOption (Rf_install ("continue"), R_BaseEnv))) {
incomplete = true;
}
MUTEX_LOCK;
@@ -251,7 +245,7 @@
RThread::this_pointer->commandFinished ();
} else if (RThread::repl_status.user_command_status == RThread::RKReplStatus::UserCommandRunning) {
// it appears, the user command triggered a call to readline.
- int n_frames = SEXPToInt (RKRSupport::callSimpleFun0 (Rf_findFun (Rf_install ("sys.nframe"), R_BaseEnv), R_GlobalEnv));
+ int n_frames = RKRSupport::SEXPToInt (RKRSupport::callSimpleFun0 (Rf_findFun (Rf_install ("sys.nframe"), R_BaseEnv), R_GlobalEnv));
if (n_frames < 1) {
// No active frames? This is either a browser() call at toplevel, or R jumped us back to toplevel, behind our backs.
// For safety, let's reset and start over.
@@ -431,10 +425,10 @@
// this function would be much shorter, if SEXPToStringList would simply return a QStringList...
unsigned int files_count, titles_count;
- QString *file_strings = SEXPToStringList (files, &files_count);
- QString *title_strings = SEXPToStringList (titles, &titles_count);
- QString wtitle_string = SEXPToString (wtitle);
- bool del_files = SEXPToInt (del, 0) != 0;
+ QString *file_strings = RKRSupport::SEXPToStringList (files, &files_count);
+ QString *title_strings = RKRSupport::SEXPToStringList (titles, &titles_count);
+ QString wtitle_string = RKRSupport::SEXPToString (wtitle);
+ bool del_files = RKRSupport::SEXPToInt (del, 0) != 0;
RK_ASSERT (files_count == titles_count);
RK_ASSERT (files_count >= 1);
@@ -508,7 +502,7 @@
SEXP doDialog (SEXP caption, SEXP message, SEXP button_yes, SEXP button_no, SEXP button_cancel, SEXP wait) {
RK_TRACE (RBACKEND);
- int result = doDialogHelper (SEXPToString (caption), SEXPToString (message), SEXPToString (button_yes), SEXPToString (button_no), SEXPToString (button_cancel), SEXPToInt (wait));
+ int result = doDialogHelper (RKRSupport::SEXPToString (caption), RKRSupport::SEXPToString (message), RKRSupport::SEXPToString (button_yes), RKRSupport::SEXPToString (button_no), RKRSupport::SEXPToString (button_cancel), RKRSupport::SEXPToInt (wait));
SEXP ret = Rf_allocVector(INTSXP, 1);
INTEGER (ret)[0] = result;
@@ -678,176 +672,6 @@
RThread::repl_status.eval_depth--;
}
-/** converts SEXP to strings, and returns the first string (or QString(), if SEXP contains no strings) */
-QString SEXPToString (SEXP from_exp) {
- RK_TRACE (RBACKEND);
-
- QString ret;
-
- unsigned int count;
- QString *list = SEXPToStringList (from_exp, &count);
-
- if (count >= 1) ret = list[0];
- delete [] list;
- return ret;
-}
-
-QString *SEXPToStringList (SEXP from_exp, unsigned int *count) {
- RK_TRACE (RBACKEND);
-
- // bad format? coerce the vector first
- if (TYPEOF (from_exp) != STRSXP) {
- SEXP strexp;
- PROTECT (strexp = Rf_coerceVector (from_exp, STRSXP));
- QString *list = SEXPToStringList (strexp, count);
- UNPROTECT (1);
- return list;
- }
-
- // format already good? Avoid coercion (and associated copying)
- *count = Rf_length (from_exp);
- QString *list = new QString[*count];
- unsigned int i = 0;
- for (; i < *count; ++i) {
- SEXP dummy = STRING_ELT (from_exp, i);
-
- if (TYPEOF (dummy) != CHARSXP) {
- list[i] = QString ("not defined"); // can this ever happen?
- } else {
- if (dummy == NA_STRING) {
- list[i] = QString::null;
- } else {
- if (IS_UTF8 (dummy)) {
- list[i] = QString::fromUtf8 ((char *) STRING_PTR (dummy));
- } else if (IS_LATIN1 (dummy)) {
- list[i] = QString::fromLatin1 ((char *) STRING_PTR (dummy));
- } else {
- list[i] = RThread::this_pointer->current_locale_codec->toUnicode ((char *) STRING_PTR (dummy));
- }
- }
- }
- }
-
- return list;
-}
-
-int *SEXPToIntArray (SEXP from_exp, unsigned int *count) {
- RK_TRACE (RBACKEND);
-
- int *integers;
-
- // bad format? coerce the vector first
- if (TYPEOF (from_exp) != INTSXP) {
- SEXP intexp;
- PROTECT (intexp = Rf_coerceVector (from_exp, INTSXP));
- integers = SEXPToIntArray (intexp, count);
- UNPROTECT (1);
- return integers;
- }
-
- // format already good? Avoid coercion (and associated copying)
- *count = Rf_length (from_exp);
- integers = new int[*count];
- for (unsigned int i = 0; i < *count; ++i) {
- integers[i] = INTEGER (from_exp)[i];
- if (integers[i] == R_NaInt) integers[i] = INT_MIN; // this has no effect for now, but if R ever chnages it's R_NaInt, then it will
- }
- return integers;
-}
-
-/** converts SEXP to integers, and returns the first int (def_value, if SEXP contains no ints) */
-int SEXPToInt (SEXP from_exp, int def_value) {
- RK_TRACE (RBACKEND);
-
- int ret = def_value;
- unsigned int count;
- int *integers = SEXPToIntArray (from_exp, &count);
- if (count >= 1) ret = integers[0];
- delete [] integers;
-
- return ret;
-}
-
-double *SEXPToRealArray (SEXP from_exp, unsigned int *count) {
- RK_TRACE (RBACKEND);
-
- double *reals;
-
- // bad format? coerce the vector first
- if (TYPEOF (from_exp) != REALSXP) {
- SEXP realexp;
- PROTECT (realexp = Rf_coerceVector (from_exp, REALSXP));
- reals = SEXPToRealArray (realexp, count);
- UNPROTECT (1);
- return reals;
- }
-
- // format already good? Avoid coercion (and associated copying)
- *count = Rf_length (from_exp);
- reals = new double[*count];
- for (unsigned int i = 0; i < *count; ++i) {
- reals[i] = REAL (from_exp)[i];
- if (R_IsNaN (reals[i]) || R_IsNA (reals[i]) ) reals[i] = RKGlobals::na_double;
- }
- return reals;
-}
-
-RData *SEXPToRData (SEXP from_exp) {
- RK_TRACE (RBACKEND);
-
- RData *data = new RData;
-
- unsigned int count;
- int type = TYPEOF (from_exp);
- switch (type) {
- case LGLSXP:
- case INTSXP:
- data->data = SEXPToIntArray (from_exp, &count);
- data->datatype = RData::IntVector;
- break;
- case REALSXP:
- data->data = SEXPToRealArray (from_exp, &count);
- data->datatype = RData::RealVector;
- break;
- case VECSXP:
- count = 0;
- count = Rf_length (from_exp);
- {
- RData **structure_array = new RData*[count];
- for (unsigned int i=0; i < count; ++i) {
- SEXP subexp = VECTOR_ELT (from_exp, i);
- //PROTECT (subexp); // should already be protected as part of the parent from_exp
- structure_array[i] = SEXPToRData (subexp);
- //UNPROTECT (1);
- }
- data->data = structure_array;
- }
- data->datatype = RData::StructureVector;
- break;
-/* case NILSXP:
- data->data = 0;
- data->datatype = RData::NoData;
- count = 0;
- break; */
- case EXTPTRSXP:
- if (R_ExternalPtrTag (from_exp) == RKWard_RData_Tag) { // our very own data
- delete data;
- data = (RData*) R_ExternalPtrAddr (from_exp);
- R_ClearExternalPtr (from_exp);
- count = data->length;
- break;
- }
- case STRSXP:
- default:
- data->data = SEXPToStringList (from_exp, &count);
- data->datatype = RData::StringVector;
- }
-
- data->length = count;
-
- return data;
-}
-
SEXP doError (SEXP call) {
RK_TRACE (RBACKEND);
@@ -855,7 +679,7 @@
RThread::this_pointer->repl_status.user_command_status = RThread::RKReplStatus::UserCommandFailed;
}
unsigned int count;
- QString *strings = SEXPToStringList (call, &count);
+ QString *strings = RKRSupport::SEXPToStringList (call, &count);
RThread::this_pointer->handleError (strings, count);
delete [] strings;
return R_NilValue;
@@ -865,7 +689,7 @@
RK_TRACE (RBACKEND);
unsigned int count;
- QString *strings = SEXPToStringList (call, &count);
+ QString *strings = RKRSupport::SEXPToStringList (call, &count);
QStringList list;
for (unsigned int i = 0; i < count; ++i) {
list.append (strings[i]);
@@ -1155,15 +979,15 @@
if (error == NoError) {
if (ctype & RCommand::GetStringVector) {
retdata.datatype = RData::StringVector;
- retdata.data = SEXPToStringList (exp, &(retdata.length));
+ retdata.data = RKRSupport::SEXPToStringList (exp, &(retdata.length));
} else if (ctype & RCommand::GetRealVector) {
retdata.datatype = RData::RealVector;
- retdata.data = SEXPToRealArray (exp, &(retdata.length));
+ retdata.data = RKRSupport::SEXPToRealArray (exp, &(retdata.length));
} else if (ctype & RCommand::GetIntVector) {
retdata.datatype = RData::IntVector;
- retdata.data = SEXPToIntArray (exp, &(retdata.length));
+ retdata.data = RKRSupport::SEXPToIntArray (exp, &(retdata.length));
} else if (ctype & RCommand::GetStructuredData) {
- RData *dummy = SEXPToRData (exp);
+ RData *dummy = RKRSupport::SEXPToRData (exp);
retdata.setData (*dummy);
delete dummy;
}
Modified: branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rkrsupport.cpp
===================================================================
--- branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rkrsupport.cpp 2010-10-26 08:15:17 UTC (rev 3150)
+++ branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rkrsupport.cpp 2010-10-26 11:15:50 UTC (rev 3151)
@@ -17,8 +17,21 @@
#include "rkrsupport.h"
+#include <Rdefines.h>
+
+// needed to detect CHARSXP encoding
+#define IS_UTF8(x) (Rf_getCharCE(x) == CE_UTF8)
+#define IS_LATIN1(x) (Rf_getCharCE(x) == CE_LATIN1)
+
+#include <QTextCodec>
+
+#include "../rkglobals.h"
+#include "rembedinternal.h"
#include "../debug.h"
+// This is sort of idiotic, but placing RKWard_RData_Tag into the RKRSupport-namespace somehow confuses the hell out of G++ (4.4.5)
+SEXP RKWard_RData_Tag;
+
SEXP RKRSupport::callSimpleFun0 (SEXP fun, SEXP env) {
SEXP call = Rf_allocVector (LANGSXP, 1);
PROTECT (call);
@@ -60,3 +73,173 @@
RK_ASSERT (TYPEOF (res) == LGLSXP);
return ((bool) LOGICAL (res)[0]);
}
+
+/** converts SEXP to strings, and returns the first string (or QString(), if SEXP contains no strings) */
+QString RKRSupport::SEXPToString (SEXP from_exp) {
+ RK_TRACE (RBACKEND);
+
+ QString ret;
+
+ unsigned int count;
+ QString *list = SEXPToStringList (from_exp, &count);
+
+ if (count >= 1) ret = list[0];
+ delete [] list;
+ return ret;
+}
+
+QString *RKRSupport::SEXPToStringList (SEXP from_exp, unsigned int *count) {
+ RK_TRACE (RBACKEND);
+
+ // bad format? coerce the vector first
+ if (TYPEOF (from_exp) != STRSXP) {
+ SEXP strexp;
+ PROTECT (strexp = Rf_coerceVector (from_exp, STRSXP));
+ QString *list = SEXPToStringList (strexp, count);
+ UNPROTECT (1);
+ return list;
+ }
+
+ // format already good? Avoid coercion (and associated copying)
+ *count = Rf_length (from_exp);
+ QString *list = new QString[*count];
+ unsigned int i = 0;
+ for (; i < *count; ++i) {
+ SEXP dummy = STRING_ELT (from_exp, i);
+
+ if (TYPEOF (dummy) != CHARSXP) {
+ list[i] = QString ("not defined"); // can this ever happen?
+ } else {
+ if (dummy == NA_STRING) {
+ list[i] = QString::null;
+ } else {
+ if (IS_UTF8 (dummy)) {
+ list[i] = QString::fromUtf8 ((char *) STRING_PTR (dummy));
+ } else if (IS_LATIN1 (dummy)) {
+ list[i] = QString::fromLatin1 ((char *) STRING_PTR (dummy));
+ } else {
+ list[i] = RThread::this_pointer->current_locale_codec->toUnicode ((char *) STRING_PTR (dummy));
+ }
+ }
+ }
+ }
+
+ return list;
+}
+
+int *RKRSupport::SEXPToIntArray (SEXP from_exp, unsigned int *count) {
+ RK_TRACE (RBACKEND);
+
+ int *integers;
+
+ // bad format? coerce the vector first
+ if (TYPEOF (from_exp) != INTSXP) {
+ SEXP intexp;
+ PROTECT (intexp = Rf_coerceVector (from_exp, INTSXP));
+ integers = SEXPToIntArray (intexp, count);
+ UNPROTECT (1);
+ return integers;
+ }
+
+ // format already good? Avoid coercion (and associated copying)
+ *count = Rf_length (from_exp);
+ integers = new int[*count];
+ for (unsigned int i = 0; i < *count; ++i) {
+ integers[i] = INTEGER (from_exp)[i];
+ if (integers[i] == R_NaInt) integers[i] = INT_MIN; // this has no effect for now, but if R ever chnages it's R_NaInt, then it will
+ }
+ return integers;
+}
+
+/** converts SEXP to integers, and returns the first int (def_value, if SEXP contains no ints) */
+int RKRSupport::SEXPToInt (SEXP from_exp, int def_value) {
+ RK_TRACE (RBACKEND);
+
+ int ret = def_value;
+ unsigned int count;
+ int *integers = SEXPToIntArray (from_exp, &count);
+ if (count >= 1) ret = integers[0];
+ delete [] integers;
+
+ return ret;
+}
+
+double *RKRSupport::SEXPToRealArray (SEXP from_exp, unsigned int *count) {
+ RK_TRACE (RBACKEND);
+
+ double *reals;
+
+ // bad format? coerce the vector first
+ if (TYPEOF (from_exp) != REALSXP) {
+ SEXP realexp;
+ PROTECT (realexp = Rf_coerceVector (from_exp, REALSXP));
+ reals = SEXPToRealArray (realexp, count);
+ UNPROTECT (1);
+ return reals;
+ }
+
+ // format already good? Avoid coercion (and associated copying)
+ *count = Rf_length (from_exp);
+ reals = new double[*count];
+ for (unsigned int i = 0; i < *count; ++i) {
+ reals[i] = REAL (from_exp)[i];
+ if (R_IsNaN (reals[i]) || R_IsNA (reals[i]) ) reals[i] = RKGlobals::na_double;
+ }
+ return reals;
+}
+
+RData *RKRSupport::SEXPToRData (SEXP from_exp) {
+ RK_TRACE (RBACKEND);
+
+ RData *data = new RData;
+
+ unsigned int count;
+ int type = TYPEOF (from_exp);
+ switch (type) {
+ case LGLSXP:
+ case INTSXP:
+ data->data = SEXPToIntArray (from_exp, &count);
+ data->datatype = RData::IntVector;
+ break;
+ case REALSXP:
+ data->data = SEXPToRealArray (from_exp, &count);
+ data->datatype = RData::RealVector;
+ break;
+ case VECSXP:
+ count = 0;
+ count = Rf_length (from_exp);
+ {
+ RData **structure_array = new RData*[count];
+ for (unsigned int i=0; i < count; ++i) {
+ SEXP subexp = VECTOR_ELT (from_exp, i);
+ //PROTECT (subexp); // should already be protected as part of the parent from_exp
+ structure_array[i] = SEXPToRData (subexp);
+ //UNPROTECT (1);
+ }
+ data->data = structure_array;
+ }
+ data->datatype = RData::StructureVector;
+ break;
+/* case NILSXP:
+ data->data = 0;
+ data->datatype = RData::NoData;
+ count = 0;
+ break; */
+ case EXTPTRSXP:
+ if (R_ExternalPtrTag (from_exp) == RKWard_RData_Tag) { // our very own data
+ delete data;
+ data = (RData*) R_ExternalPtrAddr (from_exp);
+ R_ClearExternalPtr (from_exp);
+ count = data->length;
+ break;
+ }
+ case STRSXP:
+ default:
+ data->data = SEXPToStringList (from_exp, &count);
+ data->datatype = RData::StringVector;
+ }
+
+ data->length = count;
+
+ return data;
+}
Modified: branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rkrsupport.h
===================================================================
--- branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rkrsupport.h 2010-10-26 08:15:17 UTC (rev 3150)
+++ branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rkrsupport.h 2010-10-26 11:15:50 UTC (rev 3151)
@@ -18,8 +18,13 @@
#ifndef RKRSUPPORT_H
#define RKRSUPPORT_H
-#include <QString>
+#include <limits.h>
+#include <QStringList>
+
+#include "rdata.h"
+
+#define R_NO_REMAP 1
#include <Rdefines.h>
/** Convenience functions for working with R. */
@@ -28,6 +33,13 @@
SEXP callSimpleFun (SEXP fun, SEXP arg, SEXP env);
SEXP callSimpleFun2 (SEXP fun, SEXP arg1, SEXP arg2, SEXP env);
bool callSimpleBool (SEXP fun, SEXP arg, SEXP env);
+
+ QString *SEXPToStringList (SEXP from_exp, unsigned int *count);
+ QString SEXPToString (SEXP from_exp);
+ int *SEXPToIntArray (SEXP from_exp, unsigned int *count);
+ int SEXPToInt (SEXP from_exp, int def_value = INT_MIN);
+ double *SEXPToRealArray (SEXP from_exp, unsigned int *count);
+ RData *SEXPToRData (SEXP from_exp);
};
-#endif
\ No newline at end of file
+#endif
Modified: branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rkstructuregetter.cpp
===================================================================
--- branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rkstructuregetter.cpp 2010-10-26 08:15:17 UTC (rev 3150)
+++ branches/2010_10_18_backend_restructuring_branch/rkward/rbackend/rkstructuregetter.cpp 2010-10-26 11:15:50 UTC (rev 3151)
@@ -78,7 +78,7 @@
envir_depth = INTEGER (envlevel)[0];
unsigned int count;
- QString *name_dummy = SEXPToStringList (name, &count);
+ QString *name_dummy = RKRSupport::SEXPToStringList (name, &count);
RK_ASSERT (count == 1);
QString name_string = name_dummy[0];
delete [] name_dummy;
@@ -202,7 +202,7 @@
PROTECT (classes_s);
}
- QString *classes = SEXPToStringList (classes_s, &count);
+ QString *classes = RKRSupport::SEXPToStringList (classes_s, &count);
unsigned int num_classes = count;
UNPROTECT (1); /* classes_s */
@@ -251,7 +251,7 @@
SEXP meta_s = RKRSupport::callSimpleFun (get_meta_fun, value, R_GlobalEnv);
PROTECT (meta_s);
- metadata->data = SEXPToStringList (meta_s, &count);
+ metadata->data = RKRSupport::SEXPToStringList (meta_s, &count);
metadata->length = count;
UNPROTECT (1); /* meta_s */
} else {
@@ -274,7 +274,7 @@
unsigned int num_dims;
SEXP dims_s = RKRSupport::callSimpleFun (dims_fun, value, R_BaseEnv);
if (!Rf_isNull (dims_s)) {
- dims = SEXPToIntArray (dims_s, &num_dims);
+ dims = RKRSupport::SEXPToIntArray (dims_s, &num_dims);
} else {
num_dims = 1;
@@ -286,7 +286,7 @@
dims = new int[1];
dims[0] = len;
} else {
- dims = SEXPToIntArray (len_s, &num_dims);
+ dims = RKRSupport::SEXPToIntArray (len_s, &num_dims);
}
UNPROTECT (1); /* len_s */
} else {
@@ -340,7 +340,7 @@
childnames_s = R_NilValue; // dummy
}
PROTECT (childnames_s);
- QString *childnames = SEXPToStringList (childnames_s, &childcount);
+ QString *childnames = RKRSupport::SEXPToStringList (childnames_s, &childcount);
childdata->length = childcount;
RData **children = new RData*[childcount];
@@ -423,12 +423,12 @@
SEXP formals_s = RKRSupport::callSimpleFun (get_formals_fun, value, R_GlobalEnv);
PROTECT (formals_s);
// the default values
- funargvaluesdata->data = SEXPToStringList (formals_s, &(funargvaluesdata->length));
+ funargvaluesdata->data = RKRSupport::SEXPToStringList (formals_s, &(funargvaluesdata->length));
// the argument names
SEXP names_s = Rf_getAttrib (formals_s, R_NamesSymbol);
PROTECT (names_s);
- funargsdata->data = SEXPToStringList (names_s, &(funargsdata->length));
+ funargsdata->data = RKRSupport::SEXPToStringList (names_s, &(funargsdata->length));
UNPROTECT (2); /* names_s, formals_s */
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the rkward-tracker
mailing list