1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/*
* R : A Computer Language for Statistical Data Analysis
* Copyright (C) 1998-2006 The R Core Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, a copy is available at
* http://www.r-project.org/Licenses/
*
*
*/
/*
Not part of the API, concerns .C() converters which are deprecated.
*/
#ifndef R_CCONVERTERS_H
#define R_CCONVERTERS_H
#include <Rinternals.h>
#ifdef __cplusplus
extern "C" {
#endif
#define freeCConverter RC_freeCConverter
#define R_addToCConverter RC_addToCConverter
#define R_converterMatchClass RC_converterMatchClass
#define R_converterMatchClass RC_converterMatchClass
#define R_getToCConverterByDescription RC_getToCConverterByDescription
#define R_getToCConverterByIndex RC_getToCConverterByIndex
#define R_getToCConverterByIndex RC_getToCConverterByIndex
#define R_removeToCConverter RC_removeToCConverter
/* Context information controlling how the conversion is performed, passed
to RObjToCPtr in dotcode.c and the different user level converters. */
typedef struct {
int naok;
int narg;
int dup;
int Fort;
char const * name ;
SEXP classes;
} R_CConvertInfo;
/* Typedefs for structs defined below with future/cross-referencing. */
typedef struct RtoCConverter R_toCConverter;
typedef struct RFromCConvertInfo R_FromCConvertInfo;
/* The matching routine which determines whether the converter can process the given SEXP. */
typedef Rboolean (*R_ToCPredicate)(SEXP obj, R_CConvertInfo *info, R_toCConverter *el);
/* The converter routine that returns the value to be passed to the C routine.
(We may have to make the return type a union to handle the different types.) */
typedef void* (*R_ToCConverter)(SEXP obj, R_CConvertInfo *info, R_toCConverter *el);
/* The reverse converter from the C argument to the R object that is returned via the .C() call. */
typedef SEXP (*R_FromCConverter)(void *value, SEXP arg, R_FromCConvertInfo *info,
R_toCConverter *el);
/* The definition of the converter element which are stored as a linked list. */
struct RtoCConverter {
R_ToCPredicate matcher; /* check if converter applies to R object */
R_ToCConverter converter; /* convert the R object to C value */
R_FromCConverter reverse; /* convert the C value back to an R object. */
char *description; /* user-readable string describing the converter. */
void *userData; /* additional information used in (any of) the matcher,
converter, and reverse routines to parameterize them. */
Rboolean active; /* allows the converter to be in the list but ignored temporarily. */
R_toCConverter *next; /* next element in the linked list. */
};
/* Information used to convert C values to R objects at the end of do_dotCode() */
struct RFromCConvertInfo {
const char *functionName; /* the name of the routine being called (S's name for it). */
int argIndex; /* the pariticular argument being processed. */
/* We provide all of the arguments and the corresponding C values.
This gives the full context of the call to the reverse converter */
SEXP allArgs;
void **cargs;
int nargs;
};
/* Internal mechanism for employing the converter mechanism, used in do_dotCode() in dotcode.c */
void *Rf_convertToC(SEXP s, R_CConvertInfo *info, int *success, R_toCConverter **converter);
/* Converter management facilities. */
R_toCConverter *R_addToCConverter(R_ToCPredicate match, R_ToCConverter converter,
R_FromCConverter reverse,
void *userData, char *desc);
R_toCConverter *R_getToCConverterByIndex(int which);
R_toCConverter *R_getToCConverterByDescription(const char *desc);
void R_removeToCConverter(R_toCConverter *el);
Rboolean R_converterMatchClass(SEXP obj, R_CConvertInfo *inf, R_toCConverter *el);
void freeCConverter(R_toCConverter *el);
/* The routines corresponding to the .Internal() providing access to the
management facilities of the converter list.
*/
SEXP do_getNumRtoCConverters(SEXP call, SEXP op, SEXP args, SEXP env);
SEXP do_getRtoCConverterDescriptions(SEXP call, SEXP op, SEXP args, SEXP env);
SEXP do_getRtoCConverterStatus(SEXP call, SEXP op, SEXP args, SEXP env);
SEXP do_setToCConverterActiveStatus(SEXP call, SEXP op, SEXP args, SEXP env);
#ifdef __cplusplus
}
#endif
#endif /* R_CCONVERTERS_H */
|