Are you blogging on PH? Get your free blog.
*/
*/

View \PRINTF.C

C cross compiler for 68HC11

Submitted By: Unknown
Rating: Not rated (Rate It)


/*      minimal printf-like function
 *      printf(fmt, arg, ...)
 *            acceptable formats are %d, %o, %x, %c, %s
 *            no precision, width, or modifier
 *  the inernal buffer is only MAXCHAR long, there is no check to make sure
 *  it fits.
 *
 *      It calls a function putchar(char a) to output each character.
 */

#define MAXCHARS        512

static void itoa(char **buf, int i, int base);

int printf(char *fmt, int arg, ...)
        {
        int *p = &arg;
        char *bp, *s;
        int i;
        char buf[MAXCHARS];

        bp = buf;
        *bp = 0;
        while (*fmt)
                if (*fmt != '%')
                        *bp++ = *fmt++;
                else
                        {
                        switch (*++fmt)
                                {
                        case 'd':
                                i = *p++;
                                if (i < 0)
                                        {
                                        *bp++ = '-';
                                        i = -i;
                                        }
                                itoa(&bp, i, 10);
                                break;
                        case 'o':
                                i = *p++;
                                if (i < 0)
                                        {
                                        *bp++ = '-';
                                        i = -i;
                                        }
                                *bp++ = '0';
                                itoa(&bp, i, 8);
                                break;
                        case 'x':
                                i = *p++;
                                if (i < 0)
                                        {
                                        *bp++ = '-';
                                        i = -i;
                                        }
                                *bp++ = '0';
                                *bp++ = 'x';
                                itoa(&bp, i, 16);
                                break;
                        case 'c':
                                *bp++ = *p++;
                                break;
                        case 's':
                                s = *(char **)p;
                                p += sizeof (char **) / sizeof (int);
                                if (!s)
                                        s = "(null)";
                                while (*s)
                                        *bp++ = *s++;
                                break;
                                }
                        fmt++;
                        }
        *bp = 0;
        for (bp = buf; *bp; bp++)
                putchar(*bp);
        }

static void itoa(char **buf, int i, int base)
        {
        char *s;
#define LEN     20
        int rem;
        static char rev[LEN+1];

        rev[LEN] = 0;
        if (i == 0)
                {
                (*buf)[0] = '0';
                ++(*buf);
                return;
                }
        s = &rev[LEN];
        while (i)
                {
                rem = i % base;
                if (rem <= 10)
                        *--s = rem + '0';
                else if (base == 16)
                        *--s = "abcdef"[rem - 10];
                i /= base;
                }
        while (*s)
                {
                (*buf)[0] = *s++;
                ++(*buf);
                }
        }

corner
© 1996-2008 CommunityHeaven LLC. All rights reserved. Reproduction in whole or in part, in any form or medium without express written permission is prohibited.
Violators of this policy may be subject to legal action. Please read our Terms Of Use and Privacy Statement for more information.
North American business development: Nicolai Wadstrom. Publisher: Lars Hagelin.
Resource Listings