]> 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 9cb5f0db196a9b43618360db286bec25c3a40b28..57e00afc10f8b124052cbfdbaf65ea800de39f6a 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ********************************************************************************
-*   Copyright (C) 1996-2012, International Business Machines
+*   Copyright (C) 1996-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 ********************************************************************************
 *
@@ -24,7 +24,6 @@
 #include "unicode/uscript.h"
 #include "unicode/udata.h"
 #include "uassert.h"
-#include "umutex.h"
 #include "cmemory.h"
 #include "ucln_cmn.h"
 #include "utrie2.h"
@@ -32,8 +31,6 @@
 #include "uprops.h"
 #include "ustr_imp.h"
 
-#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
-
 /* uchar_props_data.h is machine-generated by genprops --csource */
 #define INCLUDED_FROM_UCHAR_C
 #include "uchar_props_data.h"
@@ -409,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;
@@ -436,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 */
@@ -548,7 +569,7 @@ uscript_getScript(UChar32 c, UErrorCode *pErrorCode) {
     }
 }
 
-U_DRAFT UBool U_EXPORT2
+U_CAPI UBool U_EXPORT2
 uscript_hasScript(UChar32 c, UScriptCode sc) {
     const uint16_t *scx;
     uint32_t scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK;
@@ -560,7 +581,7 @@ uscript_hasScript(UChar32 c, UScriptCode sc) {
     if(scriptX>=UPROPS_SCRIPT_X_WITH_OTHER) {
         scx=scriptExtensions+scx[1];
     }
-    if(sc>0x7fff) {
+    if(sc>=USCRIPT_CODE_LIMIT) {
         /* Guard against bogus input that would make us go past the Script_Extensions terminator. */
         return FALSE;
     }
@@ -570,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) {
@@ -603,7 +624,7 @@ uscript_getScriptExtensions(UChar32 c,
     do {
         sx=*scx++;
         if(length<capacity) {
-            scripts[length]=sx&0x7fff;
+            scripts[length]=(UScriptCode)(sx&0x7fff);
         }
         ++length;
     } while(sx<0x8000);