fighter2000
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2008-02-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3305回复:4

急求sprintf源代码

楼主#
更多 发布于:2004-04-18 12:59
急求sprintf源代码,只对字符串格式化而跟具体设备无关.
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-21 12:40
自己写的,只是实现了sprintf的功能
void FAR cdecl dbgPrintf(LPSTR lpBuffere,LPSTR pszFormat,    ...    )
{    
   va_list         vaList;
  
   va_start(vaList, pszFormat);
   wvsprintfA(lpBuffere, pszFormat, vaList);
   va_end(vaList);
}
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
Sunhongbo
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2006-12-18
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-20 21:08
你看一下VS.NET中带的源码
morrispan
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2004-12-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-18 18:42
#define putchar(c) outbyte(c)

static void printchar(char **str, int c)
{
extern int putchar(int c);
if (str) {
**str = c;
++(*str);
}
else (void)putchar(c);
}

#define PAD_RIGHT 1
#define PAD_ZERO 2

static int prints(char **out, const char *string, int width, int pad)
{
register int pc = 0, padchar = \' \';

if (width > 0) {
register int len = 0;
register const char *ptr;
for (ptr = string; *ptr; ++ptr) ++len;
if (len >= width) width = 0;
else width -= len;
if (pad & PAD_ZERO) padchar = \'0\';
}
if (!(pad & PAD_RIGHT)) {
for ( ; width > 0; --width) {
printchar (out, padchar);
++pc;
}
}
for ( ; *string ; ++string) {
printchar (out, *string);
++pc;
}
for ( ; width > 0; --width) {
printchar (out, padchar);
++pc;
}

return pc;
}

/* the following should be enough for 32 bit int */
#define PRINT_BUF_LEN 12

static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)
{
char print_buf[PRINT_BUF_LEN];
register char *s;
register int t, neg = 0, pc = 0;
register unsigned int u = i;

if (i == 0) {
print_buf[0] = \'0\';
print_buf[1] = \'\\0\';
return prints (out, print_buf, width, pad);
}

if (sg && b == 10 && i < 0) {
neg = 1;
u = -i;
}

s = print_buf + PRINT_BUF_LEN-1;
*s = \'\\0\';

while (u) {
t = u % b;
if( t >= 10 )
t += letbase - \'0\' - 10;
*--s = t + \'0\';
u /= b;
}

if (neg) {
if( width && (pad & PAD_ZERO) ) {
printchar (out, \'-\');
++pc;
--width;
}
else {
*--s = \'-\';
}
}

return pc + prints (out, s, width, pad);
}

static int print(char **out, int *varg)
{
register int width, pad;
register int pc = 0;
register char *format = (char *)(*varg++);
char scr[2];

for (; *format != 0; ++format) {
if (*format == \'%\') {
++format;
width = pad = 0;
if (*format == \'\\0\') break;
if (*format == \'%\') goto out;
if (*format == \'-\') {
++format;
pad = PAD_RIGHT;
}
while (*format == \'0\') {
++format;
pad |= PAD_ZERO;
}
for ( ; *format >= \'0\' && *format <= \'9\'; ++format) {
width *= 10;
width += *format - \'0\';
}
if( *format == \'s\' ) {
register char *s = *((char **)varg++);
pc += prints (out, s?s:\"(null)\", width, pad);
continue;
}
if( *format == \'d\' ) {
pc += printi (out, *varg++, 10, 1, width, pad, \'a\');
continue;
}
if( *format == \'x\' ) {
pc += printi (out, *varg++, 16, 0, width, pad, \'a\');
continue;
}
if( *format == \'X\' ) {
pc += printi (out, *varg++, 16, 0, width, pad, \'A\');
continue;
}
if( *format == \'u\' ) {
pc += printi (out, *varg++, 10, 0, width, pad, \'a\');
continue;
}
if( *format == \'c\' ) {
/* char are converted to int then pushed on the stack */
scr[0] = *varg++;
scr[1] = \'\\0\';
pc += prints (out, scr, width, pad);
continue;
}
}
else {
out:
printchar (out, *format);
++pc;
}
}
if (out) **out = \'\\0\';
return pc;
}

/* assuming sizeof(void *) == sizeof(int) */

int printf(const char *format, ...)
{
register int *varg = (int *)(&format);
return print(0, varg);
}

int sprintf(char *out, const char *format, ...)
{
register int *varg = (int *)(&format);
return print(&out, varg);
}

#ifdef TEST_PRINTF
int main(void)
{
char *ptr = \"Hello world!\";
char *np = 0;
int i = 5;
unsigned int bs = sizeof(int)*8;
int mi;
char buf[80];

mi = (1 << (bs-1)) + 1;
printf(\"%s\\n\", ptr);
printf(\"printf test\\n\");
printf(\"%s is null pointer\\n\", np);
printf(\"%d = 5\\n\", i);
printf(\"%d = - max int\\n\", mi);
printf(\"char %c = \'a\'\\n\", \'a\');
printf(\"hex %x = ff\\n\", 0xff);
printf(\"hex %02x = 00\\n\", 0);
printf(\"signed %d = unsigned %u = hex %x\\n\", -3, -3, -3);
printf(\"%d %s(s)%\", 0, \"message\");
printf(\"\\n\");
printf(\"%d %s(s) with %%\\n\", 0, \"message\");
sprintf(buf, \"justif: \\\"%-10s\\\"\\n\", \"left\"); printf(\"%s\", buf);
sprintf(buf, \"justif: \\\"%10s\\\"\\n\", \"right\"); printf(\"%s\", buf);
sprintf(buf, \" 3: %04d zero padded\\n\", 3); printf(\"%s\", buf);
sprintf(buf, \" 3: %-4d left justif.\\n\", 3); printf(\"%s\", buf);
sprintf(buf, \" 3: %4d right justif.\\n\", 3); printf(\"%s\", buf);
sprintf(buf, \"-3: %04d zero padded\\n\", -3); printf(\"%s\", buf);
sprintf(buf, \"-3: %-4d left justif.\\n\", -3); printf(\"%s\", buf);
sprintf(buf, \"-3: %4d right justif.\\n\", -3); printf(\"%s\", buf);

return 0;
}

/*
 * if you compile this file with
 *   gcc -Wall $(YOUR_C_OPTIONS) -DTEST_PRINTF -c printf.c
 * you will get a normal warning:
 *   printf.c:214: warning: spurious trailing `%\' in format
 * this line is testing an invalid % at the end of the format string.
 *
 * this should display (on 32bit int machine) :
 *
 * Hello world!
 * printf test
 * (null) is null pointer
 * 5 = 5
 * -2147483647 = - max int
 * char a = \'a\'
 * hex ff = ff
 * hex 00 = 00
 * signed -3 = unsigned 4294967293 = hex fffffffd
 * 0 message(s)
 * 0 message(s) with %
 * justif: \"left      \"
 * justif: \"     right\"
 *  3: 0003 zero padded
 *  3: 3    left justif.
 *  3:    3 right justif.
 * -3: -003 zero padded
 * -3: -3   left justif.
 * -3:   -3 right justif.
 */

#endif
Morris
yangmin26
驱动小牛
驱动小牛
  • 注册日期2003-02-22
  • 最后登录2012-11-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-18 17:50
用WDasm反反不就有了 ;)
YM KILL YOU
游客

返回顶部