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

📄 fardata.c

📁 open arj source
💻 C
📖 第 1 页 / 共 2 页
字号:
      rc=pause();      #ifdef COLOR_OUTPUT       /* Restore the color after implicit recursion to msg_cprintf() */       if(!no_colors)        textcolor(color_table[ccode&H_COLORMASK].color);      #endif      if(!rc&&(ccode&H_WEAK))       longjmp(main_proc, 1);     }    }   #endif  }  t_text++; }#ifdef COLOR_OUTPUT if(redirected)  #if SFX_LEVEL>=ARJSFXV   fprintf(new_stdout, strform, n_text);  #else   printf(strform, n_text);  #endif else  scr_out(n_text);#else printf(strform, n_text);#endif}/* vcprintf() implementation */int vcprintf(int ccode, FMSG *fmt, va_list args){ int len; unsigned long num; int i, base; char FAR *s; int flags;                             /* flags to number() */ int field_width;                       /* width of output field */ int precision;                         /* min. # of digits for integers; max                                           number of chars for from string */ int qualifier;                         /* 'h', 'l', or 'L' for integer                                           fields */ int far_str;                           /* Far string qualifier */ char buf[CHUNK_SIZE];                  /* Output buffer */ int p_buf; int rc=0; int ocode;                             /* Output color code for formatted                                           fields (that's what the whole                                           routine is about!) */ long *ipl; int *ipi; int last_fmt=0; ocode=(ccode&H_NFMT)?H_STD:ccode; for(p_buf=0; *fmt; ++fmt) {  if(last_fmt&&ccode&H_NFMT)  {   last_fmt=0;   buf[p_buf]='\0';   rc+=p_buf;   p_buf=0;   flush_cbuf(ocode, buf);  }  if(*fmt!='%'||*(fmt+1)=='%')  {   if(p_buf>=CHUNK_SIZE-1)   {    buf[p_buf]='\0';    rc+=p_buf;    p_buf=0;    flush_cbuf(ccode, buf);   }   buf[p_buf++]=*fmt;   if(*fmt=='%')    ++fmt;                              /* Skip over the 2nd percent - we've handled                                           it here */   continue;  }  /* A format symbol is found - flush the buffer if:     1. It's H_NFMT, so we need to change the brush, OR     2. CHUNK_THRESHOLD has been exceeded (for numeric) */  if(ccode&H_NFMT||p_buf>=CHUNK_THRESHOLD)  {   buf[p_buf]='\0';   rc+=p_buf;   p_buf=0;   flush_cbuf(ccode, buf);  }  last_fmt=1;  /* Process flags */  flags=0;  repeat:  ++fmt;                                /* This also skips first '%' */  switch(*fmt)  {   case '-': flags|=LEFT; goto repeat;   case '+': flags|=PLUS; goto repeat;   case ' ': flags|=SPACE; goto repeat;   case '#': flags|=SPECIAL; goto repeat;   case '0': flags|=ZEROPAD; goto repeat;   case 'F': flags|=FAR_STR; goto repeat;  }  /* Get field width */  field_width=-1;  if(isdigit(*fmt))   field_width=skip_atoi((FMSG **)&fmt);  else if(*fmt=='*')  {   ++fmt;   /* It's the next argument */   field_width=va_arg(args, int);   if(field_width<0)   {    field_width=-field_width;    flags|=LEFT;   }  }  /* Get the precision */  precision=-1;  if(*fmt=='.')  {   ++fmt;    if(isdigit(*fmt))    precision=skip_atoi((FMSG **)&fmt);   else if(*fmt=='*')   {    ++fmt;    /* It's the next argument */    precision=va_arg(args, int);   }   if(precision<0)    precision=0;  }  /* Get the conversion qualifier */  qualifier=-1;  if(*fmt=='h'||*fmt=='l'||*fmt=='L')  {   qualifier=*fmt;   ++fmt;  }  /* Default base */  base=10;  switch(*fmt)  {   case 'c':    if(!(flags&LEFT))     while(--field_width>0)      buf[p_buf++]=' ';    buf[p_buf++]=(unsigned char)va_arg(args, int);    while(--field_width>0)     buf[p_buf++]=' ';    continue;   case 's':    if(!(flags&FAR_STR))     s=(char FAR *)va_arg(args, char NEAR *);    else     s=va_arg(args, char FAR *);#ifdef DEBUG    if(!s)     s="(null)";#endif    len=strnlen(s, precision);    if(!(flags&LEFT))    {     while(len<field_width--)     {      if(p_buf>=CHUNK_SIZE-1)      {       buf[p_buf]='\0';       rc+=p_buf;       p_buf=0;       flush_cbuf(ocode, buf);      }      buf[p_buf++]=' ';     }    }    for(i=0; i<len; ++i)    {     if(p_buf>=CHUNK_SIZE-1)     {      buf[p_buf]='\0';      rc+=p_buf;      p_buf=0;      flush_cbuf(ocode, buf);     }     buf[p_buf++]=*s++;    }    while(len<field_width--)    {     if(p_buf>=CHUNK_SIZE-1)     {      buf[p_buf]='\0';      rc+=p_buf;      p_buf=0;      flush_cbuf(ocode, buf);     }     buf[p_buf++]=' ';    }    continue;   case 'p':    if(field_width==-1)    {     field_width=2*sizeof(void *);     flags|=ZEROPAD;    }    p_buf+=number(buf+p_buf, (unsigned long)va_arg(args, void *), 16,                  field_width, precision, flags);    continue;   case 'n':    if(qualifier=='l')    {     ipl=va_arg(args, long *);     *ipl=p_buf;    }    else    {     ipi=va_arg(args, int *);     *ipi=p_buf;    }    continue;   /* Integer number formats - set up the flags and "break" */   case 'o':    base=8;    break;   case 'X':    flags|=LARGE;   case 'x':    base=16;    break;   case 'd':   case 'i':    flags|=SIGN;   case 'u':    break;   default:    if(*fmt!='%')     buf[p_buf++]='%';    if(*fmt)     buf[p_buf++]=*fmt;    else     --fmt;    continue;   }   if(qualifier=='l')    num=va_arg(args, unsigned long);   else if(qualifier=='h')   {#ifdef __linux__    if (flags&SIGN)     num=va_arg(args, int);             /* num=va_arg(args, short);      */    else     num=va_arg(args, int);             /* num=va_arg(args, unsigned short);*/#else    if(flags&SIGN)     num=va_arg(args, short);    else     num=va_arg(args, unsigned short);#endif   }   else if(flags&SIGN)    num=va_arg(args, int);   else    num=va_arg(args, unsigned int);   p_buf+=number(buf+p_buf, num, base, field_width, precision, flags); } if(p_buf>0) {  buf[p_buf]='\0';  rc+=p_buf;  flush_cbuf(last_fmt?ocode:ccode, buf); } return(rc);}#endif /* CUSTOM_PRINTF */#if SFX_LEVEL>=ARJSFX||defined(REARJ)/* Helper routine for scrprintf() */int msg_cprintf(int ccode, FMSG *fmt, ...){ #ifndef CUSTOM_PRINTF  char *storage; #endif va_list marker; int result; #ifndef CUSTOM_PRINTF  #ifdef FMSG_ST   storage=malloc_far_str(fmt);  #else   storage=fmt;  #endif #endif va_start(marker, fmt); #if defined(CUSTOM_PRINTF)  result=vcprintf(ccode, fmt, marker); #elif SFX_LEVEL>=ARJSFXV  result=vfprintf(new_stdout, (FMSG *)storage, marker); #else  result=vprintf(storage, marker); #endif va_end(marker); #if defined(FMSG_ST)&&!defined(CUSTOM_PRINTF)  free(storage); #endif return(result);}#endif#if SFX_LEVEL>=ARJSFX&&defined(TILED)/* A model-independent movedata() function (it must go to ENVIRON.C) */void far_memmove(char FAR *dest, char FAR *src, int length){ movedata(FP_SEG(src), FP_OFF(src), FP_SEG(dest), FP_OFF(dest), length);}#endif#if SFX_LEVEL>=ARJ/* Initializes CRC32 subsystem (only used by main()) */void init_crc(){ build_crc32_table();}/* Returns CRC32 for the given block */void crc_for_block(char *block, unsigned int length){ crc32_for_block(block, length);}/* Returns CRC32 for the given string */void crc_for_string(char *str){ crc32_for_string(str);}#endif#ifdef COLOR_OUTPUT/* Parse the color table */int parse_colors(char *opt){ int i, c; char *p; int rc=0; if(*opt=='\0') {  no_colors=1;  textcolor(7);                         /* HACK */  return(0); } while(*opt!='\0') {  for(p=opt; !isdigit(*p); p++)  {   if(*p=='\0')   {    opt=p;    goto next_opt;   }  }  c=atoi(p);  if(c>=32)   rc++;  else  {   for(i=0; color_table[i].arg!='\0'||!(++rc); i++)   {    if(color_table[i].arg==tolower(*opt))    {     color_table[i].color=(char)c;     break;    }   }  }  next_opt:  while(*opt!='\0'&&!isdigit(*opt))   opt++;  while(*opt!='\0'&&(isdigit(*opt)||!isalpha(*opt)))   opt++; } return(rc);}#endif

⌨️ 快捷键说明

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