📄 stdio.c
字号:
k=s;
--l;
}
else k='0';
}
else k=' ';
_put(k,ps_ptr,&max_size);
--width;
};
j=l;
if (flags & F_STRING)
{
while (j)
{
if (flags & F_STRING_FLASH) _put(*pp.pf++,ps_ptr,&max_size);
else _put(*pp.p++,ps_ptr,&max_size);
if (width) --width;
--j;
};
}
else
do
{
k='0';
i=*(unsigned flash *) pp.pf++;
while (n>=i)
{
++k;
n-=i;
};
if (k>'9')
{
if (flags & F_CAPS) k+=7;
else k+=0x27;
};
if (flags & F_NON_ZERO) goto print_digit;
if ((k>'0') || (i==1))
{
flags|=F_NON_ZERO;
goto print_sign;
};
if ((width>=j) && ((flags & F_LEFT_JUSTIFY)==0))
{
k=' ';
if (flags & F_PAD_CHR0)
{
k='0';
flags|=F_NON_ZERO;
print_sign:
if (flags & F_SIGNED)
{
flags&=~F_SIGNED;
_put(s,ps_ptr,&max_size);
if (width) --width;
};
};
print_digit:
_put(k,ps_ptr,&max_size);
if (width) --width;
};
--j;
}
while (i>1);
if (flags & F_LEFT_JUSTIFY)
while (width)
{
--width;
_put(' ',ps_ptr,&max_size);
};
default:
next:
l=TEST_FORMAT;
};
};
}
#elif defined _PRINTF_LONG_WIDTH_
#define F_LEFT_JUSTIFY 1
#define F_LONG 2
#define F_SIGNED 4
#define F_CAPS 8
#define F_STRING_FLASH 8
#define F_NON_ZERO 0x10
#define F_PAD_CHR0 0x80 // pad char is '0'
#ifdef _MODEL_TINY_
static void _print(char flash *fmtstr,va_list argptr,ps_s *ps_ptr, unsigned char max_size)
#else
static void _print(char flash *fmtstr,va_list argptr,ps_s *ps_ptr, unsigned int max_size)
#endif
{
unsigned char l=TEST_FORMAT,flags,j,k,width,s,base;
unsigned long n,i;
union ptr_u pp;
while (k=*fmtstr++)
switch (l)
{
case TEST_FORMAT: if (k=='%') l=GET_FLAGS; else _put(k,ps_ptr,&max_size);
break;
case GET_FLAGS: if (k=='%') {_put(k,ps_ptr,&max_size); l=TEST_FORMAT; break;};
l=GET_PAD_CHAR;
s=0;
flags=0;
if (k=='-') {flags=F_LEFT_JUSTIFY; break;};
if (k=='+') {s='+'; break;};
if (k==' ') {s=' '; break;};
case GET_PAD_CHAR:
width=0;
l=GET_WIDTH;
if (k=='0') {flags|=F_PAD_CHR0; break;}
case GET_WIDTH:
if ((k>='0') && (k<('9'+1)))
{
#ifdef _ENHANCED_CORE_
width*=10;
#else
j=width;
width<<=2;
width+=j;
width<<=1;
#endif
width+=k-'0';
break;
};
if (k=='l')
{
flags|=F_LONG;
l=DO_PRINT;
break;
};
case DO_PRINT:
switch (k)
{
case 'c':
_put(va_arg(argptr,char),ps_ptr,&max_size);
goto next;
case 's':
pp.p=va_arg(argptr,char *);
l=strlen(pp.p);
goto disp_string;
case 'p':
pp.pf=va_arg(argptr,char flash *);
l=strlenf(pp.pf);
flags|=F_STRING_FLASH;
disp_string:
flags&=~F_PAD_CHR0;
base=0;
j=0;
goto pad_left;
case 'd':
case 'i':
flags|=F_SIGNED;
case 'u':
base=10;
if (flags & F_LONG)
{i=1000000000L; l=10; goto get_arg;};
i=10000; l=5;
goto get_arg;
case 'X':
flags|=F_CAPS;
case 'x':
base=16;
if (flags & F_LONG)
{i=0x10000000L; l=8; goto get_arg;};
i=0x1000; l=4;
get_arg:
if (flags & F_LONG) n=va_arg(argptr,long);
else
if (flags & F_SIGNED) n=va_arg(argptr,int);
else n=va_arg(argptr,unsigned);
if (flags & F_SIGNED)
{
if ((long)n<0)
{
n=-(long) n;
s='-';
};
if (s) ++l;
else flags&=~F_SIGNED;
};
pad_left:
if ((flags & F_LEFT_JUSTIFY)==0)
while (width>l)
{
if (flags & F_PAD_CHR0)
{
if (flags & F_SIGNED)
{
flags&=~F_SIGNED;
k=s;
--l;
}
else k='0';
}
else k=' ';
_put(k,ps_ptr,&max_size);
--width;
};
j=l;
if (base==0)
{
while (j)
{
if (flags & F_STRING_FLASH) _put(*pp.pf++,ps_ptr,&max_size);
else _put(*pp.p++,ps_ptr,&max_size);
if (width) --width;
--j;
};
}
else
do
{
k=(unsigned char) (n/i);
if (k>9)
{
if (flags & F_CAPS) k+=0x37;
else k+=0x57;
}
else k+='0';
if (flags & F_NON_ZERO) goto print_digit;
if ((k>'0') || (i==1)) goto print_sign;
if ((width>=j) && ((flags & F_LEFT_JUSTIFY)==0))
{
k=' ';
if (flags & F_PAD_CHR0)
{
k='0';
print_sign:
flags|=F_NON_ZERO;
if (flags & F_SIGNED)
{
flags&=~F_SIGNED;
_put(s,ps_ptr,&max_size);
if (width) --width;
};
};
print_digit:
_put(k,ps_ptr,&max_size);
if (width) --width;
};
--j;
n%=i;
i/=base;
}
while (i);
if (flags & F_LEFT_JUSTIFY)
while (width)
{
--width;
_put(' ',ps_ptr,&max_size);
};
default:
next:
l=TEST_FORMAT;
};
};
}
#elif defined _PRINTF_LONG_WIDTH_PRECISION_
#define F_LEFT_JUSTIFY 1
#define F_LONG 2
#define F_SIGNED 4
#define F_CAPS 8
#define F_STRING_FLASH 8
#define F_NON_ZERO 0x10
#define F_PAD_CHR0 0x80 // pad char is '0'
#define _PRINT_SIGN() {flags&=~F_SIGNED; _put(s,ps_ptr,&max_size); if (width) --width;}
#ifdef _MODEL_TINY_
static void _print(char flash *fmtstr,va_list argptr,ps_s *ps_ptr, unsigned char max_size)
#else
static void _print(char flash *fmtstr,va_list argptr,ps_s *ps_ptr, unsigned int max_size)
#endif
{
unsigned char l=TEST_FORMAT,flags,j,k,width,precision,s,base;
unsigned long n,i;
union ptr_u pp;
while (k=*fmtstr++)
switch (l)
{
case TEST_FORMAT: if (k=='%') l=GET_FLAGS; else _put(k,ps_ptr,&max_size);
break;
case GET_FLAGS: if (k=='%') {_put(k,ps_ptr,&max_size); l=TEST_FORMAT; break;};
l=GET_PAD_CHAR;
s=0;
flags=0;
if (k=='-') {flags=F_LEFT_JUSTIFY; break;};
if (k=='+') {s='+'; break;};
if (k==' ') {s=' '; break;};
case GET_PAD_CHAR:
width=0;
l=GET_WIDTH;
if (k=='0') {flags|=F_PAD_CHR0; break;}
case GET_WIDTH:
if ((k>='0') && (k<('9'+1)))
{
#ifdef _ENHANCED_CORE_
width*=10;
#else
j=width;
width<<=2;
width+=j;
width<<=1;
#endif
width+=k-'0';
break;
};
precision=0;
if (k=='.') {l=GET_PRECISION; break;}
goto test_long;
case GET_PRECISION:
if ((k>='0') && (k<('9'+1)))
{
#ifdef _ENHANCED_CORE_
precision*=10;
#else
j=precision;
precision<<=2;
precision+=j;
precision<<=1;
#endif
precision+=k-'0';
break;
};
test_long:
if (k=='l')
{
flags|=F_LONG;
l=DO_PRINT;
break;
};
case DO_PRINT:
switch (k)
{
case 'c':
_put(va_arg(argptr,char),ps_ptr,&max_size);
goto next;
case 's':
pp.p=va_arg(argptr,char *);
l=strlen(pp.p);
goto disp_string;
case 'p':
pp.pf=va_arg(argptr,char flash *);
l=strlenf(pp.pf);
flags|=F_STRING_FLASH;
disp_string:
flags&=~F_PAD_CHR0;
if (precision && (l>precision))
l=precision;
precision=0;
base=0;
j=0;
goto pad_left;
case 'd':
case 'i':
flags|=F_SIGNED;
case 'u':
base=10;
if (flags & F_LONG)
{i=1000000000L; l=10; goto get_arg;};
i=10000; l=5;
goto get_arg;
case 'X':
flags|=F_CAPS;
case 'x':
base=16;
if (flags & F_LONG)
{i=0x10000000L; l=8; goto get_arg;};
i=0x1000; l=4;
get_arg:
if (precision) flags&=~F_PAD_CHR0;
else precision=1;
if (flags & F_LONG) n=va_arg(argptr,long);
else
if (flags & F_SIGNED) n=va_arg(argptr,int);
else n=va_arg(argptr,unsigned);
if (flags & F_SIGNED)
{
if ((long)n<0)
{
n=-(long) n;
s='-';
};
if (s) {++l; ++precision;}
else flags&=~F_SIGNED;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -