Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // perform 'sprintf'-operation for parameters, passed through SCM
- int format(CRunningScript *thread, char *str, size_t len, const char *format)
- {
- unsigned int written = 0;
- const char *iter = format;
- char bufa[256], fmtbufa[64], *fmta;
- while (*iter)
- {
- while (*iter && *iter != '%')
- {
- if (written++ >= len)
- return -1;
- *str++ = *iter++;
- }
- if (*iter == '%')
- {
- if (iter[1] == '%')
- {
- if (written++ >= len)
- return -1;
- *str++ = '%'; /* "%%"->'%' */
- iter += 2;
- continue;
- }
- //get flags and width specifier
- fmta = fmtbufa;
- *fmta++ = *iter++;
- while (*iter == '0' ||
- *iter == '+' ||
- *iter == '-' ||
- *iter == ' ' ||
- *iter == '*' ||
- *iter == '#')
- {
- if (*iter == '*')
- {
- char *buffiter = bufa;
- //get width
- GetScriptParams(thread, 1);
- _itoa(opcodeParams[0].dwParam, buffiter, 10);
- while (*buffiter)
- *fmta++ = *buffiter++;
- }
- else
- *fmta++ = *iter;
- iter++;
- }
- //get immidiate width value
- while (isdigit(*iter))
- *fmta++ = *iter++;
- //get precision
- if (*iter == '.')
- {
- *fmta++ = *iter++;
- if (*iter == '*')
- {
- char *buffiter = bufa;
- GetScriptParams(thread, 1);
- _itoa(opcodeParams[0].dwParam, buffiter, 10);
- while (*buffiter)
- *fmta++ = *buffiter++;
- }
- else
- while (isdigit(*iter))
- *fmta++ = *iter++;
- }
- //get size
- if (*iter == 'h' || *iter == 'l')
- *fmta++ = *iter++;
- switch (*iter)
- {
- case 's':
- {
- static const char none[] = "(null)";
- const char *astr = readString(thread);
- const char *striter = astr ? astr : none;
- while (*striter)
- {
- if (written++ >= len)
- return -1;
- *str++ = *striter++;
- }
- iter++;
- break;
- }
- case 'c':
- if (written++ >= len)
- return -1;
- GetScriptParams(thread, 1);
- *str++ = (char)opcodeParams[0].nParam;
- iter++;
- break;
- default:
- {
- /* For non wc types, use system sprintf and append to wide char output */
- /* FIXME: for unrecognised types, should ignore % when printing */
- char *bufaiter = bufa;
- if (*iter == 'p' || *iter == 'P')
- {
- GetScriptParams(thread, 1);
- sprintf(bufaiter, "%08X", opcodeParams[0].dwParam);
- }
- else
- {
- *fmta++ = *iter;
- *fmta = '\0';
- if (*iter == 'a' || *iter == 'A' ||
- *iter == 'e' || *iter == 'E' ||
- *iter == 'f' || *iter == 'F' ||
- *iter == 'g' || *iter == 'G')
- {
- GetScriptParams(thread, 1);
- sprintf(bufaiter, fmtbufa, opcodeParams[0].fParam);
- }
- else
- {
- GetScriptParams(thread, 1);
- sprintf(bufaiter, fmtbufa, opcodeParams[0].pParam);
- }
- }
- while (*bufaiter)
- {
- if (written++ >= len)
- return -1;
- *str++ = *bufaiter++;
- }
- iter++;
- break;
- }
- }
- }
- }
- if (written >= len)
- return -1;
- *str++ = 0;
- return (int)written;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement