Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re: Influencing the Gconvert macro

by Corion (Patriarch)
on Sep 30, 2020 at 12:31 UTC ( [id://11122364]=note: print w/replies, xml ) Need Help??


in reply to Influencing the Gconvert macro

From this comment:

* d_Gconvert='gconvert((x),(n),(t),(b))' * d_Gconvert='gcvt((x),(n),(b))' * d_Gconvert='sprintf((b),"%.*g",(n),(x))'

... I assume that you should be able to influence the value of the Gconvert macro by supplying a value on the ./Configure command line:

sh ./Configure -des -DGconvert='sprintf(...)'
# or maybe
d_Gconvert='sprintf(...)' sh ./Configure -des

(but I have not tested this, nor do I really know how to determine if what I see is correct ;) )

The "real fix", I guess, would be to extend the Configure unit for Gconvert (likely d_gconvert.U) to check the output of the respective C programs and then choose an appropriate value...

Update: See below for Tux approach of setting up a Policy.sh file, to evade quoting problems etc

Replies are listed 'Best First'.
Re^2: Influencing the Gconvert macro
by syphilis (Archbishop) on Sep 30, 2020 at 13:37 UTC
    you should be able to influence the value of the Gconvert macro by supplying a value on the ./Configure command line

    Excellent!! Following your suggested possible candidates, I found that the configure arg -Dd_Gconvert='sprintf((b),"%.*g",(n),(x))' seems to be doing the trick with perl-5.33.2.
    sh Configure -des -Duse64bitall -Dprefix=/home/sisyphus/perl-5.33.2-d +-Uversiononly -Dusedevel -Dd_Gconvert='sprintf((b),"%.*g",(n),(x))' & +& make ..... Everything is up to date. Type 'make test' to run test suite. $ ./perl -I./lib -le 'printf "%.54g\n", 0.3;' 0.299999999999999988897769753748434595763683319091796875 sisyphus@sisyphus5-desktop:~/comp/perl-5.33.2$ ./perl -I./lib -le 'pri +ntf "%.254g\n", 1.7e+251;' 1700000000000000056638039423376108468948472250210191793353461791741809 +721595401553113821670191901996837100770654163405637701161634938299172 +691569638797131996693245937962742921605027934132599151410492365393458 +53734303029546817799537579060533492478640128
    I haven't run make test yet. It's getting late, so I'll leave that until the morning.

    Cheers,
    Rob
Re^2: Influencing the Gconvert macro
by Tux (Canon) on Sep 30, 2020 at 13:24 UTC

    If you can't or won't spend time in fixing compline/d_gconvert.U, the best approach will be to create your own Policy.sh which defined d_Gconvert exactly as you want it.

    The -D argument might work, but I am always scared of interpolation when requiring quotes. The tricky parts are the callback units.

    Setting this using env does not work.


    Enjoy, Have FUN! H.Merijn
      If you can't or won't spend time in fixing compline/d_gconvert.U ...

      If I can fix it, then I will undertake to do so.
      At the moment, however, I have no idea how d_gconvert.U fits into "the scheme of things".
      AFAICS, it's not part of the perl source.

      ... but I am always scared of interpolation when requiring quotes

      I bothers me a bit, too. Although the configure option that I used seems to have done the trick, it wasn't exactly noiseless:
      In file included from sv.c:32:0: sv.c: In function ‘Perl_sv_vcatpvfn_flags’: config.h:909:39: warning: ‘%.*g’ directive writing between 1 and 133 b +ytes into a region of size 127 [-Wformat-overflow=] #define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x)) ^ perl.h:6791:13: note: in definition of macro ‘WITH_LC_NUMERIC_SET_TO_N +EEDED_IN’ block; + \ ^~~~~ sv.c:48:5: note: in expansion of macro ‘PERL_UNUSED_RESULT’ PERL_UNUSED_RESULT(Gconvert((NV)(nv), (int)ndig, 0, buffer)) ^~~~~~~~~~~~~~~~~~ sv.c:48:24: note: in expansion of macro ‘Gconvert’ PERL_UNUSED_RESULT(Gconvert((NV)(nv), (int)ndig, 0, buffer)) ^~~~~~~~ sv.c:13118:21: note: in expansion of macro ‘SNPRINTF_G’ SNPRINTF_G(fv, ebuf, sizeof(ebuf), precis) ^ config.h:909:39: note: assuming directive output of 132 bytes #define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x)) ^ perl.h:6791:13: note: in definition of macro ‘WITH_LC_NUMERIC_SET_TO_N +EEDED_IN’ block; + \ ^~~~~ sv.c:48:5: note: in expansion of macro ‘PERL_UNUSED_RESULT’ PERL_UNUSED_RESULT(Gconvert((NV)(nv), (int)ndig, 0, buffer)) ^~~~~~~~~~~~~~~~~~ sv.c:48:24: note: in expansion of macro ‘Gconvert’ PERL_UNUSED_RESULT(Gconvert((NV)(nv), (int)ndig, 0, buffer)) ^~~~~~~~ sv.c:13118:21: note: in expansion of macro ‘SNPRINTF_G’ SNPRINTF_G(fv, ebuf, sizeof(ebuf), precis) ^ In file included from /usr/include/stdio.h:862:0, from perlio.h:41, from iperlsys.h:50, from perl.h:3934, from sv.c:32: /usr/include/x86_64-linux-gnu/bits/stdio2.h:33:10: note: ‘__builtin___ +sprintf_chk’ output between 2 and 134 bytes into a destination of siz +e 127 return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ __bos (__s), __fmt, __va_arg_pack ()); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from sv.c:32:0: config.h:909:39: warning: ‘%.*g’ directive writing between 1 and 133 b +ytes into a region of size 127 [-Wformat-overflow=] #define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x)) ^ perl.h:6791:13: note: in definition of macro ‘WITH_LC_NUMERIC_SET_TO_N +EEDED_IN’ block; + \ ^~~~~ sv.c:48:5: note: in expansion of macro ‘PERL_UNUSED_RESULT’ PERL_UNUSED_RESULT(Gconvert((NV)(nv), (int)ndig, 0, buffer)) ^~~~~~~~~~~~~~~~~~ sv.c:48:24: note: in expansion of macro ‘Gconvert’ PERL_UNUSED_RESULT(Gconvert((NV)(nv), (int)ndig, 0, buffer)) ^~~~~~~~ sv.c:13118:21: note: in expansion of macro ‘SNPRINTF_G’ SNPRINTF_G(fv, ebuf, sizeof(ebuf), precis) ^ config.h:909:39: note: assuming directive output of 132 bytes #define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x)) ^ perl.h:6791:13: note: in definition of macro ‘WITH_LC_NUMERIC_SET_TO_N +EEDED_IN’ block; + \ ^~~~~ sv.c:48:5: note: in expansion of macro ‘PERL_UNUSED_RESULT’ PERL_UNUSED_RESULT(Gconvert((NV)(nv), (int)ndig, 0, buffer)) ^~~~~~~~~~~~~~~~~~ sv.c:48:24: note: in expansion of macro ‘Gconvert’ PERL_UNUSED_RESULT(Gconvert((NV)(nv), (int)ndig, 0, buffer)) ^~~~~~~~ sv.c:13118:21: note: in expansion of macro ‘SNPRINTF_G’ SNPRINTF_G(fv, ebuf, sizeof(ebuf), precis) ^ In file included from /usr/include/stdio.h:862:0, from perlio.h:41, from iperlsys.h:50, from perl.h:3934, from sv.c:32: /usr/include/x86_64-linux-gnu/bits/stdio2.h:33:10: note: ‘__builtin___ +sprintf_chk’ output between 2 and 134 bytes into a destination of siz +e 127 return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ __bos (__s), __fmt, __va_arg_pack ()); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      Of course, I probably should at least run make test before I start getting too excited about how successful it has been ;-)

      Cheers,
      Rob

        But it is dear hacker, it is! (free interpretation of Jethro Tull's "But you can Guru, You can" in the story of the Hare who lost his spectacles)

        Please see d_gconvert.U.

        Short summary, these units are parsed, selected and ordered according to the requirements of the perl source itself and than remodelled into the script that is called Configure.

        If you dare start the journey, read the README to start this early in the perl configuration process.


        Enjoy, Have FUN! H.Merijn

        I've seen such warnings in smoke logs a number of times, and tried to investigate at least a couple of times without success; I'd love (someone) to get to the bottom of it, at least to understand if it's a real problem (that needs to be fixed by increasing a buffer size).

        I've never seen anyone report an actual problem relating to the warning though.

        Hugo

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11122364]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others exploiting the Monastery: (6)
As of 2024-04-19 11:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found