SYN SYN
[p5sagit/p5-mst-13.2.git] / utf8.h
diff --git a/utf8.h b/utf8.h
index c37a995..7407335 100644 (file)
--- a/utf8.h
+++ b/utf8.h
@@ -35,17 +35,40 @@ END_EXTERN_C
 
 #define UTF8SKIP(s) PL_utf8skip[*(U8*)s]
 
+#ifdef HAS_QUAD
+#define UTF8LEN(uv) ( (uv) < 0x80           ? 1 : \
+                     (uv) < 0x800          ? 2 : \
+                     (uv) < 0x10000        ? 3 : \
+                     (uv) < 0x200000       ? 4 : \
+                     (uv) < 0x4000000      ? 5 : \
+                     (uv) < 0x80000000     ? 6 : \
+                      (uv) < 0x1000000000LL ? 7 : 13 ) 
+#else
+/* No, I'm not even going to *TRY* putting #ifdef inside a #define */
+#define UTF8LEN(uv) ( (uv) < 0x80           ? 1 : \
+                     (uv) < 0x800          ? 2 : \
+                     (uv) < 0x10000        ? 3 : \
+                     (uv) < 0x200000       ? 4 : \
+                     (uv) < 0x4000000      ? 5 : \
+                     (uv) < 0x80000000     ? 6 : 7 )
+#endif
+
 /*
  * Note: we try to be careful never to call the isXXX_utf8() functions
  * unless we're pretty sure we've seen the beginning of a UTF-8 character
  * (that is, the two high bits are set).  Otherwise we risk loading in the
  * heavy-duty SWASHINIT and SWASHGET routines unnecessarily.
  */
-#define isIDFIRST_lazy_if(p,c) ((!c || (*((U8*)p) < 0xc0)) \
+#ifdef EBCDIC
+#define isIDFIRST_lazy_if(p,c) isIDFIRST(*(p))
+#define isALNUM_lazy_if(p,c)   isALNUM(*(p))
+#else
+#define isIDFIRST_lazy_if(p,c) ((IN_BYTE || (!c || (*((U8*)p) < 0xc0))) \
                                ? isIDFIRST(*(p)) \
                                : isIDFIRST_utf8((U8*)p))
-#define isALNUM_lazy_if(p,c)   ((!c || (*((U8*)p) < 0xc0)) \
+#define isALNUM_lazy_if(p,c)   ((IN_BYTE || (!c || (*((U8*)p) < 0xc0))) \
                                ? isALNUM(*(p)) \
                                : isALNUM_utf8((U8*)p))
+#endif
 #define isIDFIRST_lazy(p)      isIDFIRST_lazy_if(p,1)
 #define isALNUM_lazy(p)                isALNUM_lazy_if(p,1)