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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
/*
A test case for testing char based strings. Useful for runtime testing,
there were some runtime crashes and leaks in the C# module in some of the scenarios
below.
*/
%module char_strings
%warnfilter(SWIGWARN_TYPEMAP_VARIN_UNDEF) global_char_array1; // Unable to set variable of type char[]
%warnfilter(SWIGWARN_TYPEMAP_CHARLEAK_MSG) global_const_char; // Setting a const char * variable may leak memory.
%{
#include <stdio.h>
#include <string.h>
#define OTHERLAND_MSG "Little message from the safe world."
#define CPLUSPLUS_MSG "A message from the deep dark world of C++, where anything is possible."
static char *global_str = NULL;
const int UINT_DIGITS = 10; // max unsigned int is 4294967295
bool check(const char *const str, unsigned int number) {
static char expected[256];
sprintf(expected, "%s%d", OTHERLAND_MSG, number);
bool matches = (strcmp(str, expected) == 0);
if (!matches) printf("Failed: [%s][%s]\n", str, expected);
return matches;
}
%}
%immutable global_const_char;
%inline %{
// get functions
char *GetCharHeapString() {
global_str = new char[sizeof(CPLUSPLUS_MSG)+1];
strcpy(global_str, CPLUSPLUS_MSG);
return global_str;
}
const char *GetConstCharProgramCodeString() {
return CPLUSPLUS_MSG;
}
void DeleteCharHeapString() {
delete[] global_str;
global_str = NULL;
}
char *GetCharStaticString() {
static char str[sizeof(CPLUSPLUS_MSG)+1];
strcpy(str, CPLUSPLUS_MSG);
return str;
}
char *GetCharStaticStringFixed() {
static char str[] = CPLUSPLUS_MSG;
return str;
}
const char *GetConstCharStaticStringFixed() {
static const char str[] = CPLUSPLUS_MSG;
return str;
}
// set functions
bool SetCharHeapString(char *str, unsigned int number) {
delete[] global_str;
global_str = new char[strlen(str)+UINT_DIGITS+1];
strcpy(global_str, str);
return check(global_str, number);
}
bool SetCharStaticString(char *str, unsigned int number) {
static char static_str[] = CPLUSPLUS_MSG;
strcpy(static_str, str);
return check(static_str, number);
}
bool SetCharArrayStaticString(char str[], unsigned int number) {
static char static_str[] = CPLUSPLUS_MSG;
strcpy(static_str, str);
return check(static_str, number);
}
bool SetConstCharHeapString(const char *str, unsigned int number) {
delete[] global_str;
global_str = new char[strlen(str)+UINT_DIGITS+1];
strcpy(global_str, str);
return check(global_str, number);
}
bool SetConstCharStaticString(const char *str, unsigned int number) {
static char static_str[] = CPLUSPLUS_MSG;
strcpy(static_str, str);
return check(static_str, number);
}
bool SetConstCharArrayStaticString(const char str[], unsigned int number) {
static char static_str[] = CPLUSPLUS_MSG;
strcpy(static_str, str);
return check(static_str, number);
}
bool SetCharConstStaticString(char *const str, unsigned int number) {
static char static_str[] = CPLUSPLUS_MSG;
strcpy(static_str, str);
return check(static_str, number);
}
bool SetConstCharConstStaticString(const char *const str, unsigned int number) {
static char static_str[] = CPLUSPLUS_MSG;
strcpy(static_str, str);
return check(static_str, number);
}
// get set function
char *CharPingPong(char *str) {
return str;
}
char *CharArrayPingPong(char abcstr[]) {
return abcstr;
}
char *CharArrayDimsPingPong(char abcstr[16]) {
return abcstr;
}
// variables
char *global_char = NULL;
char global_char_array1[] = CPLUSPLUS_MSG;
char global_char_array2[sizeof(CPLUSPLUS_MSG)+1] = CPLUSPLUS_MSG;
const char *global_const_char = CPLUSPLUS_MSG;
const char global_const_char_array1[] = CPLUSPLUS_MSG;
const char global_const_char_array2[sizeof(CPLUSPLUS_MSG)+1] = CPLUSPLUS_MSG;
%}
%typemap(newfree) char *GetNewCharString() { /* hello */ delete[] $1; }
%newobject GetNewCharString();
%inline {
char *GetNewCharString() {
char *nstr = new char[sizeof(CPLUSPLUS_MSG)+1];
strcpy(nstr, CPLUSPLUS_MSG);
return nstr;
}
}
%inline {
struct Formatpos;
struct OBFormat;
static int GetNextFormat(Formatpos& itr, const char*& str,OBFormat*& pFormat) {
return 0;
}
}
%inline %{
// char *& tests
char *&GetCharPointerRef() {
static char str[] = CPLUSPLUS_MSG;
static char *ptr = str;
return ptr;
}
bool SetCharPointerRef(char *&str, unsigned int number) {
static char static_str[] = CPLUSPLUS_MSG;
strcpy(static_str, str);
return check(static_str, number);
}
const char *&GetConstCharPointerRef() {
static const char str[] = CPLUSPLUS_MSG;
static const char *ptr = str;
return ptr;
}
bool SetConstCharPointerRef(const char *&str, unsigned int number) {
static char static_str[] = CPLUSPLUS_MSG;
strcpy(static_str, str);
return check(static_str, number);
}
%}
|