-
Notifications
You must be signed in to change notification settings - Fork 34
/
String.h
234 lines (216 loc) · 8.46 KB
/
String.h
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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
using std::cout; using std::cerr; using std::endl;
#ifndef __CPP__INCLUDED__RPerl__DataType__String_h
#define __CPP__INCLUDED__RPerl__DataType__String_h 0.013_000
// [[[ TYPEDEFS ]]]
# ifndef __CPP__INCLUDED__RPerl__DataType__String_h__typedefs
#define __CPP__INCLUDED__RPerl__DataType__String_h__typedefs 1
typedef std::string string;
typedef std::ostringstream ostringstream;
# endif
// [[[ PRE-DECLARED TYPEDEFS ]]]
# ifndef __CPP__INCLUDED__RPerl__DataType__Boolean_h__typedefs
#define __CPP__INCLUDED__RPerl__DataType__Boolean_h__typedefs 1
typedef bool boolean;
# endif
# ifndef __CPP__INCLUDED__RPerl__DataType__UnsignedInteger_h__typedefs
#define __CPP__INCLUDED__RPerl__DataType__UnsignedInteger_h__typedefs 1
typedef unsigned long int unsigned_integer;
# endif
# ifndef __CPP__INCLUDED__RPerl__DataType__Integer_h__typedefs
#define __CPP__INCLUDED__RPerl__DataType__Integer_h__typedefs 1
// DEV NOTE, CORRELATION #rp001: keep track of all these hard-coded "semi-dynamic" integer data types
# ifdef __TYPE__INTEGER__LONG
typedef long integer;
#define INTEGER "ld" // assume format code 'ld' exists if type 'long' exists
# elif defined __TYPE__INTEGER__LONG_LONG
typedef long long integer;
#define INTEGER "lld" // assume format code 'lld' exists if type 'long long' exists
# elif defined __TYPE__INTEGER____INT8
typedef __int8 integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I8d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId8"
# endif
# elif defined __TYPE__INTEGER____INT16
typedef __int16 integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I16d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId16"
# endif
# elif defined __TYPE__INTEGER____INT32
typedef __int32 integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I32d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId32"
# endif
# elif defined __TYPE__INTEGER____INT64
typedef __int64 integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I64d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId64"
# endif
# elif defined __TYPE__INTEGER____INT128
typedef __int128 integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I128d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId128"
# endif
# elif defined __TYPE__INTEGER__INT8_T
typedef int8_t integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I8d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId8"
# endif
# elif defined __TYPE__INTEGER__INT16_T
typedef int16_t integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I16d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId16"
# endif
# elif defined __TYPE__INTEGER__INT32_T
typedef int32_t integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I32d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId32"
# endif
# elif defined __TYPE__INTEGER__INT64_T
typedef int64_t integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I64d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId64"
# endif
# elif defined __TYPE__INTEGER__INT128_T
typedef int128_t integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I128d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId128"
# endif
# else
typedef long integer; // default
#define INTEGER "ld" // assume format code 'ld' exists if type 'long' exists
# endif
# endif
# ifndef __CPP__INCLUDED__RPerl__DataType__Number_h__typedefs
#define __CPP__INCLUDED__RPerl__DataType__Number_h__typedefs 1
# ifdef __TYPE__NUMBER__DOUBLE
typedef double number;
#define NUMBER "f"
# elif defined __TYPE__NUMBER__LONG__DOUBLE
typedef long double number;
#define NUMBER "Lf" // assume format code 'Lf' exists if type 'long double' exists
# else
typedef double number; // default
#define NUMBER "f"
# endif
# endif
# ifndef __CPP__INCLUDED__RPerl__DataType__Character_h__typedefs
#define __CPP__INCLUDED__RPerl__DataType__Character_h__typedefs 1
typedef char character;
# endif
// [[[ INCLUDES ]]]
#include <rperltypes_mode.h> // for definitions of __PERL__TYPES or __CPP__TYPES
// [[[ TYPE-CHECKING MACROS ]]]
#define string_CHECK(possible_string) \
(not(SvOK(possible_string)) ? \
croak("\nERROR EPV00, TYPE-CHECKING MISMATCH, CPPOPS_PERLTYPES & CPPOPS_CPPTYPES:\nstring value expected but undefined/null value found,\ncroaking") : \
(not(SvPOKp(possible_string)) ? \
croak("\nERROR EPV01, TYPE-CHECKING MISMATCH, CPPOPS_PERLTYPES & CPPOPS_CPPTYPES:\nstring value expected but non-string value found,\ncroaking") : \
(void)0))
#define string_CHECKTRACE(possible_string, variable_name, subroutine_name) \
(not(SvOK(possible_string)) ? \
croak("\nERROR EPV00, TYPE-CHECKING MISMATCH, CPPOPS_PERLTYPES & CPPOPS_CPPTYPES:\nstring value expected but undefined/null value found,\nin variable %s from subroutine %s,\ncroaking", variable_name, subroutine_name) : \
(not(SvPOKp(possible_string)) ? \
croak("\nERROR EPV01, TYPE-CHECKING MISMATCH, CPPOPS_PERLTYPES & CPPOPS_CPPTYPES:\nstring value expected but non-string value found,\nin variable %s from subroutine %s,\ncroaking", variable_name, subroutine_name) : \
(void)0))
// [[[ GENERAL FUNCTIONS ]]]
string escape_backslash_singlequote(string unescaped_string);
// [[[ TYPE CHECKING ]]]
// DEPRECATED, SEE MACROS ABOVE
//void string_CHECK(SV* possible_string);
//void string_CHECKTRACE(SV* possible_string, const char* variable_name, const char* subroutine_name);
// [[[ OPERATIONS & DATA TYPES REPORTER ]]]
# ifdef __PERL__TYPES
SV* RPerl__DataType__String__MODE_ID() { return(newSViv(1)); } // CPPOPS_PERLTYPES is 1
# elif defined __CPP__TYPES
int RPerl__DataType__String__MODE_ID() { return 2; } // CPPOPS_CPPTYPES is 2
# else
Purposefully_die_from_a_compile-time_error,_due_to_neither___PERL__TYPES_nor___CPP__TYPES_being_defined.__We_need_to_define_exactly_one!
# endif
// [[[ TYPEMAP PACK/UNPACK FOR __CPP__TYPES ]]]
// DEV NOTE, CORRELATION #rp010: the pack/unpack subs (below) are called by number_to_string_CPPTYPES(), moved outside #ifdef blocks
//# ifdef __CPP__TYPES
string XS_unpack_string(SV* input_sv);
void XS_pack_string(SV* output_sv, string input_string);
//# endif
// [[[ SEARCH & REPLACE ]]]
# ifdef __PERL__TYPES
void string_substitute_global(SV* input_string, const string& find_string, const string& replace_string);
# elif defined __CPP__TYPES
void string_substitute_global(string& input_string, const string& find_string, const string& replace_string);
# endif
// [[[ BOOLEANIFY ]]]
# ifdef __PERL__TYPES
SV* string_to_boolean(SV* input_string);
# elif defined __CPP__TYPES
boolean string_to_boolean(string input_string);
# endif
// [[[ UNSIGNED INTEGERIFY ]]]
# ifdef __PERL__TYPES
SV* string_to_unsigned_integer(SV* input_string);
# elif defined __CPP__TYPES
unsigned_integer string_to_unsigned_integer(string input_string);
# endif
// [[[ INTEGERIFY ]]]
# ifdef __PERL__TYPES
SV* string_to_integer(SV* input_string);
# elif defined __CPP__TYPES
integer string_to_integer(string input_string);
# endif
// [[[ NUMBERIFY ]]]
# ifdef __PERL__TYPES
SV* string_to_number(SV* input_string);
# elif defined __CPP__TYPES
number string_to_number(string input_string);
# endif
// [[[ CHARACTERIFY ]]]
# ifdef __PERL__TYPES
SV* string_to_character(SV* input_string);
# elif defined __CPP__TYPES
character string_to_character(string input_string);
# endif
// [[[ STRINGIFY ]]]
# ifdef __PERL__TYPES
SV* string_to_string(SV* input_sv);
# elif defined __CPP__TYPES
string to_string(string input_string);
string string_to_string(string input_string);
# endif
// [[[ TYPE TESTING ]]]
# ifdef __PERL__TYPES
SV* string_typetest0();
SV* string_typetest1(SV* lucky_string);
# elif defined __CPP__TYPES
string string_typetest0();
string string_typetest1(string lucky_string);
# endif
#endif