]> granicus.if.org Git - icu/commitdiff
ICU-21545 fix Unicode properties Bazel build
authorMarkus Scherer <markus.icu@gmail.com>
Mon, 27 Sep 2021 18:46:06 +0000 (11:46 -0700)
committerMarkus Scherer <markus.icu@gmail.com>
Tue, 28 Sep 2021 00:49:44 +0000 (17:49 -0700)
icu4c/source/tools/icuexportdata/icuexportdata.cpp
icu4c/source/tools/toolutil/BUILD
icu4c/source/tools/toolutil/writesrc.cpp
icu4c/source/tools/toolutil/writesrc.h

index 737f891c515ac6e3fe7ca125d533a6c08d2bf5bc..ef933676115e1bf8e9e1d3bc2fdba2a03327910e 100644 (file)
@@ -34,6 +34,20 @@ void handleError(ErrorCode& status, const char* context) {
     }
 }
 
+class PropertyValueNameGetter : public ValueNameGetter {
+public:
+    PropertyValueNameGetter(UProperty prop) : property(prop) {}
+    ~PropertyValueNameGetter() override;
+    const char *getName(uint32_t value) override {
+        return u_getPropertyValueName(property, value, U_SHORT_PROPERTY_NAME);
+    }
+
+private:
+    UProperty property;
+};
+
+PropertyValueNameGetter::~PropertyValueNameGetter() {}
+
 void dumpBinaryProperty(UProperty uproperty, FILE* f) {
     IcuToolErrorCode status("icuexportdata: dumpBinaryProperty");
     const char* fullPropName = u_getPropertyName(uproperty, U_LONG_PROPERTY_NAME);
@@ -57,7 +71,8 @@ void dumpEnumeratedProperty(UProperty uproperty, FILE* f) {
     fputs("[[enum_property]]\n", f);
     fprintf(f, "long_name = \"%s\"\n", fullPropName);
     if (shortPropName) fprintf(f, "short_name = \"%s\"\n", shortPropName);
-    usrc_writeUCPMap(f, umap, uproperty, UPRV_TARGET_SYNTAX_TOML);
+    PropertyValueNameGetter valueNameGetter(uproperty);
+    usrc_writeUCPMap(f, umap, &valueNameGetter, UPRV_TARGET_SYNTAX_TOML);
     fputs("\n", f);
 
     U_ASSERT(u_getIntPropertyMinValue(uproperty) >= 0);
index 734e9c7b59fc66036fcade7f35ec23f882efc27f..276c857f1246c8250a24634a1631d0c2c06b255e 100644 (file)
@@ -54,7 +54,11 @@ cc_library(
     local_defines = [
         "U_TOOLUTIL_IMPLEMENTATION",
     ],
-    deps = ["//icu4c/source/common:platform"],
+    deps = [
+        "//icu4c/source/common:bytestream",
+        "//icu4c/source/common:platform",
+        "//icu4c/source/common:uniset_core",
+    ],
 )
 
 cc_library(
index 9db3118e13c2256b04bd3b61b62fc19567f99d1b..143254a7f3451862140c1447e0c7a43e62e97c4d 100644 (file)
 #include "writesrc.h"
 #include "util.h"
 
+U_NAMESPACE_BEGIN
+
+ValueNameGetter::~ValueNameGetter() {}
+
+U_NAMESPACE_END
+
 U_NAMESPACE_USE
 
 static FILE *
@@ -401,7 +407,7 @@ U_CAPI void U_EXPORT2
 usrc_writeUCPMap(
         FILE *f,
         const UCPMap *pMap,
-        UProperty uproperty,
+        icu::ValueNameGetter *valueNameGetter,
         UTargetSyntax syntax) {
     // ccode is not yet supported
     U_ASSERT(syntax == UPRV_TARGET_SYNTAX_TOML);
@@ -413,9 +419,9 @@ usrc_writeUCPMap(
     fprintf(f, "# Code points `a` through `b` have value `v`, corresponding to `name`.\n");
     fprintf(f, "ranges = [\n");
     while ((end = ucpmap_getRange(pMap, start, UCPMAP_RANGE_NORMAL, 0, nullptr, nullptr, &value)) >= 0) {
-        if (uproperty != UCHAR_INVALID_CODE) {
-            const char* short_name = u_getPropertyValueName(uproperty, value, U_SHORT_PROPERTY_NAME);
-            fprintf(f, "  {a=0x%x, b=0x%x, v=%u, name=\"%s\"},\n", start, end, value, short_name);
+        if (valueNameGetter != nullptr) {
+            const char *name = valueNameGetter->getName(value);
+            fprintf(f, "  {a=0x%x, b=0x%x, v=%u, name=\"%s\"},\n", start, end, value, name);
         } else {
             fprintf(f, "  {a=0x%x, b=0x%x, v=%u},\n", start, end, value);
         }
index 25377af25c08d281d60a79174491e2bc458bac51..784a9b9c7a7589b83525540e222399677aecaa35 100644 (file)
@@ -143,19 +143,33 @@ usrc_writeUnicodeSet(
     const USet *pSet,
     UTargetSyntax syntax);
 
+#ifdef __cplusplus
+
+U_NAMESPACE_BEGIN
+
+class U_TOOLUTIL_API ValueNameGetter {
+public:
+    virtual ~ValueNameGetter();
+    virtual const char *getName(uint32_t value) = 0;
+};
+
+U_NAMESPACE_END
+
 /**
  * Writes the UCPMap ranges list.
  *
- * The "uproperty" argument is optional; ignored if UCHAR_INVALID_CODE. If present, it will be used
- * to look up the property value name strings.
+ * The "valueNameGetter" argument is optional; ignored if nullptr.
+ * If present, it will be used to look up value name strings.
  */
 U_CAPI void U_EXPORT2
 usrc_writeUCPMap(
     FILE *f,
     const UCPMap *pMap,
-    UProperty uproperty,
+    icu::ValueNameGetter *valueNameGetter,
     UTargetSyntax syntax);
 
+#endif  // __cplusplus
+
 /**
  * Writes the contents of an array of mostly invariant characters.
  * Characters 0..0x1f are printed as numbers,