⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stdio.c

📁 CVAVR的函数库的源代码。开发AVR的编译器CodeVision AVR最新版本2.53的函数库c语言源代码。函数短小精悍
💻 C
📖 第 1 页 / 共 4 页
字号:
                                  if (precision>=j)
                                     {
                                     k='0';
                                     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) _PRINT_SIGN();
                                        };
                                     print_digit:
                                     _put(k,ps_ptr,&msize);
                                     if (width) --width;
                                     };
                                  --j;
                                  arg_val.n%=i;
                                  i/=base;
                                  }
                                while (i);
                            if (flags & F_LEFT_JUSTIFY)
                               while (width)
                                     {
                                     --width;
                                     _put(' ',ps_ptr,&msize);
                                     };
                        default:
                            next:
                            l=TEST_FORMAT;
                        };
             };
}
#endif
#endif

#if funcused sprintf
void sprintf(char *str,char flash *fmtstr,...)
{
va_list argptr;
ps_s p;
va_start(argptr,fmtstr);
p.ps=str;
_print(fmtstr,argptr,&p,0);
*p.ps=0;
}
#endif

#if funcused snprintf
#ifdef _MODEL_TINY_
void snprintf(char *str, unsigned char size, char flash *fmtstr,...)
#else
void snprintf(char *str, unsigned int size, char flash *fmtstr,...)
#endif
{
va_list argptr;
ps_s p;
if (size)
   {
   va_start(argptr,fmtstr);
   p.ps=str;
   _print(fmtstr,argptr,&p,size);
   *p.ps=0;
   };
}
#endif

#if funcused vsprintf
void vsprintf(char *str,char flash *fmtstr,va_list argptr)
{
ps_s p;
p.ps=str;
_print(fmtstr,argptr,&p,0);
*p.ps=0;
}
#endif

#if funcused vsnprintf
#ifdef _MODEL_TINY_
void vsnprintf (char *str, unsigned char size, char flash * fmtstr, va_list argptr)
#else
void vsnprintf (char *str, unsigned int size, char flash * fmtstr, va_list argptr)
#endif
{
ps_s p;
if (size)
   {
   p.ps=str;
   _print(fmtstr,argptr,&p,size);
   *p.ps=0;
   };
}
#endif

#if funcused printf
void printf(char flash *fmtstr,...)
{
va_list argptr;
ps_s p;
va_start(argptr,fmtstr);
p.ps=NULL;
_print(fmtstr,argptr,&p,0);
}
#endif

#if funcused vprintf
void vprintf(char flash *fmtstr,va_list argptr)
{
ps_s p;
p.ps=NULL;
_print(fmtstr,argptr,&p,0);
}
#endif

#if funcused scanf | funcused sscanf
static char _get(char *ptr_cc,ps_s *ptr_ps)
{
char k;
if (k=*ptr_cc) *ptr_cc=0;
else if (ptr_ps->ps)
   {
   if (k=*(ptr_ps->ps)) ++(ptr_ps->ps);
   }
#if defined _CHIP_ATTINY13_ | \
defined _CHIP_ATTINY22_ | defined _CHIP_ATTINY22L_ | \
defined _CHIP_ATTINY24_ | defined _CHIP_ATTINY25_ | \
defined _CHIP_ATTINY26_ | defined _CHIP_ATTINY26L_ | \
defined _CHIP_ATTINY261_ | defined _CHIP_ATTINY261V_ | \
defined _CHIP_ATTINY44_ | defined _CHIP_ATTINY45_ | \
defined _CHIP_ATTINY461_ | defined _CHIP_ATTINY461V_ | \
defined _CHIP_ATTINY84_ | defined _CHIP_ATTINY85_ | \
defined _CHIP_ATTINY861_ | defined _CHIP_ATTINY861V_ | \
defined _CHIP_AT90S2343_ | defined _CHIP_AT90LS2343_ | \
defined _CHIP_AT90C8534_ | \
defined _CHIP_AT86RF401_ | defined _CHIP_AT43USB355_

#ifdef _ALTERNATE_GETCHAR_
else k=getchar();
#elif funcused scanf
#error the scanf function can't be used as the chip doesn't have an U(S)ART
#endif

#else
else k=getchar();
#endif
return k;
}

