Microsoft lifestyle
От: volk  
Дата: 05.10.07 13:30
Оценка: 4 (2) :))) :))) :)))

...There is no indication of success or failure. Failure is rare.

(c) MSDN, CharLower

Тот, кто желает, но не делает, распространяет чуму.
Re: Microsoft lifestyle
От: Sni4ok  
Дата: 05.10.07 21:35
Оценка:
Здравствуйте, volk, Вы писали:

буфер там просто под строку выделяется, если он не выделился- то и не будет приводиться, а так как в си исключений нет,
то проще эту вероятность ошибки просто проигнорировать)
из исходников reactos:
LPSTR
WINAPI
CharLowerA(LPSTR x)
{
    if (!HIWORD(x)) return (LPSTR)tolower((char)(int)x);
    CharLowerBuffA(x, strlen(x));
    return x;
}
DWORD
WINAPI
CharLowerBuffA(LPSTR str, DWORD len)
{
    DWORD lenW;
    WCHAR *strW;
    if (!str) return 0; /* YES */

    lenW = MultiByteToWideChar(CP_ACP, 0, str, len, NULL, 0);
    strW = HeapAlloc(GetProcessHeap(), 0, lenW * sizeof(WCHAR));
    if (strW) {
        MultiByteToWideChar(CP_ACP, 0, str, len, strW, lenW);
        CharLowerBuffW(strW, lenW);
        len = WideCharToMultiByte(CP_ACP, 0, strW, lenW, str, len, NULL, NULL);
        HeapFree(GetProcessHeap(), 0, strW);
        return len;
    }
    return 0;
}
Re[2]: Microsoft lifestyle
От: volk  
Дата: 06.10.07 10:58
Оценка: 1 (1)
Здравствуйте, Sni4ok, Вы писали:

S>буфер там просто под строку выделяется, если он не выделился- то и не будет приводиться, а так как в си исключений нет, то проще эту вероятность ошибки просто проигнорировать)


За "мухой" потенциальной ошибки с выделением буфера ты не заметил жирного слона.

А слон прячется вот где:

#include <windows.h>
#include <cstdio>

// Не самый редкий вариант -- полтора миллиарда потенциальных пользователей!
#define  CP_ACP 936


DWORD
WINAPI
CharLowerBuffA_(LPSTR str, DWORD len)
{
    DWORD lenW;
    WCHAR *strW;
    if (!str) return 0; /* YES */

    lenW = MultiByteToWideChar(CP_ACP, 0, str, len, NULL, 0);
    strW = (WCHAR *)HeapAlloc(GetProcessHeap(), 0, lenW * sizeof(WCHAR));
    if (strW) {
        MultiByteToWideChar(CP_ACP, 0, str, len, strW, lenW);
        CharLowerBuffW(strW, lenW);
        len = WideCharToMultiByte(CP_ACP, 0, strW, lenW, str, len, NULL, NULL);
        HeapFree(GetProcessHeap(), 0, strW);
        return len;
    }
    return 0;
}

LPSTR
WINAPI
CharLowerA_(LPSTR x)
{
    if (!HIWORD(x)) return (LPSTR)tolower((char)(int)x);
    CharLowerBuffA_(x, strlen(x));
    return x;
}

int main ()
{
  {
    char s [] =  "MOSKOW (55°45'N,  37°37'E) -- BEIJING (39°54'N, 116°23'E)";
    CharLowerA (s);  
    printf ("%s\n",s); // Мерзко, но терпимо
  }

  {
    char s [] =  "MOSKOW (55°45'N,  37°37'E) -- BEIJING (39°54'N, 116°23'E)";
    CharLowerA_ (s);
    printf ("%s\n",s); // Здравствуйте, кракозябры!
  }

  getc(stdin);
}
Тот, кто желает, но не делает, распространяет чуму.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.