This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Still improving! (Was: Re: [PATCH] Avoid strtok for thread safety)


Nathan Myers wrote:

Paolo set me straight about the format of the locale string.

 {
   char const* __save = __s;
   size_t __i = 0;
   for (; __i < _S_categories_size + _S_extra_categories_size; ++__i)
     {
       __save = std::find(__save, __s + __len, "=");
       char const* __next = std::find(__save, s + __len, ";");
       char* __new = new char[__next - __save];
       char* __eos = std::copy(__save + 1, __next, __new);
       *__eos = '\0';
       _M_names[__i] = __new;
       if (*__next == '\0')
         break;
       __save = __next + 1;
     }
 }

Thanks Nathan!

Note that the C++ algorithms have much nicer termination semantics than most of the C string functions (strcspn excepted).

Nice, I didn't consider that... However, in the meanwhile, I tried to post
(without success, due to a problem with my smtp server :( a different version
(tested x86-linux), which basically avoid half the finds thanks to the a
priori knowldege of the names of the various categories. Something like this:

{
char* __new;
const char* __end;
const char* __beg = __s + strlen(_S_categories[0]) + 1;
for (size_t __i = 0;
__i < _S_categories_size + _S_extra_categories_size - 1; ++__i)
{
__end = strpbrk(__beg, ";");
__new = new char[__end - __beg + 1];
memcpy(__new, __beg, __end - __beg);
__new[__end - __beg] = '\0';
_M_names[__i] = __new;
__beg = __end + strlen(_S_categories[__i + 1]) + 2;
}
__new = new char[__s + __len - __beg];
memcpy(__new, __beg, __s + __len - __beg);
_M_names[_S_categories_size + _S_extra_categories_size - 1] = __new;
}

Still, your solution is shorter (but has an additional 'if' in the loop ;-)

Also, it seems to me that in the existing practice of locale implementation
in v3 C++ algorithms like std::copy and std::find are not used, dunno exactly
why, however...

Ciao, Paolo.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]