home *** CD-ROM | disk | FTP | other *** search
- /*------------------------------------------------------------------------
- * $Id: printf.c,v 1.1 1993/10/25 13:15:20 carlson Exp $
- *
- * This program emulates the printf function in C.
- *
- * Revision History:
- * $Log: printf.c,v $
- * Revision 1.1 1993/10/25 13:15:20 carlson
- * Initial revision
- *
- *------------------------------------------------------------------------*/
-
- #include <stdio.h>
- #include <errno.h>
- #include <ctype.h>
- #include <stddef.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
-
- enum PSIZE { Norm, Short, Long, LongLong };
-
- union
- {
- int i;
- long l;
- unsigned long ul;
- float f;
- double d;
- char c;
- unsigned char uc;
- char* str;
- } data;
- char buffer[256];
-
- void fix_slashes (char *buff)
- {
- char *nbuff = buff;
- int i;
-
- while (*buff)
- {
- if (*buff == '\\')
- {
- buff++;
- switch (*buff)
- {
- case 'n':
- *nbuff = '\n';
- break;
-
- case 't':
- *nbuff = '\n';
- break;
-
- case 'v':
- *nbuff = '\v';
- break;
-
- case 'b':
- *nbuff = '\b';
- break;
-
- case 'r':
- *nbuff = '\r';
- break;
-
- case 'f':
- *nbuff = '\f';
- break;
-
- case '\\':
- *nbuff = '\\';
- break;
-
- case '\'':
- *nbuff = '\'';
- break;
-
- case '"':
- *nbuff = '"';
- break;
-
- case '?':
- *nbuff = '?';
- break;
-
- case 'a':
- *nbuff = '\a';
- break;
-
- default:
- if (isdigit (*buff))
- {
- *nbuff = '\0';
- i = 0;
- while (isdigit (*buff))
- {
- *nbuff = (*nbuff << 3) + (*buff - '0');
- buff++;
- i++;
- if (i >= 3)
- break;
- }
- buff--;
- }
- else
- *nbuff = *buff;
- }
- }
- else
- *nbuff = *buff;
- buff++;
- nbuff++;
- }
- *nbuff = '\0';
- }
-
- main (int argc, char *argv[])
- {
- char *frmt, *cptr, *fptr, *bptr;
- int p, i;
- enum PSIZE siz;
-
- if (argc <= 1)
- {
- fprintf (stderr, "Usage: printf <format> [ <parms> ]\n");
- fprintf (stderr,
- " <format> String that follows the same rules as\n");
- fprintf (stderr,
- " the format specifier in the printf\n");
- fprintf (stderr,
- " function in C.\n");
- fprintf (stderr,
- " <parms> Parameters to be printed using the\n");
- fprintf (stderr,
- " format specified.\n");
- exit (0);
- }
-
- frmt = strdup (argv[1]);
- fptr = frmt;
-
- for (p = 2, cptr = frmt; *cptr; )
- {
- siz = Norm;
- if (*cptr == '%' && (*(cptr+1) != '%'))
- {
- if (cptr != fptr)
- {
- i = cptr - fptr;
- strncpy (buffer, fptr, i);
- buffer[i] = '\0';
- fix_slashes (buffer);
- printf (buffer);
- fflush (stdout);
- }
-
- bptr = buffer;
- *bptr++ = *cptr++;
- if (*cptr == '\0')
- {
- *bptr = '\0';
- fix_slashes (buffer);
- printf (buffer);
- fflush (stdout);
- break;
- }
- if (strchr ("-+ #", *cptr))
- *bptr++ = *cptr++;
- while (isdigit (*cptr) || *cptr == '.')
- *bptr++ = *cptr++;
- if (*cptr == 'l')
- {
- *bptr++ = *cptr++;
- siz = Long;
- if (*cptr == 'l')
- {
- *bptr = *cptr++;
- siz = LongLong;
- }
- }
- else if (*cptr == 'h')
- {
- *bptr++ = *cptr++;
- siz = Short;
- }
- else if (*cptr == 'L')
- *bptr++ = *cptr++;
-
- *bptr++ = *cptr;
- *bptr = '\0';
- switch (*cptr)
- {
- case 'd':
- case 'i':
- if (siz == Long)
- printf (buffer, strtol (argv[p], NULL, 0));
- else if (siz = Short)
- printf (buffer, atoi (argv[p]));
- else
- printf (buffer, atoi (argv[p]));
- fflush (stdout);
- p++;
- break;
-
- case 'o':
- case 'u':
- case 'x':
- case 'X':
- printf (buffer, strtoul (argv[p], NULL, 0));
- fflush (stdout);
- p++;
- break;
-
- case 'f':
- if (siz == Long)
- {
- sscanf (argv[p], "%ld", &data.d);
- printf (buffer, data.d);
- }
- else
- {
- sscanf (argv[p], "%f", &data.f);
- printf (buffer, data.f);
- }
- fflush (stdout);
- p++;
- break;
-
- case 'e':
- case 'E':
- if (siz == Long)
- {
- sscanf (argv[p], "%le", &data.d);
- printf (buffer, data.d);
- }
- else
- {
- sscanf (argv[p], "%e", &data.f);
- printf (buffer, data.f);
- }
- fflush (stdout);
- p++;
- break;
-
- case 'g':
- case 'G':
- if (siz == Long)
- {
- sscanf (argv[p], "%lg", &data.d);
- printf (buffer, data.d);
- }
- else
- {
- sscanf (argv[p], "%g", &data.f);
- printf (buffer, data.f);
- }
- fflush (stdout);
- p++;
- break;
-
- case 'c':
- printf (buffer, *argv[p]);
- fflush (stdout);
- p++;
- break;
-
- case 'C':
- break;
-
- case 's':
- case 'S':
- case 'p':
- printf (buffer, argv[p]);
- fflush (stdout);
- p++;
- break;
-
- default:
- break;
- }
-
- cptr++;
- fptr = cptr;
- }
- else
- cptr++;
- }
-
- if (cptr != fptr)
- {
- strcpy (buffer, fptr);
- fix_slashes (buffer);
- printf (buffer);
- fflush (stdout);
- }
- }
-