1 /* handy.h 2 * 3 * Copyright (c) 1991-2001, Larry Wall 4 * 5 * You may distribute under the terms of either the GNU General Public 6 * License or the Artistic License, as specified in the README file. 7 * 8 */ 9 10 #if !defined(__STDC__) 11 #ifdef NULL 12 #undef NULL 13 #endif 14 #ifndef I286 15 # define NULL 0 16 #else 17 # define NULL 0L 18 #endif 19 #endif 20 21 #define Null(type) ((type)NULL) 22 23 /* 24 =for apidoc AmU||Nullch 25 Null character pointer. 26 27 =for apidoc AmU||Nullsv 28 Null SV pointer. 29 30 =cut 31 */ 32 33 #define Nullch Null(char*) 34 #define Nullfp Null(PerlIO*) 35 #define Nullsv Null(SV*) 36 37 #ifdef TRUE 38 #undef TRUE 39 #endif 40 #ifdef FALSE 41 #undef FALSE 42 #endif 43 #define TRUE (1) 44 #define FALSE (0) 45 46 47 /* XXX Configure ought to have a test for a boolean type, if I can 48 just figure out all the headers such a test needs. 49 Andy Dougherty August 1996 50 */ 51 /* bool is built-in for g++-2.6.3 and later, which might be used 52 for extensions. <_G_config.h> defines _G_HAVE_BOOL, but we can't 53 be sure _G_config.h will be included before this file. _G_config.h 54 also defines _G_HAVE_BOOL for both gcc and g++, but only g++ 55 actually has bool. Hence, _G_HAVE_BOOL is pretty useless for us. 56 g++ can be identified by __GNUG__. 57 Andy Dougherty February 2000 58 */ 59 #ifdef __GNUG__ /* GNU g++ has bool built-in */ 60 # ifndef HAS_BOOL 61 # define HAS_BOOL 1 62 # endif 63 #endif 64 65 /* The NeXT dynamic loader headers will not build with the bool macro 66 So declare them now to clear confusion. 67 */ 68 #if defined(NeXT) || defined(__NeXT__) 69 # undef FALSE 70 # undef TRUE 71 typedef enum bool { FALSE = 0, TRUE = 1 } bool; 72 # define ENUM_BOOL 1 73 # ifndef HAS_BOOL 74 # define HAS_BOOL 1 75 # endif /* !HAS_BOOL */ 76 #endif /* NeXT || __NeXT__ */ 77 78 #ifndef HAS_BOOL 79 # if defined(UTS) || defined(VMS) 80 # define bool int 81 # else 82 # define bool char 83 # endif 84 # define HAS_BOOL 1 85 #endif 86 87 /* XXX A note on the perl source internal type system. The 88 original intent was that I32 be *exactly* 32 bits. 89 90 Currently, we only guarantee that I32 is *at least* 32 bits. 91 Specifically, if int is 64 bits, then so is I32. (This is the case 92 for the Cray.) This has the advantage of meshing nicely with 93 standard library calls (where we pass an I32 and the library is 94 expecting an int), but the disadvantage that an I32 is not 32 bits. 95 Andy Dougherty August 1996 96 97 There is no guarantee that there is *any* integral type with 98 exactly 32 bits. It is perfectly legal for a system to have 99 sizeof(short) == sizeof(int) == sizeof(long) == 8. 100 101 Similarly, there is no guarantee that I16 and U16 have exactly 16 102 bits. 103 104 For dealing with issues that may arise from various 32/64-bit 105 systems, we will ask Configure to check out 106 107 SHORTSIZE == sizeof(short) 108 INTSIZE == sizeof(int) 109 LONGSIZE == sizeof(long) 110 LONGLONGSIZE == sizeof(long long) (if HAS_LONG_LONG) 111 PTRSIZE == sizeof(void *) 112 DOUBLESIZE == sizeof(double) 113 LONG_DOUBLESIZE == sizeof(long double) (if HAS_LONG_DOUBLE). 114 115 */ 116 117 #ifdef I_INTTYPES /* e.g. Linux has int64_t without <inttypes.h> */ 118 # include <inttypes.h> 119 #endif 120 121 typedef I8TYPE I8; 122 typedef U8TYPE U8; 123 typedef I16TYPE I16; 124 typedef U16TYPE U16; 125 typedef I32TYPE I32; 126 typedef U32TYPE U32; 127 #ifdef PERL_CORE 128 # ifdef HAS_QUAD 129 typedef I64TYPE I64; 130 typedef U64TYPE U64; 131 # endif 132 #endif /* PERL_CORE */ 133 134 #if defined(HAS_QUAD) && defined(USE_64_BIT_INT) 135 # ifndef UINT64_C /* usually from <inttypes.h> */ 136 # if defined(HAS_LONG_LONG) && QUADKIND == QUAD_IS_LONG_LONG 137 # define INT64_C(c) CAT2(c,LL) 138 # define UINT64_C(c) CAT2(c,ULL) 139 # else 140 # if LONGSIZE == 8 && QUADKIND == QUAD_IS_LONG 141 # define INT64_C(c) CAT2(c,L) 142 # define UINT64_C(c) CAT2(c,UL) 143 # else 144 # define INT64_C(c) ((I64TYPE)(c)) 145 # define UINT64_C(c) ((U64TYPE)(c)) 146 # endif 147 # endif 148 # endif 149 #endif 150 151 /* Mention I8SIZE, U8SIZE, I16SIZE, U16SIZE, I32SIZE, U32SIZE, 152 I64SIZE, and U64SIZE here so that metaconfig pulls them in. */ 153 154 #if defined(UINT8_MAX) && defined(INT16_MAX) && defined(INT32_MAX) 155 156 /* I8_MAX and I8_MIN constants are not defined, as I8 is an ambiguous type. 157 Please search CHAR_MAX in perl.h for further details. */ 158 #define U8_MAX UINT8_MAX 159 #define U8_MIN UINT8_MIN 160 161 #define I16_MAX INT16_MAX 162 #define I16_MIN INT16_MIN 163 #define U16_MAX UINT16_MAX 164 #define U16_MIN UINT16_MIN 165 166 #define I32_MAX INT32_MAX 167 #define I32_MIN INT32_MIN 168 #define U32_MAX UINT32_MAX 169 #define U32_MIN UINT32_MIN 170 171 #else 172 173 /* I8_MAX and I8_MIN constants are not defined, as I8 is an ambiguous type. 174 Please search CHAR_MAX in perl.h for further details. */ 175 #define U8_MAX PERL_UCHAR_MAX 176 #define U8_MIN PERL_UCHAR_MIN 177 178 #define I16_MAX PERL_SHORT_MAX 179 #define I16_MIN PERL_SHORT_MIN 180 #define U16_MAX PERL_USHORT_MAX 181 #define U16_MIN PERL_USHORT_MIN 182 183 #if LONGSIZE > 4 184 # define I32_MAX PERL_INT_MAX 185 # define I32_MIN PERL_INT_MIN 186 # define U32_MAX PERL_UINT_MAX 187 # define U32_MIN PERL_UINT_MIN 188 #else 189 # define I32_MAX PERL_LONG_MAX 190 # define I32_MIN PERL_LONG_MIN 191 # define U32_MAX PERL_ULONG_MAX 192 # define U32_MIN PERL_ULONG_MIN 193 #endif 194 195 #endif 196 197 #define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */ 198 #define TYPE_DIGITS(T) BIT_DIGITS(sizeof(T) * 8) 199 #define TYPE_CHARS(T) (TYPE_DIGITS(T) + 2) /* sign, NUL */ 200 201 #define Ctl(ch) ((ch) & 037) 202 203 /* 204 =for apidoc Am|bool|strNE|char* s1|char* s2 205 Test two strings to see if they are different. Returns true or 206 false. 207 208 =for apidoc Am|bool|strEQ|char* s1|char* s2 209 Test two strings to see if they are equal. Returns true or false. 210 211 =for apidoc Am|bool|strLT|char* s1|char* s2 212 Test two strings to see if the first, C<s1>, is less than the second, 213 C<s2>. Returns true or false. 214 215 =for apidoc Am|bool|strLE|char* s1|char* s2 216 Test two strings to see if the first, C<s1>, is less than or equal to the 217 second, C<s2>. Returns true or false. 218 219 =for apidoc Am|bool|strGT|char* s1|char* s2 220 Test two strings to see if the first, C<s1>, is greater than the second, 221 C<s2>. Returns true or false. 222 223 =for apidoc Am|bool|strGE|char* s1|char* s2 224 Test two strings to see if the first, C<s1>, is greater than or equal to 225 the second, C<s2>. Returns true or false. 226 227 =for apidoc Am|bool|strnNE|char* s1|char* s2|STRLEN len 228 Test two strings to see if they are different. The C<len> parameter 229 indicates the number of bytes to compare. Returns true or false. (A 230 wrapper for C<strncmp>). 231 232 =for apidoc Am|bool|strnEQ|char* s1|char* s2|STRLEN len 233 Test two strings to see if they are equal. The C<len> parameter indicates 234 the number of bytes to compare. Returns true or false. (A wrapper for 235 C<strncmp>). 236 237 =cut 238 */ 239 240 #define strNE(s1,s2) (strcmp(s1,s2)) 241 #define strEQ(s1,s2) (!strcmp(s1,s2)) 242 #define strLT(s1,s2) (strcmp(s1,s2) < 0) 243 #define strLE(s1,s2) (strcmp(s1,s2) <= 0) 244 #define strGT(s1,s2) (strcmp(s1,s2) > 0) 245 #define strGE(s1,s2) (strcmp(s1,s2) >= 0) 246 #define strnNE(s1,s2,l) (strncmp(s1,s2,l)) 247 #define strnEQ(s1,s2,l) (!strncmp(s1,s2,l)) 248 249 #ifdef HAS_MEMCMP 250 # define memNE(s1,s2,l) (memcmp(s1,s2,l)) 251 # define memEQ(s1,s2,l) (!memcmp(s1,s2,l)) 252 #else 253 # define memNE(s1,s2,l) (bcmp(s1,s2,l)) 254 # define memEQ(s1,s2,l) (!bcmp(s1,s2,l)) 255 #endif 256 257 /* 258 * Character classes. 259 * 260 * Unfortunately, the introduction of locales means that we 261 * can't trust isupper(), etc. to tell the truth. And when 262 * it comes to /\w+/ with tainting enabled, we *must* be able 263 * to trust our character classes. 264 * 265 * Therefore, the default tests in the text of Perl will be 266 * independent of locale. Any code that wants to depend on 267 * the current locale will use the tests that begin with "lc". 268 */ 269 270 #ifdef HAS_SETLOCALE /* XXX Is there a better test for this? */ 271 # ifndef CTYPE256 272 # define CTYPE256 273 # endif 274 #endif 275 276 /* 277 =for apidoc Am|bool|isALNUM|char ch 278 Returns a boolean indicating whether the C C<char> is an ASCII alphanumeric 279 character (including underscore) or digit. 280 281 =for apidoc Am|bool|isALPHA|char ch 282 Returns a boolean indicating whether the C C<char> is an ASCII alphabetic 283 character. 284 285 =for apidoc Am|bool|isSPACE|char ch 286 Returns a boolean indicating whether the C C<char> is whitespace. 287 288 =for apidoc Am|bool|isDIGIT|char ch 289 Returns a boolean indicating whether the C C<char> is an ASCII 290 digit. 291 292 =for apidoc Am|bool|isUPPER|char ch 293 Returns a boolean indicating whether the C C<char> is an uppercase 294 character. 295 296 =for apidoc Am|bool|isLOWER|char ch 297 Returns a boolean indicating whether the C C<char> is a lowercase 298 character. 299 300 =for apidoc Am|char|toUPPER|char ch 301 Converts the specified character to uppercase. 302 303 =for apidoc Am|char|toLOWER|char ch 304 Converts the specified character to lowercase. 305 306 =cut 307 */ 308 309 #define isALNUM(c) (isALPHA(c) || isDIGIT(c) || (c) == '_') 310 #define isIDFIRST(c) (isALPHA(c) || (c) == '_') 311 #define isALPHA(c) (isUPPER(c) || isLOWER(c)) 312 #define isSPACE(c) \ 313 ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) =='\r' || (c) == '\f') 314 #define isPSXSPC(c) (isSPACE(c) || (c) == '\v') 315 #define isBLANK(c) ((c) == ' ' || (c) == '\t') 316 #define isDIGIT(c) ((c) >= '0' && (c) <= '9') 317 #ifdef EBCDIC 318 /* In EBCDIC we do not do locales: therefore() isupper() is fine. */ 319 # define isUPPER(c) isupper(c) 320 # define isLOWER(c) islower(c) 321 # define isALNUMC(c) isalnum(c) 322 # define isASCII(c) isascii(c) 323 # define isCNTRL(c) iscntrl(c) 324 # define isGRAPH(c) isgraph(c) 325 # define isPRINT(c) isprint(c) 326 # define isPUNCT(c) ispunct(c) 327 # define isXDIGIT(c) isxdigit(c) 328 # define toUPPER(c) toupper(c) 329 # define toLOWER(c) tolower(c) 330 #else 331 # define isUPPER(c) ((c) >= 'A' && (c) <= 'Z') 332 # define isLOWER(c) ((c) >= 'a' && (c) <= 'z') 333 # define isALNUMC(c) (isALPHA(c) || isDIGIT(c)) 334 # define isASCII(c) ((c) <= 127) 335 # define isCNTRL(c) ((c) < ' ') 336 # define isGRAPH(c) (isALNUM(c) || isPUNCT(c)) 337 # define isPRINT(c) (((c) > 32 && (c) < 127) || isSPACE(c)) 338 # define isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126)) 339 # define isXDIGIT(c) (isdigit(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) 340 # define toUPPER(c) (isLOWER(c) ? (c) - ('a' - 'A') : (c)) 341 # define toLOWER(c) (isUPPER(c) ? (c) + ('a' - 'A') : (c)) 342 #endif 343 344 #ifdef USE_NEXT_CTYPE 345 346 # define isALNUM_LC(c) \ 347 (NXIsAlNum((unsigned int)(c)) || (char)(c) == '_') 348 # define isIDFIRST_LC(c) \ 349 (NXIsAlpha((unsigned int)(c)) || (char)(c) == '_') 350 # define isALPHA_LC(c) NXIsAlpha((unsigned int)(c)) 351 # define isSPACE_LC(c) NXIsSpace((unsigned int)(c)) 352 # define isDIGIT_LC(c) NXIsDigit((unsigned int)(c)) 353 # define isUPPER_LC(c) NXIsUpper((unsigned int)(c)) 354 # define isLOWER_LC(c) NXIsLower((unsigned int)(c)) 355 # define isALNUMC_LC(c) NXIsAlNum((unsigned int)(c)) 356 # define isCNTRL_LC(c) NXIsCntrl((unsigned int)(c)) 357 # define isGRAPH_LC(c) NXIsGraph((unsigned int)(c)) 358 # define isPRINT_LC(c) NXIsPrint((unsigned int)(c)) 359 # define isPUNCT_LC(c) NXIsPunct((unsigned int)(c)) 360 # define toUPPER_LC(c) NXToUpper((unsigned int)(c)) 361 # define toLOWER_LC(c) NXToLower((unsigned int)(c)) 362 363 #else /* !USE_NEXT_CTYPE */ 364 365 # if defined(CTYPE256) || (!defined(isascii) && !defined(HAS_ISASCII)) 366 367 # define isALNUM_LC(c) (isalnum((unsigned char)(c)) || (char)(c) == '_') 368 # define isIDFIRST_LC(c) (isalpha((unsigned char)(c)) || (char)(c) == '_') 369 # define isALPHA_LC(c) isalpha((unsigned char)(c)) 370 # define isSPACE_LC(c) isspace((unsigned char)(c)) 371 # define isDIGIT_LC(c) isdigit((unsigned char)(c)) 372 # define isUPPER_LC(c) isupper((unsigned char)(c)) 373 # define isLOWER_LC(c) islower((unsigned char)(c)) 374 # define isALNUMC_LC(c) isalnum((unsigned char)(c)) 375 # define isCNTRL_LC(c) iscntrl((unsigned char)(c)) 376 # define isGRAPH_LC(c) isgraph((unsigned char)(c)) 377 # define isPRINT_LC(c) isprint((unsigned char)(c)) 378 # define isPUNCT_LC(c) ispunct((unsigned char)(c)) 379 # define toUPPER_LC(c) toupper((unsigned char)(c)) 380 # define toLOWER_LC(c) tolower((unsigned char)(c)) 381 382 # else 383 384 # define isALNUM_LC(c) (isascii(c) && (isalnum(c) || (c) == '_')) 385 # define isIDFIRST_LC(c) (isascii(c) && (isalpha(c) || (c) == '_')) 386 # define isALPHA_LC(c) (isascii(c) && isalpha(c)) 387 # define isSPACE_LC(c) (isascii(c) && isspace(c)) 388 # define isDIGIT_LC(c) (isascii(c) && isdigit(c)) 389 # define isUPPER_LC(c) (isascii(c) && isupper(c)) 390 # define isLOWER_LC(c) (isascii(c) && islower(c)) 391 # define isALNUMC_LC(c) (isascii(c) && isalnum(c)) 392 # define isCNTRL_LC(c) (isascii(c) && iscntrl(c)) 393 # define isGRAPH_LC(c) (isascii(c) && isgraph(c)) 394 # define isPRINT_LC(c) (isascii(c) && isprint(c)) 395 # define isPUNCT_LC(c) (isascii(c) && ispunct(c)) 396 # define toUPPER_LC(c) toupper(c) 397 # define toLOWER_LC(c) tolower(c) 398 399 # endif 400 #endif /* USE_NEXT_CTYPE */ 401 402 #define isPSXSPC_LC(c) (isSPACE_LC(c) || (c) == '\v') 403 #define isBLANK_LC(c) isBLANK(c) /* could be wrong */ 404 405 #define isALNUM_uni(c) is_uni_alnum(c) 406 #define isIDFIRST_uni(c) is_uni_idfirst(c) 407 #define isALPHA_uni(c) is_uni_alpha(c) 408 #define isSPACE_uni(c) is_uni_space(c) 409 #define isDIGIT_uni(c) is_uni_digit(c) 410 #define isUPPER_uni(c) is_uni_upper(c) 411 #define isLOWER_uni(c) is_uni_lower(c) 412 #define isALNUMC_uni(c) is_uni_alnumc(c) 413 #define isASCII_uni(c) is_uni_ascii(c) 414 #define isCNTRL_uni(c) is_uni_cntrl(c) 415 #define isGRAPH_uni(c) is_uni_graph(c) 416 #define isPRINT_uni(c) is_uni_print(c) 417 #define isPUNCT_uni(c) is_uni_punct(c) 418 #define isXDIGIT_uni(c) is_uni_xdigit(c) 419 #define toUPPER_uni(c) to_uni_upper(c) 420 #define toTITLE_uni(c) to_uni_title(c) 421 #define toLOWER_uni(c) to_uni_lower(c) 422 423 #define isPSXSPC_uni(c) (isSPACE_uni(c) ||(c) == '\f') 424 #define isBLANK_uni(c) isBLANK(c) /* could be wrong */ 425 426 #define isALNUM_LC_uni(c) (c < 256 ? isALNUM_LC(c) : is_uni_alnum_lc(c)) 427 #define isIDFIRST_LC_uni(c) (c < 256 ? isIDFIRST_LC(c) : is_uni_idfirst_lc(c)) 428 #define isALPHA_LC_uni(c) (c < 256 ? isALPHA_LC(c) : is_uni_alpha_lc(c)) 429 #define isSPACE_LC_uni(c) (c < 256 ? isSPACE_LC(c) : is_uni_space_lc(c)) 430 #define isDIGIT_LC_uni(c) (c < 256 ? isDIGIT_LC(c) : is_uni_digit_lc(c)) 431 #define isUPPER_LC_uni(c) (c < 256 ? isUPPER_LC(c) : is_uni_upper_lc(c)) 432 #define isLOWER_LC_uni(c) (c < 256 ? isLOWER_LC(c) : is_uni_lower_lc(c)) 433 #define isALNUMC_LC_uni(c) (c < 256 ? isALNUMC_LC(c) : is_uni_alnumc_lc(c)) 434 #define isCNTRL_LC_uni(c) (c < 256 ? isCNTRL_LC(c) : is_uni_cntrl_lc(c)) 435 #define isGRAPH_LC_uni(c) (c < 256 ? isGRAPH_LC(c) : is_uni_graph_lc(c)) 436 #define isPRINT_LC_uni(c) (c < 256 ? isPRINT_LC(c) : is_uni_print_lc(c)) 437 #define isPUNCT_LC_uni(c) (c < 256 ? isPUNCT_LC(c) : is_uni_punct_lc(c)) 438 #define toUPPER_LC_uni(c) (c < 256 ? toUPPER_LC(c) : to_uni_upper_lc(c)) 439 #define toTITLE_LC_uni(c) (c < 256 ? toUPPER_LC(c) : to_uni_title_lc(c)) 440 #define toLOWER_LC_uni(c) (c < 256 ? toLOWER_LC(c) : to_uni_lower_lc(c)) 441 442 #define isPSXSPC_LC_uni(c) (isSPACE_LC_uni(c) ||(c) == '\f') 443 #define isBLANK_LC_uni(c) isBLANK(c) /* could be wrong */ 444 445 #define isALNUM_utf8(p) is_utf8_alnum(p) 446 #define isIDFIRST_utf8(p) is_utf8_idfirst(p) 447 #define isALPHA_utf8(p) is_utf8_alpha(p) 448 #define isSPACE_utf8(p) is_utf8_space(p) 449 #define isDIGIT_utf8(p) is_utf8_digit(p) 450 #define isUPPER_utf8(p) is_utf8_upper(p) 451 #define isLOWER_utf8(p) is_utf8_lower(p) 452 #define isALNUMC_utf8(p) is_utf8_alnumc(p) 453 #define isASCII_utf8(p) is_utf8_ascii(p) 454 #define isCNTRL_utf8(p) is_utf8_cntrl(p) 455 #define isGRAPH_utf8(p) is_utf8_graph(p) 456 #define isPRINT_utf8(p) is_utf8_print(p) 457 #define isPUNCT_utf8(p) is_utf8_punct(p) 458 #define isXDIGIT_utf8(p) is_utf8_xdigit(p) 459 #define toUPPER_utf8(p) to_utf8_upper(p) 460 #define toTITLE_utf8(p) to_utf8_title(p) 461 #define toLOWER_utf8(p) to_utf8_lower(p) 462 463 #define isPSXSPC_utf8(c) (isSPACE_utf8(c) ||(c) == '\f') 464 #define isBLANK_utf8(c) isBLANK(c) /* could be wrong */ 465 466 #define isALNUM_LC_utf8(p) isALNUM_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 467 #define isIDFIRST_LC_utf8(p) isIDFIRST_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 468 #define isALPHA_LC_utf8(p) isALPHA_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 469 #define isSPACE_LC_utf8(p) isSPACE_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 470 #define isDIGIT_LC_utf8(p) isDIGIT_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 471 #define isUPPER_LC_utf8(p) isUPPER_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 472 #define isLOWER_LC_utf8(p) isLOWER_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 473 #define isALNUMC_LC_utf8(p) isALNUMC_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 474 #define isCNTRL_LC_utf8(p) isCNTRL_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 475 #define isGRAPH_LC_utf8(p) isGRAPH_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 476 #define isPRINT_LC_utf8(p) isPRINT_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 477 #define isPUNCT_LC_utf8(p) isPUNCT_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 478 #define toUPPER_LC_utf8(p) toUPPER_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 479 #define toTITLE_LC_utf8(p) toTITLE_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 480 #define toLOWER_LC_utf8(p) toLOWER_LC_uni(utf8_to_uv(p, UTF8_MAXLEN, 0, 0)) 481 482 #define isPSXSPC_LC_utf8(c) (isSPACE_LC_utf8(c) ||(c) == '\f') 483 #define isBLANK_LC_utf8(c) isBLANK(c) /* could be wrong */ 484 485 #ifdef EBCDIC 486 # define toCTRL(c) Perl_ebcdic_control(c) 487 #else 488 /* This conversion works both ways, strangely enough. */ 489 # define toCTRL(c) (toUPPER(c) ^ 64) 490 #endif 491 492 /* Line numbers are unsigned, 16 bits. */ 493 typedef U16 line_t; 494 #ifdef lint 495 #define NOLINE ((line_t)0) 496 #else 497 #define NOLINE ((line_t) 65535) 498 #endif 499 500 501 /* 502 XXX LEAKTEST doesn't really work in perl5. There are direct calls to 503 safemalloc() in the source, so LEAKTEST won't pick them up. 504 (The main "offenders" are extensions.) 505 Further, if you try LEAKTEST, you'll also end up calling 506 Safefree, which might call safexfree() on some things that weren't 507 malloced with safexmalloc. The correct "fix" to this, if anyone 508 is interested, is to ensure that all calls go through the New and 509 Renew macros. 510 --Andy Dougherty August 1996 511 */ 512 513 /* 514 =for apidoc Am|SV*|NEWSV|int id|STRLEN len 515 Creates a new SV. A non-zero C<len> parameter indicates the number of 516 bytes of preallocated string space the SV should have. An extra byte for a 517 tailing NUL is also reserved. (SvPOK is not set for the SV even if string 518 space is allocated.) The reference count for the new SV is set to 1. 519 C<id> is an integer id between 0 and 1299 (used to identify leaks). 520 521 =for apidoc Am|void|New|int id|void* ptr|int nitems|type 522 The XSUB-writer's interface to the C C<malloc> function. 523 524 =for apidoc Am|void|Newc|int id|void* ptr|int nitems|type|cast 525 The XSUB-writer's interface to the C C<malloc> function, with 526 cast. 527 528 =for apidoc Am|void|Newz|int id|void* ptr|int nitems|type 529 The XSUB-writer's interface to the C C<malloc> function. The allocated 530 memory is zeroed with C<memzero>. 531 532 =for apidoc Am|void|Renew|void* ptr|int nitems|type 533 The XSUB-writer's interface to the C C<realloc> function. 534 535 =for apidoc Am|void|Renewc|void* ptr|int nitems|type|cast 536 The XSUB-writer's interface to the C C<realloc> function, with 537 cast. 538 539 =for apidoc Am|void|Safefree|void* ptr 540 The XSUB-writer's interface to the C C<free> function. 541 542 =for apidoc Am|void|Move|void* src|void* dest|int nitems|type 543 The XSUB-writer's interface to the C C<memmove> function. The C<src> is the 544 source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is 545 the type. Can do overlapping moves. See also C<Copy>. 546 547 =for apidoc Am|void|Copy|void* src|void* dest|int nitems|type 548 The XSUB-writer's interface to the C C<memcpy> function. The C<src> is the 549 source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is 550 the type. May fail on overlapping copies. See also C<Move>. 551 552 =for apidoc Am|void|Zero|void* dest|int nitems|type 553 554 The XSUB-writer's interface to the C C<memzero> function. The C<dest> is the 555 destination, C<nitems> is the number of items, and C<type> is the type. 556 557 =for apidoc Am|void|StructCopy|type src|type dest|type 558 This is an architecture-independent macro to copy one structure to another. 559 560 =cut 561 */ 562 563 #ifndef lint 564 565 #define NEWSV(x,len) newSV(len) 566 567 #ifndef LEAKTEST 568 569 #define New(x,v,n,t) (v = (t*)safemalloc((MEM_SIZE)((n)*sizeof(t)))) 570 #define Newc(x,v,n,t,c) (v = (c*)safemalloc((MEM_SIZE)((n)*sizeof(t)))) 571 #define Newz(x,v,n,t) (v = (t*)safemalloc((MEM_SIZE)((n)*sizeof(t)))), \ 572 memzero((char*)(v), (n)*sizeof(t)) 573 #define Renew(v,n,t) \ 574 (v = (t*)saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t)))) 575 #define Renewc(v,n,t,c) \ 576 (v = (c*)saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t)))) 577 #define Safefree(d) safefree((Malloc_t)(d)) 578 579 #else /* LEAKTEST */ 580 581 #define New(x,v,n,t) (v = (t*)safexmalloc((x),(MEM_SIZE)((n)*sizeof(t)))) 582 #define Newc(x,v,n,t,c) (v = (c*)safexmalloc((x),(MEM_SIZE)((n)*sizeof(t)))) 583 #define Newz(x,v,n,t) (v = (t*)safexmalloc((x),(MEM_SIZE)((n)*sizeof(t)))), \ 584 memzero((char*)(v), (n)*sizeof(t)) 585 #define Renew(v,n,t) \ 586 (v = (t*)safexrealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t)))) 587 #define Renewc(v,n,t,c) \ 588 (v = (c*)safexrealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t)))) 589 #define Safefree(d) safexfree((Malloc_t)(d)) 590 591 #define MAXXCOUNT 1400 592 #define MAXY_SIZE 80 593 #define MAXYCOUNT 16 /* (MAXY_SIZE/4 + 1) */ 594 extern long xcount[MAXXCOUNT]; 595 extern long lastxcount[MAXXCOUNT]; 596 extern long xycount[MAXXCOUNT][MAXYCOUNT]; 597 extern long lastxycount[MAXXCOUNT][MAXYCOUNT]; 598 599 #endif /* LEAKTEST */ 600 601 #define Move(s,d,n,t) (void)memmove((char*)(d),(char*)(s), (n) * sizeof(t)) 602 #define Copy(s,d,n,t) (void)memcpy((char*)(d),(char*)(s), (n) * sizeof(t)) 603 #define Zero(d,n,t) (void)memzero((char*)(d), (n) * sizeof(t)) 604 605 #else /* lint */ 606 607 #define New(x,v,n,s) (v = Null(s *)) 608 #define Newc(x,v,n,s,c) (v = Null(s *)) 609 #define Newz(x,v,n,s) (v = Null(s *)) 610 #define Renew(v,n,s) (v = Null(s *)) 611 #define Move(s,d,n,t) 612 #define Copy(s,d,n,t) 613 #define Zero(d,n,t) 614 #define Safefree(d) (d) = (d) 615 616 #endif /* lint */ 617 618 #ifdef USE_STRUCT_COPY 619 #define StructCopy(s,d,t) (*((t*)(d)) = *((t*)(s))) 620 #else 621 #define StructCopy(s,d,t) Copy(s,d,1,t) 622 #endif 623