Subversion Repositories Kolibri OS

Rev

Rev 6732 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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