Rev 6732 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6732 | leency | 1 | |
2 | |||
3 | char buffer[MAX_PATH]; |
||
4 | char bufnum[32]; |
||
5 | int bufferlen; |
||
6 | int param; |
||
7 | int length; |
||
8 | int pad; |
||
9 | |||
10 | struct _wsprintf_mf{ |
||
11 | |||
12 | int width; |
||
13 | int minus ; |
||
14 | int plus ; |
||
15 | int diez ; |
||
16 | int zero ; |
||
17 | byte upcase ; |
||
18 | byte _signed;// |
||
19 | }mf; |
||
20 | |||
21 | $push EBX,ESI,EDI; |
||
22 | |||
23 | length=0; |
||
24 | EDX=mask; |
||
25 | EBX=buff; |
||
26 | for(;;){ |
||
27 | mf=0; |
||
28 | mf.precision=0x7FFF; |
||
29 | REPEATSMALL: |
||
30 | if(!DSCHAR[EDX]){ |
||
31 | AL=0; |
||
32 | $call __wsprintfproc; |
||
33 | $pop EDI,ESI,EBX; |
||
34 | return length; |
||
35 | } |
||
36 | if(DSCHAR[EDX]!='%'){ |
||
37 | WRITECHAR: AL=DSCHAR[EDX];$call __wsprintfproc; EDX++;GOTO REPEATSMALL; |
||
38 | } |
||
39 | |||
40 | GETMASK: |
||
41 | |||
42 | SWITCH(DSCHAR[EDX]){ |
||
43 | CASE '-': mf.minus++;goto GETMASK; |
||
44 | CASE '+': mf.plus ++;goto GETMASK; |
||
45 | CASE '#': mf.diez ++;goto GETMASK; |
||
46 | CASE '0': mf.zero ++;EDX++; |
||
47 | } |
||
48 | |||
49 | WHILE(DSCHAR[EDX]>='0')&&(DSCHAR[EDX]<='9'){ |
||
50 | |||
51 | } |
||
52 | if(DSCHAR[EDX]=='.'){ |
||
53 | mf.precision=0; |
||
54 | GETPRECISION: |
||
55 | EDX++; |
||
56 | if(DSCHAR[EDX]>='0') |
||
57 | &&(DSCHAR[EDX]<='9'){ |
||
58 | $push EDX;mf.precision=mf.precision*10+DSCHAR[EDX]-'0';$pop EDX; |
||
59 | GOTO GETPRECISION; |
||
60 | } |
||
61 | } |
||
62 | if(DSCHAR[EDX]=='l'){ |
||
63 | EDX++; |
||
64 | } |
||
65 | if(DSCHAR[EDX]=='h'){ |
||
66 | EDX++; |
||
67 | } |
||
68 | if(DSCHAR[EDX]<'a'){mf.upcase=1;} |
||
69 | SWITCH(DSCHAR[EDX]|0x20){ |
||
70 | CASE 'c': buffer=DSCHAR[param];bufferlen=1;goto FORMAT; |
||
71 | CASE 's': if(!DSDWORD[param])DSDWORD[param]="(null)";//?????? |
||
72 | FOR(bufferlen=0;bufferlen |
||
73 | AL=DSCHAR[DSDWORD[param]+bufferlen]; |
||
74 | if(!AL)BREAK; |
||
75 | buffer[bufferlen]=AL; |
||
76 | } |
||
77 | goto FORMAT; |
||
78 | } |
||
79 | |||
80 | //с символьными покончили. теперь числовые |
||
81 | |||
82 | if(!mf.precision)mf.precision=1; |
||
83 | if(DSCHAR[EDX]|0x20=='x'){ |
||
84 | $push EDX; |
||
85 | EDI=0;//cnt |
||
86 | EDX=DSDWORD[param]; |
||
87 | WHILE(EDX){ |
||
88 | AL=DL&0xF+0x30;if(AL>'9'){AL+='A'-'9'-1;if(!mf.upcase)AL|=0x20;} |
||
89 | bufnum[EDI]=AL;EDI++;EDX>>=4; |
||
90 | } |
||
91 | $pop EDX; |
||
92 | WHILE(EDI |
||
93 | if(mf.diez){bufnum[EDI]=DSCHAR[EDX];EDI++;bufnum[EDI]='0';EDI++;} |
||
94 | FOR(bufferlen=0;EDI;bufferlen++){ |
||
95 | EDI--;buffer[bufferlen]=bufnum[EDI]; |
||
96 | } |
||
97 | goto FORMAT; |
||
98 | } |
||
99 | switch(DSCHAR[EDX]){ |
||
100 | CASE 'i': |
||
101 | CASE 'd': $push EDX;EDX=DSDWORD[param]; |
||
102 | if(int EDX<0){-EDX;mf._signed++;} |
||
103 | GOTO WRITEINT; |
||
104 | CASE 'u': $push EDX;mf.plus=0;EDX=DSDWORD[param]; |
||
105 | WRITEINT: |
||
106 | EDI=0;//cnt |
||
107 | WHILE(EDX){ |
||
108 | EAX=0;EDX> |
||
109 | } |
||
110 | WHILE(EDI |
||
111 | if(mf._signed){bufnum[EDI]='-';EDI++;} |
||
112 | ELSE |
||
113 | if(mf.plus){bufnum[EDI]='+';EDI++;} |
||
114 | FOR(bufferlen=0;EDI;bufferlen++){ |
||
115 | EDI--;buffer[bufferlen]=bufnum[EDI]; |
||
116 | } |
||
117 | $pop EDX; |
||
118 | FORMAT: |
||
119 | EDX++; |
||
120 | param+=sizeof(int); |
||
121 | pad=mf.width-bufferlen;if(pad<0)pad=0; |
||
122 | if(!mf.minus)$call FRM; |
||
123 | FOR(EDI=0;EDI |
||
124 | if(mf.minus)$call FRM; |
||
125 | BREAK; |
||
126 | default: |
||
127 | goto WRITECHAR; |
||
128 | } |
||
129 | }//for(;;) |
||
130 | FRM: WHILE(pad){AL=' ';$call __wsprintfproc;pad--;}$ret; |
||
131 | } |
||
132 | |||
133 | :int cdecl wsprintf(...)inline{ |
||
134 | |||
135 | goto __wsprintf; |
||
136 | WSP: DSCHAR[EBX]=AL;EBX++;$ret; |
||
137 | } |
||
138 | |||
139 | :void FillMemory(int dest,len,byt){ |
||
140 | |||
141 | ECX = len; |
||
142 | AL = byt; |
||
143 | $cld $rep $stosb |
||
144 | } |
||
145 | |||
146 | //#define CopyMemory memmov |
||
147 | |||
148 | EDI = dest; |
||
149 | ESI = src; |
||
150 | ECX = len; |
||
151 | $cld $rep $movsb |
||
152 | }0)pad=0; |
||
153 | > |
||
154 | > |