home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 14
/
CD_ASCQ_14_0694.iso
/
maj
/
653
/
commafmt.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-03
|
2KB
|
83 lines
/*
** COMMAFMT.C
**
** Public domain by Bob Stout
**
** Notes: 1. Use static buffer to eliminate error checks on buffer overflow
** and reduce code size.
** 2. By making the numeric argument a long and prototyping it before
** use, passed numeric arguments will be implicitly cast to longs
** thereby avoiding int overflow.
** 3. Use the thousands grouping and thousands separator from the
** ANSI locale to make this more robust.
*/
#include <string.h>
#ifdef TEST
#include <stdlib.h>
#endif
#define NUL '\0'
size_t commafmt(char *buf, /* Buffer for formatted string */
int bufsize, /* Size of buffer */
long N) /* Number to convert */
{
int len = 1, posn = 1, sign = 1;
char *ptr = buf + bufsize - 1;
if (2 > bufsize)
{
ABORT: *buf = NUL;
return 0;
}
*ptr-- = NUL;
--bufsize;
if (0L > N)
{
sign = -1;
N = -N;
}
for ( ; len <= bufsize; ++len, ++posn)
{
*ptr-- = (char)((N % 10L) + '0');
if (0L == (N /= 10L))
break;
if (0 == (posn % 3))
{
*ptr-- = ',';
++len;
}
if (len >= bufsize)
goto ABORT;
}
if (0 > sign)
{
if (0 == bufsize)
goto ABORT;
*ptr-- = '-';
++len;
}
strcpy(buf, ++ptr);
return (size_t)len;
}
#ifdef TEST
void main(int argc, char *argv[])
{
size_t len;
char buf[20];
long N;
N = strtol(argv[1], NULL, 10);
len = commafmt(buf, 20, N);
printf("%s converts to %s and returned %d\n", argv[1], buf, len);
}
#endif