ftp.nice.ch/pub/next/developer/languages/cows/COWS.1.4.s.tar.gz#/COWS/Other Files/Michal Jaegermann/testprint.c

This is testprint.c in view mode; [Download] [Up]

#include <stdio.h>

#define CPREC  12   /* fixed precision for conversion of doubles to strings */
#define WBUFSZ 128  /* size of buffer - should be big enough to hold
		       results of any conversion */

#define CVFORMAT "%.*e"

static char wbuf[WBUFSZ];  /* work buffer for number output formatting */
extern int   atoi(const char *);
extern char *strrchr(const char*, int);

/*
 * This function is doing what really "%g" sprintf() is supposed
 * to do, but it is not doing on NeXT machines, because is plainly
 * broken and NeXT does not want to be bothered to fix it.
 *
 * For simplicity we will use here a fixed precision
 *
 * Returns a number of characters written to 'wbuf' without
 * counting a trailing 0.
 *
 * This code is based on a code for sgfmt() from gawk sources.
 */
static int
dtostring(/* int prec, */ double val)
{
    int          precision, count;
    char        *pos, *dot;
    char         cvfmt[] = CVFORMAT;	/* first we will try this */

    if (val == 0.0) {
	wbuf[0] = '0';
	wbuf[1] = '\0';
	return 1;
    }
/*    precision = prec - 1; */
    precision = CPREC - 1;
    count = sprintf(wbuf, cvfmt, precision, val);
    if ((pos = strrchr(wbuf, 'e')) != NULL) {  /*exponent starts here */
	int exp = atoi(pos + 1);
	if (exp >= -4 && exp <= precision) {
	    /* try again in 'f' format */
	    *(cvfmt + (sizeof(cvfmt) - 2)) = 'f';
	    precision -= exp;
	    count = sprintf(wbuf, cvfmt, precision, val);
	    pos = wbuf + count;
	    /* a bit of paranoia, but play it safe */
	    while (*--pos == ' ')
		count -= 1;
	    pos += 1;
	}
	    
	/* remove trailing zeros */
	if (NULL != (dot = strrchr(wbuf, '.'))) {
	    while ( pos > dot && *--pos == '0')
		precision -= 1;
	    if (dot == pos)
		precision -= 1;
	    if (precision < 0)
		precision = 0;
	    count = sprintf(wbuf, cvfmt, precision, val);
	}
	else {
	    *pos = '\0';
	}
    }
    return count;
}

double data[] = {    123456789,
		     123456789012.0,
		     5.35,
		     0,
		     4.0,
		     12.0,
		     1245.237,
		     123.12,
		     10e+27};

int
main(int argc, char **argv)
{
    int count = sizeof(data) / sizeof(double);
    int i, t;
    int prec;

/***
    if (argc > 1) {
	prec = atoi(argv[1]);
    }
    else {
	prec = CPREC;
    }
***/

    for (i = 0; i < count; i++) {
	t = dtostring(/* prec, */ data[i]);
	printf("%2d %2d %s\n", i, t, wbuf);
    }
    return 0;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.