[haiku-commits] r37736 - haiku/trunk/src/system/libroot/add-ons/icu/locale

  • From: zooey@xxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 25 Jul 2010 19:10:52 +0200 (CEST)

Author: zooey
Date: 2010-07-25 19:10:52 +0200 (Sun, 25 Jul 2010)
New Revision: 37736
Changeset: http://dev.haiku-os.org/changeset/37736

Modified:
   haiku/trunk/src/system/libroot/add-ons/icu/locale/ICULocaleBackend.cpp
Log:
Avoid rm switching to interactive mode for any locale other than POSIX:
* reset errno to 0 if it has been set during execution of any ICU method
  (which doesn't set errno itself, but may invoke system functions that do)


Modified: haiku/trunk/src/system/libroot/add-ons/icu/locale/ICULocaleBackend.cpp
===================================================================
--- haiku/trunk/src/system/libroot/add-ons/icu/locale/ICULocaleBackend.cpp      
2010-07-25 11:31:56 UTC (rev 37735)
+++ haiku/trunk/src/system/libroot/add-ons/icu/locale/ICULocaleBackend.cpp      
2010-07-25 17:10:52 UTC (rev 37736)
@@ -8,6 +8,7 @@
 
 #include <new>
 
+#include <errno.h>
 #include <langinfo.h>
 #include <locale.h>
 #include <string.h>
@@ -23,6 +24,27 @@
 }
 
 
+/**
+ * A helper class resetting errno to 0 if it has been set during the execution
+ * of ICU methods. Any changes of errno shall only be done by our callers.
+ */
+class ErrnoMaintainer {
+public:
+       ErrnoMaintainer()
+               : fErrnoUponEntry(errno)
+       {
+       }
+
+       ~ErrnoMaintainer()
+       {
+               if (errno != 0 && fErrnoUponEntry == 0)
+                       errno = 0;
+       }
+private:
+       int fErrnoUponEntry;
+};
+
+
 ICULocaleBackend::ICULocaleBackend()
        :
        fMonetaryData(fLocaleConv),
@@ -40,6 +62,8 @@
 void
 ICULocaleBackend::Initialize(LocaleDataBridge* dataBridge)
 {
+       ErrnoMaintainer errnoMaintainer;
+
        fCtypeData.Initialize(&dataBridge->ctypeDataBridge);
        fMessagesData.Initialize(&dataBridge->messagesDataBridge);
        fMonetaryData.Initialize(&dataBridge->monetaryDataBridge);
@@ -55,6 +79,8 @@
 const char*
 ICULocaleBackend::SetLocale(int category, const char* posixLocaleName)
 {
+       ErrnoMaintainer errnoMaintainer;
+
        if (posixLocaleName == NULL)
                return _QueryLocale(category);
 
@@ -123,6 +149,8 @@
 int
 ICULocaleBackend::IsWCType(wint_t wc, wctype_t charClass)
 {
+       ErrnoMaintainer errnoMaintainer;
+
        return fCtypeData.IsWCType(wc, charClass);
 }
 
@@ -130,6 +158,8 @@
 status_t
 ICULocaleBackend::ToWCTrans(wint_t wc, wctrans_t transition, wint_t& result)
 {
+       ErrnoMaintainer errnoMaintainer;
+
        return fCtypeData.ToWCTrans(wc, transition, result);
 }
 
@@ -137,6 +167,8 @@
 const char*
 ICULocaleBackend::GetLanginfo(int index)
 {
+       ErrnoMaintainer errnoMaintainer;
+
        switch(index) {
                case CODESET:
                        return fCtypeData.GetLanginfo(index);
@@ -214,6 +246,8 @@
 status_t
 ICULocaleBackend::Strcoll(const char* a, const char* b, int& result)
 {
+       ErrnoMaintainer errnoMaintainer;
+
        return fCollateData.Strcoll(a, b, result);
 }
 
@@ -222,6 +256,8 @@
 ICULocaleBackend::Strxfrm(char* out, const char* in, size_t size,
        size_t& outSize)
 {
+       ErrnoMaintainer errnoMaintainer;
+
        return fCollateData.Strxfrm(out, in, size, outSize);
 }
 


Other related posts:

  • » [haiku-commits] r37736 - haiku/trunk/src/system/libroot/add-ons/icu/locale - zooey