Subversion Repositories Kolibri OS

Rev

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
}
153
>
154
>