This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
locale.c: Change algorithm for strxfrm() trials
authorKarl Williamson <khw@cpan.org>
Tue, 12 Apr 2016 01:11:07 +0000 (19:11 -0600)
committerKarl Williamson <khw@cpan.org>
Tue, 24 May 2016 16:26:29 +0000 (10:26 -0600)
commitc664130fefeaef47ddc7dcbf7ec1830d04af8ea7
tree3f203657dc83b4a2216da92694804e5b020fc2ff
parent3c5f993ee8b2fd0912839a82e5d7d8c871a363ea
locale.c: Change algorithm for strxfrm() trials

It's kind of guess work deciding how big a buffer to give to strxfrm().
If you give it too small a one, it will fail.  Prior to this commit, the
buffer size was doubled and then strxfrm() was called again, looping
until it worked, or we used too much memory.

Each time a new locale is made, we try to minimize the necessity of
doing this by calculating numbers 'm' and 'b' that can be plugged into
the equation

    mx + b

where 'x' is the size of the string passed to strxfrm().  strxfrm() is
roughly linear with respect to its input's length, so this generally
works without us having to do many loops to get a large enough size.

But on many systems, strxfrm(), in failing, returns how much space you
should have given it.  On such systems, we can just use that number on
the 2nd try and not have to keep guessing.  This commit changes to do
that.

But on other systems this doesn't work.  So the original method is
retained if we determine that there are problems with strxfrm(), either
from previous experience, or because using the size returned from the
first trial didn't work
embedvar.h
intrpvar.h
locale.c