mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-10 07:39:16 +00:00
ICU-23004 git merge main after ICU 77
This commit is contained in:
commit
adcf6f63cc
9100 changed files with 23953 additions and 72001 deletions
5
.github/pull_request_template.md
vendored
5
.github/pull_request_template.md
vendored
|
@ -8,8 +8,8 @@ Thank you for your pull request!
|
|||
* Associating PRs with Jira issues
|
||||
- We require each pull request to be associated with a [Jira issue](https://icu.unicode.org/bugs).
|
||||
- Reuse existing issues for minor changes:
|
||||
* ICU 77 docs minor fixes: ICU-22921 — User Guide & API docs typos etc., and version updates (e.g., dependabot for User Guide)
|
||||
* ICU 77 code warnings/version updates: ICU-22920 — Fix compiler warnings. Update versions of code-related dependencies (e.g., dependabot).
|
||||
* ICU 78 docs minor fixes: ICU-23055 — User Guide & API docs typos etc., and version updates (e.g., dependabot for User Guide)
|
||||
* ICU 78 code warnings/version updates: ICU-23054 — Fix compiler warnings. Update versions of code-related dependencies (e.g., dependabot).
|
||||
* Contributors license agreement (CLA):
|
||||
- You will be automatically asked to sign the CLA before the PR is accepted.
|
||||
- To sign the CLA: https://cla-assistant.io/unicode-org/icu
|
||||
|
@ -20,7 +20,6 @@ TODO: Fill out the checklist below.
|
|||
#### Checklist
|
||||
- [ ] Required: Issue filed: ICU-NNNNN
|
||||
- [ ] Required: The PR title must be prefixed with a JIRA Issue number. Example: "ICU-1234 Fix xyz"
|
||||
- [ ] Required: The PR description must include the link to the Jira Issue, for example by completing the URL in the first checklist item
|
||||
- [ ] Required: Each commit message must be prefixed with a JIRA Issue number. Example: "ICU-1234 Fix xyz"
|
||||
- [ ] Issue accepted (done by Technical Committee after discussion)
|
||||
- [ ] Tests included, if applicable
|
||||
|
|
64
.github/workflows/brs-commit-checker.yml
vendored
Normal file
64
.github/workflows/brs-commit-checker.yml
vendored
Normal file
|
@ -0,0 +1,64 @@
|
|||
name: BRS Commit Checker Report
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
fix_version:
|
||||
type: string
|
||||
required: true
|
||||
description: The ICU Jira "Fix Version" semver
|
||||
from_git_ref:
|
||||
type: string
|
||||
required: true
|
||||
description: The git ref start of comparison range. Prefix branches with `origin/`.
|
||||
end_git_ref:
|
||||
type: string
|
||||
required: true
|
||||
description: The git ref end of comparison range. Must be descendant of `from_git_ref`. Prefix branches with `origin/`.
|
||||
# Jira user name & API token is used for processing sensitive tickets comes from Github Secrets
|
||||
# stored in the repository
|
||||
|
||||
jobs:
|
||||
commit-report:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-tags: true
|
||||
fetch-depth: 0
|
||||
# workaround for bug in checkout action. this step should be redundant.
|
||||
# https://github.com/actions/checkout/issues/1471
|
||||
# https://github.com/actions/checkout/issues/1781
|
||||
# https://github.com/actions/checkout/issues/701#issuecomment-1133937950
|
||||
- name: Fetch all tags
|
||||
run: |
|
||||
git fetch --tags origin
|
||||
- name: Fetch all branches
|
||||
run: |
|
||||
git fetch origin
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12.8'
|
||||
cache: 'pipenv'
|
||||
cache-dependency-path: |
|
||||
tools/commit-checker/Pipfile
|
||||
tools/commit-checker/Pipfile.lock
|
||||
- name: Install pipenv
|
||||
run: |
|
||||
sudo pip3 install pipenv
|
||||
- name: Generate report
|
||||
env:
|
||||
JIRA_USERNAME: ${{ secrets.COMMIT_CHECKER_JIRA_EMAIL }}
|
||||
JIRA_PASSWORD: ${{ secrets.COMMIT_CHECKER_JIRA_TOKEN }}
|
||||
run: |
|
||||
pushd ./tools/commit-checker
|
||||
pipenv install
|
||||
pipenv run python3 check.py \
|
||||
--jira-query "project=ICU AND fixVersion=${{ inputs.fix_version }}" \
|
||||
--rev-range "${{ inputs.from_git_ref }}..${{ inputs.end_git_ref }}" > REPORT.md
|
||||
popd
|
||||
# https://github.blog/news-insights/product-news/supercharging-github-actions-with-job-summaries/
|
||||
- name: Reproduce report as workflow job summary
|
||||
run: |
|
||||
cat ./tools/commit-checker/REPORT.md >> $GITHUB_STEP_SUMMARY
|
||||
echo "View the Summary page of this GHA Workflow instance to view the rendered Markdown of this report."
|
2
.github/workflows/cache_retain.yml
vendored
2
.github/workflows/cache_retain.yml
vendored
|
@ -52,7 +52,7 @@ jobs:
|
|||
distribution: 'temurin'
|
||||
java-version: '11'
|
||||
- name: Restore read-only cache of local Maven repository
|
||||
uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
||||
uses: actions/cache/restore@v4.2.0
|
||||
id: cache
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
|
|
2
.github/workflows/cifuzz.yml
vendored
2
.github/workflows/cifuzz.yml
vendored
|
@ -55,7 +55,7 @@ jobs:
|
|||
path: ./out/artifacts
|
||||
- name: Upload Sarif
|
||||
if: always() && steps.build.outcome == 'success'
|
||||
uses: github/codeql-action/upload-sarif@v3.26.6
|
||||
uses: github/codeql-action/upload-sarif@v3.28.10
|
||||
with:
|
||||
# Path to SARIF file relative to the root of the repository
|
||||
sarif_file: cifuzz-sarif/results.sarif
|
||||
|
|
6
.github/workflows/icu4c.yml
vendored
6
.github/workflows/icu4c.yml
vendored
|
@ -53,7 +53,7 @@ jobs:
|
|||
./runConfigureICU Linux --disable-renaming;
|
||||
# Fail if 'warning:' appears in doxygen's output, but ignore warnings from file Doxyfile.
|
||||
# Regex note: (?! ... ) is a negative lookahead. Succeed if the pattern is not present.
|
||||
set +o pipefail && make doc 2>&1 | tee doxygen.log && ( ! grep -P 'warning:(?! .* file .?Doxyfile)' doxygen.log )
|
||||
set +o pipefail && make doc-searchengine 2>&1 | tee doxygen.log && ( ! grep -P 'warning:(?! .* file .?Doxyfile)' doxygen.log )
|
||||
|
||||
# gcc debug build.
|
||||
# Includes dependency checker.
|
||||
|
@ -740,13 +740,13 @@ jobs:
|
|||
runs-on: ubuntu-22.04 # Updated in BRS
|
||||
steps:
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
- uses: bazelbuild/setup-bazelisk@b39c379c82683a5f25d34f0d062761f62693e0b2 # v3.0.0
|
||||
- uses: bazel-contrib/setup-bazel@0.14.0
|
||||
- name: Get CI Linux runner VM version
|
||||
id: linux-version
|
||||
run: |
|
||||
echo "LINUX_VERSION=$(grep -F VERSION_ID /etc/os-release | cut -d'"' -f2)" >> $GITHUB_OUTPUT
|
||||
- name: Mount bazel cache
|
||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
||||
uses: actions/cache@v4.2.0
|
||||
with:
|
||||
path: "~/.cache/bazel"
|
||||
key: bazel-${{ runner.os }}-${{ steps.linux-version.outputs.LINUX_VERSION }}
|
||||
|
|
52
.github/workflows/icu_merge_ci.yml
vendored
52
.github/workflows/icu_merge_ci.yml
vendored
|
@ -45,7 +45,7 @@ jobs:
|
|||
- name: Checkout lfs objects
|
||||
run: git lfs pull
|
||||
- name: Cache local Maven repository
|
||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
||||
uses: actions/cache@v4.2.0
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||
|
@ -71,7 +71,7 @@ jobs:
|
|||
- name: Checkout lfs objects
|
||||
run: git lfs pull
|
||||
- name: Lookup read-only cache of local Maven repository
|
||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
||||
uses: actions/cache@v4.2.0
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||
|
@ -144,7 +144,7 @@ jobs:
|
|||
- name: Create directory for lib files
|
||||
run: mkdir icu4c/source/perflib
|
||||
- name: Get ICU libs
|
||||
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
|
||||
uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
|
||||
with:
|
||||
name: icu-perf-libs
|
||||
path: icu4c/source/lib
|
||||
|
@ -218,7 +218,7 @@ jobs:
|
|||
- name: Create directory for lib files
|
||||
run: mkdir icu4c/source/perflib
|
||||
- name: Get ICU libs
|
||||
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
|
||||
uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
|
||||
with:
|
||||
name: icu-perf-libs
|
||||
path: icu4c/source/lib
|
||||
|
@ -283,7 +283,7 @@ jobs:
|
|||
- name: Create directory for lib files
|
||||
run: mkdir icu4c/source/perflib
|
||||
- name: Get ICU libs
|
||||
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
|
||||
uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
|
||||
with:
|
||||
name: icu-perf-libs
|
||||
path: icu4c/source/lib
|
||||
|
@ -335,7 +335,7 @@ jobs:
|
|||
- name: Checkout lfs objects
|
||||
run: git lfs pull
|
||||
- name: Lookup read-only cache of local Maven repository
|
||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
||||
uses: actions/cache@v4.2.0
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||
|
@ -349,11 +349,6 @@ jobs:
|
|||
|
||||
- name: Build and run unicodesetperf test
|
||||
run: |
|
||||
# This file needs to be restored otherwise GHA cannot
|
||||
# check-out the perfdata branch. Setting up this task with GH lfs
|
||||
# modifies the file but the details of why and how are unknown.
|
||||
git restore --staged tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
|
||||
git restore tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
|
||||
cd icu4j;
|
||||
mvn ${SHARED_MVN_ARGS} verify -DskipITs -DskipTests;
|
||||
git status
|
||||
|
@ -397,7 +392,7 @@ jobs:
|
|||
- name: Checkout lfs objects
|
||||
run: git lfs pull
|
||||
- name: Lookup read-only cache of local Maven repository
|
||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
||||
uses: actions/cache@v4.2.0
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||
|
@ -411,11 +406,6 @@ jobs:
|
|||
|
||||
- name: Build and run ucharacterperf test
|
||||
run: |
|
||||
# This file needs to be restored otherwise GHA cannot
|
||||
# check-out the perfdata branch. Setting up this task with GH lfs
|
||||
# modifies the file but the details of why and how are unknown.
|
||||
git restore --staged tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
|
||||
git restore tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
|
||||
cd icu4j;
|
||||
mvn ${SHARED_MVN_ARGS} verify -DskipITs -DskipTests;
|
||||
cd perf-tests;
|
||||
|
@ -461,7 +451,7 @@ jobs:
|
|||
- name: Checkout lfs objects
|
||||
run: git lfs pull
|
||||
- name: Lookup read-only cache of local Maven repository
|
||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
||||
uses: actions/cache@v4.2.0
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||
|
@ -475,11 +465,6 @@ jobs:
|
|||
|
||||
- name: Build and run decimalformatperf
|
||||
run: |
|
||||
# This file needs to be restored otherwise GHA cannot
|
||||
# check-out the perfdata branch. Setting up this task with GH lfs
|
||||
# modifies the file but the details of why and how are unknown.
|
||||
git restore --staged tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
|
||||
git restore tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
|
||||
cd icu4j;
|
||||
mvn ${SHARED_MVN_ARGS} verify -DskipITs -DskipTests;
|
||||
cd perf-tests;
|
||||
|
@ -530,7 +515,7 @@ jobs:
|
|||
- name: Checkout lfs objects
|
||||
run: git lfs pull
|
||||
- name: Lookup read-only cache of local Maven repository
|
||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
||||
uses: actions/cache@v4.2.0
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||
|
@ -546,11 +531,6 @@ jobs:
|
|||
env:
|
||||
DATA_FILE_PATH: data/collation
|
||||
run: |
|
||||
# This file needs to be restored otherwise GHA cannot
|
||||
# check-out the perfdata branch. Setting up this task with GH lfs
|
||||
# modifies the file but the details of why and how are unknown.
|
||||
git restore --staged tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
|
||||
git restore tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
|
||||
cd icu4j;
|
||||
mvn ${SHARED_MVN_ARGS} verify -DskipITs -DskipTests;
|
||||
cd perf-tests;
|
||||
|
@ -669,7 +649,7 @@ jobs:
|
|||
- name: Checkout lfs objects
|
||||
run: git lfs pull
|
||||
- name: Lookup read-only cache of local Maven repository
|
||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
||||
uses: actions/cache@v4.2.0
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||
|
@ -685,11 +665,6 @@ jobs:
|
|||
env:
|
||||
DATA_FILE_PATH: data/conversion
|
||||
run: |
|
||||
# This file needs to be restored otherwise GHA cannot
|
||||
# check-out the perfdata branch. Setting up this task with GH lfs
|
||||
# modifies the file but the details of why and how are unknown.
|
||||
git restore --staged tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
|
||||
git restore tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
|
||||
cd icu4j;
|
||||
mvn ${SHARED_MVN_ARGS} verify -DskipITs -DskipTests;
|
||||
cd perf-tests;
|
||||
|
@ -752,7 +727,7 @@ jobs:
|
|||
- name: Checkout lfs objects
|
||||
run: git lfs pull
|
||||
- name: Lookup read-only cache of local Maven repository
|
||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
||||
uses: actions/cache@v4.2.0
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||
|
@ -771,11 +746,6 @@ jobs:
|
|||
echo "DDIR=${ddir: -1}" >> $GITHUB_ENV
|
||||
- name: Build and run dateformatperf
|
||||
run: |
|
||||
# This file needs to be restored otherwise GHA cannot
|
||||
# check-out the perfdata branch. Setting up this task with GH lfs
|
||||
# modifies the file but the details of why and how are unknown.
|
||||
git restore --staged tools/multi/proj/icu4cscan/old-xmls.tar.bz2
|
||||
git restore tools/multi/proj/icu4cscan/old-xmls.tar.bz2
|
||||
cd icu4j;
|
||||
mvn ${SHARED_MVN_ARGS} verify -DskipITs -DskipTests;
|
||||
cd perf-tests;
|
||||
|
|
6
.github/workflows/release-icu4c-ubuntu.yml
vendored
6
.github/workflows/release-icu4c-ubuntu.yml
vendored
|
@ -60,14 +60,14 @@ jobs:
|
|||
source /etc/os-release
|
||||
# Get the ICU version in artifact_version
|
||||
source icu4j/releases_tools/shared.sh
|
||||
# Convert 76.1 to 76_1
|
||||
# Convert 77.1 to 77_1
|
||||
underscore_version=$(echo $artifact_version | sed 's/\./_/g')
|
||||
pushd ${RELEASE_FOLDER}
|
||||
tar -czf icu4c-${underscore_version}-Ubuntu${VERSION_ID}-x64.tgz icu
|
||||
rm -fr icu
|
||||
popd
|
||||
mv icu4c/source/dist/icu4c-76_1-d* ${RELEASE_FOLDER}
|
||||
mv icu4c/source/dist/icu4c-76_1-src.* ${RELEASE_FOLDER}
|
||||
mv icu4c/source/dist/icu4c-77_1-d* ${RELEASE_FOLDER}
|
||||
mv icu4c/source/dist/icu4c-77_1-src.* ${RELEASE_FOLDER}
|
||||
|
||||
- name: Upload build results
|
||||
uses: actions/upload-artifact@v4.3.6
|
||||
|
|
4
.github/workflows/scorecard.yml
vendored
4
.github/workflows/scorecard.yml
vendored
|
@ -34,7 +34,7 @@ jobs:
|
|||
persist-credentials: false
|
||||
|
||||
- name: "Run analysis"
|
||||
uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0
|
||||
uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1
|
||||
with:
|
||||
results_file: results.sarif
|
||||
results_format: sarif
|
||||
|
@ -59,6 +59,6 @@ jobs:
|
|||
|
||||
# Upload the results to GitHub's code scanning dashboard.
|
||||
- name: "Upload to code-scanning"
|
||||
uses: github/codeql-action/upload-sarif@9b41ced437d4a4f34bf0b740f80b4e52d3c4bccd # v2.25.15
|
||||
uses: github/codeql-action/upload-sarif@83923549f688e42b34d0b90ee94725f7c30532fc # v2.25.15
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
|
|
2
.github/workflows/wait-for-checks.yml
vendored
2
.github/workflows/wait-for-checks.yml
vendored
|
@ -20,7 +20,7 @@ jobs:
|
|||
checks: read
|
||||
steps:
|
||||
- name: Wait for Triggered Required GH Checks
|
||||
uses: poseidon/wait-for-status-checks@6988432d64ad3f9c2608db4ca16fded1b7d36ead # v0.5.0
|
||||
uses: poseidon/wait-for-status-checks@899c768d191b56eef585c18f8558da19e1f3e707 # v0.6.0
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
# This regex matches everything since almost all (if not all) CI checks are required.
|
||||
|
|
2
LICENSE
2
LICENSE
|
@ -2,7 +2,7 @@ UNICODE LICENSE V3
|
|||
|
||||
COPYRIGHT AND PERMISSION NOTICE
|
||||
|
||||
Copyright © 2016-2024 Unicode, Inc.
|
||||
Copyright © 2016-2025 Unicode, Inc.
|
||||
|
||||
NOTICE TO USER: Carefully read the following legal agreement. BY
|
||||
DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR
|
||||
|
|
|
@ -110,11 +110,50 @@ These instructions have not yet verified Eclipse's handling of the import of the
|
|||
|
||||
### VS Code
|
||||
|
||||
VS Code's support of Maven projects is not as robust as IntelliJ's when it comes to the non-standard file layout for sources and tests.
|
||||
The Maven support comes from the standard Java extension (which depends on the standard Maven extension) from the extension marketplace.
|
||||
Source and test code files are not recognized properly, and it is not clear how to execute the tests.
|
||||
VS Code's support of Maven projects has not been as robust as IntelliJ's when it comes to multi-module Maven projects such as what ICU4J has.
|
||||
This situation has gotten better recently, and workable solutions are documented below..
|
||||
|
||||
However, a workaround exists for those who want to use VS Code as their preferred editor and still execute commands to recompile or run tests.
|
||||
The Maven extension that is mostly likely to top search result comes from [the Extension Pack for Java extension](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) that is maintained by the maintainers of VS Code itself. However, this extension and its dependencies do not work together satisfactorily for the ICU4J codebase.
|
||||
Source and test code files are not recognized properly, and it is not clear how to execute the tests.
|
||||
This may improve in the future.
|
||||
|
||||
For now (Jan 2025), there are a couple of different options for running Maven build commands for ICU4J in VS Code.
|
||||
|
||||
#### Install the Java extension from Oracle
|
||||
|
||||
Oracle's [Java extension for VS Code](https://marketplace.visualstudio.com/items?itemName=Oracle.oracle-java) includes support for Maven projects, including multi-module Maven projects.
|
||||
|
||||
You can view the Java extension's view of the Maven project through the "Projects" tab of the workspace explorer accordion widget.
|
||||
The project will display the list of Maven sub-modules.
|
||||
Within a submodule, click on "Source Pakcages" to view the Java class packages.
|
||||
From there, you can navigate to specific classes according to the package structure.
|
||||
|
||||
> :point_right: **Note**: This extension will use the version of Java according to the location of Java that you have defined in your `JAVA_HOME` system environment variable.
|
||||
|
||||
> :point_right: **Note**: You will also need the Maven command (`mvn`) in your `PATH` system environment variable for the extension to work.
|
||||
|
||||

|
||||
|
||||
To run all of the tests in a Maven submodule, right-click on the module and selecting "Test Project".
|
||||
|
||||

|
||||
|
||||
To run all of the tests in a single test class, open the test class, and click on the triangular play button on level with the class declaration line. You can right click on that button to run in debug mode and enable other options.
|
||||
|
||||
Every individual test will have a similar button on level with the test signature to run only that one test.
|
||||
|
||||

|
||||
|
||||
The output for a test run invocation will appear in the Debug Console tab of the bottom panel.
|
||||
|
||||
> :point_right: **Note**: In the Test Results tab, if the the formatting of the output that is provided per test is not formatted correctly, it may be related to formatting in the Maven CLI command's output (ex: allowing ANSI color code escape characters, which some system's Maven installtions enable by default).
|
||||
|
||||