#ifdef _SCANF_INT_WIDTH_
static signed char _scanf(char flash *fmtstr,va_list argptr,ps_s *ptr_ps)
{
void *parg;
unsigned char k,b,width;
char cc;
signed char ns,s;
unsigned int n;

cc=ns=0;
while (k=*fmtstr++)
      {
      if (isspace(k))
         {
         while ((k=_get(&cc,ptr_ps)) && isspace(k));
         cc=k;
         }
      else if (k=='%')
         {
         width=0;
         while (1)
               {
               k=*fmtstr++;
               if ((k<'0')||(k>'9')) break;
               width*=10;
               width+=k-'0';
               };
         if (k==0) break;
    	 while (isspace(b=_get(&cc,ptr_ps)));
         if (b==0) goto _scan_end;
         cc=b;
         if (width==0) width=255;
         switch (k)
             {
             case 'c':
             parg=va_arg(argptr,char *);
             *(char *)parg=_get(&cc,ptr_ps);
             break;

             case 's':
             parg=va_arg(argptr,char *);
             while (width--)
                   {
                   if (((k=_get(&cc,ptr_ps))==0) || isspace(k)) break;
                   *(char *)parg++=k;
                   };
             *(char *)parg=0;
             break;

             default:
             s=1;
             switch (k)
                    {
                    case 'd':
                    case 'i': s=0;
                    case 'u': b=10; break;
                    case 'x': b=16; break;
                    case '%': goto _scan_cmp;
                    default:  return ns;
                    };
             n=0;
             while (width--)
                   {
                   if ((k=_get(&cc,ptr_ps))<=' ') goto _scan_next;
                   if (s==0)
                      {
                      if (k=='-') {s=-1; continue;}
                      else s=1;
                      };
                   if (b==16)
                      {
                      if (!isxdigit(k)) goto _scan_next;
                      }
                   else
                   if (!isdigit(k))
                      {
                      _scan_next:
                      cc=k;
                      break;
                      };
                   if (k>='a') k-=0x57;
                   else if(k>='A') k-=0x37;
                   else k-='0';
                   n=n*b+k;
                   };
             parg=va_arg(argptr,int *);
             *(int *)parg=n*s;
             };
         ++ns;
         }
      else
         {
         _scan_cmp:
         if (k!=_get(&cc,ptr_ps))
            {
            _scan_end:
            if (ns==0) return EOF;
            break;
            };
         };
      };
return ns;
}
#elif defined _SCANF_LONG_WIDTH_
static signed char _scanf(char flash *fmtstr,va_list argptr,ps_s *ptr_ps)
{
void *parg;
unsigned char k,b,width,long_flag;
char cc;
signed char ns,s;
unsigned long n;

cc=ns=0;
while (k=*fmtstr++)
      {
      if (isspace(k))
         {
         while ((k=_get(&cc,ptr_ps)) && isspace(k));
         cc=k;
         }
      else if (k=='%')
         {
         width=0;
         while (1)
               {
               k=*fmtstr++;
               if ((k<'0')||(k>'9')) break;
               width*=10;
               width+=k-'0';
               };
         if (k==0) break;
    	 while (isspace(b=_get(&cc,ptr_ps)));
         if (b==0) goto _scan_end;
         cc=b;
         if (width==0) width=255;
    	 long_flag=0;
         switch (k)
             {
             case 'c':
             parg=va_arg(argptr,char *);
             *(char *)parg=_get(&cc,ptr_ps);
             break;

             case 's':
             parg=va_arg(argptr,char *);
             while (width--)
                   {
                   if (((k=_get(&cc,ptr_ps))==0) || isspace(k)) break;
                   *(char *)parg++=k;
                   };
             *(char *)parg=0;
             break;

             case 'l':
    	     long_flag=1;
    	     k=*fmtstr++;

             default:
             s=1;
             switch (k)
                    {
                    case 'd':
                    case 'i': s=0;
                    case 'u': b=10; break;
                    case 'x': b=16; break;
                    case '%': goto _scan_cmp;
                    default:  return ns;
                    };
             n=0;
             while (width--)
                   {
                   if ((k=_get(&cc,ptr_ps))<=' ') goto _scan_next;
                   if (s==0)
                      {
                      if (k=='-') {s=-1; continue;}
                      else s=1;
                      };
                   if (b==16)
                      {
                      if (!isxdigit(k)) goto _scan_next;
                      }
                   else
                   if (!isdigit(k))
                      {
                      _scan_next:
                      cc=k;
                      break;
                      };
                   if (k>='a') k-=0x57;
                   else if(k>='A') k-=0x37;
                   else k-='0';
                   n=n*b+k;
                   };
             n=n*s;
             if (long_flag)
                {
                parg=va_arg(argptr,long *);
                *(long *)parg=n;
                }
             else
                {
                parg=va_arg(argptr,int *);
                *(int *)parg=(int) n;
                };
             };
         ++ns;
         }
      else
         {
         _scan_cmp:
         if (k!=_get(&cc,ptr_ps))
            {
            _scan_end:
            if (ns==0) return EOF;
            break;
            };
         };
      };
return ns;
}
#endif

#endif

#if funcused sscanf
signed char sscanf(char *str,char flash *fmtstr,...)
{
va_list argptr;
ps_s p;
if (str==NULL) return -1;
va_start(argptr,fmtstr);
p.ps=str;
return _scanf(fmtstr,argptr,&p);
}
#endif

#if funcused scanf
signed char scanf(char flash *fmtstr,...)
{
va_list argptr;
ps_s p;
va_start(argptr,fmtstr);
p.ps=NULL;
return _scanf(fmtstr,argptr,&p);
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -