Advertisement
tyotyotyo

ftoa, dtoa, ulltoa

Apr 22nd, 2022
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.50 KB | None | 0 0
  1. void
  2. __CRT_ulltoa(uint64_t val, /*not const*/ char* buf, size_t bufSz, int mode)
  3. {
  4.     if (val)
  5.     {
  6.         uint64_t val2 = val;
  7.  
  8.         switch (mode)
  9.         {
  10.         case 0:
  11.         case 3:
  12.         default:
  13.         {
  14.             if (mode == 3)
  15.                 val2 = __CRT_dectooctll(val);
  16.             int bufferIndex = 0;
  17.             while (1)
  18.             {
  19.                 unsigned long long mod = val2 % 10;
  20.                 __CRT_itoa_internalBuffer[bufferIndex++] = (char)mod;
  21.  
  22.                 val2 = val2 / 10;
  23.  
  24.                 if (!val2)
  25.                     break;
  26.             }
  27.             if (bufferIndex)
  28.             {
  29.                 int dstBufInd = 0;
  30.                 for (int i = 0; i < bufferIndex; ++i)
  31.                 {
  32.                     buf[dstBufInd++] = __CRT_itoa_internalBuffer[bufferIndex - i - 1] + '0';
  33.                     if (dstBufInd == bufSz)
  34.                         break;
  35.                 }
  36.                 buf[dstBufInd] = 0;
  37.             }
  38.         }
  39.         break;
  40.         case 1:
  41.         case 2:
  42.         {
  43.             int bsz = 0;
  44.             char hexbuf[10];
  45.             __CRT_dectohex(val, hexbuf, &bsz);
  46.             if (bsz)
  47.             {
  48.                 for (int i = 0; i < bsz; ++i)
  49.                 {
  50.                     buf[i] = hexbuf[i];
  51.                     buf[i + 1] = 0;
  52.                 }
  53.             }
  54.             if (mode == 2)
  55.             {
  56.                 for (size_t i2 = 0; i2 < bufSz; ++i2)
  57.                 {
  58.                     if (islower(buf[i2]))
  59.                         buf[i2] = toupper(buf[i2]);
  60.  
  61.                     if (!buf[i2])
  62.                         break;
  63.                 }
  64.             }
  65.         }break;
  66.         }
  67.     }
  68.     else
  69.     {
  70.         buf[0] = '0';
  71.         buf[1] = 0;
  72.     }
  73. }
  74.  
  75. char __CRT_itoa_buffer[31]; // for vsnprintf
  76.  
  77. // `buf` is a __CRT_dtoa_buffer if it called by __CRT_vsnprintf
  78. // I can use __CRT_itoa_buffer here for i1 and i2
  79. void
  80. _C_DECL
  81. __CRT_dtoa(double val, char* buf, size_t bufSz, int mode)
  82. {
  83.     int isMinus = 0;
  84.     if (val < 0.0)
  85.         isMinus = 1;
  86.  
  87.     int bufInd = 0;
  88.  
  89.     if (isMinus)
  90.     {
  91.         buf[bufInd++] = '-';
  92.         buf[bufInd] = 0;
  93.     }
  94.  
  95.     double ipart = 0.0;
  96.     double in = modf(val, &ipart);
  97.     in *= 10000000000000000;
  98.  
  99.     uint64_t i1 = (uint64_t)ipart;
  100.     uint64_t i2 = (uint64_t)in;
  101.  
  102.     __CRT_ulltoa(i1, __CRT_itoa_buffer, 30, 0);
  103.     if (__CRT_itoa_buffer[0])
  104.     {
  105.         for(int i = 0; i < 30; ++i)
  106.         {
  107.             if (!__CRT_itoa_buffer[i])
  108.                 break;
  109.  
  110.             buf[bufInd++] = __CRT_itoa_buffer[i];
  111.             buf[bufInd] = 0;
  112.  
  113.             if (bufInd == bufSz)
  114.                 return;
  115.         }
  116.     }
  117.  
  118.     struct lconv* loc = localeconv();
  119.  
  120.     buf[bufInd++] = loc->decimal_point[0];
  121.     buf[bufInd] = 0;
  122.  
  123.     if (bufInd == bufSz)
  124.         return;
  125.  
  126.     __CRT_ulltoa(i2, __CRT_itoa_buffer, 30, 0);
  127.     if (__CRT_itoa_buffer[0])
  128.     {
  129.         for (int i = 0; i < 30; ++i)
  130.         {
  131.             if (!__CRT_itoa_buffer[i])
  132.                 break;
  133.  
  134.             buf[bufInd++] = __CRT_itoa_buffer[i];
  135.             buf[bufInd] = 0;
  136.  
  137.             if (bufInd == bufSz)
  138.                 return;
  139.         }
  140.     }
  141.     buf[bufInd] = 0;
  142. }
  143.  
  144.  
  145. void
  146. __CRT_ftoa(float val, char* buf, size_t bufSz, int mode)
  147. {
  148.     __CRT_dtoa(val, buf, bufSz, mode);
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement