summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qlocale.cpp
Commit message (Collapse)AuthorAgeFilesLines
* Assert consistency between locale and calendar dataEdward Welbourne4 days1-4/+14
| | | | | | | | They're indexed by the same key and should have the same language, script and country. Just to be sure, assert that. Change-Id: I9d4d9c0ef7078d6dcbb6ceccafdfaff671737689 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Pass trivially-copyable types by value, not by const refEdward Welbourne2024-04-091-2/+2
| | | | | | | | | The LikelyPair and QLocaleId types are small enough to pass by value. Pick-to: 6.7 6.5 Task-number: QTBUG-122619 Change-Id: I1502efcf69ac82d9c49b673975502882c59a4fd0 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QLocale: pass 64-bit LanguageCodeEntry by value, not const refEdward Welbourne2024-04-091-5/+5
| | | | | | | | | | | | Probably makes no difference, since it's all in lambdas being passed to a standard algorithm, but the static analyser noticed this would be cleaner. Pick-to: 6.7 6.5 Task-number: QTBUG-122619 Change-Id: I23093254e4857131b7be87aeff1e7ba79ea2b674 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Bootstrap: remove qnumeric.cpp by using qnumeric_p.hThiago Macieira2024-03-131-1/+1
| | | | | | | | | That is, use the inline functions that refer to <numeric_limits> and <cmath> directly, instead of the out-of-line wrappers. Someone should verify if the hacks for QNX's <math.h> are still required. Change-Id: I01ec3c774d9943adb903fffd17b7ee560b4b71b9 Reviewed-by: Ahmad Samir <a.samirh78@gmail.com>
* Make public QLocale's constant for the two-digit-year baseIvan Solovev2024-01-221-0/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The private QLocale::FirstTwoDigitYear constant, which is used as a default value for the parameters in some methods, causes troubles for Qt for Python Team, because they need to use the default values in the binding code. It also potentially create some inconveniences for the users who want to write functions wrapping these methods. The name is also confusing, because, when read out of context, it implies that there might be SecondTwoDigitYear, etc... Rename QLocale::FirstTwoDigitYear to QLocale::DefaultTwoDigitBaseYear and make it public. Now when the constant is public, we can use it in QDate, instead of introducing another constant, so do that. The qdatetime.h header already includes qlocale.h via qcalendar.h, but, rather than relying on this transitive include, add it explicitly. As pointed out by Thiago [1], the static constexpr members of exported classes need out-of-line definitions, so add such definition to qlocale.cpp. Amends 41f84f3ddb780ec751e3fc706dd242fc4a99de7a Found in 6.7 API review. [1]: https://lists.qt-project.org/pipermail/development/2024-January/044888.html Pick-to: 6.7 Change-Id: Ib3c6f1d5b181968bf311fd0435173e025a369865 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* wasm: remove onLanguageChanged event handlerMorten Sørvig2024-01-171-11/+0
| | | | | | | | | | | | | | | QSystemLocale is setting the global window.onLanguageChanged property which may cause conflicts in cases where there are more than one Qt app instance on the same web page. In addition the QSystemLocale destructor never runs, which breaks also for repeated QLocale instantiations on the same page (for example for the QLocale auto- test) Pick-to: 6.7 Change-Id: I85af0587527b2922804fc866c83864f677700e6d Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
* Give the caller control over the century used for two-digit datesEdward Welbourne2023-12-081-16/+46
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The twentieth century is now some way behind us, so using its years when parsing a date-time format that only provides the last two digits is increasingly likely to produce unwelcome results. Most such formats are saved by the "redundant" presence of a day-of-week field but, for those that are not (notably including ASN.1 date fields), there is a need to provide some way to over-ride the twentieth century default. Allow the caller to pass a base year to the fromString() methods, of QDate and QDateTime, and to QLocale's toDate() and toDateTime(), that indicates the first of 100 consecutive years, among which the two digits given can select a year. Add some test-cases to exercise the new API. [ChangeLog][QtCore][QDate] When fromString() has only a two-digit year to go on, it is now possible to set the start-year of the century within which this selects. [ChangeLog][QtCore][QDateTime] When fromString() has only a two-digit year to go on, it is now possible to set the start-year of the century within which this selects. [ChangeLog][QtCore][QLocale] When toDate() or toDateTime() has only a two-digit year to go on, it is now possible to set the start-year of the century within which this selects. Fixes: QTBUG-46843 Change-Id: Ieb312ee9e0b80557a15edcb0e6d75a57b10d7a62 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* wasm: Add QLocale backendMorten Sørvig2023-10-311-0/+11
| | | | | | | | | | | | | | | | | | This is a simple backend based on navigator.languages, which gives us a prioritized list of languages in the form '["en-US", "zh-CN", "ja-JP"]'. Use this to implement QSystemLocale::query() for UILanguages and QSystemLocale::fallbackLocale(). Register an event handler for the native QWindow:languagechange event in the QSystemLocale constructor. This event handler stays active for the lifetime of the QSystemLocale object. Task-number: QTBUG-116613 Change-Id: Ibd176748377e891b63a3f1d57605af0c2a49edb3 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
* Use localized time-zone abbreviations or offsetEdward Welbourne2023-10-271-7/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The actual formatting of date-time strings is handled by the calendar backend, but the code's in qlocale.cpp as it uses some of its tools. When feature timezone is unavailable, we're stuck (as before) with using QDateTime::timeZoneAbbreviation(), but when it's available we can use QTimeZone::displayName() to get the localized form of the abbreviation and offset string. Make matching changes in QDTP so that it recognizes these localized abbreviations. We now have another candidate for what local time might be called, to add to those that must be checked. This naturally implied some changes to tests. It turns out ICU believes en_US uses GMT+1/GMT+2 for CET/CEST. Replace some MS QEXPECT_FAIL()s by including the non-abbreviations we do in fact use on MS in the lists of "abbreviations" to accept. [ChangeLog][QtCore][QLocale] When a datetime format includes the timezone (or offset), the appropriately localised form is (to the extent the timezone backend in use supports this) used where, previously, a haphazard choice of system and C locale was used. This applies to both serialization and parsing. Task-number: QTBUG-115158 Change-Id: I04f9c1055c3b9008320bb8b758490287fd8be5cd Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Rework massaging of time zone offsets in formatted date-timesEdward Welbourne2023-10-261-6/+6
| | | | | | | | Add a missing std::move() and rearrange comments. Change-Id: I2d93e88f7b9b6f62e7d1cca5cacf794d2fef53b5 Reviewed-by: Paul Wicking <paul.wicking@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Fix neglected wording about separators added in 6.7Edward Welbourne2023-09-111-8/+8
| | | | | | | | | | | | In the documentation of the TagSeparator parameters of three QLocale methods, I neglected to mention they were added at 6.7. This amends commits 91e70f239e166956c0db2d99cfb229c6b7d94598 and 15cfdab514591a66ffa783e5d680926578b9d05b in which I added these parameters. Change-Id: I11462b88305255359d4e9b144b000cffe9a142ad Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
* Doc: Fix documentation issuesTopi Reinio2023-09-111-1/+2
| | | | | | | | | | | | | | | | | | | | Fix the following QDoc warnings: * warning: Can't link to 'QRhiWidget::sampleConut' * warning: Can't link to '`Q_NODISCARD_CTOR' * warning: Invalid '\relates' (already a member of 'QEventLoopLocker') * warning: Unknown command '\relatesalso' * warning: Undocumented parameter 'separator' in QLocale::name() * warning: clang couldn't find function when parsing \fn void QRhiWidget::framePresented() In QAtomicPointer, work around the issue of QDoc not supporting multiple \relates command for a single topic by adding a see-also link to the global qYieldCpu() function. Document the qvariant_cast() overload taking an rvalue reference. Change-Id: I2528eee666149a97a14be059bbed537636d7aa0d Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Give QLocale's name() and bcp47Name() separator parametersEdward Welbourne2023-08-181-9/+28
| | | | | | | | | | | | | Previously name() has always used underscore and bcp47Name() dash; let the user chose which one best fits their needs. [ChangeLog][QtCore][QLocale] QLocale's name() and bcp47Name() now let the caller chose what separator to use between the tags making up the name, where there is more than one. Change-Id: Ia689e6a3fb581b42905e7fb1ae7a7b688244d267 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Give QLocale::uiLanguages() a separator parameterEdward Welbourne2023-08-161-14/+53
| | | | | | | | | | | | | | | | | | | It has always returned dash-joined forms of the locale names, and callers who need an underscore-joined form have been obliged to replace('-', '_') before using them. Given that everything it adds to the list comes from QLocaleId methods that accept a separator, it's trivial to let it offer the same choice to its callers and save them this hassle. Amended code in QTranslater and QMimeType to save them that hassle. [ChangeLog][CoreLib][QLocale] QLocale::uiLanguages() now lets the caller choose what separator to use between the tags that make up each locale-identifier in the list returned. Change-Id: I91fcd0b988d9a64e0e9ad9e851f6cb8c1be8ae50 Reviewed-by: Marc Mutz <marc.mutz@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QLocale: clean out assorted over-namespacingEdward Welbourne2023-08-091-47/+46
| | | | | | | | The code of a class doesn't need that class's prefix to access members of the class. Change-Id: I4cc2f72c90cff48b331dc12d390c45c0639606b3 Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* Use CLDR's names in QLocale::*ToName() for language, script, territoryEdward Welbourne2023-08-091-3/+3
| | | | | | | | | | | | | | | Various comments need to continue using the enumdata.py names, as they associate data with particular enum members, but we can now correctly use the en.xml versions of their names when we report them, rather than the enum-friendly names we use in the code. Since this now means the data may stray outside plain ASCII - it'll be UTF-8-encoded - this implies replacing the QLatin1StringView()s of the code that formerly read this data with QString::fromUtf8(). Fixes: QTBUG-94460 Change-Id: Id3b08875a46af58c0555c3e303b0e15a19441509 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Fix digit grouping: m_grouping_top doesn't mean what I thought it didEdward Welbourne2023-08-081-4/+4
| | | | | | | | | | | | | | | | | I'd previously understood CLDR's minimumGroupingDigits to mean the most significant group must have that many digits. It turns out to mean only that the first grouping separator doesn't get added unless the more significant group has this many. Once we have one separator, more can be added that do isolate a single digit. In the process, I discover some of the prior arithmetic is incorrect; it is now fixed. Added some basic testing, amended some existing tests. In the process, fixed naming of some double validator tests. Pick-to: 6.6 6.5 Fixes: QTBUG-115740 Change-Id: Ia6ce011ba72e72428b015ca22b97d815ebf751b2 Reviewed-by: Ievgenii Meshcheriakov <ievgenii.meshcheriakov@qt.io>
* Use correct index for QLocale::system()'s staticEdward Welbourne2023-07-311-6/+34
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Nothing prevents client code from calling QLocale::setDefault() before we ever instantiate QLocale::system() - aside from some quirks that mean setDefault(), currently, does instantiate QLocale::system() to force initialization of defaultLocalePrivate - so using defaultIndex() could set the system QLocalePrivate instance's index incorrectly. In any case, even if the index is initially set correctly, a subsequent change to the system locale would change the correct index; and nothing outside QLocale::system() has access to the instance that would then be remembering an out-of-date index. Actually tripping over that inconsistency took some deviousness, but was possible. The index is (currently) only used for month name lookups and those special-case, for the Roman-derived calendars, the system locale, to only use the index if the system locale offers no name for a month. Meanwhile, updateSystemPrivate() uses the fallback locale's index for its look-up of which CLDR data to copy into the fallback QLocaleData for the system locale. None the less, a non-Roman calendar's lookup will go via the index to get at the CLDR data for that calendar, thereby exposing the system locale's index to use; and, sure enough, a setDefault() could lead that to produce wrong answers. In QLocale::system() there's a cached QLocalePrivate, whose index we need to ensure stays in sync with the active system locale. So pass its &m_index to systemData(), which will now (when passed this) ensure it's up to date. Since we always have called systemData(), to ensure it is up to date, we can skip that update in the initialization of the cached private and use m_index = -1 to let systemData() know when it's in the initial call, thereby making the static cache constinit. Amended a test to what proved the issue was present. Change-Id: I8d7ab5830cf0bbb9265c2af2a1edc9396ddef79f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* QValidator: return State::Intermediate for certain trailing charactersAhmad Samir2023-07-241-0/+6
| | | | | | | | | | | | | | | | | E.g. a group separator, a -/+ sign, or 'e' (exponent). Input ending with one of these characters now returns Intermediate, as it can become Acceptable if the user types more characters. Remove a check from initialResultCheck(), as it's now covered by QLocaleData::validateChars() checking that the last character in the buffer is -/+, this works the same if buffer's size is 1. Extended unittests based on the linked bug report; the other cases for "last" are already covered by existing unittests. Task-number: QTBUG-111371 Change-Id: I9b6979c29f07a5f57b040004cd3dbf4e27147c21 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* QLocaleData:: port bytearray/stringTo{U}LongLong to QSimpleParsedNumberAhmad Samir2023-07-221-29/+27
| | | | | | Change-Id: I97fe38d9b676cf92003a7323ebb5f56b9b79abad Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* QLocaleData: change validateChars() to return validation StateAhmad Samir2023-07-221-13/+15
| | | | | | | | | | | | | | | | | | | | Instead of returning just bool, return a result struct {State, CharBuff}, a State is useful as it can have an Intermediate state where the input isn't Acceptable yet, but not Invalid as such. The example from the linked bug is in tst_QIntValidator::validateFrench(), a string "1 ", which can be interpretted as a number with a group separator, but the input shouldn't end with a group separator (changing the unittest will be done as part of a separate commit). CharBuff (QVarLengthArray<char, 256>) replaces the QByteArray input parameter; a QVarLengthArray means no heap allocation in typical use-cases with input text < 256 characters to validate. This required minimum changes (QVLA doesn't have startsWith, replaced by comparing with buff[0]; and for converting to double, wrapped it in a QBAV). Task-number: QTBUG-111371 Change-Id: I4e0eb612d470ef03faf52031ddfe9c4bdb31e1e1 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* Move month names from QGregorianCalendar to QRomanCalendarEdward Welbourne2023-07-211-4/+4
| | | | | | | | | The other Roman-based calendars share the same month names as Gregorian, so it makes sense for them to use the same system fallbacks as it when available. Change-Id: Idf2f2901032c7a02d641f00a3993cc95b6bb8067 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Update system collator when system local is default and updatesEdward Welbourne2023-07-211-1/+5
| | | | | | | | | | | | | | | | | | Amends commit 94de5f9b25e1816039885c765e2a5b312f7daa7e so that every change to the default locale is reflected in an update to the default collator used by QString::localeAwareCompare(). Although the change to the system locale does update the QLocaleData object shared by all system locale objects, the possible change to its collator() may imply the default collator needs an update; and the collator backend's init() may use the language, script and territory that's changed in setting up the revised collator, even if the QLocale instance referenced has the same QLocaleData. Pick-to: 6.6 6.5 6.2 Change-Id: I957486c03c3d779fc9a2f0b889346ec13b1af868 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* Fix case-sensitivity of exponent separator check in Cyrillic fall-backEdward Welbourne2023-05-151-1/+2
| | | | | | | | | | | | | | | | | When matching the locale's correct exponent separator, QLocale was doing a case-insensitive match; but the Cyrillic fall-back was matching case-sensitively, so failed to catch the case of lower-case e and its Cyrillic equivalent, when used in a Cyrillic font in place of the upper-case form of the other, where that's the locale's official separator. So make this comparison case-insensitive. Added some test-cases for the lower-case exponential separator. Pick-to: 6.5 Fixes: QTBUG-113443 Change-Id: I18e22d7b3451fbb61e87d5b93661eadff3c7356e Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Ievgenii Meshcheriakov <ievgenii.meshcheriakov@qt.io>
* Misc.: Fix some narrowing integral conversion warningsAhmad Samir2023-04-251-1/+3
| | | | | | | Drive-by change: use QByteArrayView instead of allocating a QByteArray. Change-Id: Iaf7acbbdb4efbb101b73b30061ce38dd1fa99ca3 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QLocaleData: de-duplicate some codeAhmad Samir2023-04-221-38/+21
| | | | | | | | | Not using structured bindings because those functions will be changed to return QSimpleParsedNumber directly. Change-Id: Ic52b6754da14b86d8ddc5f399262f227e05527ce Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QLocaleData: replace two static helpers with if constexprAhmad Samir2023-03-211-16/+8
| | | | | | | More readable. Change-Id: I015e5df2e67d8ca2b8eb117e2d63db8f9280a2a3 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Pack languageCodeList tighterMate Barany2023-03-151-18/+24
| | | | | | | | | | | | | | Pack some of the arrays that contain locale data more tightly. The AlphaCode struct is a char[4] but always holds only [a-z]{,3} which could be fit into 16 bits, halving the size of an AlphaCode struct. With the new constructor the initialization of the AlphaCode struct also changes - modify qlocalexml2cpp.py to reflect this change and regenerate the languageCodeList. Fixes: QTBUG-105050 Change-Id: I2b1e93ab7cc3f2d667bf67b45769b74a15211931 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* Don't use unnamed namespace in qlocale_p.hEdward Welbourne2023-03-131-1/+1
| | | | | | | | | | Pointed out by CodeChecker. It's included by plenty of places, so duplicating that anonymous namespace potential code duplication. Use QtPrivate namespace instead. Change-Id: I9ccfd569089ea01a8be9ffd87889bca73b70dd9c Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* Update QLocale docs of "single character" token functionsEdward Welbourne2023-03-011-7/+48
| | | | | | | | | | | | Since 6.0, these functions all return QString, to cope if the character is outside the BMP so surrogate-encoded, and it has lately come to light that some of them are, in any case, multi-character tokens. Now that the code correctly handles that, update the docs to paint a more faithful picture of what these tokens are. Fixes: QTBUG-107801 Change-Id: I0a364432408a166fae86666f8e5de4f59622b2a3 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Revert "QLocale: update the disabling of -Wfree-nonheap-object to GCC 10 only"Thiago Macieira2023-02-251-1/+1
| | | | | | | | | | This reverts commit e76bcaa203a0b6845c84ed9bb4cf11c2f6396f54. I managed to reproduce the warning with GCC 12. It only happens with -flto (LTCG) builds, not in regular release builds. Change-Id: I6747273300ee51dec05563233017ba0cdf46794a Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* Support Cyrillic's equivalent of 'E' as exponent separatorEdward Welbourne2023-02-241-1/+13
| | | | | | | | | | | | Only Ukrainian is actually recorded in CLDR as using U+0415 as exponent separator; all other Cyrillic-using locales officially use plain ASCII 'E'. However, it seems reasonable, in all Cyrillic locales, to recognize both (given that they look very similar). Task-number: QTBUG-107801 Change-Id: I70a1e60a2d9fe7e254e01d32c5bad909ea4b8c76 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Ievgenii Meshcheriakov <ievgenii.meshcheriakov@qt.io>
* Fix parsing of numbers to cope with non-single-character tokensEdward Welbourne2023-02-241-29/+214
| | | | | | | | | | | | | | | | | | | | In some locales signs and the exponent are not single character tokens. Replace QLocaleData::numericToCLocale() with a tokenizer that will cope with this. At the same time, cache the locale data needed in support of that, so that we don't repeatedly recreate QString() objects just to compare them against input tokens. The caching class is inspired by Thiago's proposal for fixing the performance, which also inspires the optimization of the C locale in the tokenizer used here. Add some testing that round-tripping numbers via strings works for the locales with signs and exponents that use more than one character. Task-number: QTBUG-107801 Change-Id: I9fd8409a371ed62ed969d9ebc8b09584e752f7fb Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Use isAsciiDigit() in a few more places in qlocale.cppEdward Welbourne2023-02-241-6/+5
| | | | | | | | Use the function now in qtools_p.h in several more places. (A later commit rewrites the remainder away.) Change-Id: I782f0dceffe0e6e76753643a889011a834bc3ff0 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Reflow some code and comments in the aftermath of a dedentEdward Welbourne2023-02-241-16/+13
| | | | | | | There's more space to the right now, so we may as well use it. Change-Id: I653c52e1a2fb9eb2a0b027be90fb7bc2734a5e85 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* Dedent some switch statement bodies to match coding styleEdward Welbourne2023-02-241-114/+114
| | | | | | | The case labels are meant to line up with the switch statement. Change-Id: I62a45ffca22582d2264ecb3eb5ad7fbfe2aa148b Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QLocale: modernize ascii_isspace() to C++17Thiago Macieira2023-02-201-1/+1
| | | | | | | | | | | | | | | | | | | | | | | And on 64-bit platforms, use a 64-bit integer, which removes a subtraction from the matching code. The loop in bytearrayToLongLong() looks like, on x86-64: movabsq $4294983168, %rsi .L1217: movzbl (%rdx), %ecx cmpl $64, %ecx ja .L1216 btq %rcx, %rsi jnc .L1216 incq %rdx cmpq %rbx, %rdx jne .L1217 Change-Id: I3d74c753055744deb8acfffd1723d8b51e151432 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* QtMiscUtils: add some more character helpersAhmad Samir2023-02-071-8/+5
| | | | | | | | | | | | | isHexDigit, isOctalDigit, isAsciiDigit, isAsciiLower, isAsciiUpper, isAsciiLetterOrNumber. This de-duplicates some code through out. Rename two local lambdas that were called "isAsciiLetterOrNumber" to not conflict with the method in QtMiscUtils. Change-Id: I5b631f95b9f109136d19515f7e20b8e2fbca3d43 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Include QLocale::system() in matchingLocales() return listMate Barany2023-02-061-0/+9
| | | | | | | | | | | QLocale::matchingLocales() only returns matches from the CLDR database, it does not include the current system locale as a match, even if it does match. Add the current system locale, if it matches. Task-number: QTBUG-106644 Change-Id: If2e409bf0fd8582941646838330e36b79952d3f6 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* QCalendarBackend: de-duplicate some codeAhmad Samir2023-02-041-78/+29
| | | | | Change-Id: I158cb1a2c6245b07891201bd767f3a4398a885fb Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* Let QLocaleData::numberToCLocale() know the type of numberEdward Welbourne2023-01-191-11/+19
| | | | | | | | | | Passing a NumberMode lets it exclude floating-specific details for integer parsing. For now this is only partially exploited, but later work shall make more use of it. Fixes: QTBUG-81756 Change-Id: If11d3a5a122d0714f645e58a51ee0d0c47ebe61d Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Use the CLDR endonym in the documentationEdward Welbourne2023-01-121-1/+1
| | | | | | | | | Not sure where the docs got "Schwiizertüütsch" but it's not what CLDR gives for Swiss-German's endonym. Change-Id: I25d0aabea061ea34021311a2ec11d14ce61502d5 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
* QLocaleData::numberToCLocale(): clarify some conditionals and commentsEdward Welbourne2023-01-101-29/+21
| | | | | | | | | | | | | | | | | Some of the complex conditionals were done in two stages, with an outer condition on a block with a comment explaining an inner condition. Rework those to simpler statements in the conditions and move the preconditions of what each comment explains to the outer conditional. In the process, refine some of the conditionals. All group-size checks should be conditioned on last_separator_idx != -1, since we only constrain grouping by its rules, when present. The grouping separator can be empty (in system locale, if configured by user) so grouping can't be mandatory. Change-Id: Id3af7aafa6f70ecaea020a9fe0d6031f1ed9f84e Reviewed-by: Ievgenii Meshcheriakov <ievgenii.meshcheriakov@qt.io>
* Documentation: Clarify the meaning of the precision parameter for double ↵Friedemann Kleint2023-01-071-13/+9
| | | | | | | | | | | formatting Move it to the table for QLocale::toString() to make it more prominent. Explain the meaning for QTextStream::realNumberPrecision(). Pick-to: 6.5 6.4 6.2 Change-Id: Ic2da22ff6bea09e79e17f19b4636cef35dc3a615 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QContainerTools: add q_points_into_range overloadAhmad Samir2022-12-111-1/+1
| | | | | | | | | Looking at the use-cases of the already existing q_points_into_range overload, all of them can be ported to the new one (i.e. all of them were using range [begin, end)). Change-Id: I4bfdd68271512b88a9800a16237ff967a367eaeb Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Restore end-of-parse reporting to qstrntod()Edward Welbourne2022-11-241-14/+14
| | | | | | | | | | | | | | | | | | Rework QSimpleParsedNumber to store a qsizetype whose sign serves as ok flag (positive is ok, zero and negative are not) and magnitude is the number of characters used. This replaces an endptr that was set to null to indicate !ok, but that deprived us of end-of-parse information, which is needed for number-parsing. In particular, JS's parsing of numbers accepts overflow (where qstrntod() flags it as invalid) as infinity; so qstrntod() does need to say how long the overflowing (but JS-valid, none the less) number-text was. Modify all callers of functions using this (recently-introduced) type and add tests that fail without this fix. Fixes: QTBUG-108628 Change-Id: I416cd213e1fb8101b1af5a6d43615b970a5db9b4 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* QLocale: make qt_doubleToAscii not have output argumentsThiago Macieira2022-11-161-5/+3
| | | | | | | | | Repeat the last commit, now for floating point parsing (and without the benchmarking). Like the last commit, removes one category of parsing, when we would return an advanced parsing pointer and still fail. Change-Id: Ieba79baf5ac34264a988fffd1726759a2359828d Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* QLocale: make qstrnto(u)ll not have output argumentsThiago Macieira2022-11-161-10/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | That is, return everything in the return argument. On the SysV ABI, that means everything gets returned in registers, in both 32- and 64-bit platforms (unlike QtPrivate::ParsedNumber). There's a minor but perceptible performance improvement in parsing strings and byte arrays. Before: Parsed string "42" "1234" "-1548860221" Clock (ns) 16.673 18.878 25.517 CPU cycles 46.548 52.704 71.243 Instructions 201 233 331 After: Parsed string "42" "1234" "-1548860221" Clock (ns) 15.577 17.998 24.198 CPU cycles 43.491 49.942 67.552 Instructions 179 211 308 On my Core i7-1165G7 @ 2.80 GHz, the 22-23 instruction gain per iteration results in half the expected clock gain in runtime (22 / 2.8 GHz = 7.8 ns) because of a slightly lower instruction per cycle rate. That's acceptable because we need less speculative execution. Pick-to: 6.4 Task-number: QTBUG-107788 Change-Id: I07ec23f3cb174fb197c3fffd17220fd64d473cc0 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* QLocaleData::numberToCLocale(): consolidate two branchesEdward Welbourne2022-11-111-5/+4
| | | | | | | | | | The handling of a digit was done in two parts, separating the case for the first digit from the handling of later digits. Nothing in the else/if chain between involved digits, so the latter can move to the front and be combined with the former. Change-Id: I4c93515f36452721bdef472cc2f0af7ceeb00527 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QLocaleData::validateChars(): exploit last to detect first iterationEdward Welbourne2022-11-111-2/+2
| | | | | | | | Checking the value of last, instead of the index, prepares the way for using QStringIterator here. Change-Id: Ided0530413211e918acd406ebdb37f16006ef07d Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>