This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Rename perl_thread to perl_os_thread.
[perl5.git] / handy.h
diff --git a/handy.h b/handy.h
index 2db267d..379fab8 100644 (file)
--- a/handy.h
+++ b/handy.h
@@ -1,6 +1,6 @@
 /*    handy.h
  *
- *    Copyright (c) 1991-1994, Larry Wall
+ *    Copyright (c) 1991-1997, Larry Wall
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
    standard library calls (where we pass an I32 and the library is
    expecting an int), but the disadvantage that an I32 is not 32 bits.
    Andy Dougherty      August 1996
+
+   In the future, we may perhaps want to think about something like
+    #if INTSIZE == 4
+       typedef I32 int;
+    #else
+    #  if LONGSIZE == 4
+           typedef I32 long;
+    #  else
+    #    if SHORTSIZE == 4
+           typedef I32 short;
+    #    else
+           typedef I32 int;
+    #    endif
+    #  endif
+    #endif
+   For the moment, these are mentioned here so metaconfig will
+   construct Configure to figure out the various sizes.
 */
 
 typedef char           I8;
@@ -113,7 +130,11 @@ typedef unsigned short     U16;
 # define U32_MIN PERL_ULONG_MIN
 #endif
 
-#define Ctl(ch) (ch & 037)
+#define BIT_DIGITS(N)   (((N)*146)/485 + 1)  /* log2(10) =~ 146/485 */
+#define TYPE_DIGITS(T)  BIT_DIGITS(sizeof(T) * 8)
+#define TYPE_CHARS(T)   (TYPE_DIGITS(T) + 2) /* sign, NUL */
+
+#define Ctl(ch) ((ch) & 037)
 
 #define strNE(s1,s2) (strcmp(s1,s2))
 #define strEQ(s1,s2) (!strcmp(s1,s2))
@@ -124,6 +145,14 @@ typedef unsigned short     U16;
 #define strnNE(s1,s2,l) (strncmp(s1,s2,l))
 #define strnEQ(s1,s2,l) (!strncmp(s1,s2,l))
 
+#ifdef HAS_MEMCMP
+#  define memNE(s1,s2,l) (memcmp(s1,s2,l))
+#  define memEQ(s1,s2,l) (!memcmp(s1,s2,l))
+#else
+#  define memNE(s1,s2,l) (bcmp(s1,s2,l))
+#  define memEQ(s1,s2,l) (!bcmp(s1,s2,l))
+#endif
+
 /*
  * Character classes.
  *
@@ -158,24 +187,26 @@ typedef unsigned short    U16;
 #ifdef USE_NEXT_CTYPE
 
 #  define isALNUM_LC(c) \
-       (NXIsAlpha((unsigned int)c) || NXIsDigit((unsigned int)c) || c == '_')
-#  define isIDFIRST_LC(c)      (NXIsAlpha((unsigned int)c) || c == '_')
-#  define isALPHA_LC(c)                NXIsAlpha((unsigned int)c)
-#  define isSPACE_LC(c)                NXIsSpace((unsigned int)c)
-#  define isDIGIT_LC(c)                NXIsDigit((unsigned int)c)
-#  define isUPPER_LC(c)                NXIsUpper((unsigned int)c)
-#  define isLOWER_LC(c)                NXIsLower((unsigned int)c)
-#  define isPRINT_LC(c)                NXIsPrint((unsigned int)c)
-#  define toUPPER_LC(c)                NXToUpper((unsigned int)c)
-#  define toLOWER_LC(c)                NXToLower((unsigned int)c)
+       (NXIsAlpha((unsigned int)(c)) || NXIsDigit((unsigned int)(c)) || \
+        (char)(c) == '_')
+#  define isIDFIRST_LC(c) \
+       (NXIsAlpha((unsigned int)(c)) || (char)(c) == '_')
+#  define isALPHA_LC(c)                NXIsAlpha((unsigned int)(c))
+#  define isSPACE_LC(c)                NXIsSpace((unsigned int)(c))
+#  define isDIGIT_LC(c)                NXIsDigit((unsigned int)(c))
+#  define isUPPER_LC(c)                NXIsUpper((unsigned int)(c))
+#  define isLOWER_LC(c)                NXIsLower((unsigned int)(c))
+#  define isPRINT_LC(c)                NXIsPrint((unsigned int)(c))
+#  define toUPPER_LC(c)                NXToUpper((unsigned int)(c))
+#  define toLOWER_LC(c)                NXToLower((unsigned int)(c))
 
 #else /* !USE_NEXT_CTYPE */
 #  if defined(CTYPE256) || (!defined(isascii) && !defined(HAS_ISASCII))
 
 #    define isALNUM_LC(c) \
        (isalpha((unsigned char)(c)) || \
-        isdigit((unsigned char)(c)) || c == '_')
-#    define isIDFIRST_LC(c)    (isalpha((unsigned char)(c)) || (c) == '_')
+        isdigit((unsigned char)(c)) || (char)(c) == '_')
+#    define isIDFIRST_LC(c) (isalpha((unsigned char)(c)) || (char)(c) == '_')
 #    define isALPHA_LC(c)      isalpha((unsigned char)(c))
 #    define isSPACE_LC(c)      isspace((unsigned char)(c))
 #    define isDIGIT_LC(c)      isdigit((unsigned char)(c))
@@ -188,7 +219,7 @@ typedef unsigned short      U16;
 #  else
 
 #    define isALNUM_LC(c) \
-       (isascii(c) && (isalpha(c) || isdigit(c) || c == '_'))
+       (isascii(c) && (isalpha(c) || isdigit(c) || (c) == '_'))
 #    define isIDFIRST_LC(c)    (isascii(c) && (isalpha(c) || (c) == '_'))
 #    define isALPHA_LC(c)      (isascii(c) && isalpha(c))
 #    define isSPACE_LC(c)      (isascii(c) && isspace(c))
@@ -226,50 +257,55 @@ typedef U16 line_t;
 #ifndef lint
 #ifndef LEAKTEST
 
-#define New(x,v,n,t)  (v = (t*)safemalloc((MEM_SIZE)((n) * sizeof(t))))
-#define Newc(x,v,n,t,c)  (v = (c*)safemalloc((MEM_SIZE)((n) * sizeof(t))))
-#define Newz(x,v,n,t) (v = (t*)safemalloc((MEM_SIZE)((n) * sizeof(t)))), \
-    memzero((char*)(v), (n) * sizeof(t))
-#define Renew(v,n,t) (v = (t*)saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t))))
-#define Renewc(v,n,t,c) (v = (c*)saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t))))
-#define Safefree(d) safefree((Malloc_t)(d))
-#define NEWSV(x,len) newSV(len)
+#define New(x,v,n,t)   (v = (t*)safemalloc((MEM_SIZE)((n)*sizeof(t))))
+#define Newc(x,v,n,t,c)        (v = (c*)safemalloc((MEM_SIZE)((n)*sizeof(t))))
+#define Newz(x,v,n,t)  (v = (t*)safemalloc((MEM_SIZE)((n)*sizeof(t)))), \
+                       memzero((char*)(v), (n)*sizeof(t))
+#define Renew(v,n,t) \
+         (v = (t*)saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t))))
+#define Renewc(v,n,t,c) \
+         (v = (c*)saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t))))
+#define Safefree(d)    safefree((Malloc_t)(d))
+#define NEWSV(x,len)   newSV(len)
 
 #else /* LEAKTEST */
 
-#define New(x,v,n,t)  (v = (t*)safexmalloc(x,(MEM_SIZE)((n) * sizeof(t))))
-#define Newc(x,v,n,t,c)  (v = (c*)safexmalloc(x,(MEM_SIZE)((n) * sizeof(t))))
-#define Newz(x,v,n,t) (v = (t*)safexmalloc(x,(MEM_SIZE)((n) * sizeof(t)))), \
-    memzero((char*)(v), (n) * sizeof(t))
-#define Renew(v,n,t) (v = (t*)safexrealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t))))
-#define Renewc(v,n,t,c) (v = (c*)safexrealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t))))
-#define Safefree(d) safexfree((Malloc_t)d)
-#define NEWSV(x,len) newSV(x,len)
-#define MAXXCOUNT 1200
+#define New(x,v,n,t)   (v = (t*)safexmalloc((x),(MEM_SIZE)((n)*sizeof(t))))
+#define Newc(x,v,n,t,c)        (v = (c*)safexmalloc((x),(MEM_SIZE)((n)*sizeof(t))))
+#define Newz(x,v,n,t)  (v = (t*)safexmalloc((x),(MEM_SIZE)((n)*sizeof(t)))), \
+                        memzero((char*)(v), (n)*sizeof(t))
+#define Renew(v,n,t) \
+         (v = (t*)safexrealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t))))
+#define Renewc(v,n,t,c) \
+         (v = (c*)safexrealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t))))
+#define Safefree(d)    safexfree((Malloc_t)d)
+#define NEWSV(x,len)   newSV(x,len)
+
+#define MAXXCOUNT 1400
 long xcount[MAXXCOUNT];
 long lastxcount[MAXXCOUNT];
 
 #endif /* LEAKTEST */
 
-#define Move(s,d,n,t) (void)memmove((char*)(d),(char*)(s), (n) * sizeof(t))
-#define Copy(s,d,n,t) (void)memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
-#define Zero(d,n,t) (void)memzero((char*)(d), (n) * sizeof(t))
+#define Move(s,d,n,t)  (void)memmove((char*)(d),(char*)(s), (n) * sizeof(t))
+#define Copy(s,d,n,t)  (void)memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
+#define Zero(d,n,t)    (void)memzero((char*)(d), (n) * sizeof(t))
 
 #else /* lint */
 
-#define New(x,v,n,s) (v = Null(s *))
-#define Newc(x,v,n,s,c) (v = Null(s *))
-#define Newz(x,v,n,s) (v = Null(s *))
-#define Renew(v,n,s) (v = Null(s *))
+#define New(x,v,n,s)   (v = Null(s *))
+#define Newc(x,v,n,s,c)        (v = Null(s *))
+#define Newz(x,v,n,s)  (v = Null(s *))
+#define Renew(v,n,s)   (v = Null(s *))
 #define Move(s,d,n,t)
 #define Copy(s,d,n,t)
 #define Zero(d,n,t)
-#define Safefree(d) d = d
+#define Safefree(d)    (d) = (d)
 
 #endif /* lint */
 
 #ifdef USE_STRUCT_COPY
-#define StructCopy(s,d,t) *((t*)(d)) = *((t*)(s))
+#define StructCopy(s,d,t) (*((t*)(d)) = *((t*)(s)))
 #else
 #define StructCopy(s,d,t) Copy(s,d,1,t)
 #endif