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

📄 formats.c

📁 mcdp 是一个的型的Linux下的CD播放器
💻 C
字号:
/* * modified version of stdio stuff from fefes dietlibc * http://www.fefe.de/dietlibc/ */#include "mcd.h"int _ltostr(char *s, int size, unsigned long i, int base, char UpCase) {  char *tmp;  int j=0;  s[--size]=0;  tmp=s+size;  if ((base==0)||(base>36)) base=10;  if (!i) {    *(--tmp)='0';    j=1;  }  while((tmp>s)&&(i)) {    tmp--;    if ((*tmp=i%base+'0')>'9') *tmp+=(UpCase?'A':'a')-'9'-1;    i=i/base;    j++;  }  memmove(s,tmp,j+1);  return j;}int _vsnprintf (char *str, size_t size, const char *format, va_list arg_ptr) {  size_t apos,i;  char ch,buf[1024];  char *pb;  char flag_in_sign,flag_upcase;  char flag_hash,flag_zero,flag_left,flag_space,flag_sign,flag_dot;  signed char flag_long;  long number,width,preci=0,bu_len,pad;  char padwith;  size--;  apos=0;  while (apos<size)  {    ch=*format++;    switch (ch)    {    case '%':      flag_hash=flag_upcase=0;      flag_zero=0;      flag_left=0;      flag_space=0;      flag_sign=0;      flag_dot=0;      flag_in_sign=0;      flag_long=0;      width=0;      padwith=' ';inn_vsnprintf:if (apos>=size) continue; /* ARGL !!! */      ch=*format++;      switch (ch)      {/* Format end ?!? */      case 0:       return -1;       break;/* Format flag chars */      case '#':        flag_hash=1;        goto inn_vsnprintf;      case 'h':        --flag_long;        goto inn_vsnprintf;      case 'l':        ++flag_long;        goto inn_vsnprintf;      case '0':        padwith='0';        goto inn_vsnprintf;      case '-':        flag_left=1;        goto inn_vsnprintf;      case ' ':        flag_space=1;        goto inn_vsnprintf;      case '+':        flag_sign=1;        goto inn_vsnprintf;      case '1':      case '2':      case '3':      case '4':      case '5':      case '6':      case '7':      case '8':      case '9':        if(flag_dot) return -1;        width=strtol(--format,&pb,10);        format=pb;        goto inn_vsnprintf;      case '*':        width=va_arg(arg_ptr,int);        goto inn_vsnprintf;      case '.':        flag_dot=1;        if (*format=='*') {          preci=va_arg(arg_ptr,int);          ++format;        } else {          preci=strtol(format,&pb,10);          format=pb;        }        goto inn_vsnprintf;/* Format conversion chars */      case 'c':        ch=(char)va_arg(arg_ptr,int);      case '%':        if (str) str[apos]=ch; ++apos;        break;      case 's':        pb=va_arg(arg_ptr,char *);        bu_len=str_len(pb);        if (flag_dot && bu_len>preci) bu_len=preci;        if ((unsigned long)bu_len>size-apos) bu_len=size-apos;print_out:        if (str) {          if (width && (!flag_left))          {            for (pad=width-bu_len; pad>0; --pad) str[apos++]=padwith;          }          for(i=0;i<(unsigned long)bu_len;++i) { str[apos++]=pb[i]; }          if (width && (flag_left))          { /* left pad ALLWAYS with blanks ... */            for (pad=width-bu_len; pad>0; --pad) str[apos++]=' ';          }        } else {          if (width) {            apos+=width>bu_len?width:bu_len;          } else {            apos+=size>(unsigned long)bu_len?bu_len:size;          }        }        break;        /* Numbers */      case 'b':        i=2;        goto num_vsnprintf;      case 'p':        flag_hash=1;        width=sizeof(void *)<<1;        padwith='0';        ch='x';      case 'X':        flag_upcase=(ch=='X');      case 'x':        i=16;        if (flag_hash)        {          if (str) {            str[apos++]='0';            str[apos++]=ch;          } else            apos+=2;        }        goto num_vsnprintf;      case 'd':      case 'i':        flag_in_sign=1;      case 'u':        i=10;        goto num_vsnprintf;      case 'o':        i=8;        if (flag_hash) { if (str) str[apos]='0'; ++apos; }num_vsnprintf:        if (apos>=size) continue; /* ARGL !!! */        if (flag_long>0) number=va_arg(arg_ptr,long);        else number=va_arg(arg_ptr,int);        if (flag_in_sign && (number<0))        {          number=-number;          flag_in_sign=2;        }        if (flag_long<0) number&=0xffff;        if (flag_long<-1) number&=0xff;          bu_len=_ltostr(buf+1,sizeof(buf)-1,(unsigned long) number,i,flag_upcase);        pb=buf+1;        if (flag_in_sign==2)        {          *(--pb)='-';          bu_len++;        }        else if ((flag_in_sign)&&(flag_sign || flag_space))        {          *(--pb)=(flag_sign)?'+':' ';          bu_len++;        }        goto print_out;      default:        break;      }      break;    case 0:      if (str) str[apos]=0;      return apos;    default:      if (str) str[apos]=ch; apos++;      break;    }  }  if (str) str[apos]=0;  return apos;}int _snprintf(char *str,size_t size,const char *format,...) {  int n;  va_list arg_ptr;  va_start(arg_ptr, format);  n=_vsnprintf(str,size,format,arg_ptr);  va_end (arg_ptr);  return n;}int _sprintf(char *dest,const char *format,...) {  int n;  va_list arg_ptr;  va_start(arg_ptr, format);  n=_vsnprintf(dest,1000000,format,arg_ptr);  va_end (arg_ptr);  return n;}int _printf(const char *format,...) {  int n;  char *printf_buf;  va_list arg_ptr;  va_start(arg_ptr, format);  n=_vsnprintf(0,1000000,format,arg_ptr);  va_end (arg_ptr);  va_start (arg_ptr, format);  printf_buf=alloca(n+2);  n=_vsnprintf(printf_buf,n+1,format,arg_ptr);  write(1,printf_buf,n);  va_end (arg_ptr);  return n;}

⌨️ 快捷键说明

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