path: root/mcon/U/d_gconvert.U
diff options
Diffstat (limited to 'mcon/U/d_gconvert.U')
1 files changed, 147 insertions, 0 deletions
diff --git a/mcon/U/d_gconvert.U b/mcon/U/d_gconvert.U
new file mode 100644
index 0000000..b664cbc
--- /dev/null
+++ b/mcon/U/d_gconvert.U
@@ -0,0 +1,147 @@
+?RCS: $Id: d_gconvert.U,v 1997/02/28 15:33:38 ram Exp $
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS: Original Author: Andy Dougherty <>
+?RCS: $Log: d_gconvert.U,v $
+?RCS: Revision 1997/02/28 15:33:38 ram
+?RCS: patch61: integrated new unit from perl5
+?RCS: Revision 1995/07/25 13:55:59 ram
+?RCS: patch56: improved comments about the Gconvert macro (ADO)
+?RCS: patch56: force compile-link test since it may exist but be unusable (ADO)
+?RCS: Revision 1994/10/29 16:12:51 ram
+?RCS: patch36: created by ADO
+?MAKE:d_Gconvert: cat cc ccflags ldflags libs Inlibc rm _o
+?MAKE: -pick add $@ %<
+?S: This variable holds what Gconvert is defined as to convert
+?S: floating point numbers into strings. It could be 'gconvert'
+?S: or a more complex macro emulating gconvert with gcvt() or sprintf.
+?C: This preprocessor macro is defined to convert a floating point
+?C: number to a string without a trailing decimal point. This
+?C: emulates the behavior of sprintf("%g"), but is sometimes much more
+?C: efficient. If gconvert() is not available, but gcvt() drops the
+?C: trailing decimal point, then gcvt() is used. If all else fails,
+?C: a macro using sprintf("%g") is used. Arguments for the Gconvert
+?C: macro are: value, number of digits, whether trailing zeros should
+?C: be retained, and the output buffer.
+?C: Possible values are:
+?C: d_Gconvert='gconvert((x),(n),(t),(b))'
+?C: d_Gconvert='gcvt((x),(n),(b))'
+?C: d_Gconvert='sprintf((b),"%.*g",(n),(x))'
+?C: The last two assume trailing zeros should not be kept.
+?H:#define Gconvert(x,n,t,b) $d_Gconvert
+?T: xxx_list xxx_convert
+: Check how to convert floats to strings.
+echo " "
+echo "Checking for an efficient way to convert floats to strings."
+?X: We want to be sure to drop trailing decimal points (perl5
+?X: needs this).
+$cat >try.c <<'EOP'
+#ifdef TRY_gconvert
+#define Gconvert(x,n,t,b) gconvert((x),(n),(t),(b))
+char *myname = "gconvert";
+#ifdef TRY_gcvt
+#define Gconvert(x,n,t,b) gcvt((x),(n),(b))
+char *myname = "gcvt";
+#ifdef TRY_sprintf
+#define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))
+char *myname = "sprintf";
+#include <stdio.h>
+checkit(expect, got)
+char *expect;
+char *got;
+ if (strcmp(expect, got)) {
+ printf("%s oddity: Expected %s, got %s\n",
+ myname, expect, got);
+ exit(1);
+ }
+ char buf[64];
+ buf[63] = '\0';
+ /* This must be 1st test on (which?) platform */
+ /* Alan Burlison <> */
+ Gconvert(0.1, 8, 0, buf);
+ checkit("0.1", buf);
+ Gconvert(1.0, 8, 0, buf);
+ checkit("1", buf);
+ Gconvert(0.0, 8, 0, buf);
+ checkit("0", buf);
+ Gconvert(-1.0, 8, 0, buf);
+ checkit("-1", buf);
+ /* Some Linux gcvt's give 1.e+5 here. */
+ Gconvert(100000.0, 8, 0, buf);
+ checkit("100000", buf);
+ /* Some Linux gcvt's give -1.e+5 here. */
+ Gconvert(-100000.0, 8, 0, buf);
+ checkit("-100000", buf);
+ exit(0);
+?X: List of order in which to search for functions.
+?X: Usual order of efficiency is gconvert gcvt sprintf
+?X: Respect a previous or hinted value.
+case "$d_Gconvert" in
+gconvert*) xxx_list='gconvert gcvt sprintf' ;;
+gcvt*) xxx_list='gcvt gconvert sprintf' ;;
+sprintf*) xxx_list='sprintf gconvert gcvt' ;;
+*) xxx_list='gconvert gcvt sprintf' ;;
+for xxx_convert in $xxx_list; do
+ echo "Trying $xxx_convert"
+ $rm -f try try$_o
+ if $cc $ccflags -DTRY_$xxx_convert $ldflags -o try \
+ try.c $libs > /dev/null 2>&1 ; then
+ echo "$xxx_convert" found. >&4
+ if ./try; then
+ echo "I'll use $xxx_convert to convert floats into a string." >&4
+ break;
+ else
+ echo "...But $xxx_convert didn't work as I expected."
+ fi
+ else
+ echo "$xxx_convert NOT found." >&4
+ fi
+case "$xxx_convert" in
+gconvert) d_Gconvert='gconvert((x),(n),(t),(b))' ;;
+gcvt) d_Gconvert='gcvt((x),(n),(b))' ;;
+*) d_Gconvert='sprintf((b),"%.*g",(n),(x))' ;;