Chinaunix

标题: printf 实现 [打印本页]

作者: darkce    时间: 2010-01-28 15:54
标题: printf 实现
printf 函数实现,代码仅供参考

#include <stdarg.h>
/***
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);
***/

void xPrintf(int LEVEL, const char* format, ...);
void xPrintf(int LEVEL, const char* format, ...)
{
        va_list        ap;
        va_start(ap, format);

        char buf[4096];
        char *p = buf;

        const char *f = format;
        while (*f != '\0')
        {
                if (*f != '%')
                {
                        *p++ = *f++;
                        continue;
                }

                ++f;
                int value;
                char *pl;
                char *pr;
                char *tmp;
                switch(*f++) {
                case 'd':
                        value = va_arg(ap, int);
                        if (value < 0)
                        {
                                *p++ = '-';
                                value = ~value;
                        }

                        pl = p;
                        do {
                                *p++ = value%10+'0';
                        } while ((value /=10) > 0);
                        pr = p-1;

                        // swap
                        while(pr-pl > 0)
                        {
                                char t = *pl;
                                *pl = *pr;
                                *pr = t;
                                pl++; pr--;
                        }
                        break;
                case 's':
                        tmp = va_arg(ap, char*);
                        while(*tmp != '\0')
                        {
                                *p++ = *tmp++;
                        }
                        break;
                }
        }
        va_end(ap);
        *p = '\0';

        printf("%s\r\n", buf);
}
作者: liexusong    时间: 2010-01-28 16:09
printf应该用到底层的东西吧!好像汇编等!
作者: hellioncu    时间: 2010-01-28 16:25
应该说是可变参数的用法
作者: darkce    时间: 2010-02-02 13:52
楼上说的极是..
作者: prolj    时间: 2010-02-02 14:01
唉,lz去参与glibc的开发吧
作者: c/unix    时间: 2010-02-02 15:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: shang2010    时间: 2010-02-02 20:04
我大学时候看的UNIX6的代码,

里面调用的是putchar, getchar更地层的调用,再下面才是汇编

,我说的printf是内核调用,跟库概念有点不同,

代码量大约200行




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2