hschumann2/TempleOS-Source-Code
0838
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 