| 1 | 
 | 
|---|
| 2 | /***********************************************************************
 | 
|---|
| 3 | 
 | 
|---|
| 4 |   $Id: commafmt.c 98 2004-05-21 15:22:09Z root $
 | 
|---|
| 5 | 
 | 
|---|
| 6 |   Command formatting tools
 | 
|---|
| 7 | 
 | 
|---|
| 8 |   Copyright (c) 1993-98 M. Kimes
 | 
|---|
| 9 |   Copyright (c) 2004 Steven H.Levine
 | 
|---|
| 10 | 
 | 
|---|
| 11 |   Revisions     06 Jan 04 SHL - Drop hundfmt, clean commafmt
 | 
|---|
| 12 | 
 | 
|---|
| 13 | ***********************************************************************/
 | 
|---|
| 14 | 
 | 
|---|
| 15 | /*
 | 
|---|
| 16 | **  COMMAFMT.C
 | 
|---|
| 17 | **  Public domain by Bob Stout
 | 
|---|
| 18 | **
 | 
|---|
| 19 | **  Notes:  1. Use static buffer to eliminate error checks on buffer overflow
 | 
|---|
| 20 | **             and reduce code size.
 | 
|---|
| 21 | **          2. By making the numeric argument a long and prototyping it before
 | 
|---|
| 22 | **             use, passed numeric arguments will be implicitly cast to longs
 | 
|---|
| 23 | **             thereby avoiding int overflow.
 | 
|---|
| 24 | **          3. Use the thousands grouping and thousands separator from the
 | 
|---|
| 25 | **             ANSI locale to make this more robust.
 | 
|---|
| 26 | */
 | 
|---|
| 27 | 
 | 
|---|
| 28 | #pragma alloc_text(MISC8,commafmt,hundfmt)
 | 
|---|
| 29 | 
 | 
|---|
| 30 | #include <stdlib.h>
 | 
|---|
| 31 | #include <stdio.h>
 | 
|---|
| 32 | #include <string.h>
 | 
|---|
| 33 | 
 | 
|---|
| 34 | size_t commafmt(char   *buf,            /* Buffer for formatted string  */
 | 
|---|
| 35 |                 int     bufsize,        /* Size of buffer               */
 | 
|---|
| 36 |                 long    N)              /* Number to convert            */
 | 
|---|
| 37 | {
 | 
|---|
| 38 |         int len = 1;
 | 
|---|
| 39 |         int posn = 1;
 | 
|---|
| 40 |         int sign = 1;
 | 
|---|
| 41 | 
 | 
|---|
| 42 |         char *ptr = buf + bufsize - 1;
 | 
|---|
| 43 | 
 | 
|---|
| 44 |         if (bufsize < 2)
 | 
|---|
| 45 |         {
 | 
|---|
| 46 | ABORT:          *buf = 0;
 | 
|---|
| 47 |                 return 0;
 | 
|---|
| 48 |         }
 | 
|---|
| 49 | 
 | 
|---|
| 50 |         *ptr-- = 0;
 | 
|---|
| 51 |         --bufsize;
 | 
|---|
| 52 |         if (N < 0)
 | 
|---|
| 53 |         {
 | 
|---|
| 54 |                 sign = -1;
 | 
|---|
| 55 |                 N = -N;
 | 
|---|
| 56 |         }
 | 
|---|
| 57 | 
 | 
|---|
| 58 |         for ( ; len <= bufsize; ++len, ++posn)
 | 
|---|
| 59 |         {
 | 
|---|
| 60 |                 *ptr-- = (char)((N % 10L) + '0');
 | 
|---|
| 61 |                 N /= 10;
 | 
|---|
| 62 |                 if (!N)
 | 
|---|
| 63 |                         break;
 | 
|---|
| 64 |                 if (posn % 3 == 0)
 | 
|---|
| 65 |                 {
 | 
|---|
| 66 |                         *ptr-- = ',';
 | 
|---|
| 67 |                         ++len;
 | 
|---|
| 68 |                 }
 | 
|---|
| 69 |                 if (len >= bufsize)
 | 
|---|
| 70 |                         goto ABORT;
 | 
|---|
| 71 |         }
 | 
|---|
| 72 | 
 | 
|---|
| 73 |         if (sign < 0)
 | 
|---|
| 74 |         {
 | 
|---|
| 75 |                 if (bufsize == 0)
 | 
|---|
| 76 |                         goto ABORT;
 | 
|---|
| 77 |                 *ptr-- = '-';
 | 
|---|
| 78 |                 ++len;
 | 
|---|
| 79 |         }
 | 
|---|
| 80 | 
 | 
|---|
| 81 |         strcpy(buf, ++ptr);             // Left align
 | 
|---|
| 82 |         return len;
 | 
|---|
| 83 | }
 | 
|---|
| 84 | 
 | 
|---|
| 85 | 
 | 
|---|
| 86 | #if 0 // fixme
 | 
|---|
| 87 | 
 | 
|---|
| 88 | size_t hundfmt (char *buf,int bufsize,unsigned long N) {
 | 
|---|
| 89 | 
 | 
|---|
| 90 |   char           tbuf[34];
 | 
|---|
| 91 |   register char *pt,*p;
 | 
|---|
| 92 |   register int   len;
 | 
|---|
| 93 | 
 | 
|---|
| 94 |   sprintf(tbuf,"%02lu",N);
 | 
|---|
| 95 |   len = strlen(tbuf);
 | 
|---|
| 96 |   pt = tbuf;
 | 
|---|
| 97 |   p = buf;
 | 
|---|
| 98 |   bufsize--;
 | 
|---|
| 99 |   while(*pt && (p - buf) < bufsize) {
 | 
|---|
| 100 |     if(len == 2) {
 | 
|---|
| 101 |       *p = '.';
 | 
|---|
| 102 |       p++;
 | 
|---|
| 103 |     }
 | 
|---|
| 104 |     *p = *pt;
 | 
|---|
| 105 |     p++;
 | 
|---|
| 106 |     pt++;
 | 
|---|
| 107 |     len--;
 | 
|---|
| 108 |   }
 | 
|---|
| 109 |   *p = 0;
 | 
|---|
| 110 |   return p - buf;
 | 
|---|
| 111 | }
 | 
|---|
| 112 | 
 | 
|---|
| 113 | #endif 0 // fixme
 | 
|---|