Advertisement
Deji

CLEO 4 'sprintf' format

Mar 13th, 2014
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.14 KB | None | 0 0
  1.     // perform 'sprintf'-operation for parameters, passed through SCM
  2.     int format(CRunningScript *thread, char *str, size_t len, const char *format)
  3.     {
  4.         unsigned int written = 0;
  5.         const char *iter = format;
  6.         char bufa[256], fmtbufa[64], *fmta;
  7.  
  8.         while (*iter)
  9.         {
  10.             while (*iter && *iter != '%')
  11.             {
  12.                 if (written++ >= len)
  13.                     return -1;
  14.                 *str++ = *iter++;
  15.             }
  16.             if (*iter == '%')
  17.             {
  18.                 if (iter[1] == '%')
  19.                 {
  20.                     if (written++ >= len)
  21.                         return -1;
  22.                     *str++ = '%'; /* "%%"->'%' */
  23.                     iter += 2;
  24.                     continue;
  25.                 }
  26.  
  27.                 //get flags and width specifier
  28.                 fmta = fmtbufa;
  29.                 *fmta++ = *iter++;
  30.                 while (*iter == '0' ||
  31.                        *iter == '+' ||
  32.                        *iter == '-' ||
  33.                        *iter == ' ' ||
  34.                        *iter == '*' ||
  35.                        *iter == '#')
  36.                 {
  37.                     if (*iter == '*')
  38.                     {
  39.                         char *buffiter = bufa;
  40.                         //get width
  41.                         GetScriptParams(thread, 1);
  42.                         _itoa(opcodeParams[0].dwParam, buffiter, 10);
  43.                         while (*buffiter)
  44.                             *fmta++ = *buffiter++;
  45.                     }
  46.                     else
  47.                         *fmta++ = *iter;
  48.                     iter++;
  49.                 }
  50.  
  51.                 //get immidiate width value
  52.                 while (isdigit(*iter))
  53.                     *fmta++ = *iter++;
  54.  
  55.                 //get precision
  56.                 if (*iter == '.')
  57.                 {
  58.                     *fmta++ = *iter++;
  59.                     if (*iter == '*')
  60.                     {
  61.                         char *buffiter = bufa;
  62.                         GetScriptParams(thread, 1);
  63.                         _itoa(opcodeParams[0].dwParam, buffiter, 10);
  64.                         while (*buffiter)
  65.                             *fmta++ = *buffiter++;
  66.                     }
  67.                     else
  68.                         while (isdigit(*iter))
  69.                             *fmta++ = *iter++;
  70.                 }
  71.                 //get size
  72.                 if (*iter == 'h' || *iter == 'l')
  73.                     *fmta++ = *iter++;
  74.  
  75.                 switch (*iter)
  76.                 {
  77.                 case 's':
  78.                 {
  79.                     static const char none[] = "(null)";
  80.                     const char *astr = readString(thread);
  81.                     const char *striter = astr ? astr : none;
  82.                     while (*striter)
  83.                     {
  84.                         if (written++ >= len)
  85.                             return -1;
  86.                         *str++ = *striter++;
  87.                     }
  88.                     iter++;
  89.                     break;
  90.                 }
  91.  
  92.                 case 'c':
  93.                     if (written++ >= len)
  94.                         return -1;
  95.                     GetScriptParams(thread, 1);
  96.                     *str++ = (char)opcodeParams[0].nParam;
  97.                     iter++;
  98.                     break;
  99.  
  100.                 default:
  101.                 {
  102.                     /* For non wc types, use system sprintf and append to wide char output */
  103.                     /* FIXME: for unrecognised types, should ignore % when printing */
  104.                     char *bufaiter = bufa;
  105.                     if (*iter == 'p' || *iter == 'P')
  106.                     {
  107.                         GetScriptParams(thread, 1);
  108.                         sprintf(bufaiter, "%08X", opcodeParams[0].dwParam);
  109.                     }
  110.                     else
  111.                     {
  112.                         *fmta++ = *iter;
  113.                         *fmta = '\0';
  114.                         if (*iter == 'a' || *iter == 'A' ||
  115.                             *iter == 'e' || *iter == 'E' ||
  116.                             *iter == 'f' || *iter == 'F' ||
  117.                             *iter == 'g' || *iter == 'G')
  118.                         {
  119.                             GetScriptParams(thread, 1);
  120.                             sprintf(bufaiter, fmtbufa, opcodeParams[0].fParam);
  121.                         }
  122.                         else
  123.                         {
  124.                             GetScriptParams(thread, 1);
  125.                             sprintf(bufaiter, fmtbufa, opcodeParams[0].pParam);
  126.                         }
  127.                     }
  128.                     while (*bufaiter)
  129.                     {
  130.                         if (written++ >= len)
  131.                             return -1;
  132.                         *str++ = *bufaiter++;
  133.                     }
  134.                     iter++;
  135.                     break;
  136.                 }
  137.                 }
  138.             }
  139.         }
  140.         if (written >= len)
  141.             return -1;
  142.         *str++ = 0;
  143.         return (int)written;
  144.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement