]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/common/uchar.c
ICU-57163.0.1.tar.gz
[apple/icu.git] / icuSources / common / uchar.c
index 04dd60b8e7fc93538db2d2de3b2c91a459d970ad..57e00afc10f8b124052cbfdbaf65ea800de39f6a 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ********************************************************************************
-*   Copyright (C) 1996-2010, International Business Machines
+*   Copyright (C) 1996-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 ********************************************************************************
 *
@@ -23,7 +23,7 @@
 #include "unicode/uchar.h"
 #include "unicode/uscript.h"
 #include "unicode/udata.h"
-#include "umutex.h"
+#include "uassert.h"
 #include "cmemory.h"
 #include "ucln_cmn.h"
 #include "utrie2.h"
 #include "uprops.h"
 #include "ustr_imp.h"
 
-#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
-
-/* uchar_props_data.c is machine-generated by genprops --csource */
-#include "uchar_props_data.c"
+/* uchar_props_data.h is machine-generated by genprops --csource */
+#define INCLUDED_FROM_UCHAR_C
+#include "uchar_props_data.h"
 
 /* constants and macros for access to the data ------------------------------ */
 
@@ -407,7 +406,7 @@ u_getNumericValue(UChar32 c) {
         int32_t numerator=(ntv>>4)-12;
         int32_t denominator=(ntv&0xf)+1;
         return (double)numerator/denominator;
-    } else if(ntv<UPROPS_NTV_RESERVED_START) {
+    } else if(ntv<UPROPS_NTV_BASE60_START) {
         /* large, single-significant-digit integer */
         double numValue;
         int32_t mant=(ntv>>5)-14;
@@ -434,6 +433,30 @@ u_getNumericValue(UChar32 c) {
             break;
         }
 
+        return numValue;
+    } else if(ntv<UPROPS_NTV_RESERVED_START) {
+        /* sexagesimal (base 60) integer */
+        int32_t numValue=(ntv>>2)-0xbf;
+        int32_t exp=(ntv&3)+1;
+
+        switch(exp) {
+        case 4:
+            numValue*=60*60*60*60;
+            break;
+        case 3:
+            numValue*=60*60*60;
+            break;
+        case 2:
+            numValue*=60*60;
+            break;
+        case 1:
+            numValue*=60;
+            break;
+        case 0:
+        default:
+            break;
+        }
+
         return numValue;
     } else {
         /* reserved */
@@ -475,7 +498,7 @@ u_forDigit(int32_t digit, int8_t radix) {
     }
 }
 
-/* miscellaneous, and support for uprops.c ---------------------------------- */
+/* miscellaneous, and support for uprops.cpp -------------------------------- */
 
 U_CAPI void U_EXPORT2
 u_getUnicodeVersion(UVersionInfo versionArray) {
@@ -485,19 +508,19 @@ u_getUnicodeVersion(UVersionInfo versionArray) {
 }
 
 U_CFUNC uint32_t
-u_getUnicodeProperties(UChar32 c, int32_t column) {
-    uint16_t vecIndex;
+u_getMainProperties(UChar32 c) {
+    uint32_t props;
+    GET_PROPS(c, props);
+    return props;
+}
 
-    if(column==-1) {
-        uint32_t props;
-        GET_PROPS(c, props);
-        return props;
-    } else if(
-               column<0 || column>=propsVectorsColumns
-    ) {
+U_CFUNC uint32_t
+u_getUnicodeProperties(UChar32 c, int32_t column) {
+    U_ASSERT(column>=0);
+    if(column>=propsVectorsColumns) {
         return 0;
     } else {
-        vecIndex=UTRIE2_GET16(&propsVectorsTrie, c);
+        uint16_t vecIndex=UTRIE2_GET16(&propsVectorsTrie, c);
         return propsVectors[vecIndex+column];
     }
 }
@@ -546,9 +569,8 @@ uscript_getScript(UChar32 c, UErrorCode *pErrorCode) {
     }
 }
 
-U_DRAFT UBool U_EXPORT2
+U_CAPI UBool U_EXPORT2
 uscript_hasScript(UChar32 c, UScriptCode sc) {
-    UScriptCode script;
     const uint16_t *scx;
     uint32_t scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK;
     if(scriptX<UPROPS_SCRIPT_X_WITH_COMMON) {
@@ -556,16 +578,12 @@ uscript_hasScript(UChar32 c, UScriptCode sc) {
     }
 
     scx=scriptExtensions+(scriptX&UPROPS_SCRIPT_MASK);
-    if(scriptX<UPROPS_SCRIPT_X_WITH_INHERITED) {
-        script=USCRIPT_COMMON;
-    } else if(scriptX<UPROPS_SCRIPT_X_WITH_OTHER) {
-        script=USCRIPT_INHERITED;
-    } else {
-        script=(UScriptCode)scx[0];
+    if(scriptX>=UPROPS_SCRIPT_X_WITH_OTHER) {
         scx=scriptExtensions+scx[1];
     }
-    if(sc==script) {
-        return TRUE;
+    if(sc>=USCRIPT_CODE_LIMIT) {
+        /* Guard against bogus input that would make us go past the Script_Extensions terminator. */
+        return FALSE;
     }
     while(sc>*scx) {
         ++scx;
@@ -573,7 +591,7 @@ uscript_hasScript(UChar32 c, UScriptCode sc) {
     return sc==(*scx&0x7fff);
 }
 
-U_DRAFT int32_t U_EXPORT2
+U_CAPI int32_t U_EXPORT2
 uscript_getScriptExtensions(UChar32 c,
                             UScriptCode *scripts, int32_t capacity,
                             UErrorCode *pErrorCode) {
@@ -590,18 +608,23 @@ uscript_getScriptExtensions(UChar32 c,
     }
     scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK;
     if(scriptX<UPROPS_SCRIPT_X_WITH_COMMON) {
-        return 0;
+        if(capacity==0) {
+            *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
+        } else {
+            scripts[0]=(UScriptCode)scriptX;
+        }
+        return 1;
     }
 
-    length=0;
     scx=scriptExtensions+(scriptX&UPROPS_SCRIPT_MASK);
     if(scriptX>=UPROPS_SCRIPT_X_WITH_OTHER) {
         scx=scriptExtensions+scx[1];
     }
+    length=0;
     do {
         sx=*scx++;
         if(length<capacity) {
-            scripts[length]=sx&0x7fff;
+            scripts[length]=(UScriptCode)(sx&0x7fff);
         }
         ++length;
     } while(sx<0x8000);