|
||||
|
||||
#### Run Maven shell commands with a command palette
|
||||
|
||||
If none of the Java/Maven extensions for VS Code work with your instance of VS Code,
|
||||
there is still a way to execute commands to recompile or run tests.
|
||||
The workaround relies on invoking the Maven commands in a shell, and using a VS Code extension to create shortcuts within the IDE to invoke those commands.
|
||||
|
||||
The extension is [Command Runner](https://marketplace.visualstudio.com/items?itemName=edonet.vscode-command-runner).
|
BIN
docs/devsetup/java/maven/open-sources-uniset.png
Normal file
BIN
docs/devsetup/java/maven/open-sources-uniset.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 347 KiB |
BIN
docs/devsetup/java/maven/run-tests-main-core.png
Normal file
BIN
docs/devsetup/java/maven/run-tests-main-core.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 83 KiB |
BIN
docs/devsetup/java/maven/test-class-run-all-tests.png
Normal file
BIN
docs/devsetup/java/maven/test-class-run-all-tests.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 316 KiB |
BIN
docs/devsetup/java/maven/test-class-run-tests-result.png
Normal file
BIN
docs/devsetup/java/maven/test-class-run-tests-result.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 295 KiB |
|
@ -146,6 +146,23 @@ Note: There may be additional commits on the [maint/maint-76](https://github.com
|
|||
|
||||
## Known Issues
|
||||
|
||||
* Some segmentation changes should have been made as part of the Unicode 16 integration,
|
||||
but were delayed to ICU 77:
|
||||
* Word break: Root tailoring of colon reverted, Swedish & Finnish tailorings removed
|
||||
([ICU-22941](https://unicode-org.atlassian.net/browse/ICU-22941))
|
||||
([ICU 77 PR #3249](https://github.com/unicode-org/icu/pull/3249))
|
||||
* These tailorings were introduced in ICU 72, but feedback has been negative,
|
||||
and the UTC declined to adopt these changes.
|
||||
* Updated Indic grapheme clusters to use the latest `Indic_Conjunct_Break` data
|
||||
([ICU-22956](https://unicode-org.atlassian.net/browse/ICU-22956))
|
||||
([ICU 77 PR #3257](https://github.com/unicode-org/icu/pull/3257))
|
||||
* New APIs for colloquial C++ use of C USet ([ICU-22876](https://unicode-org.atlassian.net/browse/ICU-22876))
|
||||
and C UCollator ([ICU-22879](https://unicode-org.atlassian.net/browse/ICU-22879))
|
||||
* Some of the new APIs do not actually compile with `U_SHOW_CPLUSPLUS_API=0`.
|
||||
They have been fixed in ICU 77 and thoroughly tested.
|
||||
([ICU-22954](https://unicode-org.atlassian.net/browse/ICU-22954))
|
||||
* For details about these APIs and an example see the
|
||||
[“C++ Header-Only APIs” section below](#migration-issues).
|
||||
* One late CLDR 46 bug fix was accidentally omitted from ICU 46:
|
||||
[CLDR-18002](https://unicode-org.atlassian.net/browse/CLDR-18002) Fix likely subtag inconsistency
|
||||
([CLDR PR #4105](https://github.com/unicode-org/cldr/pull/4105))
|
||||
|
@ -193,6 +210,9 @@ These are C++ definitions that are not exported by the ICU DLLs/libraries,
|
|||
are thus inlined into the calling code,
|
||||
and which may call ICU C APIs but not into ICU non-header-only C++ APIs.
|
||||
|
||||
Note: Some of these new APIs did not actually compile with `U_SHOW_CPLUSPLUS_API=0`.
|
||||
They have been fixed in [ICU 77](77.md) and thoroughly tested.
|
||||
|
||||
The header-only APIs are defined in a nested `header` namespace.
|
||||
If entry point renaming is turned off (the main namespace is `icu` rather than `icu_76` etc.),
|
||||
then the new `U_HEADER_ONLY_NAMESPACE` is `icu::header`.
|
||||
|
@ -261,4 +281,4 @@ ICU locale data was generated from CLDR data equivalent to:
|
|||
<artifactId>icu4j</artifactId>
|
||||
<version>76.1</version>
|
||||
</dependency>
|
||||
```
|
||||
```
|
||||
|
|
155
docs/download/77.md
Normal file
155
docs/download/77.md
Normal file
|
@ -0,0 +1,155 @@
|
|||
---
|
||||
layout: default
|
||||
title: ICU 77
|
||||
nav_order: 899
|
||||
has_children: false
|
||||
parent: Downloading ICU
|
||||
---
|
||||
|
||||
<!--
|
||||
© 2025 and later: Unicode, Inc. and others.
|
||||
License & terms of use: http://www.unicode.org/copyright.html
|
||||
-->
|
||||
|
||||
# ICU 77
|
||||
|
||||
ICU is the [premier library for software internationalization](https://icu.unicode.org/#h.i33fakvpjb7o),
|
||||
used by a [wide array of companies and organizations](https://icu.unicode.org/#h.f9qwubthqabj).
|
||||
|
||||
## Release Overview
|
||||
|
||||
* Download: [releases/tag/release-77-1](https://github.com/unicode-org/icu/releases/tag/release-77-1)
|
||||
* [Maven: com.ibm.icu / icu4j / version 77.1](https://mvnrepository.com/artifact/com.ibm.icu/icu4j/77.1)
|
||||
|
||||
ICU 77 updates to
|
||||
[CLDR 47](https://cldr.unicode.org/downloads/cldr-47)
|
||||
([beta blog](https://blog.unicode.org/2025/02/unicode-cldr-47-beta-available-for.html))
|
||||
locale data with new locales, and various additions and corrections.
|
||||
|
||||
ICU 77 is mostly focused on bug fixes, segmentation conformance, and other refinements.
|
||||
|
||||
The Java technology preview implementation of the CLDR MessageFormat 2.0 specification has been updated to incorporate the
|
||||
[CLDR 46.1 spec](https://www.unicode.org/reports/tr35/tr35-74/tr35-messageFormat.html)
|
||||
plus most but not all of the CLDR 47 changes.
|
||||
|
||||
The C++ technology preview implementation of MessageFormat 2.0 is not yet quite up to date with CLDR 46.1.
|
||||
|
||||
For more details, including migration issues, see below.
|
||||
|
||||
Please use the [icu-support mailing list](https://icu.unicode.org/contacts) and/or [find/submit error reports](https://icu.unicode.org/bugs).
|
||||
|
||||
### Attention: Future Changes
|
||||
|
||||
Beginning with ICU 78 (2025-oct):
|
||||
|
||||
1. We want to move the minimum required Java version from Java 8 to Java 11.
|
||||
This is a significant, useful update in terms of the Java language and
|
||||
standard library, and simplifies ICU tooling which currently uses
|
||||
a mix of Java 8 and Java 11.
|
||||
Note that [Android desugaring](https://developer.android.com/studio/write/java11-default-support-table)
|
||||
supports at least Java 11 since late 2023.\
|
||||
See [ICU-23072](https://unicode-org.atlassian.net/browse/ICU-23072)
|
||||
where you can provide comments.
|
||||
2. We are planning to remove the
|
||||
[ICU4J Locale Service Provider](../userguide/icu4j/locale-service-provider.md)
|
||||
([Maven: com.ibm.icu / icu4j-localespi / version 76.1](https://mvnrepository.com/artifact/com.ibm.icu/icu4j-localespi/76.1)).
|
||||
It is much less useful than when we added it, has very low usage,
|
||||
needs work for newer Java versions, and complicates ICU4J development.\
|
||||
See [ICU-23071](https://unicode-org.atlassian.net/browse/ICU-23071)
|
||||
where you can provide comments.
|
||||
|
||||
### Version Number
|
||||
|
||||
The initial release has library version number 77.1.
|
||||
|
||||
* Release date: 2025-03-13
|
||||
* [List of tickets fixed in ICU 77](https://unicode-org.atlassian.net/issues/?jql=project%20%3D%20ICU%20AND%20status%20%3D%20Done%20AND%20resolution%20in%20%28Fixed%2C%20%22Fixed%20by%20Other%20Ticket%22%29%20AND%20fixVersion%20%3D%2077.1%20ORDER%20BY%20component%20ASC%2C%20created%20DESC)
|
||||
|
||||
If there are maintenance releases, they will be 77.2, 77.3, etc. (During ICU 77 development, the library version number was 77.0.x.)
|
||||
|
||||
Note: There may be additional commits on the [maint/maint-77](https://github.com/unicode-org/icu/tree/maint/maint-77) branch that are not included in the prepackaged download files.
|
||||
|
||||
## Common Changes
|
||||
|
||||
* [CLDR 47](https://cldr.unicode.org/downloads/cldr-47)
|
||||
([beta blog](https://blog.unicode.org/2025/02/unicode-cldr-47-beta-available-for.html)):
|
||||
* No major data collection for existing locales; focus on bug fixes and structural improvements
|
||||
* New regional variants: English in several European countries, and Cantonese in Macau (`yue_Hant_MO`)
|
||||
* Improved RBNF (number spellout) and transliteration data
|
||||
* Subtle segmentation changes to make ICU fully conform to Unicode 16
|
||||
* Word break: Root tailoring of colon reverted, Swedish & Finnish tailorings removed
|
||||
([ICU-22941](https://unicode-org.atlassian.net/browse/ICU-22941))
|
||||
* These tailorings were introduced in ICU 72, but feedback has been negative,
|
||||
and the UTC declined to adopt these changes.
|
||||
* Line break: Fixed a bug in the line breaking of obscure sequences
|
||||
⟨no-break space, combining mark, hyphen, alphabetic character⟩
|
||||
([ICU-22986](https://unicode-org.atlassian.net/browse/ICU-22986)).
|
||||
* Updated Indic grapheme clusters to use the latest `Indic_Conjunct_Break` data
|
||||
([ICU-22956](https://unicode-org.atlassian.net/browse/ICU-22956))
|
||||
* Time zone data (tzdata) version 2025a (2025-jan).
|
||||
|
||||
## ICU4C Specific Changes
|
||||
|
||||
* [API changes since ICU4C 76 (Markdown)](https://github.com/unicode-org/icu/blob/maint/maint-77/icu4c/APIChangeReport.md) / [(HTML)](https://htmlpreview.github.io/?https://github.com/unicode-org/icu/blob/maint/maint-77/icu4c/APIChangeReport.html)
|
||||
* New APIs for colloquial C++ use of C USet ([ICU-22876](https://unicode-org.atlassian.net/browse/ICU-22876))
|
||||
and C UCollator ([ICU-22879](https://unicode-org.atlassian.net/browse/ICU-22879))
|
||||
* These were added in ICU 76, but some of the new APIs did not actually compile with `U_SHOW_CPLUSPLUS_API=0`.
|
||||
They have been fixed in ICU 77 and thoroughly tested.
|
||||
USetElementIterator now returns std::u16string instead of icu::UnicodeString,
|
||||
and therefore it and related APIs have been changed to `@draft ICU 77`.
|
||||
([ICU-22954](https://unicode-org.atlassian.net/browse/ICU-22954))
|
||||
* For details about these APIs and an example see the
|
||||
“C++ Header-Only APIs” section of the [ICU 76 Migration Issues](76.md#migration-issues).
|
||||
|
||||
## ICU4J Specific Changes
|
||||
|
||||
* [API Changes since ICU4J 76](https://htmlpreview.github.io/?https://github.com/unicode-org/icu/blob/maint/maint-77/icu4j/APIChangeReport.html)
|
||||
* The Java technology preview implementation of the CLDR MessageFormat 2.0 specification has been updated to incorporate the
|
||||
[CLDR 46.1 spec](https://www.unicode.org/reports/tr35/tr35-74/tr35-messageFormat.html)
|
||||
plus most but not all of the CLDR 47 changes.
|
||||
|
||||
## Known Issues
|
||||
|
||||
* The new MeasureUnit for `portion-per-1e9` works for formatting,
|
||||
but when the new member function `getConstantDenominator()` is called on this unit,
|
||||
it incorrectly returns 0. ([ICU-23045](https://unicode-org.atlassian.net/browse/ICU-23045))
|
||||
|
||||
## Migration Issues
|
||||
|
||||
* (none yet)
|
||||
|
||||
### Migration Issues Related to CLDR
|
||||
* See [CLDR 47 migration issues](https://cldr.unicode.org/downloads/cldr-47#migration)
|
||||
|
||||
## ICU4C Platform Support
|
||||
|
||||
ICU4C requires C++17 and has been tested with up to C++20.
|
||||
|
||||
We routinely test on recent versions of Linux, macOS, and Windows.
|
||||
|
||||
We accept patches for other platforms.
|
||||
|
||||
Windows: The minimum supported version is Windows 7. (See [How To Build And Install On Windows](../userguide/icu4c/build.html#how-to-build-and-install-on-windows) for more details.)
|
||||
|
||||
## ICU4J Platform Support
|
||||
|
||||
ICU4J works on Java 8..21 (at least).
|
||||
|
||||
ICU4J should work on Android API level 21 and later but may require “[library desugaring](https://developer.android.com/studio/write/java8-support#library-desugaring)”.
|
||||
|
||||
## Download
|
||||
|
||||
### GitHub
|
||||
Source and binary downloads are available on the git/GitHub tag page: <https://github.com/unicode-org/icu/releases/tag/release-77-1>
|
||||
|
||||
See the [Source Code Setup](../devsetup/source/) page for how to download the ICU file tree directly from GitHub.
|
||||
|
||||
ICU locale data was generated from CLDR data equivalent to:
|
||||
|
||||
* <https://github.com/unicode-org/cldr/releases/tag/release-47>
|
||||
* <https://github.com/unicode-org/cldr-staging/releases/tag/release-47>
|
||||
|
||||
### Maven
|
||||
* https://mvnrepository.com/artifact/com.ibm.icu/icu4j/77.1
|
||||
* https://mvnrepository.com/artifact/com.ibm.icu/icu4j-charset/77.1
|
||||
* https://mvnrepository.com/artifact/com.ibm.icu/icu4j-localespi/77.1
|
|
@ -16,13 +16,21 @@ If you want to use ICU (as opposed to developing it), it is recommended that you
|
|||
|
||||
## Latest Release
|
||||
|
||||
***2024-10-24: ICU 76 is now available.***
|
||||
It updates to [Unicode 16](https://www.unicode.org/versions/Unicode16.0.0/) ([blog](https://blog.unicode.org/2024/09/announcing-unicode-standard-version-160.html)), including new characters and scripts, emoji, collation & IDNA changes, and corresponding APIs and implementations. It also updates to [CLDR 46](https://cldr.unicode.org/downloads/cldr-46) ([beta blog](https://blog.unicode.org/2024/09/unicode-cldr-46-beta-available-for.html)) locale data with new locales, significant updates to existing locales, and various additions and corrections. For example, the CLDR and Unicode default sort orders are now very nearly the same.
|
||||
***2025-03-13: ICU 77 is now available*** —
|
||||
[releases/tag/release-77-1](https://github.com/unicode-org/icu/releases/tag/release-77-1) —
|
||||
[Maven: com.ibm.icu / icu4j / version 77.1](https://mvnrepository.com/artifact/com.ibm.icu/icu4j/77.1)
|
||||
|
||||
Most of the java.time (Temporal) types can now be formatted directly. There are some new APIs to make ICU easier to use with modern C++ and Java patterns. The Java and C++ technology preview implementations of the CLDR MessageFormat 2.0 specification have been updated to match recent changes. See [ICU 76](76.md).
|
||||
[ICU 77](77.md) updates to [CLDR 47](https://cldr.unicode.org/downloads/cldr-47)
|
||||
locale data with new locales, and various additions and corrections.
|
||||
|
||||
ICU 77 is mostly focused on bug fixes, segmentation conformance, and other refinements.
|
||||
The technology preview implementations of the CLDR MessageFormat 2.0 specification have been updated to incorporate some, but not yet all, of the CLDR 47 changes. (Java more than C++)
|
||||
|
||||
## Previous Releases
|
||||
|
||||
- 2024-10-24: **ICU 76** updates to [Unicode 16](https://www.unicode.org/versions/Unicode16.0.0/) ([blog](https://blog.unicode.org/2024/09/announcing-unicode-standard-version-160.html)), including new characters and scripts, emoji, collation & IDNA changes, and corresponding APIs and implementations. It also updates to [CLDR 46](https://cldr.unicode.org/downloads/cldr-46) ([beta blog](https://blog.unicode.org/2024/09/unicode-cldr-46-beta-available-for.html)) locale data with new locales, significant updates to existing locales, and various additions and corrections. For example, the CLDR and Unicode default sort orders are now very nearly the same.
|
||||
- Most of the java.time (Temporal) types can now be formatted directly. There are some new APIs to make ICU easier to use with modern C++ and Java patterns. The Java and C++ technology preview implementations of the CLDR MessageFormat 2.0 specification have been updated to match recent changes. See [ICU 76](76.md).
|
||||
|
||||
- 2024-04-17: **ICU 75** updates to [CLDR 45](https://cldr.unicode.org/index/downloads/cldr-45) ([beta blog](https://blog.unicode.org/2024/04/unicode-cldr-v45-beta-available-for.html)) locale data with new locales and various additions and corrections. C++ code now requires C++17 and is being made more robust. The CLDR MessageFormat 2.0 specification is now in [technology preview](https://github.com/unicode-org/message-format-wg?tab=readme-ov-file#messageformat-2-technical-preview), together with a corresponding update of the ICU4J (Java) tech preview and a new ICU4C (C++) tech preview. See [Downloading ICU > ICU 75](https://icu.unicode.org/download/75).
|
||||
|
||||
- 2023-12-13: **ICU 74.2** released with date/time formatting bug fixes. See [Downloading ICU > ICU 74](https://icu.unicode.org/download/74).
|
||||
|
|
|
@ -29,10 +29,22 @@ It is the official landing page for the ICU project.
|
|||
Some of the pages from the ICU Site have been migrated here.
|
||||
The migrated sections and pages from the ICU Site are visible in the navigation bar of this site below the "ICU Site" section heading.
|
||||
|
||||
### Downloading ICU
|
||||
## Downloading ICU
|
||||
|
||||
The [Downloading ICU](download) page has been migrated here.
|
||||
|
||||
### Latest Release
|
||||
|
||||
***2025-03-13: ICU 77 is now available*** —
|
||||
[releases/tag/release-77-1](https://github.com/unicode-org/icu/releases/tag/release-77-1) —
|
||||
[Maven: com.ibm.icu / icu4j / version 77.1](https://mvnrepository.com/artifact/com.ibm.icu/icu4j/77.1)
|
||||
|
||||
[ICU 77](download/77.md) updates to [CLDR 47](https://cldr.unicode.org/downloads/cldr-47)
|
||||
locale data with new locales, and various additions and corrections.
|
||||
|
||||
ICU 77 is mostly focused on bug fixes, segmentation conformance, and other refinements.
|
||||
The technology preview implementations of the CLDR MessageFormat 2.0 specification have been updated to incorporate some, but not yet all, of the CLDR 47 changes. (Java more than C++)
|
||||
|
||||
## ICU team member pages
|
||||
|
||||
Other documentation pages here are written by and for team members.
|
||||
|
|
|
@ -368,9 +368,6 @@ Note: This is also referenced below [Upload API documentations](docs.md#upload-a
|
|||
|
||||
### ICU4J
|
||||
|
||||
**Note:** JCite must be installed for building ICU4J documentation:
|
||||
<https://icu.unicode.org/setup/java/ant#TOC-Building-ICU4J-API-Reference-Document-with-JCite>
|
||||
|
||||
Build the API documentation pages for the new release:
|
||||
|
||||
```
|
||||
|
|
|
@ -57,13 +57,34 @@ merging post RC fixes from trunk and others.
|
|||
Every commit being shipped in the next ICU release should be labeled with a Jira
|
||||
ticket that is marked as fixed with the correct fix version. Further, there
|
||||
should be no Jira tickets marked as fixed with the current fixVersion that do
|
||||
not have commits. To check this, run the following tool:
|
||||
not have commits.
|
||||
|
||||
### Run locally
|
||||
|
||||
To check this, run the following tool:
|
||||
|
||||
<https://github.com/unicode-org/icu/tree/main/tools/commit-checker>
|
||||
|
||||
Follow the instructions in the README file to generate the report and send it
|
||||
Follow the instructions in the README file to generate the report locally and send it
|
||||
for review.
|
||||
|
||||
### Run via CI
|
||||
|
||||
Alternatively, you can run the "BRS Commit Checker Report" workflow directly from the project page CI
|
||||
by:
|
||||
|
||||
1. Go to the [Actions tab](https://github.com/unicode-org/icu/actions)
|
||||
1. Click on the "BRS Commit Checker Report" workflow name on the left hand list of workflows
|
||||
1. Click the "Run workflow" dropdown.
|
||||
|
||||
The dropdown should reveal an input form in which to provide inputs
|
||||
|
||||
1. Provide the same inputs in the form as you would for a local run of the tool,
|
||||
as described in the tool's Readme in the instructions above.
|
||||
|
||||
The only difference from the local run instructions is that git branch names in the
|
||||
Actions workflow input form should be prefixed with `origin/`.
|
||||
|
||||
---
|
||||
|
||||
## Fix Mis-ticketted commits
|
||||
|
|
|
@ -165,28 +165,19 @@ trunk at the source revision is good.~~
|
|||
Create the download page before the first milestone, if we have one, or before
|
||||
the release candidate.
|
||||
|
||||
Log into the ICU homepage Google Site. (If you don't have write access, ask one
|
||||
of the editors to grant you access.)
|
||||
Since ICU 76, new download pages are in Markdown on GitHub, at docs/download/ .
|
||||
|
||||
Verify that there is not already a page for the upcoming release: Either via the
|
||||
sitemap, or on the bottom of the main download page where it says something like
|
||||
"Subpages (27): View All".
|
||||
In your ICU workspace, copy the download page for the last release.
|
||||
Adjust the navbar data at the top: Title, and nav_order one fewer than last time.
|
||||
|
||||
Copy the download page for the last release: Go to that page, gear menu, Copy
|
||||
page; "Name your page" using just the major version number for now (e.g., "61")
|
||||
so that the page URL is just that number, select "Put page under Downloading
|
||||
ICU", click the red COPY button.
|
||||
Adjust the new page as needed: Adjust the title to "ICU 77" (with the right version number...),
|
||||
remove contents specific to the previous release, update all version numbers, update all links.
|
||||
|
||||
Adjust the new page as needed: Change the title to "Download ICU 61 Release
|
||||
Candidate" (with the right version number...), remove contents specific to the
|
||||
previous release, update all version numbers, update all links.
|
||||
Put a big, **bold+italics** warning at the top like "This version has not been
|
||||
released yet. Use it for testing but do not use it in production!"
|
||||
|
||||
Put a big, bold+italics, red warning at the top like "This version has not been
|
||||
released yet. Use it for testing but not in production!"
|
||||
|
||||
Save the page. It is generally a good idea to save frequently. For further
|
||||
edits, simply go back into edit mode. (Keyboard shortcut 'e' for edit, ctrl+s
|
||||
for save.)
|
||||
Compare with the one-year-ago release page and adjust for whether we have a major release,
|
||||
a new Unicode version, etc.
|
||||
|
||||
Add new contents for the upcoming release: Grab some text from the sibling
|
||||
Unicode and CLDR release notes, look at the proposal status doc for this
|
||||
|
@ -198,9 +189,7 @@ like a Migration Issues section etc.
|
|||
|
||||
Ask everyone on the team to add stuff & details.
|
||||
|
||||
**Once the page has been created and various people are invited to edit it,
|
||||
everyone should keep editing short so that the page is not locked for others for
|
||||
long periods of time.**
|
||||
Once the page has been created and merged, consider editing online on GitHub.
|
||||
|
||||
### Maintenance release
|
||||
|
||||
|
|
|
@ -36,7 +36,6 @@ compiled with Java system libraries from JRE 7.*</span>
|
|||
* Java Runtime Environment 7 (used as bootclasspath for cross-compilation)
|
||||
* Apache Ant 1.10.x (the latest available version)
|
||||
\[<http://ant.apache.org/>\]
|
||||
* JCite 1.13.0 \[<https://arrenbrecht.ch/jcite/>\]
|
||||
|
||||
### Other Prerequisites only for GA
|
||||
|
||||
|
@ -56,9 +55,6 @@ compiled with Java system libraries from JRE 7.*</span>
|
|||
### Configuration
|
||||
|
||||
* Set environment variable `JAVA_HOME` to point to the JDK directory.
|
||||
* Set environment variable `JCITE_DIR` to specify JCite binary location (see[
|
||||
Building ICU4J API Reference Document with
|
||||
JCite](../../../setup/java/ant/index.md))
|
||||
* See `build.properties` to check version strings are properly set.
|
||||
* `api.report.version` / `api.report.prev.version` are used for locating
|
||||
API signature files and should be integer numbers.
|
||||
|
@ -150,7 +146,6 @@ compiled with Java system libraries from JRE 7.*</span>
|
|||
[echo] [WARNING] Insufficient Build Configuration for ICU4J Release
|
||||
[echo] JDK Tools Version: 1.8.0_152
|
||||
[echo] JRE 7 System Library Path: Not Defined!
|
||||
[echo] JCite Library Path: /home/yoshito/java-libs/jcite-1.13.0/build/jcite.jar:/home/yoshito/java-libs/jcite-1.13.0/lib/commons-discovery-0.4.jar:/home/yoshito/java-libs/jcite-1.13.0/lib/commons-logging-1.1.jar:/home/yoshito/java-libs/jcite-1.13.0/lib/java2html.jar`
|
||||
[echo] ################################################################
|
||||
|
||||
BUILD SUCCESSFUL
|
||||
|
|
|
@ -222,7 +222,7 @@ The command requires a version number string that follows the typical Java / Mav
|
|||
6. cldr-to-icu build tool has a dependency on the icu4j packages which needs to be updated in [`tools/cldr/cldr-to-icu/pom.xml`](https://github.com/unicode-org/icu/blob/main/tools/cldr/cldr-to-icu/pom.xml). Please update it to match the version that was updated in `icu4j/pom.xml` in the steps above.
|
||||
|
||||
```xml
|
||||
version>74.0.1-SNAPSHOT</version>
|
||||
<version>74.0.1-SNAPSHOT</version>
|
||||
```
|
||||
|
||||
Since ICU 77 this moved to a property:
|
||||
|
|
|
@ -29,7 +29,7 @@ ICU4J's unit tests in JUnit).
|
|||
|
||||
ICU uses Continuous Integration systems to run these tests automatically for each new code contribution,
|
||||
and upon each update to a future contribution under development
|
||||
(that is: for each [successful Pull Request merge, and upon a new push of new git commits to a Pull Request](../gitdev.md)).
|
||||
(that is: for each [successful Pull Request merge, and upon a new push of new git commits to a Pull Request](./gitdev.md)).
|
||||
ICU has GitHub Actions configured to run Continuous Integration testing.
|
||||
|
||||
Continuous Integration systems can also be used to regularly and automatically run other tasks besides testing.
|
||||
|
|
|
@ -198,41 +198,9 @@ Coding examples help users to understand the usage of each API. Whenever
|
|||
possible, it is encouraged to embed a code snippet illustrating the usage of an
|
||||
API along with the functional specification.
|
||||
|
||||
#### Embedding Coding Examples in ICU4J - JCite
|
||||
|
||||
Since ICU4J 49M2, the ICU4J ant build target "doc" utilizes an external tool
|
||||
called [JCite](https://arrenbrecht.ch/jcite/). The tool allows us to cite a
|
||||
fragment of existing source code into JavaDoc comment using a tag. To embed a
|
||||
code snippet with the tag. For example,
|
||||
`{@.jcite com.ibm.icu.samples.util.timezone.BasicTimeZoneExample:---getNextTransitionExample}`
|
||||
will be replaced a fragment of code marked by comment lines
|
||||
`// ---getNextTransisionExample` in `BasicTimeZoneExample.java` in package
|
||||
`com.ibm.icu.samples.util.timezone`. When embedding code snippet using JCite, we
|
||||
recommend to follow next guidelines
|
||||
|
||||
* A sample code should be placed in `<icu4j_root>/samples/src` directory,
|
||||
although you can cite any source fragment from source files in
|
||||
`<icu4j_root>/demos/src`, `<icu4j_root\>/main/core/*/src`,
|
||||
`<icu4j_root>/main/test/*/src`.
|
||||
* A sample code should use package name -
|
||||
`com.ibm.icu.samples.<subpackage>.<facility>`. `<subpackage>` is corresponding
|
||||
to the target ICU API class's package, that is, one of lang/math/text/util.
|
||||
`<facility>` is a name of facility, which is usually the base class of the
|
||||
service. For example, use package `com.ibm.icu.samples.text.dateformat` for
|
||||
samples related to ICU's date format service,
|
||||
`com.ibm.icu.samples.util.timezone` for samples related to time zone service.
|
||||
* A sample code should be self-contained as much as possible (use only JDK and
|
||||
ICU public APIs if possible). This allows readers to cut & paste a code
|
||||
snippet to try it out easily.
|
||||
* The citing comment should start with three consecutive hyphen followed by
|
||||
lower camel case token - for example, "`// ---compareToExample`"
|
||||
* Keep in mind that the JCite tag `{@.jcite ...}` is not resolved without JCite.
|
||||
It is encouraged to avoid placing code snippet within a sentence. Instead,
|
||||
you should place a code snippet using JCite in an independent paragraph.
|
||||
|
||||
#### Embedding Coding Examples in ICU4C
|
||||
|
||||
Also since ICU4C 49M2, ICU4C docs (using the [\\snippet command](http://www.doxygen.nl/manual/commands.html#cmdsnippet)
|
||||
Since ICU4C 49M2, ICU4C docs (using the [\\snippet command](http://www.doxygen.nl/manual/commands.html#cmdsnippet)
|
||||
which is new in Doxygen 1.7.5) can cite a fragment of existing sample or test code.
|
||||
|
||||
Example in `ucnv.h`:
|
||||
|
|
|
@ -596,4 +596,4 @@ every Saturday (at 4:00 AM UTC) and post merging on the maintenance branches.
|
|||
They do not run on pull-requests by default as they take 1-2 hours to run.
|
||||
|
||||
However, you can manually request the CI builds to run the exhaustive tests.
|
||||
See [Continuous Integration / Exhaustive Tests](../ci.md#exhaustive-tests).
|
||||
See [Continuous Integration / Exhaustive Tests](./ci.md#exhaustive-tests).
|
||||
|
|
BIN
docs/userguide/format_parse/messages/HelloMF2.zip
Normal file
BIN
docs/userguide/format_parse/messages/HelloMF2.zip
Normal file
Binary file not shown.
37
docs/userguide/format_parse/messages/hello_mf2.cpp
Normal file
37
docs/userguide/format_parse/messages/hello_mf2.cpp
Normal file
|
@ -0,0 +1,37 @@
|
|||
// © 2025 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
#include "unicode/calendar.h"
|
||||
#include "unicode/errorcode.h"
|
||||
#include "unicode/locid.h"
|
||||
#include "unicode/messageformat2.h"
|
||||
|
||||
using namespace icu;
|
||||
|
||||
int main() {
|
||||
ErrorCode errorCode;
|
||||
UParseError parseError;
|
||||
|
||||
icu::Calendar* cal(Calendar::createInstance(errorCode));
|
||||
cal->set(2025, Calendar::JANUARY, 28);
|
||||
UDate date = cal->getTime(errorCode);
|
||||
|
||||
message2::MessageFormatter::Builder builder(errorCode);
|
||||
message2::MessageFormatter mf = builder
|
||||
.setPattern("Hello {$user}, today is {$now :date style=long}!", parseError, errorCode)
|
||||
.setLocale(Locale("en_US"))
|
||||
.build(errorCode);
|
||||
|
||||
std::map<UnicodeString, message2::Formattable> argsBuilder;
|
||||
argsBuilder["user"] = message2::Formattable("John");
|
||||
argsBuilder["now"] = message2::Formattable::forDate(date);
|
||||
message2::MessageArguments arguments(argsBuilder, errorCode);
|
||||
|
||||
icu::UnicodeString result = mf.formatToString(arguments, errorCode);
|
||||
std::string strResult;
|
||||
result.toUTF8String(strResult);
|
||||
std::cout << strResult << std::endl;
|
||||
}
|
366
docs/userguide/format_parse/messages/try-mf2.md
Normal file
366
docs/userguide/format_parse/messages/try-mf2.md
Normal file
|
@ -0,0 +1,366 @@
|
|||
---
|
||||
layout: default
|
||||
title: Trying MF 2.0 Final Candidate
|
||||
nav_order: 3
|
||||
parent: Formatting Messages
|
||||
grand_parent: Formatting
|
||||
---
|
||||
<!--
|
||||
© 2025 and later: Unicode, Inc. and others.
|
||||
License & terms of use: http://www.unicode.org/copyright.html
|
||||
-->
|
||||
|
||||
# Trying MF 2.0 Final Candidate
|
||||
{: .no_toc }
|
||||
|
||||
## Contents
|
||||
{: .no_toc .text-delta }
|
||||
|
||||
1. TOC
|
||||
{:toc}
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## C++ Linux & macOS
|
||||
|
||||
|
||||
1. Prepare a sandbox folder
|
||||
|
||||
```sh
|
||||
export ICU_SANDBOX=~/hello_icu_mf2
|
||||
mkdir $ICU_SANDBOX
|
||||
cd $ICU_SANDBOX
|
||||
```
|
||||
|
||||
1. Build ICU4C (you only need to do this once)
|
||||
|
||||
```sh
|
||||
git clone https://github.com/unicode-org/icu.git
|
||||
pushd icu/icu4c/source
|
||||
|
||||
# Run this and choose the platform and toolchain you prefer
|
||||
./runConfigureICU --help
|
||||
|
||||
# if macOS
|
||||
./runConfigureICU macOS/gcc
|
||||
# else if Linux (gcc is just an example, there are 5 Linux options)
|
||||
./runConfigureICU Linux/gcc
|
||||
# end
|
||||
|
||||
export DESTDIR=$ICU_SANDBOX/icu_release
|
||||
make -j8 releaseDist
|
||||
popd
|
||||
```
|
||||
|
||||
1. Create a minimal C++ file here (we are in the `$ICU_SANDBOX` folder) called [`hello_mf2.cpp`](hello_mf2.cpp) (click to view and/or download). The contents are reproduced below.
|
||||
|
||||
```cpp
|
||||
// hello_mf2.cpp
|
||||
#include <iostream>
|
||||
|
||||
#include "unicode/utypes.h"
|
||||
#include "unicode/calendar.h"
|
||||
#include "unicode/errorcode.h"
|
||||
#include "unicode/locid.h"
|
||||
#include "unicode/messageformat2.h"
|
||||
|
||||
using namespace icu;
|
||||
|
||||
int main() {
|
||||
ErrorCode errorCode;
|
||||
UParseError parseError;
|
||||
|
||||
icu::Calendar* cal(Calendar::createInstance(errorCode));
|
||||
cal->set(2025, Calendar::JANUARY, 28);
|
||||
UDate date = cal->getTime(errorCode);
|
||||
|
||||
message2::MessageFormatter::Builder builder(errorCode);
|
||||
message2::MessageFormatter mf = builder
|
||||
.setPattern("Hello {$user}, today is {$now :date style=long}!", parseError, errorCode)
|
||||
.setLocale(Locale("en_US"))
|
||||
.build(errorCode);
|
||||
|
||||
std::map<UnicodeString, message2::Formattable> argsBuilder;
|
||||
argsBuilder["user"] = message2::Formattable("John");
|
||||
argsBuilder["now"] = message2::Formattable::forDate(date);
|
||||
message2::MessageArguments arguments(argsBuilder, errorCode);
|
||||
|
||||
icu::UnicodeString result = mf.formatToString(arguments, errorCode);
|
||||
std::string strResult;
|
||||
result.toUTF8String(strResult);
|
||||
std::cout << strResult << std::endl;
|
||||
}
|
||||
```
|
||||
|
||||
1. Build your application and run it
|
||||
|
||||
```sh
|
||||
g++ hello_mf2.cpp -I$DESTDIR/usr/local/include -std=c++17 -L$DESTDIR/usr/local/lib -licuuc -licudata -licui18n
|
||||
|
||||
# if macOS
|
||||
DYLD_LIBRARY_PATH=$DESTDIR/usr/local/lib ./a.out
|
||||
# else if Linux
|
||||
LD_LIBRARY_PATH=$DESTDIR/usr/local/lib ./a.out
|
||||
# end
|
||||
```
|
||||
|
||||
This will output
|
||||
```
|
||||
Hello John, today is January 28, 2025!
|
||||
```
|
||||
|
||||
## C++ Windows with Visual Studio
|
||||
|
||||
### From Visual Studio with minimal work
|
||||
|
||||
These instructions will use a release version of ICU4C (tested with 76.1) and
|
||||
a "Hello ICU world" project already created.
|
||||
They provide minimal effort that only requires downloading and opening in Visual Studio
|
||||
before using.
|
||||
|
||||
> :point_right: **Note**: the MessageFormat 2 implementation in a previously release version may be behind the spec in the first few releases of ICU after the MF2.0 spec was declared 1.0 in CLDR 46.1,
|
||||
which occurred between ICU 76 and ICU 77. The difference between latest MF2.0 and the spec version supported in ICU may be minimal.
|
||||
|
||||
|
||||
1. Download the Visual Studio artifacts from the
|
||||
[official release of ICU 76.1](https://github.com/unicode-org/icu/releases/tag/release-76-1):
|
||||
* [icu4c-76_1-Win32-MSVC2022.zip](https://github.com/unicode-org/icu/releases/download/release-76-1/icu4c-76_1-Win32-MSVC2022.zip)
|
||||
* [icu4c-76_1-Win64-MSVC2022.zip](https://github.com/unicode-org/icu/releases/download/release-76-1/icu4c-76_1-Win64-MSVC2022.zip)
|
||||
|
||||
1. Download the "Hello ICU / MF2 World" project [HelloMF2.zip](HelloMF2.zip).
|
||||
|
||||
1. Unzip the files you just downloaded and merge the content of the two ICU folders.
|
||||
The "hello world" project to be a sibling to the icu folder.
|
||||
|
||||
1. The folder tree structure should look like this
|
||||
|
||||
```
|
||||
someFolderOfYourChoice\
|
||||
+- HelloMF2\
|
||||
| \- HelloMF2\
|
||||
\- icu\
|
||||
\- icu4c\
|
||||
+- bin\
|
||||
+- bin64\
|
||||
+- include\
|
||||
| \- unicode\
|
||||
+- lib\
|
||||
\- lib64\
|
||||
```
|
||||
|
||||
1. Open the `HelloMF2.sln` solution in Visual Studio and you are ready to go.
|
||||
|
||||
### From command line
|
||||
|
||||
Start the Visual Studio "x64 Native Tools Command Prompt for VS 20xx"
|
||||
|
||||
1. Prepare a sandbox folder
|
||||
|
||||
```cmd
|
||||
set ICU_SANDBOX=%USERPROFILE%\hello_icu_mf2
|
||||
md %ICU_SANDBOX%
|
||||
cd %ICU_SANDBOX%
|
||||
```
|
||||
|
||||
1. Build ICU4C (you only need to do this once):
|
||||
|
||||
```cmd
|
||||
git clone https://github.com/unicode-org/icu.git
|
||||
|
||||
cd icu\icu4c
|
||||
msbuild source/allinone/allinone.sln /p:Configuration=Release /p:Platform=x64 /p:SkipUWP=true
|
||||
cd ..\..
|
||||
|
||||
set DESTDIR=%ICU_SANDBOX%\icu_release
|
||||
rd /q/s %DESTDIR%
|
||||
md %DESTDIR%
|
||||
xcopy icu\icu4c\include %DESTDIR%\include /E /V /I /Q /Y
|
||||
xcopy icu\icu4c\bin64 %DESTDIR%\bin64 /E /V /I /Q /Y
|
||||
xcopy icu\icu4c\lib64 %DESTDIR%\lib64 /E /V /I /Q /Y
|
||||
```
|
||||
|
||||
1. Create a minimal C++ file here (we are in the `$ICU_SANDBOX` folder). Call it `hello_mf2.cpp`.
|
||||
The link to download and the contents are listed above (see the Linux section).
|
||||
|
||||
1. Build your application and run it
|
||||
|
||||
```cmd
|
||||
set DESTDIR=%ICU_SANDBOX%\icu_release
|
||||
cl /std:c++17 /EHsc /I %DESTDIR%\include %DESTDIR%/lib64/*.lib hello_mf2.cpp
|
||||
|
||||
rem set PATH only once, not every time
|
||||
set PATH=%DESTDIR%\bin64;%PATH%
|
||||
|
||||
.\hello_mf2.exe
|
||||
```
|
||||
|
||||
This will output
|
||||
```
|
||||
Hello John, today is January 28, 2025!
|
||||
```
|
||||
|
||||
### From Visual Studio (UI)
|
||||
|
||||
1. Prepare a sandbox folder. Call it `hello_icu_mf2`.
|
||||
|
||||
1. Build ICU4C (you only need to do this once)
|
||||
|
||||
* Clone the ICU repository from
|
||||
<https://github.com/unicode-org/icu> to the `hello_icu_mf2` folder.
|
||||
We will end up with the folder `hello_icu_mf2\icu`.
|
||||
|
||||
* Start Visual Studio.
|
||||
* Select _"Open a project or solution"_
|
||||
* Open the `allinone.sln` solution from the `hello_icu_mf2\icu\icu4c\source\allinone` folder.
|
||||
* Select the "Build" -- "Configuration Manager" menu
|
||||
* Change the active solution to "Release" and "x64" (or another architecture, but you will have to be consistent everywhere after this)
|
||||
* Select the "Build" -- "Build solution" menu
|
||||
* Select the "File" -- "Close solution" menu
|
||||
|
||||
1. Create a minimal C++ project in the `hello_icu_mf2` folder. Call it `hello_mf2`.
|
||||
|
||||
* You are still in Visual Studio. Select "Create a new project"
|
||||
* Choose the project template "Console App" (tagged `C++`, `Windows`, `Console`)
|
||||
* Click the "Next" button
|
||||
* Set the "Project name" to "HelloMF2" and set the "Location" to the `hello_icu_mf2` folder. \
|
||||
* Click "Create"
|
||||
* A project will be created in the `hello_icu_mf2\HelloMF2` folder.
|
||||
|
||||
1. Create a macro pointing to the ICU folder with the files we built.
|
||||
|
||||
* Select the "View" -- "Property Manager" menu
|
||||
* In the new dialog select the root of the tree ("HelloMF2", not the Debug / Release leafs)
|
||||
* Right click and select "Add New Project Property Sheet..."
|
||||
* Call it `IcuPropertySheet.props` and click "Add"
|
||||
* Open (double-click) `IcuPropertySheet` in any of the "leafs" of the tree on the left.
|
||||
For example in `HelloMF2 / Release | 64 / IcuPropertySheet`
|
||||
* Select "User Macros" under "Common Properties" (left tree)
|
||||
* Click the "Add Macro" button
|
||||
* Name it `IcuDistro` and set the "Value" to the `..\icu\icu4c` folder.
|
||||
If the test project we created is not in `hello_icu_mf2`, next to `icu`, then you can use a full path to the ICU folder where you just did a built.
|
||||
You can also point it to one you downloaded (from the GitHub releases, see above).
|
||||
* Click the "OK" button
|
||||
|
||||
1. Configure the project
|
||||
|
||||
* Select `HelloMF2` in the left-side tree
|
||||
* Select the "Project" -- "Properties" menu
|
||||
* For "Configuration" (top-left) select "All Configurations"
|
||||
* For "Platform" (top-right) select "All Platforms"
|
||||
* In the left side tree:
|
||||
* "C/C++" / "General" set "Additional Include Directories" to
|
||||
`$(IcuDistro)\include;%(AdditionalIncludeDirectories)`
|
||||
* "C/C++" / "Language" set "C++ Language Standard" to
|
||||
`ISO C++17 Standard (/std:c++17)`
|
||||
* "Linker" / "General" set "Additional Dependencies" to \
|
||||
`icudt.lib;icuin.lib;icuuc.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)`
|
||||
* "Linker" / "General" set "Additional Library Directories" to \
|
||||
`$(IcuDistro)/lib64;%(AdditionalLibraryDirectories)`
|
||||
* "Debugging" set "Environment" to \
|
||||
`PATH=$(IcuDistro)/bin64;%PATH%`
|
||||
* For "Platform" (top-right) select "Win32"
|
||||
* In the left side tree remove the `64` in two of the settings:
|
||||
* "Linker" / "General" set "Additional Library Directories" to \
|
||||
`$(IcuDistro)/lib;%(AdditionalLibraryDirectories)`
|
||||
* "Debugging" set "Environment" to \
|
||||
`PATH=$(IcuDistro)/bin;%PATH%`
|
||||
|
||||
1. Update the default source file to use some ICU functionality
|
||||
|
||||
* Select the "View" -- "Solution Explorer" menu
|
||||
* In the left-side tree "HelloMF2" / "Source Files" open `HelloMF2.cpp`
|
||||
* Download the `hello_mf2.cpp` file (see earlier in this page for download link) and save it as
|
||||
`HelloMF2.cpp`, thereby replacing it.
|
||||
|
||||
1. At this point you should be able to build and run the application, debug it, etc.
|
||||
|
||||
1. When run, it will output
|
||||
```
|
||||
Hello John, today is January 28, 2025!
|
||||
```
|
||||
|
||||
|
||||
## Java
|
||||
|
||||
We will assume that if you are interested in testing a pre-release Java library
|
||||
you already have (or know how to install) a JDK, Apache Maven, git,
|
||||
know how to create a project in your favorite IDE, and so on.
|
||||
|
||||
### What you need
|
||||
|
||||
* JDK, any version between 8 and 23
|
||||
* Apache Maven
|
||||
|
||||
### Instructions
|
||||
|
||||
1. Create a new Maven project
|
||||
|
||||
```sh
|
||||
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=hello_icu_mf2 -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.5 -DinteractiveMode=false
|
||||
|
||||
cd hello_icu_mf2
|
||||
```
|
||||
|
||||
1. Modify the `pom.xml` file
|
||||
|
||||
1. The project created as above uses the Java 17 version.
|
||||
If you are using a lower version then change `<maven.compiler.release>` property to whatever Java version you are using.
|
||||
```sh
|
||||
# Example on how to set the Java version to 11
|
||||
mvn versions:set-property -Dproperty=maven.compiler.release -DnewVersion=11
|
||||
```
|
||||
|
||||
1. Edit the file and add this to `<dependencies>`
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>com.ibm.icu</groupId>
|
||||
<artifactId>icu4j</artifactId>
|
||||
<version>77.0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
```
|
||||
**Warning:** make sure it is done in `dependencies`, not in `dependencyManagement / dependencies`
|
||||
|
||||
1. Edit the `src/test/java/com/mycompany/app/AppTest.java` file
|
||||
|
||||
1. Add a new test method
|
||||
```java
|
||||
@Test
|
||||
public void testMessageFormat2() {
|
||||
MessageFormatter mf2 = MessageFormatter.builder()
|
||||
.setLocale(Locale.US)
|
||||
.setPattern("Hello {$user}, today is {$now :date style=long}!")
|
||||
.build();
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.set(2025, 0, 28);
|
||||
|
||||
Map<String, Object> arguments = new HashMap<>();
|
||||
arguments.put("user", "John");
|
||||
arguments.put("now", cal);
|
||||
System.out.println(mf2.formatToString(arguments));
|
||||
}
|
||||
```
|
||||
|
||||
1. Add imports
|
||||
|
||||
```java
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import com.ibm.icu.util.Calendar;
|
||||
import com.ibm.icu.message2.MessageFormatter;
|
||||
```
|
||||
|
||||
1. Now run the tests
|
||||
|
||||
```sh
|
||||
mvn package -q
|
||||
```
|
||||
|
||||
This will output the following in the the tests' console output
|
||||
```
|
||||
Hello John, today is January 28, 2025!
|
||||
```
|
File diff suppressed because it is too large
Load diff
|
@ -5,349 +5,199 @@
|
|||
License & terms of use: http://www.unicode.org/copyright.html
|
||||
-->
|
||||
|
||||
# ICU4C API Comparison: ICU 75 with ICU 76
|
||||
# ICU4C API Comparison: ICU 76 with ICU 77
|
||||
|
||||
> _Note_ Markdown format of this document is new for ICU 65.
|
||||
|
||||
- [Removed from ICU 75](#removed)
|
||||
- [Deprecated or Obsoleted in ICU 76](#deprecated)
|
||||
- [Changed in ICU 76](#changed)
|
||||
- [Promoted to stable in ICU 76](#promoted)
|
||||
- [Added in ICU 76](#added)
|
||||
- [Other existing drafts in ICU 76](#other)
|
||||
- [Removed from ICU 76](#removed)
|
||||
- [Deprecated or Obsoleted in ICU 77](#deprecated)
|
||||
- [Changed in ICU 77](#changed)
|
||||
- [Promoted to stable in ICU 77](#promoted)
|
||||
- [Added in ICU 77](#added)
|
||||
- [Other existing drafts in ICU 77](#other)
|
||||
- [Signature Simplifications](#simplifications)
|
||||
|
||||
## Removed
|
||||
|
||||
Removed from ICU 75
|
||||
Removed from ICU 76
|
||||
|
||||
| File | API | ICU 75 | ICU 76 |
|
||||
| File | API | ICU 76 | ICU 77 |
|
||||
|---|---|---|---|
|
||||
| messageformat2_data_model.h | Builder& icu::message2::MFDataModel::Builder::addUnsupportedStatement(UnsupportedStatement&&, UErrorCode&) | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | Builder& icu::message2::data_model::Operator::Builder::setReserved(Reserved&&) | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | Builder& icu::message2::data_model::Reserved::Builder::add(Literal&&, UErrorCode&) | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | Builder& icu::message2::data_model::Reserved::Builder::operator=(Builder&&)=delete | _untagged _ | (missing)
|
||||
| messageformat2_data_model.h | Builder& icu::message2::data_model::Reserved::Builder::operator=(const Builder&)=delete | _untagged _ | (missing)
|
||||
| messageformat2_data_model.h | Builder& icu::message2::data_model::UnsupportedStatement::Builder::addExpression(Expression&&, UErrorCode&) | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | Builder& icu::message2::data_model::UnsupportedStatement::Builder::operator=(Builder&&)=delete | _untagged _ | (missing)
|
||||
| messageformat2_data_model.h | Builder& icu::message2::data_model::UnsupportedStatement::Builder::operator=(const Builder&)=delete | _untagged _ | (missing)
|
||||
| messageformat2_data_model.h | Builder& icu::message2::data_model::UnsupportedStatement::Builder::setBody(Reserved&&) | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | Builder& icu::message2::data_model::UnsupportedStatement::Builder::setKeyword(const UnicodeString&) | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | Reserved icu::message2::data_model::Reserved::Builder::build(UErrorCode&) const | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | Reserved& icu::message2::data_model::Reserved::operator=(Reserved) | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | UnsupportedStatement icu::message2::data_model::UnsupportedStatement::Builder::build(UErrorCode&) const | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | UnsupportedStatement& icu::message2::data_model::UnsupportedStatement::operator=(UnsupportedStatement) | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | bool icu::message2::data_model::Expression::isReserved() const | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | const Literal& icu::message2::data_model::Reserved::getPart(int32_t) const | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | const Reserved* icu::message2::data_model::UnsupportedStatement::getBody(UErrorCode&) const | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | const UnicodeString & icu::message2::data_model::UnsupportedStatement::getKeyword() const | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::Reserved::Builder::Builder(Builder&&)=delete | _untagged _ | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::Reserved::Builder::Builder(UErrorCode&) | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::Reserved::Builder::Builder(const Builder&)=delete | _untagged _ | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::Reserved::Builder::~Builder() | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::Reserved::Reserved() | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::Reserved::Reserved(const Reserved&) | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::Reserved::~Reserved() | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::UnsupportedStatement::Builder::Builder(Builder&&)=delete | _untagged _ | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::UnsupportedStatement::Builder::Builder(UErrorCode&) | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::UnsupportedStatement::Builder::Builder(const Builder&)=delete | _untagged _ | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::UnsupportedStatement::Builder::~Builder() | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::UnsupportedStatement::UnsupportedStatement() | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::UnsupportedStatement::UnsupportedStatement(const UnsupportedStatement&) | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | icu::message2::data_model::UnsupportedStatement::~UnsupportedStatement() | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | int32_t icu::message2::data_model::Reserved::numParts() const | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | std::vector< Expression > icu::message2::data_model::UnsupportedStatement::getExpressions() const | InternalICU 75 | (missing)
|
||||
| simplenumberformatter.h | void icu::number::SimpleNumber::truncateStart(uint32_t, UErrorCode&) | DeprecatedICU 75 | (missing)
|
||||
| unistr.h | UNISTR_FROM_STRING_EXPLICIT icu::UnicodeString::UnicodeString(const char16_t*) | StableICU 2.0 | (missing)
|
||||
| unistr.h | UNISTR_FROM_STRING_EXPLICIT icu::UnicodeString::UnicodeString(const uint16_t*) | StableICU 59 | (missing)
|
||||
| unistr.h | UNISTR_FROM_STRING_EXPLICIT icu::UnicodeString::UnicodeString(const wchar_t*) | StableICU 59 | (missing)
|
||||
| unistr.h | UnicodeString& icu::UnicodeString::remove(int32_t, int32_t length=(int32_t)) | StableICU 2.0 | (missing)
|
||||
| unistr.h | UnicodeString& icu::UnicodeString::removeBetween(int32_t, int32_t limit=(int32_t)) | StableICU 2.0 | (missing)
|
||||
| usimplenumberformatter.h | void usnum_truncateStart(USimpleNumber*, int32_t, UErrorCode*) | DeprecatedICU 75 | (missing)
|
||||
| utypes.h | <tt>enum</tt> UErrorCode::U_MF_UNSUPPORTED_EXPRESSION_ERROR | InternalICU 75 | (missing)
|
||||
| utypes.h | <tt>enum</tt> UErrorCode::U_MF_UNSUPPORTED_STATEMENT_ERROR | InternalICU 75 | (missing)
|
||||
| messageformat2_data_model.h | Builder& icu::message2::MFDataModel::Builder::addSelector(Expression&&, UErrorCode&) | InternalICU 75 | (missing)
|
||||
| resbund.h | const Locale icu::ResourceBundle::getLocale(ULocDataLocaleType, UErrorCode&) const | StableICU 2.8 | (missing)
|
||||
| timezone.h | <tt>static</tt> const UnicodeString icu::TimeZone::getEquivalentID(const UnicodeString&, int32_t) | StableICU 2.0 | (missing)
|
||||
| uset.h | UnicodeString U_HEADER_ONLY_NAMESPACE::USetElementIterator::operator* () const | DraftICU 76 | (missing)
|
||||
|
||||
## Deprecated
|
||||
|
||||
Deprecated or Obsoleted in ICU 76
|
||||
Deprecated or Obsoleted in ICU 77
|
||||
|
||||
| File | API | ICU 75 | ICU 76 |
|
||||
| File | API | ICU 76 | ICU 77 |
|
||||
|---|---|---|---|
|
||||
|
||||
## Changed
|
||||
|
||||
Changed in ICU 76 (old, new)
|
||||
Changed in ICU 77 (old, new)
|
||||
|
||||
|
||||
|
||||
| File | API | ICU 75 | ICU 76 |
|
||||
| File | API | ICU 76 | ICU 77 |
|
||||
|---|---|---|---|
|
||||
| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getGasolineEnergyDensity() | Draft→StableICU 74
|
||||
| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createGasolineEnergyDensity(UErrorCode&) | Draft→StableICU 74
|
||||
| measure.h | bool icu::Measure::operator!=(const UObject&) const | Draft→StableICU 74
|
||||
| normalizer2.h | <tt>static</tt> const Normalizer2* icu::Normalizer2::getNFKCSimpleCasefoldInstance(UErrorCode&) | Draft→StableICU 74
|
||||
| timezone.h | <tt>static</tt> UnicodeString& icu::TimeZone::getIanaID(const UnicodeString&, UnicodeString&, UErrorCode&) | Draft→StableICU 74
|
||||
| ucal.h | int32_t ucal_getIanaTimeZoneID(const UChar*, int32_t, UChar*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_IDS_UNARY_OPERATOR | Draft→StableICU 74
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_ID_COMPAT_MATH_CONTINUE | Draft→StableICU 74
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_ID_COMPAT_MATH_START | Draft→StableICU 74
|
||||
| ulocale.h | UEnumeration* ulocale_getKeywords(const ULocale*, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocale.h | UEnumeration* ulocale_getUnicodeKeywords(const ULocale*, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocale.h | ULocale* ulocale_openForLanguageTag(const char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocale.h | ULocale* ulocale_openForLocaleID(const char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocale.h | bool ulocale_isBogus(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | const char* ulocale_getBaseName(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | const char* ulocale_getLanguage(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | const char* ulocale_getLocaleID(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | const char* ulocale_getRegion(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | const char* ulocale_getScript(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | const char* ulocale_getVariant(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | int32_t ulocale_getKeywordValue(const ULocale*, const char*, int32_t, char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocale.h | int32_t ulocale_getUnicodeKeywordValue(const ULocale*, const char*, int32_t, char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocale.h | void ulocale_close(ULocale*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | ULocale* ulocbld_buildULocale(ULocaleBuilder*, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | ULocaleBuilder* ulocbld_open() | Draft→StableICU 74
|
||||
| ulocbuilder.h | bool ulocbld_copyErrorTo(const ULocaleBuilder*, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | int32_t ulocbld_buildLanguageTag(ULocaleBuilder*, char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | int32_t ulocbld_buildLocaleID(ULocaleBuilder*, char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_addUnicodeLocaleAttribute(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_adoptULocale(ULocaleBuilder*, ULocale*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_clear(ULocaleBuilder*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_clearExtensions(ULocaleBuilder*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_close(ULocaleBuilder*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_removeUnicodeLocaleAttribute(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setExtension(ULocaleBuilder*, char, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setLanguage(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setLanguageTag(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setLocale(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setRegion(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setScript(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setUnicodeLocaleKeyword(ULocaleBuilder*, const char*, int32_t, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setVariant(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| unorm2.h | const UNormalizer2* unorm2_getNFKCSimpleCasefoldInstance(UErrorCode*) | Draft→StableICU 74
|
||||
| uspoof.h | icu::UnicodeString& uspoof_getBidiSkeletonUnicodeString(const USpoofChecker*, UBiDiDirection, const icu::UnicodeString&, icu::UnicodeString&, UErrorCode*) | Draft→StableICU 74
|
||||
| uspoof.h | int32_t uspoof_getBidiSkeleton(const USpoofChecker*, UBiDiDirection, const UChar*, int32_t, UChar*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| uspoof.h | int32_t uspoof_getBidiSkeletonUTF8(const USpoofChecker*, UBiDiDirection, const char*, int32_t, char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| uspoof.h | uint32_t uspoof_areBidiConfusable(const USpoofChecker*, UBiDiDirection, const UChar*, int32_t, const UChar*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| uspoof.h | uint32_t uspoof_areBidiConfusableUTF8(const USpoofChecker*, UBiDiDirection, const char*, int32_t, const char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| uspoof.h | uint32_t uspoof_areBidiConfusableUnicodeString(const USpoofChecker*, UBiDiDirection, const icu::UnicodeString&, const icu::UnicodeString&, UErrorCode*) | Draft→StableICU 74
|
||||
| numberformatter.h | UnlocalizedNumberFormatter icu::number::LocalizedNumberFormatter::withoutLocale() && | Draft→StableICU 75
|
||||
| numberformatter.h | UnlocalizedNumberFormatter icu::number::LocalizedNumberFormatter::withoutLocale() const & | Draft→StableICU 75
|
||||
| numberrangeformatter.h | UnlocalizedNumberRangeFormatter icu::number::LocalizedNumberRangeFormatter::withoutLocale() && | Draft→StableICU 75
|
||||
| numberrangeformatter.h | UnlocalizedNumberRangeFormatter icu::number::LocalizedNumberRangeFormatter::withoutLocale() const & | Draft→StableICU 75
|
||||
| simplenumberformatter.h | void icu::number::SimpleNumber::setMaximumIntegerDigits(uint32_t, UErrorCode&) | Draft→StableICU 75
|
||||
| uchar.h | bool u_hasIDType(UChar32, UIdentifierType) | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierStatus::U_ID_STATUS_ALLOWED | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierStatus::U_ID_STATUS_RESTRICTED | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_DEFAULT_IGNORABLE | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_DEPRECATED | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_EXCLUSION | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_INCLUSION | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_LIMITED_USE | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_NOT_CHARACTER | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_NOT_NFKC | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_NOT_XID | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_OBSOLETE | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_RECOMMENDED | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_TECHNICAL | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_UNCOMMON_USE | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_IDENTIFIER_STATUS | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_IDENTIFIER_TYPE | Draft→StableICU 75
|
||||
| uchar.h | int32_t u_getIDTypes(UChar32, UIdentifierType*, int32_t, UErrorCode*) | Draft→StableICU 75
|
||||
| uniset.h | U_HEADER_NESTED_NAMESPACE::USetElementIterator icu::UnicodeSet::begin() const | DraftICU 76 | DraftICU 77
|
||||
| uniset.h | U_HEADER_NESTED_NAMESPACE::USetElementIterator icu::UnicodeSet::end() const | DraftICU 76 | DraftICU 77
|
||||
| uset.h | USetElementIterator & U_HEADER_ONLY_NAMESPACE::USetElementIterator::operator++() | DraftICU 76 | DraftICU 77
|
||||
| uset.h | USetElementIterator U_HEADER_ONLY_NAMESPACE::USetElementIterator::operator++(int) | DraftICU 76 | DraftICU 77
|
||||
| uset.h | USetElementIterator U_HEADER_ONLY_NAMESPACE::USetElements::begin() const | DraftICU 76 | DraftICU 77
|
||||
| uset.h | USetElementIterator U_HEADER_ONLY_NAMESPACE::USetElements::end() const | DraftICU 76 | DraftICU 77
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetElementIterator::USetElementIterator(const USetElementIterator&)=default | DraftICU 76 | DraftICU 77
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetElements::USetElements(const USet*) | DraftICU 76 | DraftICU 77
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetElements::USetElements(const USetElements&)=default | DraftICU 76 | DraftICU 77
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetElementIterator::operator!=(const USetElementIterator&) const | DraftICU 76 | DraftICU 77
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetElementIterator::operator==(const USetElementIterator&) const | DraftICU 76 | DraftICU 77
|
||||
| usimplenumberformatter.h | void usnum_setMaximumIntegerDigits(USimpleNumber*, int32_t, UErrorCode*) | Draft→StableICU 75
|
||||
|
||||
## Promoted
|
||||
|
||||
Promoted to stable in ICU 76
|
||||
Promoted to stable in ICU 77
|
||||
|
||||
| File | API | ICU 75 | ICU 76 |
|
||||
| File | API | ICU 76 | ICU 77 |
|
||||
|---|---|---|---|
|
||||
| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getGasolineEnergyDensity() | Draft→StableICU 74
|
||||
| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createGasolineEnergyDensity(UErrorCode&) | Draft→StableICU 74
|
||||
| measure.h | bool icu::Measure::operator!=(const UObject&) const | Draft→StableICU 74
|
||||
| normalizer2.h | <tt>static</tt> const Normalizer2* icu::Normalizer2::getNFKCSimpleCasefoldInstance(UErrorCode&) | Draft→StableICU 74
|
||||
| timezone.h | <tt>static</tt> UnicodeString& icu::TimeZone::getIanaID(const UnicodeString&, UnicodeString&, UErrorCode&) | Draft→StableICU 74
|
||||
| ucal.h | int32_t ucal_getIanaTimeZoneID(const UChar*, int32_t, UChar*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_EGYPTIAN_HIEROGLYPHS_EXTENDED_A | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_GARAY | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_GURUNG_KHEMA | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_KIRAT_RAI | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_MYANMAR_EXTENDED_C | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_OL_ONAL | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_SUNUWAR | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_SYMBOLS_FOR_LEGACY_COMPUTING_SUPPLEMENT | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_TODHRI | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_TULU_TIGALARI | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UIndicSyllabicCategory::U_INSC_REORDERING_KILLER | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UJoiningGroup::U_JG_KASHMIRI_YEH | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_IDS_UNARY_OPERATOR | Draft→StableICU 74
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_ID_COMPAT_MATH_CONTINUE | Draft→StableICU 74
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_ID_COMPAT_MATH_START | Draft→StableICU 74
|
||||
| ulocale.h | UEnumeration* ulocale_getKeywords(const ULocale*, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocale.h | UEnumeration* ulocale_getUnicodeKeywords(const ULocale*, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocale.h | ULocale* ulocale_openForLanguageTag(const char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocale.h | ULocale* ulocale_openForLocaleID(const char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocale.h | bool ulocale_isBogus(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | const char* ulocale_getBaseName(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | const char* ulocale_getLanguage(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | const char* ulocale_getLocaleID(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | const char* ulocale_getRegion(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | const char* ulocale_getScript(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | const char* ulocale_getVariant(const ULocale*) | Draft→StableICU 74
|
||||
| ulocale.h | int32_t ulocale_getKeywordValue(const ULocale*, const char*, int32_t, char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocale.h | int32_t ulocale_getUnicodeKeywordValue(const ULocale*, const char*, int32_t, char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocale.h | void ulocale_close(ULocale*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | ULocale* ulocbld_buildULocale(ULocaleBuilder*, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | ULocaleBuilder* ulocbld_open() | Draft→StableICU 74
|
||||
| ulocbuilder.h | bool ulocbld_copyErrorTo(const ULocaleBuilder*, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | int32_t ulocbld_buildLanguageTag(ULocaleBuilder*, char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | int32_t ulocbld_buildLocaleID(ULocaleBuilder*, char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_addUnicodeLocaleAttribute(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_adoptULocale(ULocaleBuilder*, ULocale*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_clear(ULocaleBuilder*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_clearExtensions(ULocaleBuilder*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_close(ULocaleBuilder*) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_removeUnicodeLocaleAttribute(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setExtension(ULocaleBuilder*, char, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setLanguage(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setLanguageTag(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setLocale(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setRegion(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setScript(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setUnicodeLocaleKeyword(ULocaleBuilder*, const char*, int32_t, const char*, int32_t) | Draft→StableICU 74
|
||||
| ulocbuilder.h | void ulocbld_setVariant(ULocaleBuilder*, const char*, int32_t) | Draft→StableICU 74
|
||||
| unistr.h | UnicodeString& icu::UnicodeString::remove(int32_t, int32_t length=static_cast< int32_t >(INT32_MAX)) | (missing) | StableICU 2.0
|
||||
| unistr.h | UnicodeString& icu::UnicodeString::removeBetween(int32_t, int32_t limit=static_cast< int32_t >(INT32_MAX)) | (missing) | StableICU 2.0
|
||||
| unorm2.h | const UNormalizer2* unorm2_getNFKCSimpleCasefoldInstance(UErrorCode*) | Draft→StableICU 74
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_GARAY | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_GURUNG_KHEMA | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_KIRAT_RAI | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_OL_ONAL | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_SUNUWAR | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_TODHRI | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_TULU_TIGALARI | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uspoof.h | icu::UnicodeString& uspoof_getBidiSkeletonUnicodeString(const USpoofChecker*, UBiDiDirection, const icu::UnicodeString&, icu::UnicodeString&, UErrorCode*) | Draft→StableICU 74
|
||||
| uspoof.h | int32_t uspoof_getBidiSkeleton(const USpoofChecker*, UBiDiDirection, const UChar*, int32_t, UChar*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| uspoof.h | int32_t uspoof_getBidiSkeletonUTF8(const USpoofChecker*, UBiDiDirection, const char*, int32_t, char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| uspoof.h | uint32_t uspoof_areBidiConfusable(const USpoofChecker*, UBiDiDirection, const UChar*, int32_t, const UChar*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| uspoof.h | uint32_t uspoof_areBidiConfusableUTF8(const USpoofChecker*, UBiDiDirection, const char*, int32_t, const char*, int32_t, UErrorCode*) | Draft→StableICU 74
|
||||
| uspoof.h | uint32_t uspoof_areBidiConfusableUnicodeString(const USpoofChecker*, UBiDiDirection, const icu::UnicodeString&, const icu::UnicodeString&, UErrorCode*) | Draft→StableICU 74
|
||||
| numberformatter.h | UnlocalizedNumberFormatter icu::number::LocalizedNumberFormatter::withoutLocale() && | Draft→StableICU 75
|
||||
| numberformatter.h | UnlocalizedNumberFormatter icu::number::LocalizedNumberFormatter::withoutLocale() const & | Draft→StableICU 75
|
||||
| numberrangeformatter.h | UnlocalizedNumberRangeFormatter icu::number::LocalizedNumberRangeFormatter::withoutLocale() && | Draft→StableICU 75
|
||||
| numberrangeformatter.h | UnlocalizedNumberRangeFormatter icu::number::LocalizedNumberRangeFormatter::withoutLocale() const & | Draft→StableICU 75
|
||||
| resbund.h | Locale icu::ResourceBundle::getLocale(ULocDataLocaleType, UErrorCode&) const | (missing) | StableICU 2.8
|
||||
| simplenumberformatter.h | void icu::number::SimpleNumber::setMaximumIntegerDigits(uint32_t, UErrorCode&) | Draft→StableICU 75
|
||||
| timezone.h | <tt>static</tt> UnicodeString icu::TimeZone::getEquivalentID(const UnicodeString&, int32_t) | (missing) | StableICU 2.0
|
||||
| uchar.h | bool u_hasIDType(UChar32, UIdentifierType) | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierStatus::U_ID_STATUS_ALLOWED | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierStatus::U_ID_STATUS_RESTRICTED | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_DEFAULT_IGNORABLE | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_DEPRECATED | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_EXCLUSION | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_INCLUSION | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_LIMITED_USE | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_NOT_CHARACTER | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_NOT_NFKC | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_NOT_XID | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_OBSOLETE | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_RECOMMENDED | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_TECHNICAL | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_UNCOMMON_USE | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_IDENTIFIER_STATUS | Draft→StableICU 75
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_IDENTIFIER_TYPE | Draft→StableICU 75
|
||||
| uchar.h | int32_t u_getIDTypes(UChar32, UIdentifierType*, int32_t, UErrorCode*) | Draft→StableICU 75
|
||||
| usimplenumberformatter.h | void usnum_setMaximumIntegerDigits(USimpleNumber*, int32_t, UErrorCode*) | Draft→StableICU 75
|
||||
|
||||
## Added
|
||||
|
||||
Added in ICU 76
|
||||
Added in ICU 77
|
||||
|
||||
| File | API | ICU 75 | ICU 76 |
|
||||
| File | API | ICU 76 | ICU 77 |
|
||||
|---|---|---|---|
|
||||
| coll.h | auto icu::Collator::equal_to() const | (missing) | DraftICU 76
|
||||
| coll.h | auto icu::Collator::greater() const | (missing) | DraftICU 76
|
||||
| coll.h | auto icu::Collator::greater_equal() const | (missing) | DraftICU 76
|
||||
| coll.h | auto icu::Collator::less() const | (missing) | DraftICU 76
|
||||
| coll.h | auto icu::Collator::less_equal() const | (missing) | DraftICU 76
|
||||
| coll.h | auto icu::Collator::not_equal_to() const | (missing) | DraftICU 76
|
||||
| messageformat2.h | Builder& icu::message2::MessageFormatter::Builder::setErrorHandlingBehavior(UMFErrorHandlingBehavior) | (missing) | InternalICU 76
|
||||
| messageformat2.h | <tt>enum</tt> icu::message2::MessageFormatter::UMFErrorHandlingBehavior {} | (missing) | InternalICU 76
|
||||
| messageformat2.h | <tt>enum</tt> icu::message2::MessageFormatter::UMFErrorHandlingBehavior::U_MF_BEST_EFFORT | (missing) | InternalICU 76
|
||||
| messageformat2.h | <tt>enum</tt> icu::message2::MessageFormatter::UMFErrorHandlingBehavior::U_MF_STRICT | (missing) | InternalICU 76
|
||||
| stringpiece.h | icu::StringPiece::operator std::string_view() const | (missing) | Internal
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_EGYPTIAN_HIEROGLYPHS_EXTENDED_A | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_GARAY | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_GURUNG_KHEMA | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_KIRAT_RAI | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_MYANMAR_EXTENDED_C | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_OL_ONAL | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_SUNUWAR | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_SYMBOLS_FOR_LEGACY_COMPUTING_SUPPLEMENT | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_TODHRI | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_TULU_TIGALARI | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UIndicConjunctBreak::U_INCB_CONSONANT | (missing) | DraftICU 76
|
||||
| uchar.h | <tt>enum</tt> UIndicConjunctBreak::U_INCB_EXTEND | (missing) | DraftICU 76
|
||||
| uchar.h | <tt>enum</tt> UIndicConjunctBreak::U_INCB_LINKER | (missing) | DraftICU 76
|
||||
| uchar.h | <tt>enum</tt> UIndicConjunctBreak::U_INCB_NONE | (missing) | DraftICU 76
|
||||
| uchar.h | <tt>enum</tt> UIndicSyllabicCategory::U_INSC_REORDERING_KILLER | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UJoiningGroup::U_JG_KASHMIRI_YEH | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_INDIC_CONJUNCT_BREAK | (missing) | DraftICU 76
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_MODIFIER_COMBINING_MARK | (missing) | DraftICU 76
|
||||
| ucol.h | U_HEADER_ONLY_NAMESPACE::collator::internal::Predicate< Compare, result >::Predicate(const UCollator*) | (missing) | Internal
|
||||
| ucol.h | bool U_HEADER_ONLY_NAMESPACE::collator::internal::Predicate< Compare, result >::operator()(const T&, const U&) const | (missing) | Internal
|
||||
| ucol.h | bool U_HEADER_ONLY_NAMESPACE::collator::internal::Predicate< Compare, result >::operator()(std::string_view, std::string_view) const | (missing) | Internal
|
||||
| uniset.h | U_HEADER_NESTED_NAMESPACE::USetCodePoints icu::UnicodeSet::codePoints() const | (missing) | DraftICU 76
|
||||
| uniset.h | U_HEADER_NESTED_NAMESPACE::USetElementIterator icu::UnicodeSet::begin() const | (missing) | DraftICU 76
|
||||
| uniset.h | U_HEADER_NESTED_NAMESPACE::USetElementIterator icu::UnicodeSet::end() const | (missing) | DraftICU 76
|
||||
| uniset.h | U_HEADER_NESTED_NAMESPACE::USetRanges icu::UnicodeSet::ranges() const | (missing) | DraftICU 76
|
||||
| uniset.h | U_HEADER_NESTED_NAMESPACE::USetStrings icu::UnicodeSet::strings() const | (missing) | DraftICU 76
|
||||
| unistr.h | UNISTR_FROM_STRING_EXPLICIT icu::UnicodeString::UnicodeString(const S&) | (missing) | DraftICU 76
|
||||
| unistr.h | UnicodeString& icu::UnicodeString::append(const S&) | (missing) | DraftICU 76
|
||||
| unistr.h | UnicodeString& icu::UnicodeString::operator+=(const S&) | (missing) | DraftICU 76
|
||||
| unistr.h | UnicodeString& icu::UnicodeString::operator=(const S&) | (missing) | DraftICU 76
|
||||
| unistr.h | UnicodeString& icu::UnicodeString::remove(int32_t, int32_t length=static_cast< int32_t >(INT32_MAX)) | (missing) | StableICU 2.0
|
||||
| unistr.h | UnicodeString& icu::UnicodeString::removeBetween(int32_t, int32_t limit=static_cast< int32_t >(INT32_MAX)) | (missing) | StableICU 2.0
|
||||
| unistr.h | bool icu::UnicodeString::operator!=(const S&) const | (missing) | DraftICU 76
|
||||
| unistr.h | bool icu::UnicodeString::operator==(const S&) const | (missing) | DraftICU 76
|
||||
| unistr.h | icu::UnicodeString::operator std::u16string_view() const | (missing) | DraftICU 76
|
||||
| unistr.h | icu::UnicodeString::operator std::wstring_view() const | (missing) | DraftICU 76
|
||||
| unistr.h | <tt>static</tt> UnicodeString icu::UnicodeString::readOnlyAlias(const S&) | (missing) | DraftICU 76
|
||||
| unistr.h | <tt>static</tt> UnicodeString icu::UnicodeString::readOnlyAlias(const UnicodeString&) | (missing) | DraftICU 76
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_GARAY | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_GURUNG_KHEMA | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_KIRAT_RAI | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_OL_ONAL | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_SUNUWAR | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_TODHRI | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_TULU_TIGALARI | (missing) | StableICU 76| *(Born Stable)* |
|
||||
| uset.h | CodePointRange U_HEADER_ONLY_NAMESPACE::USetRangeIterator::operator* () const | (missing) | DraftICU 76
|
||||
| uset.h | USetCodePointIterator & U_HEADER_ONLY_NAMESPACE::USetCodePointIterator::operator++() | (missing) | DraftICU 76
|
||||
| uset.h | USetCodePointIterator U_HEADER_ONLY_NAMESPACE::USetCodePointIterator::operator++(int) | (missing) | DraftICU 76
|
||||
| uset.h | USetCodePointIterator U_HEADER_ONLY_NAMESPACE::USetCodePoints::begin() const | (missing) | DraftICU 76
|
||||
| uset.h | USetCodePointIterator U_HEADER_ONLY_NAMESPACE::USetCodePoints::end() const | (missing) | DraftICU 76
|
||||
| uset.h | USetElementIterator & U_HEADER_ONLY_NAMESPACE::USetElementIterator::operator++() | (missing) | DraftICU 76
|
||||
| uset.h | USetElementIterator U_HEADER_ONLY_NAMESPACE::USetElementIterator::operator++(int) | (missing) | DraftICU 76
|
||||
| uset.h | USetElementIterator U_HEADER_ONLY_NAMESPACE::USetElements::begin() const | (missing) | DraftICU 76
|
||||
| uset.h | USetElementIterator U_HEADER_ONLY_NAMESPACE::USetElements::end() const | (missing) | DraftICU 76
|
||||
| uset.h | USetRangeIterator & U_HEADER_ONLY_NAMESPACE::USetRangeIterator::operator++() | (missing) | DraftICU 76
|
||||
| uset.h | USetRangeIterator U_HEADER_ONLY_NAMESPACE::USetRangeIterator::operator++(int) | (missing) | DraftICU 76
|
||||
| uset.h | USetRangeIterator U_HEADER_ONLY_NAMESPACE::USetRanges::begin() const | (missing) | DraftICU 76
|
||||
| uset.h | USetRangeIterator U_HEADER_ONLY_NAMESPACE::USetRanges::end() const | (missing) | DraftICU 76
|
||||
| uset.h | USetStringIterator & U_HEADER_ONLY_NAMESPACE::USetStringIterator::operator++() | (missing) | DraftICU 76
|
||||
| uset.h | USetStringIterator U_HEADER_ONLY_NAMESPACE::USetStringIterator::operator++(int) | (missing) | DraftICU 76
|
||||
| uset.h | USetStringIterator U_HEADER_ONLY_NAMESPACE::USetStrings::begin() const | (missing) | DraftICU 76
|
||||
| uset.h | USetStringIterator U_HEADER_ONLY_NAMESPACE::USetStrings::end() const | (missing) | DraftICU 76
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetCodePointIterator::USetCodePointIterator(const USetCodePointIterator&)=default | (missing) | DraftICU 76
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetCodePoints::USetCodePoints(const USet*) | (missing) | DraftICU 76
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetCodePoints::USetCodePoints(const USetCodePoints&)=default | (missing) | DraftICU 76
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetElementIterator::USetElementIterator(const USetElementIterator&)=default | (missing) | DraftICU 76
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetElements::USetElements(const USet*) | (missing) | DraftICU 76
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetElements::USetElements(const USetElements&)=default | (missing) | DraftICU 76
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetRangeIterator::USetRangeIterator(const USetRangeIterator&)=default | (missing) | DraftICU 76
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetRanges::USetRanges(const USet*) | (missing) | DraftICU 76
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetRanges::USetRanges(const USetRanges&)=default | (missing) | DraftICU 76
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetStringIterator::USetStringIterator(const USetStringIterator&)=default | (missing) | DraftICU 76
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetStrings::USetStrings(const USet*) | (missing) | DraftICU 76
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetStrings::USetStrings(const USetStrings&)=default | (missing) | DraftICU 76
|
||||
| uset.h | UnicodeString U_HEADER_ONLY_NAMESPACE::USetElementIterator::operator* () const | (missing) | DraftICU 76
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetCodePointIterator::operator!=(const USetCodePointIterator&) const | (missing) | DraftICU 76
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetCodePointIterator::operator==(const USetCodePointIterator&) const | (missing) | DraftICU 76
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetElementIterator::operator!=(const USetElementIterator&) const | (missing) | DraftICU 76
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetElementIterator::operator==(const USetElementIterator&) const | (missing) | DraftICU 76
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetRangeIterator::operator!=(const USetRangeIterator&) const | (missing) | DraftICU 76
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetRangeIterator::operator==(const USetRangeIterator&) const | (missing) | DraftICU 76
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetStringIterator::operator!=(const USetStringIterator&) const | (missing) | DraftICU 76
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetStringIterator::operator==(const USetStringIterator&) const | (missing) | DraftICU 76
|
||||
| uset.h | UChar32 U_HEADER_ONLY_NAMESPACE::USetCodePointIterator::operator* () const | (missing) | DraftICU 76
|
||||
| uset.h | const UChar* uset_getString(const USet*, int32_t, int32_t*) | (missing) | DraftICU 76
|
||||
| uset.h | int32_t uset_getStringCount(const USet*) | (missing) | DraftICU 76
|
||||
| uset.h | std::u16string_view U_HEADER_ONLY_NAMESPACE::USetStringIterator::operator* () const | (missing) | DraftICU 76
|
||||
| utypes.h | <tt>#define</tt> U_SHOW_CPLUSPLUS_HEADER_API | (missing) | Internal
|
||||
| utypes.h | <tt>enum</tt> UErrorCode::U_MF_DUPLICATE_VARIANT_ERROR | (missing) | InternalICU 76
|
||||
| locid.h | <tt>static</tt> Locale icu::Locale::createFromName(StringPiece) | (missing) | Internal
|
||||
| measunit.h | MeasureUnit icu::MeasureUnit::withConstantDenominator(uint64_t, UErrorCode&) const | (missing) | DraftICU 77
|
||||
| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getPortionPer1E9() | (missing) | DraftICU 77
|
||||
| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createPortionPer1E9(UErrorCode&) | (missing) | DraftICU 77
|
||||
| measunit.h | uint64_t icu::MeasureUnit::getConstantDenominator(UErrorCode&) const | (missing) | DraftICU 77
|
||||
| messageformat2_data_model.h | Builder& icu::message2::MFDataModel::Builder::addSelector(VariableName&&, UErrorCode&) | (missing) | InternalICU 75
|
||||
| resbund.h | Locale icu::ResourceBundle::getLocale(ULocDataLocaleType, UErrorCode&) const | (missing) | StableICU 2.8
|
||||
| timezone.h | <tt>static</tt> UnicodeString icu::TimeZone::getEquivalentID(const UnicodeString&, int32_t) | (missing) | StableICU 2.0
|
||||
| uset.h | std::u16string U_HEADER_ONLY_NAMESPACE::USetElementIterator::operator* () const | (missing) | DraftICU 77
|
||||
| utypes.h | <tt>enum</tt> UErrorCode::U_MF_BAD_OPTION | (missing) | InternalICU 77
|
||||
|
||||
## Other
|
||||
|
||||
Other existing drafts in ICU 76
|
||||
Other existing drafts in ICU 77
|
||||
|
||||
| File | API | ICU 75 | ICU 76 |
|
||||
| File | API | ICU 76 | ICU 77 |
|
||||
|---|---|---|---|
|
||||
| coll.h | auto icu::Collator::equal_to() const | DraftICU 76 |
|
||||
| coll.h | auto icu::Collator::greater() const | DraftICU 76 |
|
||||
| coll.h | auto icu::Collator::greater_equal() const | DraftICU 76 |
|
||||
| coll.h | auto icu::Collator::less() const | DraftICU 76 |
|
||||
| coll.h | auto icu::Collator::less_equal() const | DraftICU 76 |
|
||||
| coll.h | auto icu::Collator::not_equal_to() const | DraftICU 76 |
|
||||
| measfmt.h | void icu::MeasureFormat::parseObject(const UnicodeString&, Formattable&, ParsePosition&) const | DraftICU 53 |
|
||||
| numberformatter.h | UnlocalizedNumberFormatter icu::number::LocalizedNumberFormatter::withoutLocale() && | DraftICU 75 |
|
||||
| numberformatter.h | UnlocalizedNumberFormatter icu::number::LocalizedNumberFormatter::withoutLocale() const & | DraftICU 75 |
|
||||
| numberrangeformatter.h | UnlocalizedNumberRangeFormatter icu::number::LocalizedNumberRangeFormatter::withoutLocale() && | DraftICU 75 |
|
||||
| numberrangeformatter.h | UnlocalizedNumberRangeFormatter icu::number::LocalizedNumberRangeFormatter::withoutLocale() const & | DraftICU 75 |
|
||||
| simplenumberformatter.h | void icu::number::SimpleNumber::setMaximumIntegerDigits(uint32_t, UErrorCode&) | DraftICU 75 |
|
||||
| uchar.h | bool u_hasIDType(UChar32, UIdentifierType) | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierStatus::U_ID_STATUS_ALLOWED | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierStatus::U_ID_STATUS_RESTRICTED | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_DEFAULT_IGNORABLE | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_DEPRECATED | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_EXCLUSION | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_INCLUSION | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_LIMITED_USE | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_NOT_CHARACTER | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_NOT_NFKC | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_NOT_XID | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_OBSOLETE | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_RECOMMENDED | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_TECHNICAL | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UIdentifierType::U_ID_TYPE_UNCOMMON_USE | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_IDENTIFIER_STATUS | DraftICU 75 |
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_IDENTIFIER_TYPE | DraftICU 75 |
|
||||
| uchar.h | int32_t u_getIDTypes(UChar32, UIdentifierType*, int32_t, UErrorCode*) | DraftICU 75 |
|
||||
| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getLightSpeed() | DraftICU 76 |
|
||||
| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getNight() | DraftICU 76 |
|
||||
| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createLightSpeed(UErrorCode&) | DraftICU 76 |
|
||||
| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createNight(UErrorCode&) | DraftICU 76 |
|
||||
| uchar.h | <tt>enum</tt> UIndicConjunctBreak::U_INCB_CONSONANT | DraftICU 76 |
|
||||
| uchar.h | <tt>enum</tt> UIndicConjunctBreak::U_INCB_EXTEND | DraftICU 76 |
|
||||
| uchar.h | <tt>enum</tt> UIndicConjunctBreak::U_INCB_LINKER | DraftICU 76 |
|
||||
| uchar.h | <tt>enum</tt> UIndicConjunctBreak::U_INCB_NONE | DraftICU 76 |
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_INDIC_CONJUNCT_BREAK | DraftICU 76 |
|
||||
| uchar.h | <tt>enum</tt> UProperty::UCHAR_MODIFIER_COMBINING_MARK | DraftICU 76 |
|
||||
| uniset.h | U_HEADER_NESTED_NAMESPACE::USetCodePoints icu::UnicodeSet::codePoints() const | DraftICU 76 |
|
||||
| uniset.h | U_HEADER_NESTED_NAMESPACE::USetRanges icu::UnicodeSet::ranges() const | DraftICU 76 |
|
||||
| uniset.h | U_HEADER_NESTED_NAMESPACE::USetStrings icu::UnicodeSet::strings() const | DraftICU 76 |
|
||||
| unistr.h | UNISTR_FROM_STRING_EXPLICIT icu::UnicodeString::UnicodeString(const S&) | DraftICU 76 |
|
||||
| unistr.h | UnicodeString& icu::UnicodeString::append(const S&) | DraftICU 76 |
|
||||
| unistr.h | UnicodeString& icu::UnicodeString::operator+=(const S&) | DraftICU 76 |
|
||||
| unistr.h | UnicodeString& icu::UnicodeString::operator=(const S&) | DraftICU 76 |
|
||||
| unistr.h | bool icu::UnicodeString::operator!=(const S&) const | DraftICU 76 |
|
||||
| unistr.h | bool icu::UnicodeString::operator==(const S&) const | DraftICU 76 |
|
||||
| unistr.h | icu::UnicodeString::operator std::u16string_view() const | DraftICU 76 |
|
||||
| unistr.h | icu::UnicodeString::operator std::wstring_view() const | DraftICU 76 |
|
||||
| unistr.h | <tt>static</tt> UnicodeString icu::UnicodeString::readOnlyAlias(const S&) | DraftICU 76 |
|
||||
| unistr.h | <tt>static</tt> UnicodeString icu::UnicodeString::readOnlyAlias(const UnicodeString&) | DraftICU 76 |
|
||||
| uregex.h | <tt>enum</tt> URegexpFlag::UREGEX_CANON_EQ | DraftICU 2.4 |
|
||||
| usimplenumberformatter.h | void usnum_setMaximumIntegerDigits(USimpleNumber*, int32_t, UErrorCode*) | DraftICU 75 |
|
||||
| uset.h | CodePointRange U_HEADER_ONLY_NAMESPACE::USetRangeIterator::operator* () const | DraftICU 76 |
|
||||
| uset.h | USetCodePointIterator & U_HEADER_ONLY_NAMESPACE::USetCodePointIterator::operator++() | DraftICU 76 |
|
||||
| uset.h | USetCodePointIterator U_HEADER_ONLY_NAMESPACE::USetCodePointIterator::operator++(int) | DraftICU 76 |
|
||||
| uset.h | USetCodePointIterator U_HEADER_ONLY_NAMESPACE::USetCodePoints::begin() const | DraftICU 76 |
|
||||
| uset.h | USetCodePointIterator U_HEADER_ONLY_NAMESPACE::USetCodePoints::end() const | DraftICU 76 |
|
||||
| uset.h | USetRangeIterator & U_HEADER_ONLY_NAMESPACE::USetRangeIterator::operator++() | DraftICU 76 |
|
||||
| uset.h | USetRangeIterator U_HEADER_ONLY_NAMESPACE::USetRangeIterator::operator++(int) | DraftICU 76 |
|
||||
| uset.h | USetRangeIterator U_HEADER_ONLY_NAMESPACE::USetRanges::begin() const | DraftICU 76 |
|
||||
| uset.h | USetRangeIterator U_HEADER_ONLY_NAMESPACE::USetRanges::end() const | DraftICU 76 |
|
||||
| uset.h | USetStringIterator & U_HEADER_ONLY_NAMESPACE::USetStringIterator::operator++() | DraftICU 76 |
|
||||
| uset.h | USetStringIterator U_HEADER_ONLY_NAMESPACE::USetStringIterator::operator++(int) | DraftICU 76 |
|
||||
| uset.h | USetStringIterator U_HEADER_ONLY_NAMESPACE::USetStrings::begin() const | DraftICU 76 |
|
||||
| uset.h | USetStringIterator U_HEADER_ONLY_NAMESPACE::USetStrings::end() const | DraftICU 76 |
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetCodePointIterator::USetCodePointIterator(const USetCodePointIterator&)=default | DraftICU 76 |
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetCodePoints::USetCodePoints(const USet*) | DraftICU 76 |
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetCodePoints::USetCodePoints(const USetCodePoints&)=default | DraftICU 76 |
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetRangeIterator::USetRangeIterator(const USetRangeIterator&)=default | DraftICU 76 |
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetRanges::USetRanges(const USet*) | DraftICU 76 |
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetRanges::USetRanges(const USetRanges&)=default | DraftICU 76 |
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetStringIterator::USetStringIterator(const USetStringIterator&)=default | DraftICU 76 |
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetStrings::USetStrings(const USet*) | DraftICU 76 |
|
||||
| uset.h | U_HEADER_ONLY_NAMESPACE::USetStrings::USetStrings(const USetStrings&)=default | DraftICU 76 |
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetCodePointIterator::operator!=(const USetCodePointIterator&) const | DraftICU 76 |
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetCodePointIterator::operator==(const USetCodePointIterator&) const | DraftICU 76 |
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetRangeIterator::operator!=(const USetRangeIterator&) const | DraftICU 76 |
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetRangeIterator::operator==(const USetRangeIterator&) const | DraftICU 76 |
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetStringIterator::operator!=(const USetStringIterator&) const | DraftICU 76 |
|
||||
| uset.h | bool U_HEADER_ONLY_NAMESPACE::USetStringIterator::operator==(const USetStringIterator&) const | DraftICU 76 |
|
||||
| uset.h | UChar32 U_HEADER_ONLY_NAMESPACE::USetCodePointIterator::operator* () const | DraftICU 76 |
|
||||
| uset.h | const UChar* uset_getString(const USet*, int32_t, int32_t*) | DraftICU 76 |
|
||||
| uset.h | int32_t uset_getStringCount(const USet*) | DraftICU 76 |
|
||||
| uset.h | std::u16string_view U_HEADER_ONLY_NAMESPACE::USetStringIterator::operator* () const | DraftICU 76 |
|
||||
|
||||
## Simplifications
|
||||
|
||||
|
@ -357,7 +207,7 @@ This section shows cases where the signature was "simplified" for the sake of co
|
|||
|
||||
## Colophon
|
||||
|
||||
Contents generated by StableAPI tool on Tue Sep 24 13:19:44 PDT 2024
|
||||
Contents generated by StableAPI tool on Wed Feb 19 16:10:28 PST 2025
|
||||
|
||||
Copyright © 2019 and later: Unicode, Inc. and others.
|
||||
License & terms of use: http://www.unicode.org/copyright.html
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Doxyfile 1.8.13
|
||||
# Doxyfile 1.9.1
|
||||
|
||||
# Copyright (C) 2016 and later: Unicode, Inc. and others.
|
||||
# License & terms of use: http://www.unicode.org/copyright.html
|
||||
|
@ -25,11 +25,11 @@
|
|||
# Project related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# This tag specifies the encoding used for all characters in the config file
|
||||
# that follow. The default is UTF-8 which is also the encoding used for all text
|
||||
# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
|
||||
# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
|
||||
# for the list of possible encodings.
|
||||
# This tag specifies the encoding used for all characters in the configuration
|
||||
# file that follow. The default is UTF-8 which is also the encoding used for all
|
||||
# text before the first occurrence of this tag. Doxygen uses libiconv (or the
|
||||
# iconv built into libc) for the transcoding. See
|
||||
# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
|
||||
# The default value is: UTF-8.
|
||||
|
||||
DOXYFILE_ENCODING = UTF-8
|
||||
|
@ -101,6 +101,14 @@ ALLOW_UNICODE_NAMES = NO
|
|||
|
||||
OUTPUT_LANGUAGE = English
|
||||
|
||||
# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all
|
||||
# documentation generated by doxygen is written. Doxygen will use this
|
||||
# information to generate all generated output in the proper direction.
|
||||
# Possible values are: None, LTR, RTL and Context.
|
||||
# The default value is: None.
|
||||
|
||||
OUTPUT_TEXT_DIRECTION = None
|
||||
|
||||
# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
|
||||
# descriptions after the members that are listed in the file and class
|
||||
# documentation (similar to Javadoc). Set to NO to disable this.
|
||||
|
@ -187,6 +195,16 @@ SHORT_NAMES = NO
|
|||
|
||||
JAVADOC_AUTOBRIEF = YES
|
||||
|
||||
# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
|
||||
# such as
|
||||
# /***************
|
||||
# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
|
||||
# Javadoc-style will behave just like regular comments and it will not be
|
||||
# interpreted by doxygen.
|
||||
# The default value is: NO.
|
||||
|
||||
JAVADOC_BANNER = NO
|
||||
|
||||
# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
|
||||
# line (until the first dot) of a Qt-style comment as the brief description. If
|
||||
# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
|
||||
|
@ -207,6 +225,14 @@ QT_AUTOBRIEF = NO
|
|||
|
||||
MULTILINE_CPP_IS_BRIEF = NO
|
||||
|
||||
# By default Python docstrings are displayed as preformatted text and doxygen's
|
||||
# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
|
||||
# doxygen's special commands can be used and the contents of the docstring
|
||||
# documentation blocks is shown as doxygen documentation.
|
||||
# The default value is: YES.
|
||||
|
||||
PYTHON_DOCSTRING = YES
|
||||
|
||||
# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
|
||||
# documentation from any documented member that it re-implements.
|
||||
# The default value is: YES.
|
||||
|
@ -234,7 +260,12 @@ TAB_SIZE = 8
|
|||
# will allow you to put the command \sideeffect (or @sideeffect) in the
|
||||
# documentation, which will result in a user-defined paragraph with heading
|
||||
# "Side Effects:". You can put \n's in the value part of an alias to insert
|
||||
# newlines.
|
||||
# newlines (in the resulting output). You can put ^^ in the value part of an
|
||||
# alias to insert a newline as if a physical newline was in the original file.
|
||||
# When you need a literal { or } or , in the value part of an alias you have to
|
||||
# escape them by means of a backslash (\), this can lead to conflicts with the
|
||||
# commands \{ and \} for these it is advised to use the version @{ and @} or use
|
||||
# a double escape (\\{ and \\})
|
||||
|
||||
ALIASES = "memo=\par Note:\n" \
|
||||
"draft=\xrefitem draft \"Draft\" \"Draft List\" This API may be changed in the future versions and was introduced in" \
|
||||
|
@ -244,12 +275,6 @@ ALIASES = "memo=\par Note:\n" \
|
|||
"system=\xrefitem system \"System\" \"System List\" \n Do not use unless you know what you are doing." \
|
||||
"internal=\xrefitem internal \"Internal\" \"Internal List\" Do not use. This API is for internal use only."
|
||||
|
||||
# This tag can be used to specify a number of word-keyword mappings (TCL only).
|
||||
# A mapping has the form "name=value". For example adding "class=itcl::class"
|
||||
# will allow you to use the command class in the itcl::class meaning.
|
||||
|
||||
TCL_SUBST =
|
||||
|
||||
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
|
||||
# only. Doxygen will then generate output that is more tailored for C. For
|
||||
# instance, some of the names that are used will be different. The list of all
|
||||
|
@ -278,28 +303,40 @@ OPTIMIZE_FOR_FORTRAN = NO
|
|||
|
||||
OPTIMIZE_OUTPUT_VHDL = NO
|
||||
|
||||
# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
|
||||
# sources only. Doxygen will then generate output that is more tailored for that
|
||||
# language. For instance, namespaces will be presented as modules, types will be
|
||||
# separated into more groups, etc.
|
||||
# The default value is: NO.
|
||||
|
||||
OPTIMIZE_OUTPUT_SLICE = NO
|
||||
|
||||
# Doxygen selects the parser to use depending on the extension of the files it
|
||||
# parses. With this tag you can assign which parser to use for a given
|
||||
# extension. Doxygen has a built-in mapping, but you can override or extend it
|
||||
# using this tag. The format is ext=language, where ext is a file extension, and
|
||||
# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
|
||||
# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
|
||||
# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
|
||||
# Fortran. In the later case the parser tries to guess whether the code is fixed
|
||||
# or free formatted code, this is the default for Fortran type files), VHDL. For
|
||||
# instance to make doxygen treat .inc files as Fortran files (default is PHP),
|
||||
# and .f files as C (default is Fortran), use: inc=Fortran f=C.
|
||||
# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
|
||||
# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL,
|
||||
# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
|
||||
# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
|
||||
# tries to guess whether the code is fixed or free formatted code, this is the
|
||||
# default for Fortran type files). For instance to make doxygen treat .inc files
|
||||
# as Fortran files (default is PHP), and .f files as C (default is Fortran),
|
||||
# use: inc=Fortran f=C.
|
||||
#
|
||||
# Note: For files without extension you can use no_extension as a placeholder.
|
||||
#
|
||||
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
|
||||
# the files are not read by doxygen.
|
||||
# the files are not read by doxygen. When specifying no_extension you should add
|
||||
# * to the FILE_PATTERNS.
|
||||
#
|
||||
# Note see also the list of default file extension mappings.
|
||||
|
||||
EXTENSION_MAPPING =
|
||||
|
||||
# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
|
||||
# according to the Markdown format, which allows for more readable
|
||||
# documentation. See http://daringfireball.net/projects/markdown/ for details.
|
||||
# documentation. See https://daringfireball.net/projects/markdown/ for details.
|
||||
# The output of markdown processing is further processed by doxygen, so you can
|
||||
# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
|
||||
# case of backward compatibilities issues.
|
||||
|
@ -311,7 +348,7 @@ MARKDOWN_SUPPORT = YES
|
|||
# to that level are automatically included in the table of contents, even if
|
||||
# they do not have an id attribute.
|
||||
# Note: This feature currently applies only to Markdown headings.
|
||||
# Minimum value: 0, maximum value: 99, default value: 0.
|
||||
# Minimum value: 0, maximum value: 99, default value: 5.
|
||||
# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
|
||||
|
||||
TOC_INCLUDE_HEADINGS = 0
|
||||
|
@ -341,7 +378,7 @@ BUILTIN_STL_SUPPORT = NO
|
|||
CPP_CLI_SUPPORT = NO
|
||||
|
||||
# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
|
||||
# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
|
||||
# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
|
||||
# will parse them like normal C++ but will assume all classes use public instead
|
||||
# of private inheritance when no explicit protection keyword is present.
|
||||
# The default value is: NO.
|
||||
|
@ -427,6 +464,19 @@ TYPEDEF_HIDES_STRUCT = NO
|
|||
|
||||
LOOKUP_CACHE_SIZE = 0
|
||||
|
||||
# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use
|
||||
# during processing. When set to 0 doxygen will based this on the number of
|
||||
# cores available in the system. You can set it explicitly to a value larger
|
||||
# than 0 to get more control over the balance between CPU load and processing
|
||||
# speed. At this moment only the input processing can be done using multiple
|
||||
# threads. Since this is still an experimental feature the default is set to 1,
|
||||
# which efficively disables parallel processing. Please report any issues you
|
||||
# encounter. Generating dot graphs in parallel is controlled by the
|
||||
# DOT_NUM_THREADS setting.
|
||||
# Minimum value: 0, maximum value: 32, default value: 1.
|
||||
|
||||
NUM_PROC_THREADS = 1
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Build related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -447,6 +497,12 @@ EXTRACT_ALL = NO
|
|||
|
||||
EXTRACT_PRIVATE = NO
|
||||
|
||||
# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
|
||||
# methods of a class will be included in the documentation.
|
||||
# The default value is: NO.
|
||||
|
||||
EXTRACT_PRIV_VIRTUAL = NO
|
||||
|
||||
# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
|
||||
# scope will be included in the documentation.
|
||||
# The default value is: NO.
|
||||
|
@ -484,6 +540,13 @@ EXTRACT_LOCAL_METHODS = NO
|
|||
|
||||
EXTRACT_ANON_NSPACES = NO
|
||||
|
||||
# If this flag is set to YES, the name of an unnamed parameter in a declaration
|
||||
# will be determined by the corresponding definition. By default unnamed
|
||||
# parameters remain unnamed in the output.
|
||||
# The default value is: YES.
|
||||
|
||||
RESOLVE_UNNAMED_PARAMS = YES
|
||||
|
||||
# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
|
||||
# undocumented members inside documented classes or files. If set to NO these
|
||||
# members will be included in the various overviews, but no documentation
|
||||
|
@ -501,8 +564,8 @@ HIDE_UNDOC_MEMBERS = NO
|
|||
HIDE_UNDOC_CLASSES = NO
|
||||
|
||||
# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
|
||||
# (class|struct|union) declarations. If set to NO, these declarations will be
|
||||
# included in the documentation.
|
||||
# declarations. If set to NO, these declarations will be included in the
|
||||
# documentation.
|
||||
# The default value is: NO.
|
||||
|
||||
HIDE_FRIEND_COMPOUNDS = NO
|
||||
|
@ -521,11 +584,18 @@ HIDE_IN_BODY_DOCS = NO
|
|||
|
||||
INTERNAL_DOCS = YES
|
||||
|
||||
# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
|
||||
# names in lower-case letters. If set to YES, upper-case letters are also
|
||||
# allowed. This is useful if you have classes or files whose names only differ
|
||||
# in case and if your file system supports case sensitive file names. Windows
|
||||
# and Mac users are advised to set this option to NO.
|
||||
# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
|
||||
# able to match the capabilities of the underlying filesystem. In case the
|
||||
# filesystem is case sensitive (i.e. it supports files in the same directory
|
||||
# whose names only differ in casing), the option must be set to YES to properly
|
||||
# deal with such files in case they appear in the input. For filesystems that
|
||||
# are not case sensitive the option should be be set to NO to properly deal with
|
||||
# output files written for symbols that only differ in casing, such as for two
|
||||
# classes, one named CLASS and the other named Class, and to also support
|
||||
# references to files without having to specify the exact matching casing. On
|
||||
# Windows (including Cygwin) and MacOS, users should typically set this option
|
||||
# to NO, whereas on Linux or other Unix flavors it should typically be set to
|
||||
# YES.
|
||||
# The default value is: system dependent.
|
||||
|
||||
CASE_SENSE_NAMES = YES
|
||||
|
@ -712,7 +782,7 @@ LAYOUT_FILE =
|
|||
# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
|
||||
# the reference definitions. This must be a list of .bib files. The .bib
|
||||
# extension is automatically appended if omitted. This requires the bibtex tool
|
||||
# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
|
||||
# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
|
||||
# For LaTeX the style of the bibliography can be controlled using
|
||||
# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
|
||||
# search path. See also \cite for info how to create references.
|
||||
|
@ -757,13 +827,17 @@ WARN_IF_DOC_ERROR = YES
|
|||
# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
|
||||
# are documented, but have no documentation for their parameters or return
|
||||
# value. If set to NO, doxygen will only warn about wrong or incomplete
|
||||
# parameter documentation, but not about the absence of documentation.
|
||||
# parameter documentation, but not about the absence of documentation. If
|
||||
# EXTRACT_ALL is set to YES then this flag will automatically be disabled.
|
||||
# The default value is: NO.
|
||||
|
||||
WARN_NO_PARAMDOC = NO
|
||||
|
||||
# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
|
||||
# a warning is encountered.
|
||||
# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
|
||||
# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
|
||||
# at the end of the doxygen process doxygen will return with a non-zero status.
|
||||
# Possible values are: NO, YES and FAIL_ON_WARNINGS.
|
||||
# The default value is: NO.
|
||||
|
||||
WARN_AS_ERROR = NO
|
||||
|
@ -802,8 +876,8 @@ INPUT = @srcdir@/common/unicode \
|
|||
# This tag can be used to specify the character encoding of the source files
|
||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
|
||||
# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
|
||||
# documentation (see: http://www.gnu.org/software/libiconv) for the list of
|
||||
# possible encodings.
|
||||
# documentation (see:
|
||||
# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
|
||||
# The default value is: UTF-8.
|
||||
|
||||
INPUT_ENCODING = UTF-8
|
||||
|
@ -816,11 +890,15 @@ INPUT_ENCODING = UTF-8
|
|||
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
|
||||
# read by doxygen.
|
||||
#
|
||||
# Note the list of default checked file patterns might differ from the list of
|
||||
# default file extension mappings.
|
||||
#
|
||||
# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
|
||||
# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
|
||||
# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
|
||||
# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
|
||||
# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
|
||||
# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),
|
||||
# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl,
|
||||
# *.ucf, *.qsf and *.ice.
|
||||
|
||||
FILE_PATTERNS = *.h
|
||||
|
||||
|
@ -979,7 +1057,7 @@ INLINE_SOURCES = NO
|
|||
STRIP_CODE_COMMENTS = YES
|
||||
|
||||
# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
|
||||
# function all documented functions referencing it will be listed.
|
||||
# entity all documented functions referencing it will be listed.
|
||||
# The default value is: NO.
|
||||
|
||||
REFERENCED_BY_RELATION = YES
|
||||
|
@ -1011,12 +1089,12 @@ SOURCE_TOOLTIPS = YES
|
|||
# If the USE_HTAGS tag is set to YES then the references to source code will
|
||||
# point to the HTML generated by the htags(1) tool instead of doxygen built-in
|
||||
# source browser. The htags tool is part of GNU's global source tagging system
|
||||
# (see http://www.gnu.org/software/global/global.html). You will need version
|
||||
# (see https://www.gnu.org/software/global/global.html). You will need version
|
||||
# 4.8.6 or higher.
|
||||
#
|
||||
# To use it do the following:
|
||||
# - Install the latest version of global
|
||||
# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
|
||||
# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
|
||||
# - Make sure the INPUT points to the root of the source tree
|
||||
# - Run doxygen as normal
|
||||
#
|
||||
|
@ -1039,16 +1117,22 @@ USE_HTAGS = NO
|
|||
VERBATIM_HEADERS = YES
|
||||
|
||||
# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
|
||||
# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
|
||||
# cost of reduced performance. This can be particularly helpful with template
|
||||
# rich C++ code for which doxygen's built-in parser lacks the necessary type
|
||||
# information.
|
||||
# clang parser (see:
|
||||
# http://clang.llvm.org/) for more accurate parsing at the cost of reduced
|
||||
# performance. This can be particularly helpful with template rich C++ code for
|
||||
# which doxygen's built-in parser lacks the necessary type information.
|
||||
# Note: The availability of this option depends on whether or not doxygen was
|
||||
# generated with the -Duse-libclang=ON option for CMake.
|
||||
# generated with the -Duse_libclang=ON option for CMake.
|
||||
# The default value is: NO.
|
||||
|
||||
CLANG_ASSISTED_PARSING = NO
|
||||
|
||||
# If clang assisted parsing is enabled and the CLANG_ADD_INC_PATHS tag is set to
|
||||
# YES then doxygen will add the directory of each input to the include path.
|
||||
# The default value is: YES.
|
||||
|
||||
CLANG_ADD_INC_PATHS = YES
|
||||
|
||||
# If clang assisted parsing is enabled you can provide the compiler with command
|
||||
# line options that you would normally use when invoking the compiler. Note that
|
||||
# the include paths will already be set by doxygen for the files and directories
|
||||
|
@ -1057,6 +1141,19 @@ CLANG_ASSISTED_PARSING = NO
|
|||
|
||||
CLANG_OPTIONS =
|
||||
|
||||
# If clang assisted parsing is enabled you can provide the clang parser with the
|
||||
# path to the directory containing a file called compile_commands.json. This
|
||||
# file is the compilation database (see:
|
||||
# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the
|
||||
# options used when the source files were built. This is equivalent to
|
||||
# specifying the -p option to a clang tool, such as clang-check. These options
|
||||
# will then be passed to the parser. Any options specified with CLANG_OPTIONS
|
||||
# will be added as well.
|
||||
# Note: The availability of this option depends on whether or not doxygen was
|
||||
# generated with the -Duse_libclang=ON option for CMake.
|
||||
|
||||
CLANG_DATABASE_PATH =
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the alphabetical class index
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -1068,13 +1165,6 @@ CLANG_OPTIONS =
|
|||
|
||||
ALPHABETICAL_INDEX = YES
|
||||
|
||||
# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
|
||||
# which the alphabetical index list will be split.
|
||||
# Minimum value: 1, maximum value: 20, default value: 5.
|
||||
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
|
||||
|
||||
COLS_IN_ALPHA_INDEX = 5
|
||||
|
||||
# In case all classes in a project start with a common prefix, all classes will
|
||||
# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
|
||||
# can be used to specify a prefix (or a list of prefixes) that should be ignored
|
||||
|
@ -1175,7 +1265,7 @@ HTML_EXTRA_FILES =
|
|||
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
|
||||
# will adjust the colors in the style sheet and background images according to
|
||||
# this color. Hue is specified as an angle on a colorwheel, see
|
||||
# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
|
||||
# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
|
||||
# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
|
||||
# purple, and 360 is red again.
|
||||
# Minimum value: 0, maximum value: 359, default value: 220.
|
||||
|
@ -1211,6 +1301,17 @@ HTML_COLORSTYLE_GAMMA = 80
|
|||
|
||||
HTML_TIMESTAMP = NO
|
||||
|
||||
# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
|
||||
# documentation will contain a main index with vertical navigation menus that
|
||||
# are dynamically created via JavaScript. If disabled, the navigation index will
|
||||
# consists of multiple levels of tabs that are statically embedded in every HTML
|
||||
# page. Disable this option to support browsers that do not have JavaScript,
|
||||
# like the Qt help browser.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
HTML_DYNAMIC_MENUS = YES
|
||||
|
||||
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
|
||||
# documentation will contain sections that can be hidden and shown after the
|
||||
# page has loaded.
|
||||
|
@ -1234,13 +1335,14 @@ HTML_INDEX_NUM_ENTRIES = 100
|
|||
|
||||
# If the GENERATE_DOCSET tag is set to YES, additional index files will be
|
||||
# generated that can be used as input for Apple's Xcode 3 integrated development
|
||||
# environment (see: http://developer.apple.com/tools/xcode/), introduced with
|
||||
# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
|
||||
# Makefile in the HTML output directory. Running make will produce the docset in
|
||||
# that directory and running make install will install the docset in
|
||||
# environment (see:
|
||||
# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
|
||||
# create a documentation set, doxygen will generate a Makefile in the HTML
|
||||
# output directory. Running make will produce the docset in that directory and
|
||||
# running make install will install the docset in
|
||||
# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
|
||||
# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
|
||||
# for more information.
|
||||
# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
|
||||
# genXcode/_index.html for more information.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
|
@ -1279,8 +1381,8 @@ DOCSET_PUBLISHER_NAME = Publisher
|
|||
# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
|
||||
# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
|
||||
# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
|
||||
# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
|
||||
# Windows.
|
||||
# (see:
|
||||
# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows.
|
||||
#
|
||||
# The HTML Help Workshop contains a compiler that can convert all HTML output
|
||||
# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
|
||||
|
@ -1310,7 +1412,7 @@ CHM_FILE =
|
|||
HHC_LOCATION =
|
||||
|
||||
# The GENERATE_CHI flag controls if a separate .chi index file is generated
|
||||
# (YES) or that it should be included in the primary .chm file (NO).
|
||||
# (YES) or that it should be included in the main .chm file (NO).
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
|
||||
|
||||
|
@ -1355,7 +1457,8 @@ QCH_FILE =
|
|||
|
||||
# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
|
||||
# Project output. For more information please see Qt Help Project / Namespace
|
||||
# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
|
||||
# (see:
|
||||
# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
|
||||
# The default value is: org.doxygen.Project.
|
||||
# This tag requires that the tag GENERATE_QHP is set to YES.
|
||||
|
||||
|
@ -1363,8 +1466,8 @@ QHP_NAMESPACE = org.doxygen.Project
|
|||
|
||||
# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
|
||||
# Help Project output. For more information please see Qt Help Project / Virtual
|
||||
# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
|
||||
# folders).
|
||||
# Folders (see:
|
||||
# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
|
||||
# The default value is: doc.
|
||||
# This tag requires that the tag GENERATE_QHP is set to YES.
|
||||
|
||||
|
@ -1372,30 +1475,30 @@ QHP_VIRTUAL_FOLDER = doc
|
|||
|
||||
# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
|
||||
# filter to add. For more information please see Qt Help Project / Custom
|
||||
# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
|
||||
# filters).
|
||||
# Filters (see:
|
||||
# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
|
||||
# This tag requires that the tag GENERATE_QHP is set to YES.
|
||||
|
||||
QHP_CUST_FILTER_NAME =
|
||||
|
||||
# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
|
||||
# custom filter to add. For more information please see Qt Help Project / Custom
|
||||
# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
|
||||
# filters).
|
||||
# Filters (see:
|
||||
# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
|
||||
# This tag requires that the tag GENERATE_QHP is set to YES.
|
||||
|
||||
QHP_CUST_FILTER_ATTRS =
|
||||
|
||||
# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
|
||||
# project's filter section matches. Qt Help Project / Filter Attributes (see:
|
||||
# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
|
||||
# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
|
||||
# This tag requires that the tag GENERATE_QHP is set to YES.
|
||||
|
||||
QHP_SECT_FILTER_ATTRS =
|
||||
|
||||
# The QHG_LOCATION tag can be used to specify the location of Qt's
|
||||
# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
|
||||
# generated .qhp file.
|
||||
# The QHG_LOCATION tag can be used to specify the location (absolute path
|
||||
# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
|
||||
# run qhelpgenerator on the generated .qhp file.
|
||||
# This tag requires that the tag GENERATE_QHP is set to YES.
|
||||
|
||||
QHG_LOCATION =
|
||||
|
@ -1472,6 +1575,17 @@ TREEVIEW_WIDTH = 250
|
|||
|
||||
EXT_LINKS_IN_WINDOW = NO
|
||||
|
||||
# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
|
||||
# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
|
||||
# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
|
||||
# the HTML output. These images will generally look nicer at scaled resolutions.
|
||||
# Possible values are: png (the default) and svg (looks nicer but requires the
|
||||
# pdf2svg or inkscape tool).
|
||||
# The default value is: png.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
HTML_FORMULA_FORMAT = png
|
||||
|
||||
# Use this tag to change the font size of LaTeX formulas included as images in
|
||||
# the HTML documentation. When you change the font size after a successful
|
||||
# doxygen run you need to manually remove any form_*.png images from the HTML
|
||||
|
@ -1481,7 +1595,7 @@ EXT_LINKS_IN_WINDOW = NO
|
|||
|
||||
FORMULA_FONTSIZE = 10
|
||||
|
||||
# Use the FORMULA_TRANPARENT tag to determine whether or not the images
|
||||
# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
|
||||
# generated for formulas are transparent PNGs. Transparent PNGs are not
|
||||
# supported properly for IE 6.0, but are supported on all modern browsers.
|
||||
#
|
||||
|
@ -1492,8 +1606,14 @@ FORMULA_FONTSIZE = 10
|
|||
|
||||
FORMULA_TRANSPARENT = YES
|
||||
|
||||
# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
|
||||
# to create new LaTeX commands to be used in formulas as building blocks. See
|
||||
# the section "Including formulas" for details.
|
||||
|
||||
FORMULA_MACROFILE =
|
||||
|
||||
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
|
||||
# http://www.mathjax.org) which uses client side Javascript for the rendering
|
||||
# https://www.mathjax.org) which uses client side JavaScript for the rendering
|
||||
# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
|
||||
# installed or if you want to formulas look prettier in the HTML output. When
|
||||
# enabled you may also need to install MathJax separately and configure the path
|
||||
|
@ -1505,7 +1625,7 @@ USE_MATHJAX = NO
|
|||
|
||||
# When MathJax is enabled you can set the default output format to be used for
|
||||
# the MathJax output. See the MathJax site (see:
|
||||
# http://docs.mathjax.org/en/latest/output.html) for more details.
|
||||
# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details.
|
||||
# Possible values are: HTML-CSS (which is slower, but has the best
|
||||
# compatibility), NativeMML (i.e. MathML) and SVG.
|
||||
# The default value is: HTML-CSS.
|
||||
|
@ -1520,8 +1640,8 @@ MATHJAX_FORMAT = HTML-CSS
|
|||
# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
|
||||
# Content Delivery Network so you can quickly see the result without installing
|
||||
# MathJax. However, it is strongly recommended to install a local copy of
|
||||
# MathJax from http://www.mathjax.org before deployment.
|
||||
# The default value is: http://cdn.mathjax.org/mathjax/latest.
|
||||
# MathJax from https://www.mathjax.org before deployment.
|
||||
# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2.
|
||||
# This tag requires that the tag USE_MATHJAX is set to YES.
|
||||
|
||||
MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
|
||||
|
@ -1535,7 +1655,8 @@ MATHJAX_EXTENSIONS =
|
|||
|
||||
# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
|
||||
# of code that will be used on startup of the MathJax code. See the MathJax site
|
||||
# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
|
||||
# (see:
|
||||
# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
|
||||
# example see the documentation.
|
||||
# This tag requires that the tag USE_MATHJAX is set to YES.
|
||||
|
||||
|
@ -1563,7 +1684,7 @@ MATHJAX_CODEFILE =
|
|||
SEARCHENGINE = NO
|
||||
|
||||
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
|
||||
# implemented using a web server instead of a web client using Javascript. There
|
||||
# implemented using a web server instead of a web client using JavaScript. There
|
||||
# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
|
||||
# setting. When disabled, doxygen will generate a PHP script for searching and
|
||||
# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
|
||||
|
@ -1582,7 +1703,8 @@ SERVER_BASED_SEARCH = NO
|
|||
#
|
||||
# Doxygen ships with an example indexer (doxyindexer) and search engine
|
||||
# (doxysearch.cgi) which are based on the open source search engine library
|
||||
# Xapian (see: http://xapian.org/).
|
||||
# Xapian (see:
|
||||
# https://xapian.org/).
|
||||
#
|
||||
# See the section "External Indexing and Searching" for details.
|
||||
# The default value is: NO.
|
||||
|
@ -1595,8 +1717,9 @@ EXTERNAL_SEARCH = NO
|
|||
#
|
||||
# Doxygen ships with an example indexer (doxyindexer) and search engine
|
||||
# (doxysearch.cgi) which are based on the open source search engine library
|
||||
# Xapian (see: http://xapian.org/). See the section "External Indexing and
|
||||
# Searching" for details.
|
||||
# Xapian (see:
|
||||
# https://xapian.org/). See the section "External Indexing and Searching" for
|
||||
# details.
|
||||
# This tag requires that the tag SEARCHENGINE is set to YES.
|
||||
|
||||
SEARCHENGINE_URL =
|
||||
|
@ -1647,21 +1770,35 @@ LATEX_OUTPUT = latex
|
|||
# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
|
||||
# invoked.
|
||||
#
|
||||
# Note that when enabling USE_PDFLATEX this option is only used for generating
|
||||
# bitmaps for formulas in the HTML output, but not in the Makefile that is
|
||||
# written to the output directory.
|
||||
# The default file is: latex.
|
||||
# Note that when not enabling USE_PDFLATEX the default is latex when enabling
|
||||
# USE_PDFLATEX the default is pdflatex and when in the later case latex is
|
||||
# chosen this is overwritten by pdflatex. For specific output languages the
|
||||
# default can have been set differently, this depends on the implementation of
|
||||
# the output language.
|
||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||
|
||||
LATEX_CMD_NAME = latex
|
||||
|
||||
# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
|
||||
# index for LaTeX.
|
||||
# Note: This tag is used in the Makefile / make.bat.
|
||||
# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
|
||||
# (.tex).
|
||||
# The default file is: makeindex.
|
||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||
|
||||
MAKEINDEX_CMD_NAME = makeindex
|
||||
|
||||
# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
|
||||
# generate index for LaTeX. In case there is no backslash (\) as first character
|
||||
# it will be automatically added in the LaTeX code.
|
||||
# Note: This tag is used in the generated output file (.tex).
|
||||
# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
|
||||
# The default value is: makeindex.
|
||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||
|
||||
LATEX_MAKEINDEX_CMD = makeindex
|
||||
|
||||
# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
|
||||
# documents. This may be useful for small projects and may help to save some
|
||||
# trees in general.
|
||||
|
@ -1746,9 +1883,11 @@ LATEX_EXTRA_FILES =
|
|||
|
||||
PDF_HYPERLINKS = NO
|
||||
|
||||
# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
|
||||
# the PDF file directly from the LaTeX files. Set this option to YES, to get a
|
||||
# higher quality PDF documentation.
|
||||
# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
|
||||
# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
|
||||
# files. Set this option to YES, to get a higher quality PDF documentation.
|
||||
#
|
||||
# See also section LATEX_CMD_NAME for selecting the engine.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||
|
||||
|
@ -1782,7 +1921,7 @@ LATEX_SOURCE_CODE = NO
|
|||
|
||||
# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
|
||||
# bibliography, e.g. plainnat, or ieeetr. See
|
||||
# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
|
||||
# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
|
||||
# The default value is: plain.
|
||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||
|
||||
|
@ -1796,6 +1935,14 @@ LATEX_BIB_STYLE = plain
|
|||
|
||||
LATEX_TIMESTAMP = NO
|
||||
|
||||
# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
|
||||
# path from which the emoji images will be read. If a relative path is entered,
|
||||
# it will be relative to the LATEX_OUTPUT directory. If left blank the
|
||||
# LATEX_OUTPUT directory will be used.
|
||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||
|
||||
LATEX_EMOJI_DIRECTORY =
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the RTF output
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -1835,9 +1982,9 @@ COMPACT_RTF = NO
|
|||
|
||||
RTF_HYPERLINKS = NO
|
||||
|
||||
# Load stylesheet definitions from file. Syntax is similar to doxygen's config
|
||||
# file, i.e. a series of assignments. You only have to provide replacements,
|
||||
# missing definitions are set to their default value.
|
||||
# Load stylesheet definitions from file. Syntax is similar to doxygen's
|
||||
# configuration file, i.e. a series of assignments. You only have to provide
|
||||
# replacements, missing definitions are set to their default value.
|
||||
#
|
||||
# See also section "Doxygen usage" for information on how to generate the
|
||||
# default style sheet that doxygen normally uses.
|
||||
|
@ -1846,8 +1993,8 @@ RTF_HYPERLINKS = NO
|
|||
RTF_STYLESHEET_FILE =
|
||||
|
||||
# Set optional variables used in the generation of an RTF document. Syntax is
|
||||
# similar to doxygen's config file. A template extensions file can be generated
|
||||
# using doxygen -e rtf extensionFile.
|
||||
# similar to doxygen's configuration file. A template extensions file can be
|
||||
# generated using doxygen -e rtf extensionFile.
|
||||
# This tag requires that the tag GENERATE_RTF is set to YES.
|
||||
|
||||
RTF_EXTENSIONS_FILE =
|
||||
|
@ -1933,6 +2080,13 @@ XML_OUTPUT = xml
|
|||
|
||||
XML_PROGRAMLISTING = YES
|
||||
|
||||
# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
|
||||
# namespace members in file scope as well, matching the HTML output.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag GENERATE_XML is set to YES.
|
||||
|
||||
XML_NS_MEMB_FILE_SCOPE = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the DOCBOOK output
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -1965,9 +2119,9 @@ DOCBOOK_PROGRAMLISTING = NO
|
|||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
|
||||
# AutoGen Definitions (see http://autogen.sf.net) file that captures the
|
||||
# structure of the code including all documentation. Note that this feature is
|
||||
# still experimental and incomplete at the moment.
|
||||
# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
|
||||
# the structure of the code including all documentation. Note that this feature
|
||||
# is still experimental and incomplete at the moment.
|
||||
# The default value is: NO.
|
||||
|
||||
GENERATE_AUTOGEN_DEF = NO
|
||||
|
@ -2079,7 +2233,7 @@ PREDEFINED = U_EXPORT2= \
|
|||
U_CDECL_BEGIN= \
|
||||
U_CDECL_END= \
|
||||
"U_NAMESPACE_BEGIN=namespace icu{" \
|
||||
"U_NAMESPACE_END=}" \
|
||||
U_NAMESPACE_END=} \
|
||||
U_SHOW_CPLUSPLUS_API=1 \
|
||||
U_DEFINE_LOCAL_OPEN_POINTER()= \
|
||||
U_IN_DOXYGEN=1 \
|
||||
|
@ -2129,7 +2283,7 @@ TAGFILES =
|
|||
# tag file that is based on the input files it reads. See section "Linking to
|
||||
# external documentation" for more information about the usage of tag files.
|
||||
|
||||
GENERATE_TAGFILE = "@builddir@/doc/html/icudocs.tag"
|
||||
GENERATE_TAGFILE = @builddir@/doc/html/icudocs.tag
|
||||
|
||||
# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
|
||||
# the class index. If set to NO, only the inherited external classes will be
|
||||
|
@ -2152,12 +2306,6 @@ EXTERNAL_GROUPS = YES
|
|||
|
||||
EXTERNAL_PAGES = YES
|
||||
|
||||
# The PERL_PATH should be the absolute path and name of the perl script
|
||||
# interpreter (i.e. the result of 'which perl').
|
||||
# The default file (with absolute path) is: /usr/bin/perl.
|
||||
|
||||
PERL_PATH = /usr/bin/perl
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the dot tool
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -2171,15 +2319,6 @@ PERL_PATH = /usr/bin/perl
|
|||
|
||||
CLASS_DIAGRAMS = YES
|
||||
|
||||
# You can define message sequence charts within doxygen comments using the \msc
|
||||
# command. Doxygen will then run the mscgen tool (see:
|
||||
# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
|
||||
# documentation. The MSCGEN_PATH tag allows you to specify the directory where
|
||||
# the mscgen tool resides. If left empty the tool is assumed to be found in the
|
||||
# default search path.
|
||||
|
||||
MSCGEN_PATH =
|
||||
|
||||
# You can include diagrams made with dia in doxygen documentation. Doxygen will
|
||||
# then run dia to produce the diagram and insert it in the documentation. The
|
||||
# DIA_PATH tag allows you to specify the directory where the dia binary resides.
|
||||
|
@ -2277,10 +2416,32 @@ UML_LOOK = NO
|
|||
# but if the number exceeds 15, the total amount of fields shown is limited to
|
||||
# 10.
|
||||
# Minimum value: 0, maximum value: 100, default value: 10.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
# This tag requires that the tag UML_LOOK is set to YES.
|
||||
|
||||
UML_LIMIT_NUM_FIELDS = 10
|
||||
|
||||
# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
|
||||
# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
|
||||
# tag is set to YES, doxygen will add type and arguments for attributes and
|
||||
# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
|
||||
# will not generate fields with class member information in the UML graphs. The
|
||||
# class diagrams will look similar to the default class diagrams but using UML
|
||||
# notation for the relationships.
|
||||
# Possible values are: NO, YES and NONE.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag UML_LOOK is set to YES.
|
||||
|
||||
DOT_UML_DETAILS = NO
|
||||
|
||||
# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
|
||||
# to display on a single line. If the actual line length exceeds this threshold
|
||||
# significantly it will wrapped across multiple lines. Some heuristics are apply
|
||||
# to avoid ugly line breaks.
|
||||
# Minimum value: 0, maximum value: 1000, default value: 17.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
DOT_WRAP_THRESHOLD = 17
|
||||
|
||||
# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
|
||||
# collaboration graphs will show the relations between templates and their
|
||||
# instances.
|
||||
|
@ -2472,9 +2633,11 @@ DOT_MULTI_TARGETS = NO
|
|||
|
||||
GENERATE_LEGEND = YES
|
||||
|
||||
# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
|
||||
# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
|
||||
# files that are used to generate the various graphs.
|
||||
#
|
||||
# Note: This setting is not only used for dot files but also for msc and
|
||||
# plantuml temporary files.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
DOT_CLEANUP = YES
|
||||
|
|
|
@ -133,7 +133,7 @@ doc/html/index.html: Doxyfile $(wildcard ./common/unicode/platform.h $(srcdir)/c
|
|||
Doxyfile: $(srcdir)/Doxyfile.in
|
||||
CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
|
||||
$(DOCZIP): doc
|
||||
$(DOCZIP): doc-searchengine
|
||||
-$(RMV) $(DOCZIP)
|
||||
( cd doc/html ; zip -r ../../$(DOCZIP) * )
|
||||
endif
|
||||
|
@ -206,7 +206,7 @@ endif
|
|||
ifeq ($(DOXYGEN),)
|
||||
install-doc:
|
||||
else
|
||||
install-doc: doc
|
||||
install-doc: doc-searchengine
|
||||
$(RM) -r $(DESTDIR)$(docdir)/$(docsubdir)
|
||||
$(MKINSTALLDIRS) $(DESTDIR)$(docdir)/$(docsubdir)
|
||||
$(INSTALL_DATA) $(docfiles) $(DESTDIR)$(docdir)/$(docsubdir)
|
||||
|
|
|
@ -59,7 +59,7 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &st
|
|||
{
|
||||
char fnbuff[256];
|
||||
char ext[4]={'\0'};
|
||||
CharString actualLocale;
|
||||
CharString actual;
|
||||
int32_t size;
|
||||
const char16_t* brkfname = nullptr;
|
||||
UResourceBundle brkRulesStack;
|
||||
|
@ -94,7 +94,7 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &st
|
|||
|
||||
// Use the string if we found it
|
||||
if (U_SUCCESS(status) && brkfname) {
|
||||
actualLocale.append(ures_getLocaleInternal(brkName, &status), -1, status);
|
||||
actual.append(ures_getLocaleInternal(brkName, &status), -1, status);
|
||||
|
||||
char16_t* extStart=u_strchr(brkfname, 0x002e);
|
||||
int len = 0;
|
||||
|
@ -123,10 +123,9 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &st
|
|||
if (U_SUCCESS(status) && result != nullptr) {
|
||||
U_LOCALE_BASED(locBased, *(BreakIterator*)result);
|
||||
|
||||
locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status),
|
||||
actualLocale.data());
|
||||
uprv_strncpy(result->requestLocale, loc.getName(), ULOC_FULLNAME_CAPACITY);
|
||||
result->requestLocale[ULOC_FULLNAME_CAPACITY-1] = 0; // always terminate
|
||||
locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status),
|
||||
actual.data(), status);
|
||||
LocaleBased::setLocaleID(loc.getName(), result->requestLocale, status);
|
||||
}
|
||||
|
||||
ures_close(b);
|
||||
|
@ -206,26 +205,32 @@ BreakIterator::getAvailableLocales(int32_t& count)
|
|||
|
||||
BreakIterator::BreakIterator()
|
||||
{
|
||||
*validLocale = *actualLocale = *requestLocale = 0;
|
||||
}
|
||||
|
||||
BreakIterator::BreakIterator(const BreakIterator &other) : UObject(other) {
|
||||
uprv_strncpy(actualLocale, other.actualLocale, sizeof(actualLocale));
|
||||
uprv_strncpy(validLocale, other.validLocale, sizeof(validLocale));
|
||||
uprv_strncpy(requestLocale, other.requestLocale, sizeof(requestLocale));
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
U_LOCALE_BASED(locBased, *this);
|
||||
locBased.setLocaleIDs(other.validLocale, other.actualLocale, status);
|
||||
LocaleBased::setLocaleID(other.requestLocale, requestLocale, status);
|
||||
U_ASSERT(U_SUCCESS(status));
|
||||
}
|
||||
|
||||
BreakIterator &BreakIterator::operator =(const BreakIterator &other) {
|
||||
if (this != &other) {
|
||||
uprv_strncpy(actualLocale, other.actualLocale, sizeof(actualLocale));
|
||||
uprv_strncpy(validLocale, other.validLocale, sizeof(validLocale));
|
||||
uprv_strncpy(requestLocale, other.requestLocale, sizeof(requestLocale));
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
U_LOCALE_BASED(locBased, *this);
|
||||
locBased.setLocaleIDs(other.validLocale, other.actualLocale, status);
|
||||
LocaleBased::setLocaleID(other.requestLocale, requestLocale, status);
|
||||
U_ASSERT(U_SUCCESS(status));
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
BreakIterator::~BreakIterator()
|
||||
{
|
||||
delete validLocale;
|
||||
delete actualLocale;
|
||||
delete requestLocale;
|
||||
}
|
||||
|
||||
// ------------------------------------------
|
||||
|
@ -394,7 +399,7 @@ BreakIterator::createInstance(const Locale& loc, int32_t kind, UErrorCode& statu
|
|||
// revisit this in ICU 3.0 and clean it up/fix it/remove it.
|
||||
if (U_SUCCESS(status) && (result != nullptr) && *actualLoc.getName() != 0) {
|
||||
U_LOCALE_BASED(locBased, *result);
|
||||
locBased.setLocaleIDs(actualLoc.getName(), actualLoc.getName());
|
||||
locBased.setLocaleIDs(actualLoc.getName(), actualLoc.getName(), status);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@ -488,6 +493,7 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status)
|
|||
}
|
||||
|
||||
if (U_FAILURE(status)) {
|
||||
delete result;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -496,20 +502,25 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status)
|
|||
|
||||
Locale
|
||||
BreakIterator::getLocale(ULocDataLocaleType type, UErrorCode& status) const {
|
||||
if (type == ULOC_REQUESTED_LOCALE) {
|
||||
return {requestLocale};
|
||||
if (U_FAILURE(status)) {
|
||||
return Locale::getRoot();
|
||||
}
|
||||
U_LOCALE_BASED(locBased, *this);
|
||||
return locBased.getLocale(type, status);
|
||||
if (type == ULOC_REQUESTED_LOCALE) {
|
||||
return requestLocale == nullptr ?
|
||||
Locale::getRoot() : Locale(requestLocale->data());
|
||||
}
|
||||
return LocaleBased::getLocale(validLocale, actualLocale, type, status);
|
||||
}
|
||||
|
||||
const char *
|
||||
BreakIterator::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const {
|
||||
if (type == ULOC_REQUESTED_LOCALE) {
|
||||
return requestLocale;
|
||||
if (U_FAILURE(status)) {
|
||||
return nullptr;
|
||||
}
|
||||
U_LOCALE_BASED(locBased, *this);
|
||||
return locBased.getLocaleID(type, status);
|
||||
if (type == ULOC_REQUESTED_LOCALE) {
|
||||
return requestLocale == nullptr ? "" : requestLocale->data();
|
||||
}
|
||||
return LocaleBased::getLocaleID(validLocale, actualLocale, type, status);
|
||||
}
|
||||
|
||||
|
||||
|
@ -536,8 +547,10 @@ int32_t BreakIterator::getRuleStatusVec(int32_t *fillInVec, int32_t capacity, UE
|
|||
}
|
||||
|
||||
BreakIterator::BreakIterator (const Locale& valid, const Locale& actual) {
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
U_LOCALE_BASED(locBased, (*this));
|
||||
locBased.setLocaleIDs(valid, actual);
|
||||
locBased.setLocaleIDs(valid.getName(), actual.getName(), status);
|
||||
U_ASSERT(U_SUCCESS(status));
|
||||
}
|
||||
|
||||
U_NAMESPACE_END
|
||||
|
|
|
@ -70,6 +70,15 @@ CharString &CharString::copyFrom(const CharString &s, UErrorCode &errorCode) {
|
|||
return *this;
|
||||
}
|
||||
|
||||
CharString &CharString::copyFrom(StringPiece s, UErrorCode &errorCode) {
|
||||
if (U_FAILURE(errorCode)) {
|
||||
return *this;
|
||||
}
|
||||
len = 0;
|
||||
append(s, errorCode);
|
||||
return *this;
|
||||
}
|
||||
|
||||
int32_t CharString::lastIndexOf(char c) const {
|
||||
for(int32_t i=len; i>0;) {
|
||||
if(buffer[--i]==c) {
|
||||
|
@ -143,7 +152,7 @@ CharString &CharString::append(const char *s, int32_t sLength, UErrorCode &error
|
|||
return *this;
|
||||
}
|
||||
|
||||
CharString &CharString::appendNumber(int32_t number, UErrorCode &status) {
|
||||
CharString &CharString::appendNumber(int64_t number, UErrorCode &status) {
|
||||
if (number < 0) {
|
||||
this->append('-', status);
|
||||
if (U_FAILURE(status)) {
|
||||
|
|
|
@ -74,6 +74,7 @@ public:
|
|||
* use a UErrorCode where memory allocations might be needed.
|
||||
*/
|
||||
CharString ©From(const CharString &other, UErrorCode &errorCode);
|
||||
CharString ©From(StringPiece s, UErrorCode &errorCode);
|
||||
|
||||
UBool isEmpty() const { return len==0; }
|
||||
int32_t length() const { return len; }
|
||||
|
@ -135,7 +136,7 @@ public:
|
|||
}
|
||||
CharString &append(const char *s, int32_t sLength, UErrorCode &status);
|
||||
|
||||
CharString &appendNumber(int32_t number, UErrorCode &status);
|
||||
CharString &appendNumber(int64_t number, UErrorCode &status);
|
||||
|
||||
/**
|
||||
* Returns a writable buffer for appending and writes the buffer's capacity to
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -12,44 +12,84 @@
|
|||
*/
|
||||
#include "locbased.h"
|
||||
#include "cstring.h"
|
||||
#include "charstr.h"
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
Locale LocaleBased::getLocale(ULocDataLocaleType type, UErrorCode& status) const {
|
||||
const char* id = getLocaleID(type, status);
|
||||
Locale LocaleBased::getLocale(const CharString* valid, const CharString* actual,
|
||||
ULocDataLocaleType type, UErrorCode& status) {
|
||||
const char* id = getLocaleID(valid, actual, type, status);
|
||||
return Locale(id != nullptr ? id : "");
|
||||
}
|
||||
|
||||
const char* LocaleBased::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const {
|
||||
const char* LocaleBased::getLocaleID(const CharString* valid, const CharString* actual,
|
||||
ULocDataLocaleType type, UErrorCode& status) {
|
||||
if (U_FAILURE(status)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
switch(type) {
|
||||
case ULOC_VALID_LOCALE:
|
||||
return valid;
|
||||
return valid == nullptr ? "" : valid->data();
|
||||
case ULOC_ACTUAL_LOCALE:
|
||||
return actual;
|
||||
return actual == nullptr ? "" : actual->data();
|
||||
default:
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void LocaleBased::setLocaleIDs(const char* validID, const char* actualID) {
|
||||
if (validID != nullptr) {
|
||||
uprv_strncpy(valid, validID, ULOC_FULLNAME_CAPACITY);
|
||||
valid[ULOC_FULLNAME_CAPACITY-1] = 0; // always terminate
|
||||
}
|
||||
if (actualID != nullptr) {
|
||||
uprv_strncpy(actual, actualID, ULOC_FULLNAME_CAPACITY);
|
||||
actual[ULOC_FULLNAME_CAPACITY-1] = 0; // always terminate
|
||||
void LocaleBased::setLocaleIDs(const CharString* validID, const CharString* actualID, UErrorCode& status) {
|
||||
setValidLocaleID(validID, status);
|
||||
setActualLocaleID(actualID,status);
|
||||
}
|
||||
void LocaleBased::setLocaleIDs(const char* validID, const char* actualID, UErrorCode& status) {
|
||||
setValidLocaleID(validID, status);
|
||||
setActualLocaleID(actualID,status);
|
||||
}
|
||||
|
||||
void LocaleBased::setLocaleID(const char* id, CharString*& dest, UErrorCode& status) {
|
||||
if (U_FAILURE(status)) { return; }
|
||||
if (id == nullptr || *id == 0) {
|
||||
delete dest;
|
||||
dest = nullptr;
|
||||
} else {
|
||||
if (dest == nullptr) {
|
||||
dest = new CharString(id, status);
|
||||
if (dest == nullptr) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
dest->copyFrom(id, status);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LocaleBased::setLocaleIDs(const Locale& validID, const Locale& actualID) {
|
||||
uprv_strcpy(valid, validID.getName());
|
||||
uprv_strcpy(actual, actualID.getName());
|
||||
void LocaleBased::setLocaleID(const CharString* id, CharString*& dest, UErrorCode& status) {
|
||||
if (U_FAILURE(status)) { return; }
|
||||
if (id == nullptr || id->isEmpty()) {
|
||||
delete dest;
|
||||
dest = nullptr;
|
||||
} else {
|
||||
if (dest == nullptr) {
|
||||
dest = new CharString(*id, status);
|
||||
if (dest == nullptr) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
dest->copyFrom(*id, status);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool LocaleBased::equalIDs(const CharString* left, const CharString* right) {
|
||||
// true if both are nullptr
|
||||
if (left == nullptr && right == nullptr) return true;
|
||||
// false if only one is nullptr
|
||||
if (left == nullptr || right == nullptr) return false;
|
||||
return *left == *right;
|
||||
}
|
||||
|
||||
U_NAMESPACE_END
|
||||
|
|
|
@ -19,13 +19,14 @@
|
|||
/**
|
||||
* Macro to declare a locale LocaleBased wrapper object for the given
|
||||
* object, which must have two members named `validLocale' and
|
||||
* `actualLocale' of size ULOC_FULLNAME_CAPACITY
|
||||
* `actualLocale' of which are pointers to the internal icu::CharString.
|
||||
*/
|
||||
#define U_LOCALE_BASED(varname, objname) \
|
||||
LocaleBased varname((objname).validLocale, (objname).actualLocale)
|
||||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
class CharString;
|
||||
/**
|
||||
* A utility class that unifies the implementation of getLocale() by
|
||||
* various ICU services. This class is likely to be removed in the
|
||||
|
@ -41,33 +42,35 @@ class U_COMMON_API LocaleBased : public UMemory {
|
|||
* Construct a LocaleBased wrapper around the two pointers. These
|
||||
* will be aliased for the lifetime of this object.
|
||||
*/
|
||||
inline LocaleBased(char* validAlias, char* actualAlias);
|
||||
|
||||
/**
|
||||
* Construct a LocaleBased wrapper around the two const pointers.
|
||||
* These will be aliased for the lifetime of this object.
|
||||
*/
|
||||
inline LocaleBased(const char* validAlias, const char* actualAlias);
|
||||
inline LocaleBased(CharString*& validAlias, CharString*& actualAlias);
|
||||
|
||||
/**
|
||||
* Return locale meta-data for the service object wrapped by this
|
||||
* object. Either the valid or the actual locale may be
|
||||
* retrieved.
|
||||
* @param valid The valid locale.
|
||||
* @param actual The actual locale.
|
||||
* @param type either ULOC_VALID_LOCALE or ULOC_ACTUAL_LOCALE
|
||||
* @param status input-output error code
|
||||
* @return the indicated locale
|
||||
*/
|
||||
Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
|
||||
static Locale getLocale(
|
||||
const CharString* valid, const CharString* actual,
|
||||
ULocDataLocaleType type, UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Return the locale ID for the service object wrapped by this
|
||||
* object. Either the valid or the actual locale may be
|
||||
* retrieved.
|
||||
* @param valid The valid locale.
|
||||
* @param actual The actual locale.
|
||||
* @param type either ULOC_VALID_LOCALE or ULOC_ACTUAL_LOCALE
|
||||
* @param status input-output error code
|
||||
* @return the indicated locale ID
|
||||
*/
|
||||
const char* getLocaleID(ULocDataLocaleType type, UErrorCode& status) const;
|
||||
static const char* getLocaleID(
|
||||
const CharString* valid, const CharString* actual,
|
||||
ULocDataLocaleType type, UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Set the locale meta-data for the service object wrapped by this
|
||||
|
@ -75,31 +78,40 @@ class U_COMMON_API LocaleBased : public UMemory {
|
|||
* @param valid the ID of the valid locale
|
||||
* @param actual the ID of the actual locale
|
||||
*/
|
||||
void setLocaleIDs(const char* valid, const char* actual);
|
||||
void setLocaleIDs(const char* valid, const char* actual, UErrorCode& status);
|
||||
void setLocaleIDs(const CharString* valid, const CharString* actual, UErrorCode& status);
|
||||
|
||||
/**
|
||||
* Set the locale meta-data for the service object wrapped by this
|
||||
* object.
|
||||
* @param valid the ID of the valid locale
|
||||
* @param actual the ID of the actual locale
|
||||
*/
|
||||
void setLocaleIDs(const Locale& valid, const Locale& actual);
|
||||
static void setLocaleID(const char* id, CharString*& dest, UErrorCode& status);
|
||||
static void setLocaleID(const CharString* id, CharString*& dest, UErrorCode& status);
|
||||
|
||||
static bool equalIDs(const CharString* left, const CharString* right);
|
||||
|
||||
private:
|
||||
|
||||
char* valid;
|
||||
|
||||
char* actual;
|
||||
void setValidLocaleID(const CharString* id, UErrorCode& status);
|
||||
void setActualLocaleID(const CharString* id, UErrorCode& status);
|
||||
void setValidLocaleID(const char* id, UErrorCode& status);
|
||||
void setActualLocaleID(const char* id, UErrorCode& status);
|
||||
|
||||
CharString*& valid;
|
||||
CharString*& actual;
|
||||
};
|
||||
|
||||
inline LocaleBased::LocaleBased(char* validAlias, char* actualAlias) :
|
||||
inline LocaleBased::LocaleBased(CharString*& validAlias, CharString*& actualAlias) :
|
||||
valid(validAlias), actual(actualAlias) {
|
||||
}
|
||||
|
||||
inline LocaleBased::LocaleBased(const char* validAlias,
|
||||
const char* actualAlias) :
|
||||
// ugh: cast away const
|
||||
valid(const_cast<char*>(validAlias)), actual(const_cast<char*>(actualAlias)) {
|
||||
inline void LocaleBased::setValidLocaleID(const CharString* id, UErrorCode& status) {
|
||||
setLocaleID(id, valid, status);
|
||||
}
|
||||
inline void LocaleBased::setActualLocaleID(const CharString* id, UErrorCode& status) {
|
||||
setLocaleID(id, actual, status);
|
||||
}
|
||||
inline void LocaleBased::setValidLocaleID(const char* id, UErrorCode& status) {
|
||||
setLocaleID(id, valid, status);
|
||||
}
|
||||
inline void LocaleBased::setActualLocaleID(const char* id, UErrorCode& status) {
|
||||
setLocaleID(id, actual, status);
|
||||
}
|
||||
|
||||
U_NAMESPACE_END
|
||||
|
|
|
@ -1828,8 +1828,13 @@ ulocimp_isCanonicalizedLocaleForTest(const char* localeName)
|
|||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
/*This function initializes a Locale from a C locale ID*/
|
||||
Locale& Locale::init(const char* localeID, UBool canonicalize)
|
||||
{
|
||||
return localeID == nullptr ? *this = getDefault() : init(StringPiece{localeID}, canonicalize);
|
||||
}
|
||||
|
||||
/*This function initializes a Locale from a C locale ID*/
|
||||
Locale& Locale::init(StringPiece localeID, UBool canonicalize)
|
||||
{
|
||||
fIsBogus = false;
|
||||
/* Free our current storage */
|
||||
|
@ -1854,19 +1859,28 @@ Locale& Locale::init(const char* localeID, UBool canonicalize)
|
|||
int32_t length;
|
||||
UErrorCode err;
|
||||
|
||||
if(localeID == nullptr) {
|
||||
// not an error, just set the default locale
|
||||
return *this = getDefault();
|
||||
}
|
||||
|
||||
/* preset all fields to empty */
|
||||
language[0] = script[0] = country[0] = 0;
|
||||
|
||||
const auto parse = [canonicalize](std::string_view localeID,
|
||||
char* name,
|
||||
int32_t nameCapacity,
|
||||
UErrorCode& status) {
|
||||
return ByteSinkUtil::viaByteSinkToTerminatedChars(
|
||||
name, nameCapacity,
|
||||
[&](ByteSink& sink, UErrorCode& status) {
|
||||
if (canonicalize) {
|
||||
ulocimp_canonicalize(localeID, sink, status);
|
||||
} else {
|
||||
ulocimp_getName(localeID, sink, status);
|
||||
}
|
||||
},
|
||||
status);
|
||||
};
|
||||
|
||||
// "canonicalize" the locale ID to ICU/Java format
|
||||
err = U_ZERO_ERROR;
|
||||
length = canonicalize ?
|
||||
uloc_canonicalize(localeID, fullName, sizeof(fullNameBuffer), &err) :
|
||||
uloc_getName(localeID, fullName, sizeof(fullNameBuffer), &err);
|
||||
length = parse(localeID, fullName, sizeof fullNameBuffer, err);
|
||||
|
||||
if (err == U_BUFFER_OVERFLOW_ERROR || length >= static_cast<int32_t>(sizeof(fullNameBuffer))) {
|
||||
U_ASSERT(baseName == nullptr);
|
||||
|
@ -1877,9 +1891,7 @@ Locale& Locale::init(const char* localeID, UBool canonicalize)
|
|||
}
|
||||
fullName = newFullName;
|
||||
err = U_ZERO_ERROR;
|
||||
length = canonicalize ?
|
||||
uloc_canonicalize(localeID, fullName, length+1, &err) :
|
||||
uloc_getName(localeID, fullName, length+1, &err);
|
||||
length = parse(localeID, fullName, length + 1, err);
|
||||
}
|
||||
if(U_FAILURE(err) || err == U_STRING_NOT_TERMINATED_WARNING) {
|
||||
/* should never occur */
|
||||
|
@ -2200,6 +2212,13 @@ Locale::createFromName (const char *name)
|
|||
}
|
||||
}
|
||||
|
||||
Locale U_EXPORT2
|
||||
Locale::createFromName(StringPiece name) {
|
||||
Locale loc("");
|
||||
loc.init(name, false);
|
||||
return loc;
|
||||
}
|
||||
|
||||
Locale U_EXPORT2
|
||||
Locale::createCanonical(const char* name) {
|
||||
Locale loc("");
|
||||
|
|
|
@ -300,6 +300,9 @@ ulocimp_addLikelySubtags(const char* localeID,
|
|||
icu::ByteSink& sink,
|
||||
UErrorCode& status) {
|
||||
if (U_FAILURE(status)) { return; }
|
||||
if (localeID == nullptr) {
|
||||
localeID = uloc_getDefault();
|
||||
}
|
||||
icu::CharString localeBuffer = ulocimp_canonicalize(localeID, status);
|
||||
_uloc_addLikelySubtags(localeBuffer.data(), sink, status);
|
||||
}
|
||||
|
@ -334,6 +337,9 @@ ulocimp_minimizeSubtags(const char* localeID,
|
|||
bool favorScript,
|
||||
UErrorCode& status) {
|
||||
if (U_FAILURE(status)) { return; }
|
||||
if (localeID == nullptr) {
|
||||
localeID = uloc_getDefault();
|
||||
}
|
||||
icu::CharString localeBuffer = ulocimp_canonicalize(localeID, status);
|
||||
_uloc_minimizeSubtags(localeBuffer.data(), sink, favorScript, status);
|
||||
}
|
||||
|
|
|
@ -161,6 +161,9 @@ _uloc_getOrientationHelper(const char* localeId,
|
|||
|
||||
if (U_FAILURE(status)) { return result; }
|
||||
|
||||
if (localeId == nullptr) {
|
||||
localeId = uloc_getDefault();
|
||||
}
|
||||
icu::CharString localeBuffer = ulocimp_canonicalize(localeId, status);
|
||||
|
||||
if (U_FAILURE(status)) { return result; }
|
||||
|
|
|
@ -193,7 +193,7 @@ u_strToPunycode(const char16_t *src, int32_t srcLength,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if(src==nullptr || srcLength<-1 || (dest==nullptr && destCapacity!=0)) {
|
||||
if(src==nullptr || srcLength<-1 || destCapacity<0 || (dest==nullptr && destCapacity!=0)) {
|
||||
*pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -47,7 +47,10 @@ static int gLastSerial = 0;
|
|||
// Constructor. Just set the fields to reasonable default values.
|
||||
//
|
||||
//-------------------------------------------------------------------------
|
||||
RBBINode::RBBINode(NodeType t) : UMemory() {
|
||||
RBBINode::RBBINode(NodeType t, UErrorCode& status) : UMemory() {
|
||||
if (U_FAILURE(status)) {
|
||||
return;
|
||||
}
|
||||
#ifdef RBBI_DEBUG
|
||||
fSerialNum = ++gLastSerial;
|
||||
#endif
|
||||
|
@ -65,10 +68,13 @@ RBBINode::RBBINode(NodeType t) : UMemory() {
|
|||
fVal = 0;
|
||||
fPrecedence = precZero;
|
||||
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
fFirstPosSet = new UVector(status); // TODO - get a real status from somewhere
|
||||
fFirstPosSet = new UVector(status);
|
||||
fLastPosSet = new UVector(status);
|
||||
fFollowPos = new UVector(status);
|
||||
if (U_SUCCESS(status) &&
|
||||
(fFirstPosSet == nullptr || fLastPosSet == nullptr || fFollowPos == nullptr)) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
if (t==opCat) {fPrecedence = precOpCat;}
|
||||
else if (t==opOr) {fPrecedence = precOpOr;}
|
||||
else if (t==opStart) {fPrecedence = precStart;}
|
||||
|
@ -77,7 +83,10 @@ RBBINode::RBBINode(NodeType t) : UMemory() {
|
|||
}
|
||||
|
||||
|
||||
RBBINode::RBBINode(const RBBINode &other) : UMemory(other) {
|
||||
RBBINode::RBBINode(const RBBINode &other, UErrorCode& status) : UMemory(other) {
|
||||
if (U_FAILURE(status)) {
|
||||
return;
|
||||
}
|
||||
#ifdef RBBI_DEBUG
|
||||
fSerialNum = ++gLastSerial;
|
||||
#endif
|
||||
|
@ -94,10 +103,13 @@ RBBINode::RBBINode(const RBBINode &other) : UMemory(other) {
|
|||
fVal = other.fVal;
|
||||
fRuleRoot = false;
|
||||
fChainIn = other.fChainIn;
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
fFirstPosSet = new UVector(status); // TODO - get a real status from somewhere
|
||||
fLastPosSet = new UVector(status);
|
||||
fFollowPos = new UVector(status);
|
||||
if (U_SUCCESS(status) &&
|
||||
(fFirstPosSet == nullptr || fLastPosSet == nullptr || fFollowPos == nullptr)) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -210,24 +222,37 @@ RBBINode *RBBINode::cloneTree(UErrorCode &status, int depth) {
|
|||
// If the current node is a variable reference, skip over it
|
||||
// and clone the definition of the variable instead.
|
||||
n = fLeftChild->cloneTree(status, depth+1);
|
||||
if (U_FAILURE(status)) {
|
||||
return nullptr;
|
||||
}
|
||||
} else if (fType == RBBINode::uset) {
|
||||
n = this;
|
||||
} else {
|
||||
n = new RBBINode(*this);
|
||||
n = new RBBINode(*this, status);
|
||||
if (U_FAILURE(status)) {
|
||||
delete n;
|
||||
return nullptr;
|
||||
}
|
||||
// Check for null pointer.
|
||||
if (n != nullptr) {
|
||||
if (fLeftChild != nullptr) {
|
||||
n->fLeftChild = fLeftChild->cloneTree(status, depth+1);
|
||||
if (U_SUCCESS(status)) {
|
||||
n->fLeftChild->fParent = n;
|
||||
}
|
||||
if (n == nullptr) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
return nullptr;
|
||||
}
|
||||
if (fLeftChild != nullptr) {
|
||||
n->fLeftChild = fLeftChild->cloneTree(status, depth+1);
|
||||
if (U_FAILURE(status)) {
|
||||
delete n;
|
||||
return nullptr;
|
||||
}
|
||||
if (fRightChild != nullptr) {
|
||||
n->fRightChild = fRightChild->cloneTree(status, depth+1);
|
||||
if (U_SUCCESS(status)) {
|
||||
n->fRightChild->fParent = n;
|
||||
}
|
||||
n->fLeftChild->fParent = n;
|
||||
}
|
||||
if (fRightChild != nullptr) {
|
||||
n->fRightChild = fRightChild->cloneTree(status, depth+1);
|
||||
if (U_FAILURE(status)) {
|
||||
delete n;
|
||||
return nullptr;
|
||||
}
|
||||
n->fRightChild->fParent = n;
|
||||
}
|
||||
}
|
||||
return n;
|
||||
|
@ -265,20 +290,33 @@ RBBINode *RBBINode::flattenVariables(UErrorCode& status, int depth) {
|
|||
}
|
||||
if (fType == varRef) {
|
||||
RBBINode *retNode = fLeftChild->cloneTree(status, depth+1);
|
||||
if (retNode != nullptr) {
|
||||
retNode->fRuleRoot = this->fRuleRoot;
|
||||
retNode->fChainIn = this->fChainIn;
|
||||
if (U_FAILURE(status)) {
|
||||
return this;
|
||||
}
|
||||
retNode->fRuleRoot = this->fRuleRoot;
|
||||
retNode->fChainIn = this->fChainIn;
|
||||
delete this; // TODO: undefined behavior. Fix.
|
||||
return retNode;
|
||||
}
|
||||
|
||||
if (fLeftChild != nullptr) {
|
||||
fLeftChild = fLeftChild->flattenVariables(status, depth+1);
|
||||
if (fLeftChild == nullptr) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
if (U_FAILURE(status)) {
|
||||
return this;
|
||||
}
|
||||
fLeftChild->fParent = this;
|
||||
}
|
||||
if (fRightChild != nullptr) {
|
||||
fRightChild = fRightChild->flattenVariables(status, depth+1);
|
||||
if (fRightChild == nullptr) {
|
||||
status = U_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
if (U_FAILURE(status)) {
|
||||
return this;
|
||||
}
|
||||
fRightChild->fParent = this;
|
||||
}
|
||||
return this;
|
||||
|
@ -312,8 +350,10 @@ void RBBINode::flattenSets(UErrorCode &status, int depth) {
|
|||
RBBINode *replTree = usetNode->fLeftChild;
|
||||
fLeftChild = replTree->cloneTree(status, depth+1);
|
||||
if (U_FAILURE(status)) {
|
||||
fLeftChild->fParent = this;
|
||||
delete setRefNode;
|
||||
return;
|
||||
}
|
||||
fLeftChild->fParent = this;
|
||||
delete setRefNode;
|
||||
} else {
|
||||
fLeftChild->flattenSets(status, depth+1);
|
||||
|
@ -327,8 +367,10 @@ void RBBINode::flattenSets(UErrorCode &status, int depth) {
|
|||
RBBINode *replTree = usetNode->fLeftChild;
|
||||
fRightChild = replTree->cloneTree(status, depth+1);
|
||||
if (U_FAILURE(status)) {
|
||||
fRightChild->fParent = this;
|
||||
delete setRefNode;
|
||||
return;
|
||||
}
|
||||
fRightChild->fParent = this;
|
||||
delete setRefNode;
|
||||
} else {
|
||||
fRightChild->flattenSets(status, depth+1);
|
||||
|
|
|
@ -91,8 +91,8 @@ class RBBINode : public UMemory {
|
|||
UVector *fFollowPos;
|
||||
|
||||
|
||||
RBBINode(NodeType t);
|
||||
RBBINode(const RBBINode &other);
|
||||
RBBINode(NodeType t, UErrorCode& status);
|
||||
RBBINode(const RBBINode &other, UErrorCode& status);
|
||||
~RBBINode();
|
||||
static void NRDeleteNode(RBBINode *node);
|
||||
|
||||
|
|
|
@ -767,15 +767,24 @@ void RBBIRuleScanner::findSetFor(const UnicodeString &s, RBBINode *node, Unicode
|
|||
c = s.char32At(0);
|
||||
setToAdopt = new UnicodeSet(c, c);
|
||||
}
|
||||
if (setToAdopt == nullptr) {
|
||||
error(U_MEMORY_ALLOCATION_ERROR);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Make a new uset node to refer to this UnicodeSet
|
||||
// This new uset node becomes the child of the caller's setReference node.
|
||||
//
|
||||
RBBINode *usetNode = new RBBINode(RBBINode::uset);
|
||||
UErrorCode localStatus = U_ZERO_ERROR;
|
||||
RBBINode *usetNode = new RBBINode(RBBINode::uset, localStatus);
|
||||
if (usetNode == nullptr) {
|
||||
error(U_MEMORY_ALLOCATION_ERROR);
|
||||
localStatus = U_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
if (U_FAILURE(localStatus)) {
|
||||
delete usetNode;
|
||||
error(localStatus);
|
||||
delete setToAdopt;
|
||||
return;
|
||||
}
|
||||
|
@ -1191,7 +1200,7 @@ RBBINode *RBBIRuleScanner::pushNewNode(RBBINode::NodeType t) {
|
|||
return nullptr;
|
||||
}
|
||||
fNodeStackPtr++;
|
||||
fNodeStack[fNodeStackPtr] = new RBBINode(t);
|
||||
fNodeStack[fNodeStackPtr] = new RBBINode(t, *fRB->fStatus);
|
||||
if (fNodeStack[fNodeStackPtr] == nullptr) {
|
||||
*fRB->fStatus = U_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
|
|
|
@ -375,7 +375,11 @@ void RBBISetBuilder::addValToSets(UVector *sets, uint32_t val) {
|
|||
}
|
||||
|
||||
void RBBISetBuilder::addValToSet(RBBINode *usetNode, uint32_t val) {
|
||||
RBBINode *leafNode = new RBBINode(RBBINode::leafChar);
|
||||
RBBINode *leafNode = new RBBINode(RBBINode::leafChar, *fStatus);
|
||||
if (U_FAILURE(*fStatus)) {
|
||||
delete leafNode;
|
||||
return;
|
||||
}
|
||||
if (leafNode == nullptr) {
|
||||
*fStatus = U_MEMORY_ALLOCATION_ERROR;
|
||||
return;
|
||||
|
@ -388,9 +392,13 @@ void RBBISetBuilder::addValToSet(RBBINode *usetNode, uint32_t val) {
|
|||
// There are already input symbols present for this set.
|
||||
// Set up an OR node, with the previous stuff as the left child
|
||||
// and the new value as the right child.
|
||||
RBBINode *orNode = new RBBINode(RBBINode::opOr);
|
||||
RBBINode *orNode = new RBBINode(RBBINode::opOr, *fStatus);
|
||||
if (orNode == nullptr) {
|
||||
*fStatus = U_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
if (U_FAILURE(*fStatus)) {
|
||||
delete orNode;
|
||||
delete leafNode;
|
||||
return;
|
||||
}
|
||||
orNode->fLeftChild = usetNode->fLeftChild;
|
||||
|
|
|
@ -99,13 +99,22 @@ void RBBITableBuilder::buildForwardTable() {
|
|||
// {bof} fake character.
|
||||
//
|
||||
if (fRB->fSetBuilder->sawBOF()) {
|
||||
RBBINode *bofTop = new RBBINode(RBBINode::opCat);
|
||||
RBBINode *bofLeaf = new RBBINode(RBBINode::leafChar);
|
||||
// Delete and exit if memory allocation failed.
|
||||
if (bofTop == nullptr || bofLeaf == nullptr) {
|
||||
RBBINode *bofTop = new RBBINode(RBBINode::opCat, *fStatus);
|
||||
if (bofTop == nullptr) {
|
||||
*fStatus = U_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
if (U_FAILURE(*fStatus)) {
|
||||
delete bofTop;
|
||||
return;
|
||||
}
|
||||
RBBINode *bofLeaf = new RBBINode(RBBINode::leafChar, *fStatus);
|
||||
// Delete and exit if memory allocation failed.
|
||||
if (bofLeaf == nullptr) {
|
||||
*fStatus = U_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
if (U_FAILURE(*fStatus)) {
|
||||
delete bofLeaf;
|
||||
delete bofTop;
|
||||
return;
|
||||
}
|
||||
bofTop->fLeftChild = bofLeaf;
|
||||
|
@ -120,18 +129,23 @@ void RBBITableBuilder::buildForwardTable() {
|
|||
// Appears as a cat-node, left child being the original tree,
|
||||
// right child being the end marker.
|
||||
//
|
||||
RBBINode *cn = new RBBINode(RBBINode::opCat);
|
||||
RBBINode *cn = new RBBINode(RBBINode::opCat, *fStatus);
|
||||
// Exit if memory allocation failed.
|
||||
if (cn == nullptr) {
|
||||
*fStatus = U_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
if (U_FAILURE(*fStatus)) {
|
||||
delete cn;
|
||||
return;
|
||||
}
|
||||
cn->fLeftChild = fTree;
|
||||
fTree->fParent = cn;
|
||||
RBBINode *endMarkerNode = cn->fRightChild = new RBBINode(RBBINode::endMark);
|
||||
RBBINode *endMarkerNode = cn->fRightChild = new RBBINode(RBBINode::endMark, *fStatus);
|
||||
// Delete and exit if memory allocation failed.
|
||||
if (cn->fRightChild == nullptr) {
|
||||
*fStatus = U_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
if (U_FAILURE(*fStatus)) {
|
||||
delete cn;
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -388,7 +388,7 @@ const Locale &ResourceBundle::getLocale() const {
|
|||
return ncThis->fLocale != nullptr ? *ncThis->fLocale : Locale::getDefault();
|
||||
}
|
||||
|
||||
const Locale ResourceBundle::getLocale(ULocDataLocaleType type, UErrorCode &status) const
|
||||
Locale ResourceBundle::getLocale(ULocDataLocaleType type, UErrorCode &status) const
|
||||
{
|
||||
return ures_getLocaleByType(fResource, type, &status);
|
||||
}
|
||||
|
|
|
@ -678,6 +678,9 @@ ucurr_getName(const char16_t* currency,
|
|||
// this function.
|
||||
UErrorCode ec2 = U_ZERO_ERROR;
|
||||
|
||||
if (locale == nullptr) {
|
||||
locale = uloc_getDefault();
|
||||
}
|
||||
CharString loc = ulocimp_getName(locale, ec2);
|
||||
if (U_FAILURE(ec2)) {
|
||||
*ec = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
|
@ -776,6 +779,9 @@ ucurr_getPluralName(const char16_t* currency,
|
|||
// this function.
|
||||
UErrorCode ec2 = U_ZERO_ERROR;
|
||||
|
||||
if (locale == nullptr) {
|
||||
locale = uloc_getDefault();
|
||||
}
|
||||
CharString loc = ulocimp_getName(locale, ec2);
|
||||
if (U_FAILURE(ec2)) {
|
||||
*ec = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
|
@ -969,6 +975,9 @@ collectCurrencyNames(const char* locale,
|
|||
// Look up the Currencies resource for the given locale.
|
||||
UErrorCode ec2 = U_ZERO_ERROR;
|
||||
|
||||
if (locale == nullptr) {
|
||||
locale = uloc_getDefault();
|
||||
}
|
||||
CharString loc = ulocimp_getName(locale, ec2);
|
||||
if (U_FAILURE(ec2)) {
|
||||
ec = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
|
|
|
@ -589,7 +589,7 @@ compareKeywordStructs(const void * /*context*/, const void *left, const void *ri
|
|||
} // namespace
|
||||
|
||||
U_EXPORT CharString
|
||||
ulocimp_getKeywords(const char* localeID,
|
||||
ulocimp_getKeywords(std::string_view localeID,
|
||||
char prev,
|
||||
bool valuesToo,
|
||||
UErrorCode& status)
|
||||
|
@ -606,7 +606,7 @@ ulocimp_getKeywords(const char* localeID,
|
|||
}
|
||||
|
||||
U_EXPORT void
|
||||
ulocimp_getKeywords(const char* localeID,
|
||||
ulocimp_getKeywords(std::string_view localeID,
|
||||
char prev,
|
||||
ByteSink& sink,
|
||||
bool valuesToo,
|
||||
|
@ -618,9 +618,8 @@ ulocimp_getKeywords(const char* localeID,
|
|||
|
||||
int32_t maxKeywords = ULOC_MAX_NO_KEYWORDS;
|
||||
int32_t numKeywords = 0;
|
||||
const char* pos = localeID;
|
||||
const char* equalSign = nullptr;
|
||||
const char* semicolon = nullptr;
|
||||
size_t equalSign = std::string_view::npos;
|
||||
size_t semicolon = std::string_view::npos;
|
||||
int32_t i = 0, j, n;
|
||||
|
||||
if(prev == '@') { /* start of keyword definition */
|
||||
|
@ -628,74 +627,72 @@ ulocimp_getKeywords(const char* localeID,
|
|||
do {
|
||||
bool duplicate = false;
|
||||
/* skip leading spaces */
|
||||
while(*pos == ' ') {
|
||||
pos++;
|
||||
while (localeID.front() == ' ') {
|
||||
localeID.remove_prefix(1);
|
||||
}
|
||||
if (!*pos) { /* handle trailing "; " */
|
||||
if (localeID.empty()) { /* handle trailing "; " */
|
||||
break;
|
||||
}
|
||||
if(numKeywords == maxKeywords) {
|
||||
status = U_INTERNAL_PROGRAM_ERROR;
|
||||
return;
|
||||
}
|
||||
equalSign = uprv_strchr(pos, '=');
|
||||
semicolon = uprv_strchr(pos, ';');
|
||||
equalSign = localeID.find('=');
|
||||
semicolon = localeID.find(';');
|
||||
/* lack of '=' [foo@currency] is illegal */
|
||||
/* ';' before '=' [foo@currency;collation=pinyin] is illegal */
|
||||
if(!equalSign || (semicolon && semicolon<equalSign)) {
|
||||
if (equalSign == std::string_view::npos ||
|
||||
(semicolon != std::string_view::npos && semicolon < equalSign)) {
|
||||
status = U_INVALID_FORMAT_ERROR;
|
||||
return;
|
||||
}
|
||||
/* zero-length keyword is an error. */
|
||||
if (equalSign == 0) {
|
||||
status = U_INVALID_FORMAT_ERROR;
|
||||
return;
|
||||
}
|
||||
/* need to normalize both keyword and keyword name */
|
||||
if(equalSign - pos >= ULOC_KEYWORD_BUFFER_LEN) {
|
||||
if (equalSign >= ULOC_KEYWORD_BUFFER_LEN) {
|
||||
/* keyword name too long for internal buffer */
|
||||
status = U_INTERNAL_PROGRAM_ERROR;
|
||||
return;
|
||||
}
|
||||
for(i = 0, n = 0; i < equalSign - pos; ++i) {
|
||||
if (pos[i] != ' ') {
|
||||
keywordList[numKeywords].keyword[n++] = uprv_tolower(pos[i]);
|
||||
for (i = 0, n = 0; static_cast<size_t>(i) < equalSign; ++i) {
|
||||
if (localeID[i] != ' ') {
|
||||
keywordList[numKeywords].keyword[n++] = uprv_tolower(localeID[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/* zero-length keyword is an error. */
|
||||
if (n == 0) {
|
||||
status = U_INVALID_FORMAT_ERROR;
|
||||
return;
|
||||
}
|
||||
|
||||
keywordList[numKeywords].keyword[n] = 0;
|
||||
keywordList[numKeywords].keywordLen = n;
|
||||
/* now grab the value part. First we skip the '=' */
|
||||
equalSign++;
|
||||
/* then we leading spaces */
|
||||
while(*equalSign == ' ') {
|
||||
while (equalSign < localeID.length() && localeID[equalSign] == ' ') {
|
||||
equalSign++;
|
||||
}
|
||||
|
||||
/* Premature end or zero-length value */
|
||||
if (!*equalSign || equalSign == semicolon) {
|
||||
if (equalSign == localeID.length() || equalSign == semicolon) {
|
||||
status = U_INVALID_FORMAT_ERROR;
|
||||
return;
|
||||
}
|
||||
|
||||
keywordList[numKeywords].valueStart = equalSign;
|
||||
keywordList[numKeywords].valueStart = localeID.data() + equalSign;
|
||||
|
||||
pos = semicolon;
|
||||
i = 0;
|
||||
if(pos) {
|
||||
while(*(pos - i - 1) == ' ') {
|
||||
i++;
|
||||
}
|
||||
keywordList[numKeywords].valueLen = static_cast<int32_t>(pos - equalSign - i);
|
||||
pos++;
|
||||
std::string_view value = localeID;
|
||||
if (semicolon != std::string_view::npos) {
|
||||
value.remove_suffix(value.length() - semicolon);
|
||||
localeID.remove_prefix(semicolon + 1);
|
||||
} else {
|
||||
i = static_cast<int32_t>(uprv_strlen(equalSign));
|
||||
while(i && equalSign[i-1] == ' ') {
|
||||
i--;
|
||||
}
|
||||
keywordList[numKeywords].valueLen = i;
|
||||
localeID = {};
|
||||
}
|
||||
value.remove_prefix(equalSign);
|
||||
if (size_t last = value.find_last_not_of(' '); last != std::string_view::npos) {
|
||||
value.remove_suffix(value.length() - last - 1);
|
||||
}
|
||||
keywordList[numKeywords].valueLen = static_cast<int32_t>(value.length());
|
||||
|
||||
/* If this is a duplicate keyword, then ignore it */
|
||||
for (j=0; j<numKeywords; ++j) {
|
||||
if (uprv_strcmp(keywordList[j].keyword, keywordList[numKeywords].keyword) == 0) {
|
||||
|
@ -706,7 +703,7 @@ ulocimp_getKeywords(const char* localeID,
|
|||
if (!duplicate) {
|
||||
++numKeywords;
|
||||
}
|
||||
} while(pos);
|
||||
} while (!localeID.empty());
|
||||
|
||||
/* now we have a list of keywords */
|
||||
/* we need to sort it */
|
||||
|
@ -1341,7 +1338,7 @@ _getVariant(std::string_view localeID,
|
|||
ByteSink* sink,
|
||||
bool needSeparator,
|
||||
UErrorCode& status) {
|
||||
if (U_FAILURE(status)) return 0;
|
||||
if (U_FAILURE(status) || localeID.empty()) return 0;
|
||||
|
||||
// Reasonable upper limit for variants
|
||||
// There are no strict limitation of the syntax of variant in the legacy
|
||||
|
@ -1357,27 +1354,43 @@ _getVariant(std::string_view localeID,
|
|||
size_t index = 0;
|
||||
if (_isIDSeparator(prev)) {
|
||||
/* get a variant string after a '-' or '_' */
|
||||
for (; index < localeID.size() && !_isTerminator(localeID[index]); index++) {
|
||||
if (index >= MAX_VARIANTS_LENGTH) { // same as length > MAX_VARIANTS_LENGTH
|
||||
for (std::string_view sub = localeID;;) {
|
||||
size_t next = sub.find_first_of(".@_-");
|
||||
// For historical reasons, a trailing separator is included in the variant.
|
||||
bool finished = next == std::string_view::npos || next + 1 == sub.length();
|
||||
size_t limit = finished ? sub.length() : next;
|
||||
index += limit;
|
||||
if (index > MAX_VARIANTS_LENGTH) {
|
||||
status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return 0;
|
||||
}
|
||||
if (needSeparator) {
|
||||
if (sink != nullptr) {
|
||||
sink->Append("_", 1);
|
||||
}
|
||||
needSeparator = false;
|
||||
}
|
||||
if (sink != nullptr) {
|
||||
char c = uprv_toupper(localeID[index]);
|
||||
if (c == '-') c = '_';
|
||||
sink->Append(&c, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (index > 0) {
|
||||
return index;
|
||||
if (sink != nullptr) {
|
||||
if (needSeparator) {
|
||||
sink->Append("_", 1);
|
||||
} else {
|
||||
needSeparator = true;
|
||||
}
|
||||
|
||||
int32_t length = static_cast<int32_t>(limit);
|
||||
int32_t minCapacity = uprv_min(length, MAX_VARIANTS_LENGTH);
|
||||
char scratch[MAX_VARIANTS_LENGTH];
|
||||
int32_t capacity = 0;
|
||||
char* buffer = sink->GetAppendBuffer(
|
||||
minCapacity, minCapacity, scratch, UPRV_LENGTHOF(scratch), &capacity);
|
||||
|
||||
for (size_t i = 0; i < limit; ++i) {
|
||||
buffer[i] = uprv_toupper(sub[i]);
|
||||
}
|
||||
sink->Append(buffer, length);
|
||||
}
|
||||
|
||||
if (finished) { return index; }
|
||||
sub.remove_prefix(next);
|
||||
if (_isTerminator(sub.front()) || _isBCP47Extension(sub)) { return index; }
|
||||
sub.remove_prefix(1);
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
size_t skip = 0;
|
||||
|
@ -1574,6 +1587,8 @@ ulocimp_getSubtags(
|
|||
|
||||
if ((variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
|
||||
|
||||
bool hasVariant = false;
|
||||
|
||||
if (_isIDSeparator(localeID.front()) && !_isBCP47Extension(localeID)) {
|
||||
std::string_view sub = localeID;
|
||||
/* If there was no country ID, skip a possible extra IDSeparator */
|
||||
|
@ -1581,7 +1596,38 @@ ulocimp_getSubtags(
|
|||
sub.remove_prefix(skip);
|
||||
size_t len = _getVariant(sub, localeID[0], variant, false, status);
|
||||
if (U_FAILURE(status)) { return; }
|
||||
if (len > 0 && pEnd != nullptr) { *pEnd = localeID.data() + skip + len; }
|
||||
if (len > 0) {
|
||||
hasVariant = true;
|
||||
localeID.remove_prefix(skip + len);
|
||||
if (pEnd != nullptr) { *pEnd = localeID.data(); }
|
||||
}
|
||||
}
|
||||
|
||||
if ((variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; }
|
||||
|
||||
if (_isBCP47Extension(localeID)) {
|
||||
localeID.remove_prefix(2);
|
||||
constexpr char vaposix[] = "-va-posix";
|
||||
constexpr size_t length = sizeof vaposix - 1;
|
||||
for (size_t next;; localeID.remove_prefix(next)) {
|
||||
next = localeID.find('-', 1);
|
||||
if (next == std::string_view::npos) { break; }
|
||||
next = localeID.find('-', next + 1);
|
||||
bool finished = next == std::string_view::npos;
|
||||
std::string_view sub = localeID;
|
||||
if (!finished) { sub.remove_suffix(sub.length() - next); }
|
||||
|
||||
if (sub.length() == length && uprv_strnicmp(sub.data(), vaposix, length) == 0) {
|
||||
if (variant != nullptr) {
|
||||
if (hasVariant) { variant->Append("_", 1); }
|
||||
constexpr char posix[] = "POSIX";
|
||||
variant->Append(posix, sizeof posix - 1);
|
||||
}
|
||||
if (pEnd != nullptr) { *pEnd = localeID.data() + length; }
|
||||
}
|
||||
|
||||
if (finished) { break; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1740,7 +1786,7 @@ constexpr int32_t I_DEFAULT_LENGTH = UPRV_LENGTHOF(i_default);
|
|||
* This is the code underlying uloc_getName and uloc_canonicalize.
|
||||
*/
|
||||
void
|
||||
_canonicalize(const char* localeID,
|
||||
_canonicalize(std::string_view localeID,
|
||||
ByteSink& sink,
|
||||
uint32_t options,
|
||||
UErrorCode& err) {
|
||||
|
@ -1751,33 +1797,30 @@ _canonicalize(const char* localeID,
|
|||
int32_t j, fieldCount=0;
|
||||
CharString tempBuffer; // if localeID has a BCP47 extension, tmpLocaleID points to this
|
||||
CharString localeIDWithHyphens; // if localeID has a BPC47 extension and have _, tmpLocaleID points to this
|
||||
const char* origLocaleID;
|
||||
const char* tmpLocaleID;
|
||||
const char* keywordAssign = nullptr;
|
||||
const char* separatorIndicator = nullptr;
|
||||
std::string_view origLocaleID;
|
||||
std::string_view tmpLocaleID;
|
||||
size_t keywordAssign = std::string_view::npos;
|
||||
size_t separatorIndicator = std::string_view::npos;
|
||||
|
||||
if (localeID != nullptr && _hasBCP47Extension(localeID)) {
|
||||
const char* localeIDPtr = localeID;
|
||||
if (_hasBCP47Extension(localeID)) {
|
||||
std::string_view localeIDPtr = localeID;
|
||||
|
||||
// convert all underbars to hyphens, unless the "BCP47 extension" comes at the beginning of the string
|
||||
if (uprv_strchr(localeID, '_') != nullptr && localeID[1] != '-' && localeID[1] != '_') {
|
||||
localeIDWithHyphens.append(localeID, -1, err);
|
||||
if (localeID.size() >= 2 && localeID.find('_') != std::string_view::npos && localeID[1] != '-' && localeID[1] != '_') {
|
||||
localeIDWithHyphens.append(localeID, err);
|
||||
if (U_SUCCESS(err)) {
|
||||
for (char* p = localeIDWithHyphens.data(); *p != '\0'; ++p) {
|
||||
if (*p == '_') {
|
||||
*p = '-';
|
||||
}
|
||||
}
|
||||
localeIDPtr = localeIDWithHyphens.data();
|
||||
localeIDPtr = localeIDWithHyphens.toStringPiece();
|
||||
}
|
||||
}
|
||||
|
||||
tempBuffer = ulocimp_forLanguageTag(localeIDPtr, -1, nullptr, err);
|
||||
tmpLocaleID = U_SUCCESS(err) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeIDPtr;
|
||||
tempBuffer = ulocimp_forLanguageTag(localeIDPtr.data(), static_cast<int32_t>(localeIDPtr.size()), nullptr, err);
|
||||
tmpLocaleID = U_SUCCESS(err) && !tempBuffer.isEmpty() ? static_cast<std::string_view>(tempBuffer.toStringPiece()) : localeIDPtr;
|
||||
} else {
|
||||
if (localeID==nullptr) {
|
||||
localeID=uloc_getDefault();
|
||||
}
|
||||
tmpLocaleID=localeID;
|
||||
}
|
||||
|
||||
|
@ -1788,20 +1831,25 @@ _canonicalize(const char* localeID,
|
|||
CharString script;
|
||||
CharString country;
|
||||
CharString variant;
|
||||
const char* end = nullptr;
|
||||
ulocimp_getSubtags(
|
||||
tmpLocaleID,
|
||||
&tag,
|
||||
&script,
|
||||
&country,
|
||||
&variant,
|
||||
&tmpLocaleID,
|
||||
&end,
|
||||
err);
|
||||
if (U_FAILURE(err)) {
|
||||
return;
|
||||
}
|
||||
U_ASSERT(end != nullptr);
|
||||
if (end > tmpLocaleID.data()) {
|
||||
tmpLocaleID.remove_prefix(end - tmpLocaleID.data());
|
||||
}
|
||||
|
||||
if (tag.length() == I_DEFAULT_LENGTH &&
|
||||
uprv_strncmp(origLocaleID, i_default, I_DEFAULT_LENGTH) == 0) {
|
||||
if (tag.length() == I_DEFAULT_LENGTH && origLocaleID.length() >= I_DEFAULT_LENGTH &&
|
||||
uprv_strncmp(origLocaleID.data(), i_default, I_DEFAULT_LENGTH) == 0) {
|
||||
tag.clear();
|
||||
tag.append(uloc_getDefault(), err);
|
||||
} else {
|
||||
|
@ -1826,15 +1874,14 @@ _canonicalize(const char* localeID,
|
|||
}
|
||||
|
||||
/* Copy POSIX-style charset specifier, if any [mr.utf8] */
|
||||
if (!OPTION_SET(options, _ULOC_CANONICALIZE) && *tmpLocaleID == '.') {
|
||||
if (!OPTION_SET(options, _ULOC_CANONICALIZE) && !tmpLocaleID.empty() && tmpLocaleID.front() == '.') {
|
||||
tag.append('.', err);
|
||||
++tmpLocaleID;
|
||||
const char *atPos = nullptr;
|
||||
tmpLocaleID.remove_prefix(1);
|
||||
size_t length;
|
||||
if((atPos = uprv_strchr(tmpLocaleID, '@')) != nullptr) {
|
||||
length = atPos - tmpLocaleID;
|
||||
if (size_t atPos = tmpLocaleID.find('@'); atPos != std::string_view::npos) {
|
||||
length = atPos;
|
||||
} else {
|
||||
length = uprv_strlen(tmpLocaleID);
|
||||
length = tmpLocaleID.length();
|
||||
}
|
||||
// The longest charset name we found in IANA charset registry
|
||||
// https://www.iana.org/assignments/character-sets/ is
|
||||
|
@ -1846,33 +1893,34 @@ _canonicalize(const char* localeID,
|
|||
err = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */
|
||||
return;
|
||||
}
|
||||
tag.append(tmpLocaleID, static_cast<int32_t>(length), err);
|
||||
tmpLocaleID += length;
|
||||
if (length > 0) {
|
||||
tag.append(tmpLocaleID.data(), static_cast<int32_t>(length), err);
|
||||
tmpLocaleID.remove_prefix(length);
|
||||
}
|
||||
}
|
||||
|
||||
/* Scan ahead to next '@' and determine if it is followed by '=' and/or ';'
|
||||
After this, tmpLocaleID either points to '@' or is nullptr */
|
||||
if ((tmpLocaleID=locale_getKeywordsStart(tmpLocaleID))!=nullptr) {
|
||||
keywordAssign = uprv_strchr(tmpLocaleID, '=');
|
||||
separatorIndicator = uprv_strchr(tmpLocaleID, ';');
|
||||
After this, tmpLocaleID either starts at '@' or is empty. */
|
||||
if (const char* start = locale_getKeywordsStart(tmpLocaleID); start != nullptr) {
|
||||
if (start > tmpLocaleID.data()) {
|
||||
tmpLocaleID.remove_prefix(start - tmpLocaleID.data());
|
||||
}
|
||||
keywordAssign = tmpLocaleID.find('=');
|
||||
separatorIndicator = tmpLocaleID.find(';');
|
||||
} else {
|
||||
tmpLocaleID = {};
|
||||
}
|
||||
|
||||
/* Copy POSIX-style variant, if any [mr@FOO] */
|
||||
if (!OPTION_SET(options, _ULOC_CANONICALIZE) &&
|
||||
tmpLocaleID != nullptr && keywordAssign == nullptr) {
|
||||
for (;;) {
|
||||
char c = *tmpLocaleID;
|
||||
if (c == 0) {
|
||||
break;
|
||||
}
|
||||
tag.append(c, err);
|
||||
++tmpLocaleID;
|
||||
}
|
||||
!tmpLocaleID.empty() && keywordAssign == std::string_view::npos) {
|
||||
tag.append(tmpLocaleID, err);
|
||||
tmpLocaleID = {};
|
||||
}
|
||||
|
||||
if (OPTION_SET(options, _ULOC_CANONICALIZE)) {
|
||||
/* Handle @FOO variant if @ is present and not followed by = */
|
||||
if (tmpLocaleID!=nullptr && keywordAssign==nullptr) {
|
||||
if (!tmpLocaleID.empty() && keywordAssign == std::string_view::npos) {
|
||||
/* Add missing '_' if needed */
|
||||
if (fieldCount < 2 || (fieldCount < 3 && !script.isEmpty())) {
|
||||
do {
|
||||
|
@ -1882,7 +1930,9 @@ _canonicalize(const char* localeID,
|
|||
}
|
||||
|
||||
CharStringByteSink s(&tag);
|
||||
_getVariant(tmpLocaleID+1, '@', &s, !variant.isEmpty(), err);
|
||||
std::string_view sub = tmpLocaleID;
|
||||
sub.remove_prefix(1);
|
||||
_getVariant(sub, '@', &s, !variant.isEmpty(), err);
|
||||
if (U_FAILURE(err)) { return; }
|
||||
}
|
||||
|
||||
|
@ -1890,7 +1940,7 @@ _canonicalize(const char* localeID,
|
|||
for (j=0; j<UPRV_LENGTHOF(CANONICALIZE_MAP); j++) {
|
||||
StringPiece id(CANONICALIZE_MAP[j].id);
|
||||
if (tag == id) {
|
||||
if (id.empty() && tmpLocaleID != nullptr) {
|
||||
if (id.empty() && !tmpLocaleID.empty()) {
|
||||
break; /* Don't remap "" if keywords present */
|
||||
}
|
||||
tag.clear();
|
||||
|
@ -1903,11 +1953,12 @@ _canonicalize(const char* localeID,
|
|||
sink.Append(tag.data(), tag.length());
|
||||
|
||||
if (!OPTION_SET(options, _ULOC_STRIP_KEYWORDS)) {
|
||||
if (tmpLocaleID!=nullptr && keywordAssign!=nullptr &&
|
||||
(!separatorIndicator || separatorIndicator > keywordAssign)) {
|
||||
if (!tmpLocaleID.empty() && keywordAssign != std::string_view::npos &&
|
||||
(separatorIndicator == std::string_view::npos || separatorIndicator > keywordAssign)) {
|
||||
sink.Append("@", 1);
|
||||
++fieldCount;
|
||||
ulocimp_getKeywords(tmpLocaleID+1, '@', sink, true, err);
|
||||
tmpLocaleID.remove_prefix(1);
|
||||
ulocimp_getKeywords(tmpLocaleID, '@', sink, true, err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2077,6 +2128,9 @@ uloc_getName(const char* localeID,
|
|||
int32_t nameCapacity,
|
||||
UErrorCode* err)
|
||||
{
|
||||
if (localeID == nullptr) {
|
||||
localeID = uloc_getDefault();
|
||||
}
|
||||
return ByteSinkUtil::viaByteSinkToTerminatedChars(
|
||||
name, nameCapacity,
|
||||
[&](ByteSink& sink, UErrorCode& status) {
|
||||
|
@ -2086,7 +2140,7 @@ uloc_getName(const char* localeID,
|
|||
}
|
||||
|
||||
U_EXPORT CharString
|
||||
ulocimp_getName(const char* localeID,
|
||||
ulocimp_getName(std::string_view localeID,
|
||||
UErrorCode& err)
|
||||
{
|
||||
return ByteSinkUtil::viaByteSinkToCharString(
|
||||
|
@ -2097,7 +2151,7 @@ ulocimp_getName(const char* localeID,
|
|||
}
|
||||
|
||||
U_EXPORT void
|
||||
ulocimp_getName(const char* localeID,
|
||||
ulocimp_getName(std::string_view localeID,
|
||||
ByteSink& sink,
|
||||
UErrorCode& err)
|
||||
{
|
||||
|
@ -2110,6 +2164,9 @@ uloc_getBaseName(const char* localeID,
|
|||
int32_t nameCapacity,
|
||||
UErrorCode* err)
|
||||
{
|
||||
if (localeID == nullptr) {
|
||||
localeID = uloc_getDefault();
|
||||
}
|
||||
return ByteSinkUtil::viaByteSinkToTerminatedChars(
|
||||
name, nameCapacity,
|
||||
[&](ByteSink& sink, UErrorCode& status) {
|
||||
|
@ -2119,7 +2176,7 @@ uloc_getBaseName(const char* localeID,
|
|||
}
|
||||
|
||||
U_EXPORT CharString
|
||||
ulocimp_getBaseName(const char* localeID,
|
||||
ulocimp_getBaseName(std::string_view localeID,
|
||||
UErrorCode& err)
|
||||
{
|
||||
return ByteSinkUtil::viaByteSinkToCharString(
|
||||
|
@ -2130,7 +2187,7 @@ ulocimp_getBaseName(const char* localeID,
|
|||
}
|
||||
|
||||
U_EXPORT void
|
||||
ulocimp_getBaseName(const char* localeID,
|
||||
ulocimp_getBaseName(std::string_view localeID,
|
||||
ByteSink& sink,
|
||||
UErrorCode& err)
|
||||
{
|
||||
|
@ -2143,6 +2200,9 @@ uloc_canonicalize(const char* localeID,
|
|||
int32_t nameCapacity,
|
||||
UErrorCode* err)
|
||||
{
|
||||
if (localeID == nullptr) {
|
||||
localeID = uloc_getDefault();
|
||||
}
|
||||
return ByteSinkUtil::viaByteSinkToTerminatedChars(
|
||||
name, nameCapacity,
|
||||
[&](ByteSink& sink, UErrorCode& status) {
|
||||
|
@ -2152,7 +2212,7 @@ uloc_canonicalize(const char* localeID,
|
|||
}
|
||||
|
||||
U_EXPORT CharString
|
||||
ulocimp_canonicalize(const char* localeID,
|
||||
ulocimp_canonicalize(std::string_view localeID,
|
||||
UErrorCode& err)
|
||||
{
|
||||
return ByteSinkUtil::viaByteSinkToCharString(
|
||||
|
@ -2163,7 +2223,7 @@ ulocimp_canonicalize(const char* localeID,
|
|||
}
|
||||
|
||||
U_EXPORT void
|
||||
ulocimp_canonicalize(const char* localeID,
|
||||
ulocimp_canonicalize(std::string_view localeID,
|
||||
ByteSink& sink,
|
||||
UErrorCode& err)
|
||||
{
|
||||
|
|
|
@ -2596,6 +2596,9 @@ ulocimp_toLanguageTag(const char* localeID,
|
|||
bool hadPosix = false;
|
||||
const char* pKeywordStart;
|
||||
|
||||
if (localeID == nullptr) {
|
||||
localeID = uloc_getDefault();
|
||||
}
|
||||
/* Note: uloc_canonicalize returns "en_US_POSIX" for input locale ID "". See #6835 */
|
||||
icu::CharString canonical = ulocimp_canonicalize(localeID, tmpStatus);
|
||||
if (U_FAILURE(tmpStatus)) {
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
#include "unicode/locid.h"
|
||||
|
||||
#include "bytesinkutil.h"
|
||||
#include "charstr.h"
|
||||
#include "cmemory.h"
|
||||
|
||||
U_NAMESPACE_USE
|
||||
|
@ -24,9 +23,7 @@ ulocale_openForLocaleID(const char* localeID, int32_t length, UErrorCode* err) {
|
|||
if (length < 0) {
|
||||
return EXTERNAL(icu::Locale::createFromName(localeID).clone());
|
||||
}
|
||||
CharString str(localeID, length, *err); // Make a NUL terminated copy.
|
||||
if (U_FAILURE(*err)) { return nullptr; }
|
||||
return EXTERNAL(icu::Locale::createFromName(str.data()).clone());
|
||||
return EXTERNAL(icu::Locale::createFromName(StringPiece{localeID, length}).clone());
|
||||
}
|
||||
|
||||
ULocale*
|
||||
|
|
|
@ -68,42 +68,42 @@ U_EXPORT std::optional<std::string_view>
|
|||
ulocimp_toLegacyTypeWithFallback(std::string_view keyword, std::string_view value);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
ulocimp_getKeywords(const char* localeID,
|
||||
ulocimp_getKeywords(std::string_view localeID,
|
||||
char prev,
|
||||
bool valuesToo,
|
||||
UErrorCode& status);
|
||||
|
||||
U_EXPORT void
|
||||
ulocimp_getKeywords(const char* localeID,
|
||||
ulocimp_getKeywords(std::string_view localeID,
|
||||
char prev,
|
||||
icu::ByteSink& sink,
|
||||
bool valuesToo,
|
||||
UErrorCode& status);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
ulocimp_getName(const char* localeID,
|
||||
ulocimp_getName(std::string_view localeID,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT void
|
||||
ulocimp_getName(const char* localeID,
|
||||
ulocimp_getName(std::string_view localeID,
|
||||
icu::ByteSink& sink,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
ulocimp_getBaseName(const char* localeID,
|
||||
ulocimp_getBaseName(std::string_view localeID,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT void
|
||||
ulocimp_getBaseName(const char* localeID,
|
||||
ulocimp_getBaseName(std::string_view localeID,
|
||||
icu::ByteSink& sink,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT icu::CharString
|
||||
ulocimp_canonicalize(const char* localeID,
|
||||
ulocimp_canonicalize(std::string_view localeID,
|
||||
UErrorCode& err);
|
||||
|
||||
U_EXPORT void
|
||||
ulocimp_canonicalize(const char* localeID,
|
||||
ulocimp_canonicalize(std::string_view localeID,
|
||||
icu::ByteSink& sink,
|
||||
UErrorCode& err);
|
||||
|
||||
|
|
|
@ -237,8 +237,13 @@ typedef HANDLE MemoryMap;
|
|||
pData->map = (char *)data + length;
|
||||
pData->pHeader=(const DataHeader *)data;
|
||||
pData->mapAddr = data;
|
||||
#if U_PLATFORM == U_PF_IPHONE
|
||||
#if U_PLATFORM == U_PF_IPHONE || U_PLATFORM == U_PF_ANDROID
|
||||
// Apparently supported from Android 23 and higher:
|
||||
// https://github.com/ggml-org/llama.cpp/pull/3631
|
||||
// Checking for the flag itself is safer than checking for __ANDROID_API__.
|
||||
# ifdef POSIX_MADV_RANDOM
|
||||
posix_madvise(data, length, POSIX_MADV_RANDOM);
|
||||
# endif
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -58,6 +58,8 @@ U_NAMESPACE_END
|
|||
|
||||
U_NAMESPACE_BEGIN
|
||||
|
||||
class CharString;
|
||||
|
||||
/**
|
||||
* The BreakIterator class implements methods for finding the location
|
||||
* of boundaries in text. BreakIterator is an abstract base class.
|
||||
|
@ -646,9 +648,9 @@ protected:
|
|||
private:
|
||||
|
||||
/** @internal (private) */
|
||||
char actualLocale[ULOC_FULLNAME_CAPACITY];
|
||||
char validLocale[ULOC_FULLNAME_CAPACITY];
|
||||
char requestLocale[ULOC_FULLNAME_CAPACITY];
|
||||
CharString* actualLocale = nullptr;
|
||||
CharString* validLocale = nullptr;
|
||||
CharString* requestLocale = nullptr;
|
||||
};
|
||||
|
||||
#ifndef U_HIDE_DEPRECATED_API
|
||||
|
|
|
@ -283,6 +283,32 @@ inline const char16_t *uprv_char16PtrFromUChar(const T *p) {
|
|||
#endif
|
||||
}
|
||||
}
|
||||
#if !U_CHAR16_IS_TYPEDEF && (!defined(_LIBCPP_VERSION) || _LIBCPP_VERSION < 180000)
|
||||
/** @internal */
|
||||
inline const char16_t *uprv_char16PtrFromUint16(const uint16_t *p) {
|
||||
#if U_SHOW_CPLUSPLUS_API
|
||||
return ConstChar16Ptr(p).get();
|
||||
#else
|
||||
#ifdef U_ALIASING_BARRIER
|
||||
U_ALIASING_BARRIER(p);
|
||||
#endif
|
||||
return reinterpret_cast<const char16_t *>(p);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#if U_SIZEOF_WCHAR_T==2
|
||||
/** @internal */
|
||||
inline const char16_t *uprv_char16PtrFromWchar(const wchar_t *p) {
|
||||
#if U_SHOW_CPLUSPLUS_API
|
||||
return ConstChar16Ptr(p).get();
|
||||
#else
|
||||
#ifdef U_ALIASING_BARRIER
|
||||
U_ALIASING_BARRIER(p);
|
||||
#endif
|
||||
return reinterpret_cast<const char16_t *>(p);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
|
|
@ -449,6 +449,11 @@ public:
|
|||
*/
|
||||
static Locale U_EXPORT2 createFromName(const char *name);
|
||||
|
||||
#ifndef U_HIDE_INTERNAL_API
|
||||
/** @internal */
|
||||
static Locale U_EXPORT2 createFromName(StringPiece name);
|
||||
#endif /* U_HIDE_INTERNAL_API */
|
||||
|
||||
/**
|
||||
* Creates a locale from the given string after canonicalizing
|
||||
* the string according to CLDR by calling uloc_canonicalize().
|
||||
|
@ -1133,7 +1138,9 @@ private:
|
|||
* @param cLocaleID The new locale name.
|
||||
* @param canonicalize whether to call uloc_canonicalize on cLocaleID
|
||||
*/
|
||||
Locale& init(const char* cLocaleID, UBool canonicalize);
|
||||
Locale& init(const char* localeID, UBool canonicalize);
|
||||
/** @internal */
|
||||
Locale& init(StringPiece localeID, UBool canonicalize);
|
||||
|
||||
/*
|
||||
* Internal constructor to allow construction of a locale object with
|
||||
|
|
|
@ -450,7 +450,7 @@ public:
|
|||
* @return a Locale object
|
||||
* @stable ICU 2.8
|
||||
*/
|
||||
const Locale
|
||||
Locale
|
||||
getLocale(ULocDataLocaleType type, UErrorCode &status) const;
|
||||
#ifndef U_HIDE_INTERNAL_API
|
||||
/**
|
||||
|
|
|
@ -675,14 +675,14 @@ typedef enum UProperty {
|
|||
* @stable ICU 63
|
||||
*/
|
||||
UCHAR_VERTICAL_ORIENTATION=0x1018,
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Enumerated property Identifier_Status.
|
||||
* Used for UTS #39 General Security Profile for Identifiers
|
||||
* (https://www.unicode.org/reports/tr39/#General_Security_Profile).
|
||||
* @draft ICU 75
|
||||
* @stable ICU 75
|
||||
*/
|
||||
UCHAR_IDENTIFIER_STATUS=0x1019,
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Enumerated property Indic_Conjunct_Break.
|
||||
* Used in the grapheme cluster break algorithm in UAX #29.
|
||||
|
@ -796,7 +796,6 @@ typedef enum UProperty {
|
|||
UCHAR_SCRIPT_EXTENSIONS=0x7000,
|
||||
/** First constant for Unicode properties with unusual value types. @stable ICU 4.6 */
|
||||
UCHAR_OTHER_PROPERTY_START=UCHAR_SCRIPT_EXTENSIONS,
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Miscellaneous property Identifier_Type.
|
||||
* Used for UTS #39 General Security Profile for Identifiers
|
||||
|
@ -808,10 +807,9 @@ typedef enum UProperty {
|
|||
*
|
||||
* @see u_hasIDType
|
||||
* @see u_getIDTypes
|
||||
* @draft ICU 75
|
||||
* @stable ICU 75
|
||||
*/
|
||||
UCHAR_IDENTIFIER_TYPE=0x7001,
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
#ifndef U_HIDE_DEPRECATED_API
|
||||
/**
|
||||
* One more than the last constant for Unicode properties with unusual value types.
|
||||
|
@ -2791,13 +2789,12 @@ typedef enum UVerticalOrientation {
|
|||
U_VO_UPRIGHT,
|
||||
} UVerticalOrientation;
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Identifier Status constants.
|
||||
* See https://www.unicode.org/reports/tr39/#Identifier_Status_and_Type.
|
||||
*
|
||||
* @see UCHAR_IDENTIFIER_STATUS
|
||||
* @draft ICU 75
|
||||
* @stable ICU 75
|
||||
*/
|
||||
typedef enum UIdentifierStatus {
|
||||
/*
|
||||
|
@ -2806,9 +2803,9 @@ typedef enum UIdentifierStatus {
|
|||
* U_ID_STATUS_<Unicode Identifier_Status value name>
|
||||
*/
|
||||
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_STATUS_RESTRICTED,
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_STATUS_ALLOWED,
|
||||
} UIdentifierStatus;
|
||||
|
||||
|
@ -2817,7 +2814,7 @@ typedef enum UIdentifierStatus {
|
|||
* See https://www.unicode.org/reports/tr39/#Identifier_Status_and_Type.
|
||||
*
|
||||
* @see UCHAR_IDENTIFIER_TYPE
|
||||
* @draft ICU 75
|
||||
* @stable ICU 75
|
||||
*/
|
||||
typedef enum UIdentifierType {
|
||||
/*
|
||||
|
@ -2826,32 +2823,31 @@ typedef enum UIdentifierType {
|
|||
* U_ID_TYPE_<Unicode Identifier_Type value name>
|
||||
*/
|
||||
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_TYPE_NOT_CHARACTER,
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_TYPE_DEPRECATED,
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_TYPE_DEFAULT_IGNORABLE,
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_TYPE_NOT_NFKC,
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_TYPE_NOT_XID,
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_TYPE_EXCLUSION,
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_TYPE_OBSOLETE,
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_TYPE_TECHNICAL,
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_TYPE_UNCOMMON_USE,
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_TYPE_LIMITED_USE,
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_TYPE_INCLUSION,
|
||||
/** @draft ICU 75 */
|
||||
/** @stable ICU 75 */
|
||||
U_ID_TYPE_RECOMMENDED,
|
||||
} UIdentifierType;
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Check a binary Unicode property for a code point.
|
||||
|
@ -4057,7 +4053,6 @@ u_isIDStart(UChar32 c);
|
|||
U_CAPI UBool U_EXPORT2
|
||||
u_isIDPart(UChar32 c);
|
||||
|
||||
#ifndef U_HIDE_DRAFT_API
|
||||
/**
|
||||
* Does the set of Identifier_Type values code point c contain the given type?
|
||||
*
|
||||
|
@ -4069,7 +4064,7 @@ u_isIDPart(UChar32 c);
|
|||
* @param c code point
|
||||
* @param type Identifier_Type to check
|
||||
* @return true if type is in Identifier_Type(c)
|
||||
* @draft ICU 75
|
||||
* @stable ICU 75
|
||||
*/
|
||||
U_CAPI bool U_EXPORT2
|
||||
u_hasIDType(UChar32 c, UIdentifierType type);
|
||||
|
@ -4104,11 +4099,10 @@ u_hasIDType(UChar32 c, UIdentifierType type);
|
|||
* function chaining. (See User Guide for details.)
|
||||
* @return number of values in c's Identifier_Type,
|
||||
* written to types unless U_BUFFER_OVERFLOW_ERROR indicates insufficient capacity
|
||||
* @draft ICU 75
|
||||
* @stable ICU 75
|
||||
*/
|
||||
U_CAPI int32_t U_EXPORT2
|
||||
u_getIDTypes(UChar32 c, UIdentifierType *types, int32_t capacity, UErrorCode *pErrorCode);
|
||||
#endif // U_HIDE_DRAFT_API
|
||||
|
||||
/**
|
||||
* Determines if the specified character should be regarded
|
||||
|
|
|
@ -1189,7 +1189,7 @@ public:
|
|||
* for (auto el : set) {
|
||||
* UnicodeString us(el);
|
||||
* std::string u8;
|
||||
* printf("set.string length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str());
|
||||
* printf("set.element length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str());
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
|
|
|
@ -1393,8 +1393,8 @@ public:
|
|||
private:
|
||||
friend class USetCodePoints;
|
||||
|
||||
USetCodePointIterator(const USet *uset, int32_t rangeIndex, int32_t rangeCount)
|
||||
: uset(uset), rangeIndex(rangeIndex), rangeCount(rangeCount),
|
||||
USetCodePointIterator(const USet *pUset, int32_t nRangeIndex, int32_t nRangeCount)
|
||||
: uset(pUset), rangeIndex(nRangeIndex), rangeCount(nRangeCount),
|
||||
c(U_SENTINEL), end(U_SENTINEL) {
|
||||
// Fetch the first range.
|
||||
operator++();
|
||||
|
@ -1430,7 +1430,7 @@ public:
|
|||
* Constructs a C++ "range" object over the code points of the USet.
|
||||
* @draft ICU 76
|
||||
*/
|
||||
USetCodePoints(const USet *uset) : uset(uset), rangeCount(uset_getRangeCount(uset)) {}
|
||||
USetCodePoints(const USet *pUset) : uset(pUset), rangeCount(uset_getRangeCount(pUset)) {}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
USetCodePoints(const USetCodePoints &other) = default;
|
||||
|
@ -1461,7 +1461,7 @@ struct CodePointRange {
|
|||
/** @draft ICU 76 */
|
||||
struct iterator {
|
||||
/** @draft ICU 76 */
|
||||
iterator(UChar32 c) : c(c) {}
|
||||
iterator(UChar32 aC) : c(aC) {}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
bool operator==(const iterator &other) const { return c == other.c; }
|
||||
|
@ -1574,8 +1574,8 @@ public:
|
|||
private:
|
||||
friend class USetRanges;
|
||||
|
||||
USetRangeIterator(const USet *uset, int32_t rangeIndex, int32_t rangeCount)
|
||||
: uset(uset), rangeIndex(rangeIndex), rangeCount(rangeCount) {}
|
||||
USetRangeIterator(const USet *pUset, int32_t nRangeIndex, int32_t nRangeCount)
|
||||
: uset(pUset), rangeIndex(nRangeIndex), rangeCount(nRangeCount) {}
|
||||
|
||||
const USet *uset;
|
||||
int32_t rangeIndex;
|
||||
|
@ -1611,7 +1611,7 @@ public:
|
|||
* Constructs a C++ "range" object over the code point ranges of the USet.
|
||||
* @draft ICU 76
|
||||
*/
|
||||
USetRanges(const USet *uset) : uset(uset), rangeCount(uset_getRangeCount(uset)) {}
|
||||
USetRanges(const USet *pUset) : uset(pUset), rangeCount(uset_getRangeCount(pUset)) {}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
USetRanges(const USetRanges &other) = default;
|
||||
|
@ -1685,8 +1685,8 @@ public:
|
|||
private:
|
||||
friend class USetStrings;
|
||||
|
||||
USetStringIterator(const USet *uset, int32_t index, int32_t count)
|
||||
: uset(uset), index(index), count(count) {}
|
||||
USetStringIterator(const USet *pUset, int32_t nIndex, int32_t nCount)
|
||||
: uset(pUset), index(nIndex), count(nCount) {}
|
||||
|
||||
const USet *uset;
|
||||
int32_t index;
|
||||
|
@ -1700,9 +1700,11 @@ private:
|
|||
* using U_HEADER_NESTED_NAMESPACE::USetStrings;
|
||||
* LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, &errorCode));
|
||||
* for (auto s : USetStrings(uset.getAlias())) {
|
||||
* UnicodeString us(s);
|
||||
* std::string u8;
|
||||
* printf("uset.string length %ld \"%s\"\n", (long)s.length(), us.toUTF8String(u8).c_str());
|
||||
* int32_t len32 = s.length();
|
||||
* char utf8[200];
|
||||
* u_strToUTF8WithSub(utf8, int32_t{sizeof(utf8) - 1}, nullptr,
|
||||
* s.data(), len32, 0xFFFD, nullptr, errorCode);
|
||||
* printf("uset.string length %ld \"%s\"\n", long{len32}, utf8);
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
|
@ -1719,7 +1721,7 @@ public:
|
|||
* Constructs a C++ "range" object over the strings of the USet.
|
||||
* @draft ICU 76
|
||||
*/
|
||||
USetStrings(const USet *uset) : uset(uset), count(uset_getStringCount(uset)) {}
|
||||
USetStrings(const USet *pUset) : uset(pUset), count(uset_getStringCount(pUset)) {}
|
||||
|
||||
/** @draft ICU 76 */
|
||||
USetStrings(const USetStrings &other) = default;
|
||||
|
@ -1816,8 +1818,8 @@ public:
|
|||
private:
|
||||
friend class USetElements;
|
||||
|
||||
USetElementIterator(const USet *uset, int32_t index, int32_t rangeCount, int32_t totalCount)
|
||||
: uset(uset), index(index), rangeCount(rangeCount), totalCount(totalCount),
|
||||
USetElementIterator(const USet *pUset, int32_t nIndex, int32_t nRangeCount, int32_t nTotalCount)
|
||||
: uset(pUset), index(nIndex), rangeCount(nRangeCount), totalCount(nTotalCount),
|
||||
c(U_SENTINEL), end(U_SENTINEL) {
|
||||
if (index < rangeCount) {
|
||||
// Fetch the first range.
|
||||
|
@ -1854,9 +1856,11 @@ private:
|
|||
* using U_HEADER_NESTED_NAMESPACE::USetElements;
|
||||
* LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, &errorCode));
|
||||
* for (auto el : USetElements(uset.getAlias())) {
|
||||
* UnicodeString us(el);
|
||||
* std::string u8;
|
||||
* printf("uset.string length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str());
|
||||
* int32_t len32 = el.length();
|
||||
* char utf8[200];
|
||||
* u_strToUTF8WithSub(utf8, int32_t{sizeof(utf8) - 1}, nullptr,
|
||||
* el.data(), len32, 0xFFFD, nullptr, errorCode);
|
||||
* printf("uset.element length %ld \"%s\"\n", long{len32}, utf8);
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
|
@ -1874,9 +1878,9 @@ public:
|
|||
* Constructs a C++ "range" object over all of the elements of the USet.
|
||||
* @draft ICU 77
|
||||
*/
|
||||
USetElements(const USet *uset)
|
||||
: uset(uset), rangeCount(uset_getRangeCount(uset)),
|
||||
stringCount(uset_getStringCount(uset)) {}
|
||||
USetElements(const USet *pUset)
|
||||
: uset(pUset), rangeCount(uset_getRangeCount(pUset)),
|
||||
stringCount(uset_getStringCount(pUset)) {}
|
||||
|
||||
/** @draft ICU 77 */
|
||||
USetElements(const USetElements &other) = default;
|
||||
|
|
|
@ -598,12 +598,13 @@ typedef enum UErrorCode {
|
|||
U_MF_DUPLICATE_DECLARATION_ERROR, /**< The same variable is declared in more than one .local or .input declaration. @internal ICU 75 technology preview @deprecated This API is for technology preview only. */
|
||||
U_MF_OPERAND_MISMATCH_ERROR, /**< An operand provided to a function does not have the required form for that function @internal ICU 75 technology preview @deprecated This API is for technology preview only. */
|
||||
U_MF_DUPLICATE_VARIANT_ERROR, /**< A message includes a variant with the same key list as another variant. @internal ICU 76 technology preview @deprecated This API is for technology preview only. */
|
||||
U_MF_BAD_OPTION, /**< An option value provided to a function does not have the required form for that option. @internal ICU 77 technology preview @deprecated This API is for technology preview only. */
|
||||
#ifndef U_HIDE_DEPRECATED_API
|
||||
/**
|
||||
* One more than the highest normal formatting API error code.
|
||||
* @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
|
||||
*/
|
||||
U_FMT_PARSE_ERROR_LIMIT = 0x10120,
|
||||
U_FMT_PARSE_ERROR_LIMIT = 0x10121,
|
||||
#endif // U_HIDE_DEPRECATED_API
|
||||
|
||||
/*
|
||||
|
|
|
@ -59,13 +59,13 @@
|
|||
* This value will change in the subsequent releases of ICU
|
||||
* @stable ICU 2.6
|
||||
*/
|
||||
#define U_ICU_VERSION_MINOR_NUM 0
|
||||
#define U_ICU_VERSION_MINOR_NUM 1
|
||||
|
||||
/** The current ICU patchlevel version as an integer.
|
||||
* This value will change in the subsequent releases of ICU
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
#define U_ICU_VERSION_PATCHLEVEL_NUM 1
|
||||
#define U_ICU_VERSION_PATCHLEVEL_NUM 0
|
||||
|
||||
/** The current ICU build level version as an integer.
|
||||
* This value is for use by ICU clients. It defaults to 0.
|
||||
|
@ -132,7 +132,7 @@
|
|||
* This value will change in the subsequent releases of ICU
|
||||
* @stable ICU 2.4
|
||||
*/
|
||||
#define U_ICU_VERSION "77.0.1"
|
||||
#define U_ICU_VERSION "77.1"
|
||||
|
||||
/**
|
||||
* The current ICU library major version number as a string, for library name suffixes.
|
||||
|
@ -151,7 +151,7 @@
|
|||
/** Data version in ICU4C.
|
||||
* @internal ICU 4.4 Internal Use Only
|
||||
**/
|
||||
#define U_ICU_DATA_VERSION "77.0.1"
|
||||
#define U_ICU_DATA_VERSION "77.1"
|
||||
#endif /* U_HIDE_INTERNAL_API */
|
||||
|
||||
/*===========================================================================
|
||||
|
|
|
@ -1945,6 +1945,13 @@ UnicodeString::cloneArrayIfNeeded(int32_t newCapacity,
|
|||
growCapacity = newCapacity;
|
||||
} else if(newCapacity <= US_STACKBUF_SIZE && growCapacity > US_STACKBUF_SIZE) {
|
||||
growCapacity = US_STACKBUF_SIZE;
|
||||
} else if(newCapacity > growCapacity) {
|
||||
setToBogus();
|
||||
return false; // bad inputs
|
||||
}
|
||||
if(growCapacity > kMaxCapacity) {
|
||||
setToBogus();
|
||||
return false;
|
||||
}
|
||||
|
||||
// save old values
|
||||
|
|
|
@ -2716,6 +2716,9 @@ ures_openWithType(UResourceBundle *r, const char* path, const char* localeID,
|
|||
|
||||
UResourceDataEntry *entry;
|
||||
if(openType != URES_OPEN_DIRECT) {
|
||||
if (localeID == nullptr) {
|
||||
localeID = uloc_getDefault();
|
||||
}
|
||||
/* first "canonicalize" the locale ID */
|
||||
CharString canonLocaleID = ulocimp_getBaseName(localeID, *status);
|
||||
if(U_FAILURE(*status)) {
|
||||
|
@ -3080,6 +3083,9 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity,
|
|||
kwVal.clear();
|
||||
}
|
||||
}
|
||||
if (locid == nullptr) {
|
||||
locid = uloc_getDefault();
|
||||
}
|
||||
CharString base = ulocimp_getBaseName(locid, subStatus);
|
||||
#if defined(URES_TREE_DEBUG)
|
||||
fprintf(stderr, "getFunctionalEquivalent: \"%s\" [%s=%s] in %s - %s\n",
|
||||
|
|
|
@ -140,7 +140,8 @@ _uFmtErrorName[U_FMT_PARSE_ERROR_LIMIT - U_FMT_PARSE_ERROR_START] = {
|
|||
"U_MF_MISSING_SELECTOR_ANNOTATION_ERROR",
|
||||
"U_MF_DUPLICATE_DECLARATION_ERROR",
|
||||
"U_MF_OPERAND_MISMATCH_ERROR",
|
||||
"U_MF_DUPLICATE_VARIANT_ERROR"
|
||||
"U_MF_DUPLICATE_VARIANT_ERROR",
|
||||
"U_MF_BAD_OPTION"
|
||||
};
|
||||
|
||||
static const char * const
|
||||
|
|
18
icu4c/source/configure
vendored
18
icu4c/source/configure
vendored
|
@ -1,6 +1,6 @@
|
|||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.72 for ICU 77.0.1.
|
||||
# Generated by GNU Autoconf 2.72 for ICU 77.1.
|
||||
#
|
||||
# Report bugs to <https://icu.unicode.org/bugs>.
|
||||
#
|
||||
|
@ -606,8 +606,8 @@ MAKEFLAGS=
|
|||
# Identity of this package.
|
||||
PACKAGE_NAME='ICU'
|
||||
PACKAGE_TARNAME='icu4c'
|
||||
PACKAGE_VERSION='77.0.1'
|
||||
PACKAGE_STRING='ICU 77.0.1'
|
||||
PACKAGE_VERSION='77.1'
|
||||
PACKAGE_STRING='ICU 77.1'
|
||||
PACKAGE_BUGREPORT='https://icu.unicode.org/bugs'
|
||||
PACKAGE_URL='https://icu.unicode.org/'
|
||||
|
||||
|
@ -1387,7 +1387,7 @@ if test "$ac_init_help" = "long"; then
|
|||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
'configure' configures ICU 77.0.1 to adapt to many kinds of systems.
|
||||
'configure' configures ICU 77.1 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
|
@ -1453,7 +1453,7 @@ fi
|
|||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of ICU 77.0.1:";;
|
||||
short | recursive ) echo "Configuration of ICU 77.1:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
|
@ -1592,7 +1592,7 @@ fi
|
|||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
ICU configure 77.0.1
|
||||
ICU configure 77.1
|
||||
generated by GNU Autoconf 2.72
|
||||
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
|
@ -2184,7 +2184,7 @@ cat >config.log <<_ACEOF
|
|||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by ICU $as_me 77.0.1, which was
|
||||
It was created by ICU $as_me 77.1, which was
|
||||
generated by GNU Autoconf 2.72. Invocation command line was
|
||||
|
||||
$ $0$ac_configure_args_raw
|
||||
|
@ -9019,7 +9019,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by ICU $as_me 77.0.1, which was
|
||||
This file was extended by ICU $as_me 77.1, which was
|
||||
generated by GNU Autoconf 2.72. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
|
@ -9075,7 +9075,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
|
|||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config='$ac_cs_config_escaped'
|
||||
ac_cs_version="\\
|
||||
ICU config.status 77.0.1
|
||||
ICU config.status 77.1
|
||||
configured by $0, generated by GNU Autoconf 2.72,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
|
||||
{
|
||||
"cldrVersion": "46"
|
||||
"cldrVersion": "47"
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
de{
|
||||
exceptions{
|
||||
SentenceBreak:array{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
el{
|
||||
boundaries{
|
||||
sentence:process(dependency){"sent_el.brk"}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
en{
|
||||
exceptions{
|
||||
SentenceBreak:array{
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
en_US{
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
en_US_POSIX{
|
||||
boundaries{
|
||||
word:process(dependency){"word_POSIX.brk"}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
es{
|
||||
exceptions{
|
||||
SentenceBreak:array{
|
||||
|
|
5
icu4c/source/data/brkitr/fi.txt
Normal file
5
icu4c/source/data/brkitr/fi.txt
Normal file
|
@ -0,0 +1,5 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
fi{
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
fr{
|
||||
exceptions{
|
||||
SentenceBreak:array{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
it{
|
||||
exceptions{
|
||||
SentenceBreak:array{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
ja{
|
||||
boundaries{
|
||||
line:process(dependency){"line_normal.brk"}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
ko{
|
||||
boundaries{
|
||||
line:process(dependency){"line_normal.brk"}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
pt{
|
||||
exceptions{
|
||||
SentenceBreak:array{
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
root{
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
boundaries{
|
||||
grapheme:process(dependency){"char.brk"}
|
||||
line:process(dependency){"line.brk"}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
ru{
|
||||
exceptions{
|
||||
SentenceBreak:array{
|
||||
|
|
5
icu4c/source/data/brkitr/sv.txt
Normal file
5
icu4c/source/data/brkitr/sv.txt
Normal file
|
@ -0,0 +1,5 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
sv{
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
zh{
|
||||
boundaries{
|
||||
line:process(dependency){"line_cj.brk"}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
zh_Hant{
|
||||
boundaries{
|
||||
line:process(dependency){"line_cj.brk"}
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
|
||||
{
|
||||
"cldrVersion": "46",
|
||||
"cldrVersion": "47",
|
||||
"aliases": {
|
||||
"ars": "ar_SA",
|
||||
"in": "id",
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
af{
|
||||
collations{
|
||||
standard{
|
||||
Sequence{"&N<<<ʼn"}
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
am{
|
||||
collations{
|
||||
standard{
|
||||
Sequence{"[reorder Ethi]"}
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
ar{
|
||||
collations{
|
||||
compat{
|
||||
|
@ -9,7 +9,7 @@ ar{
|
|||
"&ت<<ة<<<ﺔ<<<ﺓ"
|
||||
"&ي<<ى<<<ﯨ<<<ﯩ<<<ﻰ<<<ﻯ<<<ﲐ<<<ﱝ"
|
||||
}
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
}
|
||||
standard{
|
||||
Sequence{
|
||||
|
@ -397,7 +397,7 @@ ar{
|
|||
"&ۓ=ﮰ=ﮱ"
|
||||
"&ۀ=ﮤ=ﮥ"
|
||||
}
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
/**
|
||||
* generated alias target
|
||||
*/
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
ars{
|
||||
"%%ALIAS"{"ar_SA"}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
as{
|
||||
collations{
|
||||
standard{
|
||||
|
@ -11,7 +11,7 @@ as{
|
|||
"&[before 1]ত<ৎ=ত্\u200D"
|
||||
"&হ<ক্ষ"
|
||||
}
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
az{
|
||||
collations{
|
||||
search{
|
||||
|
@ -9,7 +9,7 @@ az{
|
|||
"[import az-u-co-standard]"
|
||||
"[reorder others]"
|
||||
}
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
}
|
||||
standard{
|
||||
Sequence{
|
||||
|
@ -26,7 +26,7 @@ az{
|
|||
"&H<x<<<X"
|
||||
"&Z<w<<<W"
|
||||
}
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
be{
|
||||
collations{
|
||||
standard{
|
||||
|
@ -9,7 +9,7 @@ be{
|
|||
"&Е<ё<<<Ё"
|
||||
"&у<ў<<<Ў"
|
||||
}
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
bg{
|
||||
collations{
|
||||
standard{
|
||||
Sequence{"[reorder Cyrl]"}
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
bn{
|
||||
collations{
|
||||
standard{
|
||||
|
@ -9,7 +9,7 @@ bn{
|
|||
"[reorder Beng Deva Guru Gujr Orya Taml Telu Knda Mlym Sinh]"
|
||||
"&ঔ<ং<ঃ<ঁ"
|
||||
}
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
}
|
||||
traditional{
|
||||
Sequence{
|
||||
|
@ -629,7 +629,7 @@ bn{
|
|||
"&যৌ<<<য়ৌ"
|
||||
"&য্<<<য়্"
|
||||
}
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
bo{
|
||||
collations{
|
||||
standard{
|
||||
|
@ -65,7 +65,7 @@ bo{
|
|||
"&ྲཱྀ=ཷ"
|
||||
"&ླཱྀ=ཹ"
|
||||
}
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// © 2016 and later: Unicode, Inc. and others.
|
||||
// License & terms of use: http://www.unicode.org/copyright.html
|
||||
// Generated using tools/cldr/cldr-to-icu/build-icu-data.xml
|
||||
// Generated using tools/cldr/cldr-to-icu/
|
||||
br{
|
||||
collations{
|
||||
standard{
|
||||
|
@ -8,7 +8,7 @@ br{
|
|||
"&C<ch<<<Ch<<<CH<c''h=c\u02BCh=c\u2019h<<<C''h=C\u02BCh=C\u2019h<<<C'"
|
||||
"'H=C\u02BCH=C\u2019H"
|
||||
}
|
||||
Version{"46"}
|
||||
Version{"47"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue