Ignore:
Timestamp:
Mar 31, 2003, 1:54:29 PM (22 years ago)
Author:
sandervl
Message:

PF: Added vsnprintfW/snprintfW funcs for syncing with latest wine NTDLL + KDO: Made Pe2Lx dlls work again

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/unicode/string.c

    r8666 r9963  
    77#include <windows.h>
    88#include <limits.h>
     9#include <stdio.h>
     10#include <ctype.h>
    911
    1012#include "wine/unicode.h"
     
    273275  return 0L;
    274276}
     277
     278int vsnprintfW(WCHAR *str, unsigned int len, const WCHAR *format, va_list valist)
     279{
     280    unsigned int written = 0;
     281    const WCHAR *iter = format;
     282    char bufa[256], fmtbufa[64], *fmta;
     283
     284    while (*iter)
     285    {
     286        while (*iter && *iter != '%')
     287        {
     288            if (written++ >= len)
     289                return -1;
     290            *str++ = *iter++;
     291        }
     292        if (*iter == '%')
     293        {
     294            fmta = fmtbufa;
     295            *fmta++ = *iter++;
     296            while (*iter == '0' ||
     297                   *iter == '+' ||
     298                   *iter == '-' ||
     299                   *iter == ' ' ||
     300                   *iter == '0' ||
     301                   *iter == '*' ||
     302                   *iter == '#')
     303            {
     304                if (*iter == '*')
     305                {
     306                    char *buffiter = bufa;
     307                    int fieldlen = va_arg(valist, int);
     308                    sprintf(buffiter, "%d", fieldlen);
     309                    while (*buffiter)
     310                        *fmta++ = *buffiter++;
     311                }
     312                else
     313                    *fmta++ = *iter;
     314                iter++;
     315            }
     316
     317            while (isdigit(*iter))
     318                *fmta++ = *iter++;
     319
     320            if (*iter == '.')
     321            {
     322                *fmta++ = *iter++;
     323                if (*iter == '*')
     324                {
     325                    char *buffiter = bufa;
     326                    int fieldlen = va_arg(valist, int);
     327                    sprintf(buffiter, "%d", fieldlen);
     328                    while (*buffiter)
     329                        *fmta++ = *buffiter++;
     330                }
     331                else
     332                    while (isdigit(*iter))
     333                        *fmta++ = *iter++;
     334            }
     335            if (*iter == 'h' || *iter == 'l')
     336                *fmta++ = *iter++;
     337
     338            switch (*iter)
     339            {
     340            case 's':
     341            {
     342                static const WCHAR none[] = { '(','n','u','l','l',')',0 };
     343                const WCHAR *wstr = va_arg(valist, const WCHAR *);
     344                const WCHAR *striter = wstr ? wstr : none;
     345                while (*striter)
     346                {
     347                    if (written++ >= len)
     348                        return -1;
     349                    *str++ = *striter++;
     350                }
     351                iter++;
     352                break;
     353            }
     354
     355            case 'c':
     356                if (written++ >= len)
     357                    return -1;
     358                *str++ = (WCHAR)va_arg(valist, int);
     359                iter++;
     360                break;
     361
     362            default:
     363            {
     364                /* For non wc types, use system sprintf and append to wide char output */
     365                /* FIXME: for unrecognised types, should ignore % when printing */
     366                char *bufaiter = bufa;
     367                if (*iter == 'p')
     368                    sprintf(bufaiter, "%08lX", va_arg(valist, long));
     369                else
     370                {
     371                    *fmta++ = *iter;
     372                    *fmta = '\0';
     373                    if (*iter == 'f')
     374                        sprintf(bufaiter, fmtbufa, va_arg(valist, double));
     375                    else
     376                        sprintf(bufaiter, fmtbufa, va_arg(valist, void *));
     377                }
     378                while (*bufaiter)
     379                {
     380                    if (written++ >= len)
     381                        return -1;
     382                    *str++ = *bufaiter++;
     383                }
     384                iter++;
     385                break;
     386            }
     387            }
     388        }
     389    }
     390    if (written >= len)
     391        return -1;
     392    *str++ = 0;
     393    return (int)written;
     394}
     395
     396
     397int snprintfW(WCHAR *str, unsigned int len, const WCHAR *format, ...)
     398{
     399    int retval;
     400    va_list valist;
     401    va_start(valist, format);
     402    retval = vsnprintfW(str, len, format, valist);
     403    va_end(valist);
     404    return retval;
     405}
Note: See TracChangeset for help on using the changeset viewer.