00642 {
00643
BOOL fAllocateMem;
00644 WCHAR prefix, fillch;
00645
int left, width, prec, size, sign, radix, upper, hprefix;
00646
int cchLimit = WSPRINTF_LIMIT, cch;
00647 LPWSTR lpT, lpTWC;
00648 LPBYTE psz;
00649 va_list varglist = arglist;
00650
union {
00651 LONG_PTR l;
00652 ULONG_PTR ul;
00653
char sz[2];
00654 WCHAR wsz[2];
00655 } val;
00656
00657
while (*lpFmt != 0) {
00658
if (*lpFmt ==
L'%') {
00659
00660
00661
00662
00663 left = 0;
00664 prefix = 0;
00665
while (*++lpFmt) {
00666
if (*lpFmt ==
L'-')
00667 left++;
00668
else if (*lpFmt ==
L'#')
00669 prefix++;
00670
else
00671
break;
00672 }
00673
00674
00675
00676
00677
if (*lpFmt ==
L'0') {
00678 fillch =
L'0';
00679 lpFmt++;
00680 }
else
00681 fillch =
L' ';
00682
00683
00684
00685
00686 lpFmt =
SP_GetFmtValueW(lpFmt, &cch);
00687 width = cch;
00688
00689
00690
00691
00692
if (*lpFmt ==
L'.') {
00693 lpFmt =
SP_GetFmtValueW(++lpFmt, &cch);
00694 prec = cch;
00695 }
else
00696 prec = -1;
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706 hprefix = 0;
00707
if ((*lpFmt ==
L'w') || (*lpFmt ==
L't')) {
00708 size = 2;
00709 lpFmt++;
00710 }
else if (*lpFmt ==
L'l') {
00711 size = 1;
00712 lpFmt++;
00713 }
else {
00714 size = 0;
00715
if (*lpFmt ==
L'h') {
00716 lpFmt++;
00717 hprefix = 1;
00718 }
00719 }
00720
00721 upper = 0;
00722 sign = 0;
00723 radix = 10;
00724
00725
switch (*lpFmt) {
00726
case 0:
00727
goto errorout;
00728
00729
case L'i':
00730
case L'd':
00731 size=1;
00732 sign++;
00733
00734
00735
00736
case L'u':
00737
00738 prefix = 0;
00739 donumeric:
00740
00741
if (left || prec >= 0)
00742 fillch =
L' ';
00743
00744
00745
00746
00747
00748
00749
if (size == 3) {
00750 val.l = va_arg(varglist, LONG_PTR);
00751 }
else if (size) {
00752 val.l = va_arg(varglist, LONG);
00753 }
else if (sign) {
00754 val.l = va_arg(varglist, SHORT);
00755 }
else {
00756 val.ul = va_arg(varglist,
unsigned);
00757 }
00758
00759
if (sign && val.l < 0
L)
00760 val.l = -val.l;
00761
else
00762 sign = 0;
00763
00764
00765
00766
00767
00768
00769
if (size != 3) {
00770 val.l &= MAXULONG;
00771 }
00772
00773 lpT = lpOut;
00774
00775
00776
00777
00778 cch =
SP_PutNumberW(lpOut, val.l, cchLimit, radix, upper);
00779
if (!(cchLimit -= cch))
00780
goto errorout;
00781
00782 lpOut += cch;
00783 width -= cch;
00784 prec -= cch;
00785
if (prec > 0)
00786 width -= prec;
00787
00788
00789
00790
00791
while (prec-- > 0)
00792
out(L
'0');
00793
00794
if (width > 0 && !left) {
00795
00796
00797
00798
if (fillch !=
L'0') {
00799
if (sign) {
00800 sign = 0;
00801
out(L
'-');
00802 width--;
00803 }
00804
00805
if (prefix) {
00806
out(prefix);
00807
out(L
'0');
00808 prefix = 0;
00809 }
00810 }
00811
00812
if (sign)
00813 width--;
00814
00815
00816
00817
00818
while (width-- > 0)
00819
out(fillch);
00820
00821
00822
00823
00824
if (sign)
00825
out(L
'-');
00826
00827
if (prefix) {
00828
out(prefix);
00829
out(L
'0');
00830 }
00831
00832
00833
00834
00835
SP_ReverseW(lpT, lpOut - 1);
00836 }
else {
00837
00838
00839
00840
if (sign) {
00841
out(L
'-');
00842 width--;
00843 }
00844
00845
if (prefix) {
00846
out(prefix);
00847
out(L
'0');
00848 }
00849
00850
00851
00852
00853
SP_ReverseW(lpT, lpOut - 1);
00854
00855
00856
00857
00858
while (width-- > 0)
00859
out(fillch);
00860 }
00861
break;
00862
00863
case L'p':
00864 size = 3;
00865
if (prec == -1) {
00866 prec = 2 *
sizeof(LONG_PTR);
00867 }
00868
00869
00870
00871
case L'X':
00872 upper++;
00873
00874
00875
00876
case L'x':
00877 radix = 16;
00878
if (prefix)
00879
if (upper)
00880 prefix =
L'X';
00881
else
00882 prefix =
L'x';
00883
goto donumeric;
00884
00885
case L'c':
00886
if (!size && !hprefix) {
00887 size = 1;
00888 }
00889
00890
00891
00892
case L'C':
00893
00894
00895
00896
00897
00898 cch = 1;
00899
if (size) {
00900 val.wsz[0] = va_arg(varglist, WCHAR);
00901 val.wsz[1] = 0;
00902 lpT = val.wsz;
00903
goto putwstring;
00904 }
else {
00905 val.sz[0] = va_arg(varglist, CHAR);
00906 val.sz[1] = 0;
00907 psz = val.sz;
00908
goto putstring;
00909 }
00910
00911
case L's':
00912
if (!size && !hprefix) {
00913 size = 1;
00914 }
00915
00916
00917
00918
case L'S':
00919
00920
00921
00922
00923
00924
if (size) {
00925 lpT = va_arg(varglist, LPWSTR);
00926
if (lpT ==
NULL) {
00927 cch = 0;
00928 }
else {
00929 cch = wcslen(lpT);
00930 }
00931 putwstring:
00932 fAllocateMem =
FALSE;
00933 }
else {
00934 psz = va_arg(varglist, LPBYTE);
00935
if (psz ==
NULL) {
00936 cch = 0;
00937 }
else {
00938 cch =
strlen(psz);
00939 }
00940 putstring:
00941 cch = MBToWCS(psz, cch, &lpTWC, -1, TRUE);
00942 fAllocateMem = (
BOOL) cch;
00943 lpT = lpTWC;
00944 }
00945
00946
if (prec >= 0 && cch > prec)
00947 cch = prec;
00948 width -= cch;
00949
00950
if (fAllocateMem) {
00951
if (cch + (width < 0 ? 0 : width) >= cchLimit) {
00952
UserLocalFree(lpTWC);
00953
goto errorout;
00954 }
00955 }
00956
00957
if (left) {
00958
while (cch--)
00959
out(*lpT++);
00960
while (width-- > 0)
00961
out(fillch);
00962 }
else {
00963
while (width-- > 0)
00964
out(fillch);
00965
while (cch--)
00966
out(*lpT++);
00967 }
00968
00969
if (fAllocateMem) {
00970
UserLocalFree(lpTWC);
00971 }
00972
00973
break;
00974
00975
default:
00976 normalch:
00977
out((WCHAR)*lpFmt);
00978
break;
00979 }
00980 }
else
00981
goto normalch;
00982
00983
00984
00985
00986 lpFmt++;
00987 }
00988
00989 errorout:
00990 *lpOut = 0;
00991
00992
return WSPRINTF_LIMIT - cchLimit;
00993 }