CoolFace
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes838downloads
StrPrint.txt922 linesDownload Raw Back to Kernel
1 2U0 SPutChar(U8 **_dst,U8 ch,U8 **_buf)3{4  I64 i;5  U8 *dst=*_dst,*buf;6  if (_buf) {7    buf=*_buf;8    i=dst-buf;9    if (i>=MSize(buf)) {10      buf=MAlloc(i<<1+1);11      MemCpy(buf,*_buf,i);12      Free(*_buf);13      dst=buf+i;14      *_buf=buf;15    }16  }17  *dst++=ch;18  *_dst=dst;19}20 21U0 OutStr(U8 *ptr,U8 **_buf,U8 **_dst,I64 len,I64 flags)22{23  I64 i,j;24  if (!ptr)25    i=0;26  else27    i=StrLen(ptr);28  if (flags&PRTF_TRUNCATE && i>len)29    i=len;30  if (flags&PRTF_LEFT_JUSTIFY) {31    for (j=0;j<i;j++)32      SPutChar(_dst,*ptr++,_buf);33    for (j=0;j<len-i;j++)34      SPutChar(_dst,CH_SPACE,_buf);35  } else {36    for (j=0;j<len-i;j++)37      SPutChar(_dst,CH_SPACE,_buf);38    for (j=len-i;j<len;j++)39      SPutChar(_dst,*ptr++,_buf);40  }41}42 43U8 *MPrintTime(CDate cdt)44{45  CDateStruct ds;46  Date2Struct(&ds,cdt+local_time_offset);47  return MStrPrint("%02d:%02d:%02d",ds.hour,ds.min,ds.sec);48}49 50U8 *MPrintDate(CDate cdt)51{52  CDateStruct ds;53  Date2Struct(&ds,cdt+local_time_offset);54  return MStrPrint("%02d/%02d/%02d",ds.mon,ds.day_of_mon,ds.year%100);55}56 57U8 *MPrintQ(U8 *ptr,I64 flags)58{59  U8 **_buf,*buf,**_dst,*dst,buf2[8],*ptr2;60  I64 ch;61  buf=MAlloc(STR_LEN);62  _buf=&buf;63  dst=buf;64  _dst=&dst;65  if (ptr)66    while (ch=*ptr++) {67      switch (ch) {68        case '$':69          if (flags&PRTF_DOLLAR) {70            SPutChar(_dst,'\\',_buf);71            SPutChar(_dst,'d',_buf);72          } else {73            SPutChar(_dst,ch,_buf);74            SPutChar(_dst,ch,_buf);75          }76          break;77        case '%':78          SPutChar(_dst,ch,_buf);79          if (flags&PRTF_SLASH)80            SPutChar(_dst,ch,_buf);81          break;82        case '\n':83          SPutChar(_dst,'\\',_buf);84          SPutChar(_dst,'n',_buf);85          break;86        case '\r':87          SPutChar(_dst,'\\',_buf);88          SPutChar(_dst,'r',_buf);89          break;90        case '\t':91          SPutChar(_dst,'\\',_buf);92          SPutChar(_dst,'t',_buf);93          break;94        case '"':95        case '\\':96          SPutChar(_dst,'\\',_buf);97          SPutChar(_dst,ch,_buf);98          break;99        default:100          if (ch>=CH_SHIFT_SPACE && ch!=0x7F)101            SPutChar(_dst,ch,_buf);102          else {103            StrPrint(buf2,"\\x%02X",ch);104            ptr2=buf2;105            while (*ptr2)106              SPutChar(_dst,*ptr2++,_buf);107          }108      }109    }110  SPutChar(_dst,0,_buf);111  return buf;112}113 114U8 *MPrintq(U8 *ptr,I64 flags)115{116  U8 **_buf,*buf,**_dst,*dst;117  I64 i,j,ch,ch1;118  buf=MAlloc(STR_LEN);119  _buf=&buf;120  dst=buf;121  _dst=&dst;122  if (ptr)123    while (ch=*ptr++) {124      ch1=*ptr;125      switch (ch) {126        case '\\':127          switch (ch1) {128            start:129              case '0':130                SPutChar(_dst,0,_buf);131                break;132              case '\'':133                SPutChar(_dst,'\'',_buf);134                break;135              case '\`':136                SPutChar(_dst,'\`',_buf);137                break;138              case '"':139                SPutChar(_dst,'"',_buf);140                break;141              case '\\':142                SPutChar(_dst,'\\',_buf);143                break;144              case 'd':145                SPutChar(_dst,'$',_buf);146                break;147              case 'n':148                SPutChar(_dst,'\n',_buf);149                break;150              case 'r':151                SPutChar(_dst,'\r',_buf);152                break;153              case 't':154                SPutChar(_dst,'\t',_buf);155                break;156            end:157              ptr++;158              break;159 160            case 'x':161            case 'X':162              i=0;163              ptr++;164              for (j=0;j<2;j++) {165                ch1=ToUpper(*ptr++);166                if (Bt(char_bmp_hex_numeric,ch1)) {167                  if (ch1<='9')168                    i=i<<4+ch1-'0';169                  else170                    i=i<<4+ch1-'A'+10;171                } else {172                  ptr--;173                  break;174                }175              }176              SPutChar(_dst,i,_buf);177              break;178 179            default:180              SPutChar(_dst,ch,_buf);181          }182          break;183        case '$':184          SPutChar(_dst,ch,_buf);185          if (ch1=='$')186            ptr++;187          break;188        case '%':189          SPutChar(_dst,ch,_buf);190          if (flags&PRTF_SLASH && ch1=='%')191            ptr++;192          break;193        default:194          SPutChar(_dst,ch,_buf);195      }196    }197  SPutChar(_dst,0,_buf);198  return buf;199}200 201U8 *sys_pos_pows_lets=" KMGTPEZY",202   *sys_neg_pows_lets=" munpfazy",203   *sys_pos_pows_lst="kilo\0mega\0giga\0tera\0peta\0exa\0zetta\0yotta\0",204   *sys_neg_pows_lst="milli\0micro\0nano\0pico\0femto\0atto\0zepto\0yocto\0";205 206#define TMP_BUF_LEN     256207#define SLOP            8208 209U8 *StrPrintJoin(U8 *dst,U8 *fmt,I64 argc,I64 *argv)210{/*Print("") Fmt Strings211In float formatting, do not exceed 18-digits212before or after the decimal point213because the numbers before and after214the decimal point are stored215in 64-bits.  Use exponentiated forms216to avoid this.217*/218  I64 i,j,l,ch,k,k0,n,n0,len,dec_len,flags,old_flags,219        aux_fmt_num,comma_cnt,comma_fmt_cnt,cur_arg=0;220  U64 m;221  F64 d,d1;222  CDoc *doc;223  U8 *ptr,**_buf,*buf,**_dst,tmp_buf[TMP_BUF_LEN],tmp_buf2[TMP_BUF_LEN*2];224 225  if (!fmt)226    throw('StrPrint');227  if (dst) {228    _buf=NULL;229    buf=dst;230  } else {231    buf=MAlloc(STR_LEN);232    _buf=&buf;233    dst=buf;234  }235  _dst=&dst;236 237  while (ch = *fmt++) {238    if (ch=='%') {239      flags=0;240      if (*fmt=='-') {241        flags|=PRTF_LEFT_JUSTIFY;242        fmt++;243      }244      if (*fmt=='0') {245        flags|=PRTF_PAD_ZERO;246        fmt++;247      }248      len=0;249      while ('0'<=*fmt<='9')250        len=len*10+ *fmt++ -'0';251      if (*fmt=='*') {252        fmt++;253        if (cur_arg>=argc)254          throw('StrPrint');255        len=argv[cur_arg++];256      }257      dec_len=0;258      if (*fmt=='.') {259        fmt++;260        while ('0'<=*fmt<='9')261          dec_len=dec_len*10+ *fmt++ -'0';262        if (*fmt=='*') {263          fmt++;264          if (cur_arg>=argc)265            throw('StrPrint');266          dec_len=argv[cur_arg++];267        }268        flags|=PRTF_DECIMAL;269      }270 271      aux_fmt_num=0;272      while (TRUE) {273        switch (*fmt) {274          start:275            case '$':276              flags|=PRTF_DOLLAR;277              break;278            case '/':279              flags|=PRTF_SLASH;280              break;281            case ',':282              flags|=PRTF_COMMA;283              break;284            case 't':285              flags|=PRTF_TRUNCATE;286              break;287            case 'l': //harmless288              break;289          end:290            fmt++;291            break;292 293          case 'h':294            fmt++;295            flags|=PRTF_AUX_FMT_NUM;296            if (*fmt=='?') {297              fmt++;298              flags|=PRTF_QUESTION;299            } else {300              if (*fmt=='*') {301                fmt++;302                if (cur_arg>=argc)303                  throw('StrPrint');304                aux_fmt_num=argv[cur_arg++];305              } else {306                if (*fmt=='-') {307                  fmt++;308                  flags|=PRTF_NEG_AUX_FMT_NUM;309                }310                while ('0'<=*fmt<='9')311                  aux_fmt_num=aux_fmt_num*10+ *fmt++ -'0';312                if (flags&PRTF_NEG_AUX_FMT_NUM)313                  aux_fmt_num=-aux_fmt_num;314              }315            }316            break;317          default:318            goto sp_arg;319        }320      }321 322      sp_arg:323      k=0;324      switch (*fmt++) {325        start:326          case 'F':327            if (cur_arg>=argc)328              throw('StrPrint');329            if (flags&PRTF_DOLLAR) {330              doc=argv[cur_arg++];331              old_flags=doc->flags;332              doc->flags|=DOCF_NO_CURSOR;333              ptr=DocSave(doc);334              doc->flags=old_flags;335            } else336              ptr=FileRead(argv[cur_arg++]);337            break;338          case 'Q':339            if (cur_arg>=argc)340              throw('StrPrint');341            ptr=MPrintQ(argv[cur_arg++],flags);342            break;343          case 'q':344            if (cur_arg>=argc)345              throw('StrPrint');346            ptr=MPrintq(argv[cur_arg++],flags);347            break;348          case 'D':349            if (cur_arg>=argc)350              throw('StrPrint');351            ptr=MPrintDate(argv[cur_arg++]);352            break;353          case 'T':354            if (cur_arg>=argc)355              throw('StrPrint');356            ptr=MPrintTime(argv[cur_arg++]);357            break;358        end:359          OutStr(ptr,_buf,_dst,len,flags);360          Free(ptr);361          break;362 363        start:364          case 's':365            if (cur_arg>=argc)366              throw('StrPrint');367            ptr=argv[cur_arg++];368            break;369          case 'S':370            if (cur_arg>=argc)371              throw('StrPrint');372            ptr=Define(argv[cur_arg++]);373            break;374          case 'z':375            if (cur_arg+1>=argc)376              throw('StrPrint');377            ptr=LstSub(argv[cur_arg],argv[cur_arg+1]);378            cur_arg=cur_arg+2;379            break;380          case 'Z':381            if (cur_arg+1>=argc)382              throw('StrPrint');383            ptr=DefineSub(argv[cur_arg],argv[cur_arg+1]);384            cur_arg=cur_arg+2;385            break;386        end:387          OutStr(ptr,_buf,_dst,len,flags);388          break;389 390        start:391          case 'c':392            if (cur_arg>=argc)393              throw('StrPrint');394            tmp_buf[0](I64)=argv[cur_arg++];395            tmp_buf[8]=0;396            break;397          case 'C':398            if (cur_arg>=argc)399              throw('StrPrint');400            tmp_buf[0](I64)=argv[cur_arg++];401            tmp_buf[8]=0;402            ptr=tmp_buf;403            while (*ptr) {404              *ptr=ToUpper(*ptr);405              ptr++;406            }407            break;408        end:409          if (!(flags&PRTF_AUX_FMT_NUM))410            aux_fmt_num=1;411          while (aux_fmt_num-->0)412            OutStr(tmp_buf,_buf,_dst,len,flags);413          break;414 415        case 'p':416          if (cur_arg>=argc)417            throw('StrPrint');418          StrPrintFunSeg(tmp_buf,argv[cur_arg++],len,flags);419          OutStr(tmp_buf,_buf,_dst,len,flags);420          break;421        case 'P':422          if (cur_arg>=argc)423            throw('StrPrint');424          StrPrintFunSeg(tmp_buf,argv[cur_arg],len,flags);425          if (!IsRaw || !_buf) {426            StrPrint(tmp_buf2,"$LK,\"%s\",A=\"AD:0x%X\"$",427                  tmp_buf,argv[cur_arg]);428            OutStr(tmp_buf2,_buf,_dst,len,flags);429          } else430            OutStr(tmp_buf,_buf,_dst,len,flags);431          cur_arg++;432          break;433        case 'd':434          if (cur_arg>=argc)435            throw('StrPrint');436          m=argv[cur_arg++];437          if (m(I64)<0) {438            flags|=PRTF_NEG;439            m=-m;440          }441sp_out_dec:442          if (flags&PRTF_AUX_FMT_NUM) {443            if (!len) len=12;444            d=m;445            goto sp_out_eng;446          }447          if (flags&PRTF_COMMA) {448            comma_fmt_cnt=comma_cnt=3;449            do {450              tmp_buf[k++]=ModU64(&m,10)+'0';451              if (!m) break;452              if (!--comma_cnt) {453                tmp_buf[k++]=',';454                comma_cnt=3;455              }456            } while (k<TMP_BUF_LEN-SLOP);457sp_out_comma_num:458            if (flags&PRTF_NEG)459              i=1;460            else461              i=0;462            if (len<0)463              len=0;464            if (flags&PRTF_TRUNCATE && k+i>len)465              k=len-i;466            if (k<0)467              k=0;468            if (flags&PRTF_PAD_ZERO) {469              if (flags&PRTF_NEG)470                SPutChar(_dst,'-',_buf);471              comma_cnt=(len-k-i+comma_fmt_cnt-comma_cnt+1)472              %(comma_fmt_cnt+1)+1;473              for (;i<len-k;i++) {474                if (!--comma_cnt) {475                  SPutChar(_dst,',',_buf);476                  comma_cnt=comma_fmt_cnt;477                  if (++i>=len-k)478                    break;479                }480                SPutChar(_dst,'0',_buf);481              }482            } else {483              for (;i<len-k;i++)484                SPutChar(_dst,CH_SPACE,_buf);485              if (flags&PRTF_NEG)486                SPutChar(_dst,'-',_buf);487            }488          } else {489            do {490              tmp_buf[k++]=ModU64(&m,10)+'0';491              if (!m) break;492            } while (k<TMP_BUF_LEN-SLOP);493sp_out_num:494            if (flags&PRTF_NEG)495              i=1;496            else497              i=0;498            if (len<0)499              len=0;500            if (flags&PRTF_TRUNCATE && k+i>len)501              k=len-i;502            if (k<0)503              k=0;504            if (flags&PRTF_PAD_ZERO) {505              if (flags&PRTF_NEG)506                SPutChar(_dst,'-',_buf);507              for (;i<len-k;i++)508                SPutChar(_dst,'0',_buf);509            } else {510              for (;i<len-k;i++)511                SPutChar(_dst,CH_SPACE,_buf);512              if (flags&PRTF_NEG)513                SPutChar(_dst,'-',_buf);514            }515          }516          for (i=k-1;i>=0;i--)517            SPutChar(_dst,tmp_buf[i],_buf);518          break;519        case 'u':520          if (cur_arg>=argc)521            throw('StrPrint');522          m=argv[cur_arg++];523          goto sp_out_dec;524        case 'f':525          if (cur_arg>=argc)526            throw('StrPrint');527          d=argv[cur_arg++](F64);528          if (d<0) {529            flags|=PRTF_NEG;530            d=-d;531          }532 533          if (d==inf) {534sp_out_inf:535            if (flags&PRTF_NEG)536              i=1;537            else538              i=0;539            k=1;540            if (len<0)541              len=0;542            if (flags&PRTF_TRUNCATE && k+i>len)543              k=len-i;544            if (k<0)545              k=0;546            for (;i<len-k;i++)547              SPutChar(_dst,CH_SPACE,_buf);548            if (flags&PRTF_NEG)549              SPutChar(_dst,'-',_buf);550            for (i=0;i<k;i++)551              SPutChar(_dst,'inf',_buf);552            break;553          }554 555          sp_out_f:556          if (dec_len<0)557            dec_len=0;558          n=Log10(d);559          if (i=dec_len) {560            if (flags&PRTF_COMMA)561              i=i-i/4;562            if (n+i>17) {563              n+=i-17;564              d*=Pow10I64(i-n);565            } else {566              n=0;567              d*=Pow10I64(i);568            }569            i=dec_len;570          } else if (n>17) {571            n-=17;572            d*=Pow10I64(-n);573          } else574            n=0;575 576          m=Round(d);577          if (flags&PRTF_COMMA) {578            comma_cnt=i&3;579            while (i-- && k<TMP_BUF_LEN-SLOP) {580              if (i>2 && !comma_cnt--) {581                tmp_buf[k++]=',';582                comma_cnt=2;583                if (!--i) break;584              }585              if (n) {586                n--;587                tmp_buf[k++]='0';588              } else589                tmp_buf[k++]=ModU64(&m,10)+'0';590              if (!i) break;591            }592          } else {593            while (i-- && k<TMP_BUF_LEN-SLOP) {594              if (n) {595                n--;596                tmp_buf[k++]='0';597              } else598                tmp_buf[k++]=ModU64(&m,10)+'0';599            }600          }601          if (dec_len)602            tmp_buf[k++]='.';603          if (flags&PRTF_COMMA) {604            comma_cnt=3;605            do {606              if (n) {607                n--;608                tmp_buf[k++]='0';609              } else610                tmp_buf[k++]=ModU64(&m,10)+'0';611              if (!m) break;612              if (!--comma_cnt) {613                tmp_buf[k++]=',';614                comma_cnt=3;615              }616            } while (k<TMP_BUF_LEN-SLOP);617          } else {618            do {619              if (n) {620                n--;621                tmp_buf[k++]='0';622              } else623                tmp_buf[k++]=ModU64(&m,10)+'0';624              if (!m) break;625            } while (k<TMP_BUF_LEN-SLOP);626          }627          goto sp_out_num;628        case 'e':629          if (!len) len=12;630          flags|=PRTF_TRUNCATE;631 632          if (cur_arg>=argc)633            throw('StrPrint');634          d=argv[cur_arg++](F64);635          if (d<0) {636            flags|=PRTF_NEG;637            d=-d;638          }639          if (d==inf) goto sp_out_inf;640 641          if (d)642            n=Floor(Log10(d));643          else644            n=0;645sp_out_e:646          d/=Pow10I64(n);647 648          k0=k;649          for (l=0;l<2;l++) {650            n0=n;651            if (n<0) {652              n=-n;653              flags|=PRTF_NEG_E;654            } else655              flags&=~PRTF_NEG_E;656 657            i=3;658            do tmp_buf[k++]=ModU64(&n,10)+'0';659            while (n && i--);660            if (flags&PRTF_NEG_E)661              tmp_buf[k++]='-';662            tmp_buf[k++]='e';663            dec_len=len-k-2;664            if (flags&PRTF_NEG)665              dec_len--;666 667            if (d) {668              d1=d+Pow10I64(-dec_len)/2;669              if (d1<1.0) {670                d*=10;671                n=n0-1;672                k=k0;673              } else if (d1>=10) {674                d/=10;675                n=n0+1;676                k=k0;677              } else678                break;679            } else680              break;681          }682 683          goto sp_out_f;684        case 'g':685          if (!len) len=12;686          flags|=PRTF_TRUNCATE;687          if (cur_arg>=argc)688            throw('StrPrint');689          d=argv[cur_arg++](F64);690          if (d<0) {691            flags|=PRTF_NEG;692            d=-d;693          }694          if (d==inf) goto sp_out_inf;695          if (d)696            n=Floor(Log10(d));697          else698            n=0;699          if (n>=len-1-dec_len || n<-(dec_len-1))700            goto sp_out_e;701          else702            goto sp_out_f;703        case 'n':704          if (!len) len=12;705          flags|=PRTF_TRUNCATE;706          if (cur_arg>=argc)707            throw('StrPrint');708          d=argv[cur_arg++](F64);709          if (d<0) {710            flags|=PRTF_NEG;711            d=-d;712          }713sp_out_eng: //Engineering notation714          if (d==inf) goto sp_out_inf;715          if (d)716            n=FloorI64(Floor(Log10(d)),3);717          else718            n=0;719          d/=Pow10I64(n);720 721          if (n<0) {722            n=-n;723            flags|=PRTF_NEG_E;724          }725          if (flags&PRTF_AUX_FMT_NUM && -24<=n<=24) {726            if (flags&PRTF_QUESTION) {727              if (flags&PRTF_NEG_E)728                i=-n/3;729              else730                i=n/3;731              j=0;732            } else {733              if (flags&PRTF_NEG_E)734                j=-n-aux_fmt_num;735              else736                j=n-aux_fmt_num;737              d*=Pow10I64(j);738              i=aux_fmt_num/3;739            }740            if (i<0)741              tmp_buf[k++]=sys_neg_pows_lets[-i];742            else if (i>0)743              tmp_buf[k++]=sys_pos_pows_lets[i];744            else if (len!=0)745              tmp_buf[k++]=CH_SPACE;746            if (!(flags&PRTF_DECIMAL)) {747              dec_len=len-k-2;748              if (flags&PRTF_NEG)749                dec_len--;750              if (j>0) {751                if (flags&PRTF_COMMA)752                  dec_len-=4*j/3;753                else754                  dec_len-=j;755              }756              d1=d+Pow10I64(-dec_len+1)/2;757              if (d1>=10) {758                dec_len--;759                if (d1>=100)760                  dec_len--;761              }762            }763          } else {764            i=3;765            do tmp_buf[k++]=ModU64(&n,10)+'0';766            while (n && i--);767            if (flags&PRTF_NEG_E)768              tmp_buf[k++]='-';769            tmp_buf[k++]='e';770            if (!dec_len) {771              dec_len=len-k-2;772              if (flags&PRTF_NEG)773                dec_len--;774              d1=d+Pow10I64(-dec_len+1)/2;775              if (d1>=10) {776                dec_len--;777                if (d1>=100)778                  dec_len--;779              }780            }781          }782          if (flags&PRTF_COMMA) {783            if (len && dec_len>0 && !(dec_len&3))784              tmp_buf[k++]=',';785            dec_len-=dec_len/4;786          }787          goto sp_out_f;788        case 'X':789          if (cur_arg>=argc)790            throw('StrPrint');791          m=argv[cur_arg++];792          if (flags&PRTF_COMMA) {793            comma_fmt_cnt=comma_cnt=4;794            do {795              tmp_buf[k]= m&15 +'0';796              if (tmp_buf[k]>'9') tmp_buf[k]+='A'-0x3A;797              k++;798              m>>=4;799              if (!m) break;800              if (!--comma_cnt) {801                tmp_buf[k++]=',';802                comma_cnt=4;803              }804            } while (k<TMP_BUF_LEN-SLOP);805            goto sp_out_comma_num;806          } else {807            do {808              tmp_buf[k]= m&15 +'0';809              if (tmp_buf[k]>'9') tmp_buf[k]+='A'-0x3A;810              k++;811              m>>=4;812            } while (m && k<TMP_BUF_LEN-SLOP);813            goto sp_out_num;814          }815        case 'x':816          if (cur_arg>=argc)817            throw('StrPrint');818          m=argv[cur_arg++];819          if (flags&PRTF_COMMA) {820            comma_fmt_cnt=comma_cnt=4;821            do {822              tmp_buf[k]= m&15 +'0';823              if (tmp_buf[k]>'9') tmp_buf[k]+='a'-0x3A;824              k++;825              m>>=4;826              if (!m) break;827              if (!--comma_cnt) {828                tmp_buf[k++]=',';829                comma_cnt=4;830              }831            } while (k<TMP_BUF_LEN-SLOP);832            goto sp_out_comma_num;833          } else {834            do {835              tmp_buf[k]= m&15 +'0';836              if (tmp_buf[k]>'9') tmp_buf[k]+='a'-0x3A;837              k++;838              m>>=4;839            } while (m && k<TMP_BUF_LEN-SLOP);840            goto sp_out_num;841          }842        case 'b':843        case 'B':844          if (cur_arg>=argc)845            throw('StrPrint');846          m=argv[cur_arg++];847          if (flags&PRTF_COMMA) {848            comma_fmt_cnt=comma_cnt=4;849            do {850              tmp_buf[k++]= m&1 +'0';851              m>>=1;852              if (!m) break;853              if (!--comma_cnt) {854                tmp_buf[k++]=',';855                comma_cnt=4;856              }857            } while (k<TMP_BUF_LEN-SLOP);858            goto sp_out_comma_num;859          } else {860            do {861              tmp_buf[k++]= m&1 +'0';862              m>>=1;863            } while (m && k<TMP_BUF_LEN-SLOP);864            goto sp_out_num;865          }866        case '%':867          SPutChar(_dst,'%',_buf);868          break;869      }870    } else871      SPutChar(_dst,ch,_buf);872  }873  SPutChar(_dst,0,_buf);874  return buf;875}876 877U8 *StrPrint(U8 *dst,U8 *fmt,...)878{//See StrPrintJoin().879  return StrPrintJoin(dst,fmt,argc,argv);880}881 882U8 *CatPrint(U8 *_dst,U8 *fmt,...)883{//StrCat().  See StrPrintJoin().884  U8 *dst=_dst;885  while (*dst)886    dst++;887  StrPrintJoin(dst,fmt,argc,argv);888  return _dst;889}890 891U0 Print(U8 *fmt,...)892{//Print("") Fmt Strings.  See StrPrintJoin().893//Don't use this.  See Print() shortcut.894  U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);895  PutS(buf);//Don't use PutS().  See Print() shortcut.896  Free(buf);897}898 899U8 *MStrPrint(U8 *fmt,...)900{//MAlloc StrPrint.  See StrPrintJoin().901  U8 *res,*buf=StrPrintJoin(NULL,fmt,argc,argv);902  res=StrNew(buf);903  Free(buf);904  return res;905}906 907U0 PrintErr(U8 *fmt,...)908{//Print "Err:" and msg in blinking red.909  U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);910  GetOutOfDollar;911  "%,p %,p %,p %,p " ST_ERR_ST "%s",Caller,Caller(2),Caller(3),Caller(4),buf;912  Free(buf);913}914 915U0 PrintWarn(U8 *fmt,...)916{//Print "Warn:" and msg in blinking red.917  U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);918  GetOutOfDollar;919  "%,p %,p %,p %,p " ST_WARN_ST "%s",Caller,Caller(2),Caller(3),Caller(4),buf;920  Free(buf);921}922