home *** CD-ROM | disk | FTP | other *** search
- /*
- * sprintf.c
- *
- * By Ross Ridge
- * Public Domain
- * 92/02/01 07:30:16
- *
- */
-
- #include "defs.h"
-
- #include <ctype.h>
-
- #ifdef USE_SCCS_IDS
- static const char SCCSid[] = "@(#) mytinfo sprintf.c 3.2 92/02/01 public domain, By Ross Ridge";
- #endif
-
- #ifdef TEST
- #define USE_FAKE_STDIO
- #undef PRINTF
- #define sprintf _sprintf
- #endif
-
- #ifdef USE_FAKE_STDIO
-
- #ifdef PRINTF
- #undef putchar
- #define PUTCHAR(c) (cnt++, putchar(c))
- #else
- #define PUTCHAR(c) (*s++ = c)
- #endif
-
- #ifdef PRINTF
- #ifdef USE_STDARG
- #ifdef USE_PROTOTYPES
- int
- printf(char *fmt, ...) {
- #else
- int printf(fmt)
- char *fmt; {
- #endif
- #else
- int printf(va_alist)
- va_dcl {
- register char *fmt;
- #endif
- register int cnt;
- #else /* PRINTF */
- #ifdef lint
- /* VARARGS1 */
- int
- sprintf(str, fmt)
- char *str;
- char *fmt; {
- #else /* lint */
- #ifdef USE_STDARG
- #ifdef USE_PROTOTYPES
- int sprintf(char *str, char *fmt, ...) {
- #else /* USE_PROTOTYPES */
- int sprintf(str, fmt)
- char *str;
- char *fmt; {
- #endif /* else USE_PROTOTYPES */
- #else /* USE_STDARG */
- int sprintf(va_alist)
- va_dcl {
- register char *fmt;
- char *str;
- #endif /* else USE_STDARG */
- #endif /* else lint */
- register char *s;
- #endif /* else PRINTF */
- int minus;
- int sharp;
- int space;
- int plus;
- int zero;
- int ell;
- int prec;
- int width;
- int sign;
- int pad;
- char buf[100];
- register long n;
- register unsigned long u;
- register char *d;
- int l;
- int k;
- va_list args;
-
- #ifdef lint
- args = (va_list) 0;
- #else
- #ifdef USE_STDARG
- va_start(args, fmt);
- #else
- va_start(args);
- #ifndef PRINTF
- str = va_arg(args, char *);
- #endif
- fmt = va_arg(args, char *);
- #endif
- #endif /* else lint */
-
-
- #ifdef PRINTF
- cnt = 0;
- #else
- s = str;
- #endif
-
- while(*fmt != '\0') {
- if (*fmt == '%') {
- fmt++;
- if (*fmt == '%' || *fmt == '\0') {
- PUTCHAR('%');
- fmt++;
- continue;
- }
- minus = plus = sharp = space = zero = ell = 0;
- width = 0;
- prec = -1;
- do {
- switch(*fmt) {
- case '-': minus = 1; continue;
- case '+': plus = 1; continue;
- case ' ': space = 1; continue;
- case '#': sharp = 1; continue;
- }
- break;
- } while (*++fmt != '\0');
- if (*fmt == '0') {
- zero = 1;
- fmt++;
- }
- if (*fmt == '*') {
- width = va_arg(args, int);
- fmt++;
- } else if (isdigit(*fmt)) {
- width = *fmt++ - '0';
- while(isdigit(*fmt))
- width = 10 * width + *fmt++ - '0';
- }
- if (*fmt == '.') {
- prec = 0;
- fmt++;
- if (*fmt == '*') {
- prec = va_arg(args, int);
- fmt++;
- } else {
- while(isdigit(*fmt))
- prec = 10 * prec + *fmt++ - '0';
- }
- }
- if (*fmt == 'l') {
- ell = 1;
- fmt++;
- }
- sign = 0;
- l = 0;
- d = buf;
- switch(*fmt) {
- case 'd':
- case 'i':
- if (ell)
- n = va_arg(args, long);
- else
- n = va_arg(args, int);
- if (n < 0) {
- sign = -1;
- n = -n;
- } else {
- sign = 1;
- }
- while(n != 0) {
- *d++ = (n % 10) + '0';
- n /= 10;
- }
- break;
- case 'o':
- if (ell)
- u = va_arg(args, unsigned long);
- else
- u = va_arg(args, unsigned );
- while(u != 0) {
- *d++ = (u & 7) + '0';
- u >>= 3;
- }
- if (sharp)
- l = 1;
- break;
- case 'u':
- if (ell)
- u = va_arg(args, unsigned long);
- else
- u = va_arg(args, unsigned );
- while(u != 0) {
- *d++ = (u % 10) + '0';
- u /= 10;
- }
- break;
- case 'x':
- if (ell)
- u = va_arg(args, unsigned long);
- else
- u = va_arg(args, unsigned );
- while(u != 0) {
- *d++ = "0123456789abcdef"[u & 15];
- u >>= 4;
- }
- if (sharp)
- l += 2;
- break;
- case 'X':
- if (ell)
- u = va_arg(args, unsigned long);
- else
- u = va_arg(args, unsigned );
- while(u != 0) {
- /* just to be silly... */
- *d++ = (u & 15)["0123456789ABCDEF"];
- u >>= 4;
- }
- if (sharp)
- l += 2;
- break;
- case 's':
- d = va_arg(args, char *);
- l = strlen(d);
- break;
- case 'c':
- buf[0] = va_arg(args, int);
- l = 1;
- break;
- default:
- PUTCHAR(*fmt++);
- continue;
- }
- if (*fmt == 's' || *fmt == 'c') {
- if (prec != -1 && l > prec)
- l = prec;
- pad = width - l;
- if (zero)
- while(pad-- > 0)
- PUTCHAR('0');
- else if (!minus)
- while(pad-- > 0)
- PUTCHAR(' ');
- while(l-- > 0)
- PUTCHAR(*d++);
- if (minus)
- while(pad-- > 0)
- PUTCHAR(' ');
- } else {
- if (prec == -1)
- prec = 1;
- k = d - buf;
- if (k < prec)
- l += prec;
- else
- l += k;
- if (sign == -1)
- l++;
- else if (sign == 1 && (space || plus))
- l++;
- pad = width - l;
- if (zero)
- while(pad-- > 0)
- PUTCHAR('0');
- else if (!minus)
- while(pad-- > 0)
- PUTCHAR(' ');
- if (*fmt == 'x' && sharp) {
- PUTCHAR('0');
- PUTCHAR('x');
- } else if (*fmt == 'X' && sharp) {
- PUTCHAR('0');
- PUTCHAR('X');
- } else if (*fmt == 'o' && sharp) {
- PUTCHAR('0');
- } else if (sign == -1) {
- PUTCHAR('-');
- } else if (sign == 1 && space) {
- PUTCHAR(' ');
- } else if (sign == 1 && plus) {
- PUTCHAR('+');
- }
- while(k++ < prec)
- PUTCHAR('0');
- while(d > buf)
- PUTCHAR(*--d);
- if (!zero && minus)
- while(pad-- > 0)
- PUTCHAR(' ');
- }
- fmt++;
- } else {
- PUTCHAR(*fmt++);
- }
- }
- #ifdef PRINTF
- return cnt;
- #else
- *s = '\0';
- return s - str;
- #endif
- }
-
- #endif /* USE_FAKE_STDIO */
-
- #ifdef TEST
- #ifndef PRINTF
- #undef sprintf
- main(argc, argv)
- int argc;
- char *argv; {
- char buf[256];
-
- _sprintf(buf, "%d", 2);
- printf("'%s'\n", buf);
- sprintf(buf, "%d", 2);
- printf("'%s'\n", buf);
- _sprintf(buf, "%05d", 2);
- printf("'%s'\n", buf);
- sprintf(buf, "%05d", 2);
- printf("'%s'\n", buf);
- _sprintf(buf, "% 5d", 2);
- printf("'%s'\n", buf);
- sprintf(buf, "% 5d", 2);
- printf("'%s'\n", buf);
- _sprintf(buf, "%-5d", 2);
- printf("'%s'\n", buf);
- sprintf(buf, "%-5d", 2);
- printf("'%s'\n", buf);
- _sprintf(buf, "%5.3d", 2);
- printf("'%s'\n", buf);
- sprintf(buf, "%5.3d", 2);
- printf("'%s'\n", buf);
- _sprintf(buf, "%+d", 2);
- printf("'%s'\n", buf);
- sprintf(buf, "%+d", 2);
- printf("'%s'\n", buf);
- _sprintf(buf, "%#-1.2d", 2);
- printf("'%s'\n", buf);
- sprintf(buf, "%#-1.2d", 2);
- printf("'%s'\n", buf);
- _sprintf(buf, "% 5d", -2);
- printf("'%s'\n", buf);
- sprintf(buf, "% 5d", -2);
- printf("'%s'\n", buf);
- _sprintf(buf, "%-5d", -2);
- printf("'%s'\n", buf);
- sprintf(buf, "%-5d", -2);
- printf("'%s'\n", buf);
- _sprintf(buf, "%5.3d", -2);
- printf("'%s'\n", buf);
- sprintf(buf, "%5.3d", -2);
- printf("'%s'\n", buf);
- _sprintf(buf, "%%:%o:%x:%X:%ld:%u:%i", 10, 22, 333, -456L, 50000, 6);
- printf("'%s'\n", buf);
- sprintf(buf, "%%:%o:%x:%X:%ld:%u:%i", 10, 22, 333, -456L, 50000, 6);
- printf("'%s'\n", buf);
- _sprintf(buf, "%06o:%#6x:%#012.4X:%-5ld:%*u:%*.*i",
- 10, 22, 333, -456L, 8, 50000, 4, 2, 6);
- printf("'%s'\n", buf);
- sprintf(buf, "%06o:%#6x:%#012.4X:%-5ld:%*u:%*.*i",
- 10, 22, 333, -456L, 8, 50000, 4, 2, 6);
- printf("'%s'\n", buf);
- _sprintf(buf, "%s", "abcdefghi");
- printf("'%s'\n", buf);
- sprintf(buf, "%s", "abcdefghi");
- printf("'%s'\n", buf);
- _sprintf(buf, "%.4s", "abcdefghi");
- printf("'%s'\n", buf);
- sprintf(buf, "%.4s", "abcdefghi");
- printf("'%s'\n", buf);
- _sprintf(buf, "%4.4s", "abcdefghi");
- printf("'%s'\n", buf);
- sprintf(buf, "%4.4s", "abcdefghi");
- printf("'%s'\n", buf);
- _sprintf(buf, "%20s", "abcdefghi");
- printf("'%s'\n", buf);
- sprintf(buf, "%20s", "abcdefghi");
- printf("'%s'\n", buf);
- _sprintf(buf, "%-20s", "abcdefghi");
- printf("'%s'\n", buf);
- sprintf(buf, "%-20s", "abcdefghi");
- printf("'%s'\n", buf);
- _sprintf(buf, "%-20.20s", "abcdefghi");
- printf("'%s'\n", buf);
- sprintf(buf, "%-20.20s", "abcdefghi");
- printf("'%s'\n", buf);
- _sprintf(buf, "%#-0.20s", "abcdefghi");
- printf("'%s'\n", buf);
- sprintf(buf, "%#-0.20s", "abcdefghi");
- printf("'%s'\n", buf);
- _sprintf(buf, "%5s", "abcdefghi");
- printf("'%s'\n", buf);
- sprintf(buf, "%5s", "abcdefghi");
- printf("'%s'\n", buf);
- _sprintf(buf, "%015s", "abcdefghi");
- printf("'%s'\n", buf);
- sprintf(buf, "%015s", "abcdefghi");
- printf("'%s'\n", buf);
- _sprintf(buf, "%c", 'C');
- printf("'%s'\n", buf);
- sprintf(buf, "%c", 'C');
- printf("'%s'\n", buf);
- _sprintf(buf, "%5c", 'C');
- printf("'%s'\n", buf);
- sprintf(buf, "%5c", 'C');
- printf("'%s'\n", buf);
- _sprintf(buf, "%-5c", 'C');
- printf("'%s'\n", buf);
- sprintf(buf, "%-5c", 'C');
- printf("'%s'\n", buf);
- _sprintf(buf, "%d", 0);
- printf("'%s'\n", buf);
- sprintf(buf, "%d", 0);
- printf("'%s'\n", buf);
- _sprintf(buf, "%.d", 0);
- printf("'%s'\n", buf);
- sprintf(buf, "%.d", 0);
- printf("'%s'\n", buf);
- _sprintf(buf, "%5.0d", 0);
- printf("'%s'\n", buf);
- sprintf(buf, "%5.0d", 0);
- printf("'%s'\n", buf);
- }
- #endif /* !PRINTF */
- #endif /* TEST */
-