Author: jgardou Date: Thu Sep 30 18:45:58 2010 New Revision: 48942
URL: http://svn.reactos.org/svn/reactos?rev=48942&view=rev Log: [DOSKEY] - Fix compilation with msvc by GetProcAddress'ing undocumented functions - TCHAR -> WCHAR in the process
Modified: trunk/reactos/base/applications/cmdutils/doskey/doskey.c trunk/reactos/base/applications/cmdutils/doskey/doskey.h
Modified: trunk/reactos/base/applications/cmdutils/doskey/doskey.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/cmdutils/... ============================================================================== --- trunk/reactos/base/applications/cmdutils/doskey/doskey.c [iso-8859-1] (original) +++ trunk/reactos/base/applications/cmdutils/doskey/doskey.c [iso-8859-1] Thu Sep 30 18:45:58 2010 @@ -1,11 +1,23 @@ #include <windows.h> #include <stdio.h> -#include <tchar.h> +#include <wchar.h> +#include <assert.h> #include "doskey.h"
#define MAX_STRING 2000 -TCHAR szStringBuf[MAX_STRING]; -LPTSTR pszExeName = _T("cmd.exe"); +WCHAR szStringBuf[MAX_STRING]; +LPWSTR pszExeName = L"cmd.exe"; + +/* Function pointers */ +typedef DWORD (WINAPI *GetConsoleCommandHistoryW_t) (LPWSTR sCommands, DWORD nBufferLength, LPWSTR sExeName); +typedef DWORD (WINAPI *GetConsoleCommandHistoryLengthW_t) (LPWSTR sExeName); +typedef BOOL (WINAPI *SetConsoleNumberOfCommandsW_t)(DWORD nNumber, LPWSTR sExeName); +typedef VOID (WINAPI *ExpungeConsoleCommandHistoryW_t)(LPWSTR sExeName); + +GetConsoleCommandHistoryW_t pGetConsoleCommandHistoryW; +GetConsoleCommandHistoryLengthW_t pGetConsoleCommandHistoryLengthW; +SetConsoleNumberOfCommandsW_t pSetConsoleNumberOfCommandsW; +ExpungeConsoleCommandHistoryW_t pExpungeConsoleCommandHistoryW;
static VOID SetInsert(DWORD dwFlag) { @@ -18,79 +30,74 @@
static VOID PrintHistory(VOID) { - DWORD Length = GetConsoleCommandHistoryLength(pszExeName); - DWORD BufferLength; + DWORD Length = pGetConsoleCommandHistoryLengthW(pszExeName); PBYTE HistBuf; - TCHAR *Hist; - TCHAR *HistEnd; - - /* On Windows, the ANSI version of GetConsoleCommandHistory requires - * a buffer twice as large as the actual history length. */ - BufferLength = Length * (sizeof(WCHAR) / sizeof(TCHAR)) * sizeof(BYTE); + WCHAR *Hist; + WCHAR *HistEnd;
HistBuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - BufferLength); + Length); if (!HistBuf) return; - Hist = (TCHAR *)HistBuf; - HistEnd = (TCHAR *)&HistBuf[Length]; - - if (GetConsoleCommandHistory(Hist, BufferLength, pszExeName)) - for (; Hist < HistEnd; Hist += _tcslen(Hist) + 1) - _tprintf(_T("%s\n"), Hist); + Hist = (WCHAR *)HistBuf; + HistEnd = (WCHAR *)&HistBuf[Length]; + + if (pGetConsoleCommandHistoryW(Hist, Length, pszExeName)) + for (; Hist < HistEnd; Hist += wcslen(Hist) + 1) + wprintf(L"%s\n", Hist);
HeapFree(GetProcessHeap(), 0, HistBuf); }
-static INT SetMacro(LPTSTR definition) -{ - TCHAR *name, *nameend, *text, temp; +static INT SetMacro(LPWSTR definition) +{ + WCHAR *name, *nameend, *text, temp;
name = definition; - while (*name == _T(' ')) + while (*name == L' ') name++;
/* error if no '=' found */ - if ((nameend = _tcschr(name, _T('='))) != NULL) + if ((nameend = wcschr(name, L'=')) != NULL) { text = nameend + 1; - while (*text == _T(' ')) + while (*text == L' ') text++;
- while (nameend > name && nameend[-1] == _T(' ')) + while (nameend > name && nameend[-1] == L' ') nameend--;
/* Split rest into name and substitute */ temp = *nameend; - *nameend = _T('\0'); + *nameend = L'\0'; /* Don't allow spaces in the name, since such a macro would be unusable */ - if (!_tcschr(name, _T(' ')) && AddConsoleAlias(name, text, pszExeName)) + if (!wcschr(name, L' ') && AddConsoleAlias(name, text, pszExeName)) return 0; *nameend = temp; }
LoadString(GetModuleHandle(NULL), IDS_INVALID_MACRO_DEF, szStringBuf, MAX_STRING); - _tprintf(szStringBuf, definition); + wprintf(szStringBuf, definition); return 1; }
-static VOID PrintMacros(LPTSTR pszExeName, LPTSTR Indent) +static VOID PrintMacros(LPWSTR pszExeName, LPWSTR Indent) { DWORD Length = GetConsoleAliasesLength(pszExeName); PBYTE AliasBuf; - TCHAR *Alias; - TCHAR *AliasEnd; + WCHAR *Alias; + WCHAR *AliasEnd;
AliasBuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Length * sizeof(BYTE)); if (!AliasBuf) return; - Alias = (TCHAR *)AliasBuf; - AliasEnd = (TCHAR *)&AliasBuf[Length]; + Alias = (WCHAR *)AliasBuf; + AliasEnd = (WCHAR *)&AliasBuf[Length];
if (GetConsoleAliases(Alias, Length * sizeof(BYTE), pszExeName)) - for (; Alias < AliasEnd; Alias += _tcslen(Alias) + 1) - _tprintf(_T("%s%s\n"), Indent, Alias); + for (; Alias < AliasEnd; Alias += wcslen(Alias) + 1) + wprintf(L"%s%s\n", Indent, Alias);
HeapFree(GetProcessHeap(), 0, AliasBuf); } @@ -99,51 +106,47 @@ { DWORD Length = GetConsoleAliasExesLength(); PBYTE ExeNameBuf; - TCHAR *ExeName; - TCHAR *ExeNameEnd; + WCHAR *ExeName; + WCHAR *ExeNameEnd;
ExeNameBuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Length * sizeof(BYTE)); if (!ExeNameBuf) return; - ExeName = (TCHAR *)ExeNameBuf; - ExeNameEnd = (TCHAR *)&ExeNameBuf[Length]; + ExeName = (WCHAR *)ExeNameBuf; + ExeNameEnd = (WCHAR *)&ExeNameBuf[Length];
if (GetConsoleAliasExes(ExeName, Length * sizeof(BYTE))) { - for (; ExeName < ExeNameEnd; ExeName += _tcslen(ExeName) + 1) - { - _tprintf(_T("[%s]\n"), ExeName); - PrintMacros(ExeName, _T(" ")); - _tprintf(_T("\n")); + for (; ExeName < ExeNameEnd; ExeName += wcslen(ExeName) + 1) + { + wprintf(L"[%s]\n", ExeName); + PrintMacros(ExeName, L" "); + wprintf(L"\n"); } }
HeapFree(GetProcessHeap(), 0, ExeNameBuf); }
-static VOID ReadFromFile(LPTSTR param) +static VOID ReadFromFile(LPWSTR param) { FILE* fp; - TCHAR line[MAX_PATH]; - - fp = _tfopen(param, _T("r")); + WCHAR line[MAX_PATH]; + + fp = _wfopen(param, L"r"); if (!fp) { -#ifdef UNICODE _wperror(param); -#else - perror(param); -#endif return; }
- while ( _fgetts(line, MAX_PATH, fp) != NULL) + while ( fgetws(line, MAX_PATH, fp) != NULL) { /* Remove newline character */ - TCHAR *end = &line[_tcslen(line) - 1]; - if (*end == _T('\n')) - *end = _T('\0'); + WCHAR *end = &line[wcslen(line) - 1]; + if (*end == L'\n') + *end = L'\0';
if (*line) SetMacro(line); @@ -154,43 +157,53 @@ }
/* Get the start and end of the next command-line argument. */ -static BOOL GetArg(TCHAR **pStart, TCHAR **pEnd) +static BOOL GetArg(WCHAR **pStart, WCHAR **pEnd) { BOOL bInQuotes = FALSE; - TCHAR *p = *pEnd; - p += _tcsspn(p, _T(" \t")); + WCHAR *p = *pEnd; + p += wcsspn(p, L" \t"); if (!*p) return FALSE; *pStart = p; do { - if (!bInQuotes && (*p == _T(' ') || *p == _T('\t'))) + if (!bInQuotes && (*p == L' ' || *p == L'\t')) break; - bInQuotes ^= (*p++ == _T('"')); + bInQuotes ^= (*p++ == L'"'); } while (*p); *pEnd = p; return TRUE; }
/* Remove starting and ending quotes from a string, if present */ -static LPTSTR RemoveQuotes(LPTSTR str) -{ - TCHAR *end; - if (*str == _T('"') && *(end = str + _tcslen(str) - 1) == _T('"')) +static LPWSTR RemoveQuotes(LPWSTR str) +{ + WCHAR *end; + if (*str == L'"' && *(end = str + wcslen(str) - 1) == L'"') { str++; - *end = _T('\0'); + *end = L'\0'; } return str; }
int -_tmain(VOID) +wmain(VOID) { /* Get the full command line using GetCommandLine(). We can't just use argv, * because then a parameter like "gotoroot=cd " wouldn't be passed completely. */ - TCHAR *pArgStart; - TCHAR *pArgEnd = GetCommandLine(); + WCHAR *pArgStart; + WCHAR *pArgEnd = GetCommandLine(); + HMODULE hKernel32 = LoadLibraryW(L"kernel32.dll"); + + /* Get function pointers */ + pGetConsoleCommandHistoryW = (GetConsoleCommandHistoryW_t)GetProcAddress( hKernel32, "GetConsoleCommandHistoryW"); + pGetConsoleCommandHistoryLengthW = (GetConsoleCommandHistoryLengthW_t)GetProcAddress( hKernel32, "GetConsoleCommandHistoryLengthW"); + pSetConsoleNumberOfCommandsW = (SetConsoleNumberOfCommandsW_t)GetProcAddress( hKernel32, "SetConsoleNumberOfCommandsW"); + pExpungeConsoleCommandHistoryW = (ExpungeConsoleCommandHistoryW_t)GetProcAddress( hKernel32, "ExpungeConsoleCommandHistoryW"); + + assert(pGetConsoleCommandHistoryW && pGetConsoleCommandHistoryLengthW && + pSetConsoleNumberOfCommandsW && pSetConsoleNumberOfCommandsW);
/* Skip the application name */ GetArg(&pArgStart, &pArgEnd); @@ -198,55 +211,55 @@ while (GetArg(&pArgStart, &pArgEnd)) { /* NUL-terminate this argument to make processing easier */ - TCHAR tmp = *pArgEnd; - *pArgEnd = _T('\0'); - - if (!_tcscmp(pArgStart, _T("/?"))) + WCHAR tmp = *pArgEnd; + *pArgEnd = L'\0'; + + if (!wcscmp(pArgStart, L"/?")) { LoadString(GetModuleHandle(NULL), IDS_HELP, szStringBuf, MAX_STRING); - _tprintf(szStringBuf); + wprintf(szStringBuf); break; } - else if (!_tcsnicmp(pArgStart, _T("/EXENAME="), 9)) + else if (!_wcsnicmp(pArgStart, L"/EXENAME=", 9)) { pszExeName = RemoveQuotes(pArgStart + 9); } - else if (!_tcsicmp(pArgStart, _T("/H")) || - !_tcsicmp(pArgStart, _T("/HISTORY"))) + else if (!wcsicmp(pArgStart, L"/H") || + !wcsicmp(pArgStart, L"/HISTORY")) { PrintHistory(); } - else if (!_tcsnicmp(pArgStart, _T("/LISTSIZE="), 10)) - { - SetConsoleNumberOfCommands(_ttoi(pArgStart + 10), pszExeName); - } - else if (!_tcsicmp(pArgStart, _T("/REINSTALL"))) - { - ExpungeConsoleCommandHistory(pszExeName); - } - else if (!_tcsicmp(pArgStart, _T("/INSERT"))) + else if (!_wcsnicmp(pArgStart, L"/LISTSIZE=", 10)) + { + pSetConsoleNumberOfCommandsW(_wtoi(pArgStart + 10), pszExeName); + } + else if (!wcsicmp(pArgStart, L"/REINSTALL")) + { + pExpungeConsoleCommandHistoryW(pszExeName); + } + else if (!wcsicmp(pArgStart, L"/INSERT")) { SetInsert(ENABLE_INSERT_MODE); } - else if (!_tcsicmp(pArgStart, _T("/OVERSTRIKE"))) + else if (!wcsicmp(pArgStart, L"/OVERSTRIKE")) { SetInsert(0); } - else if (!_tcsicmp(pArgStart, _T("/M")) || - !_tcsicmp(pArgStart, _T("/MACROS"))) - { - PrintMacros(pszExeName, _T("")); - } - else if (!_tcsnicmp(pArgStart, _T("/M:"), 3) || - !_tcsnicmp(pArgStart, _T("/MACROS:"), 8)) - { - LPTSTR exe = RemoveQuotes(_tcschr(pArgStart, _T(':')) + 1); - if (!_tcsicmp(exe, _T("ALL"))) + else if (!wcsicmp(pArgStart, L"/M") || + !wcsicmp(pArgStart, L"/MACROS")) + { + PrintMacros(pszExeName, L""); + } + else if (!_wcsnicmp(pArgStart, L"/M:", 3) || + !_wcsnicmp(pArgStart, L"/MACROS:", 8)) + { + LPWSTR exe = RemoveQuotes(wcschr(pArgStart, L':') + 1); + if (!wcsicmp(exe, L"ALL")) PrintAllMacros(); else - PrintMacros(exe, _T("")); - } - else if (!_tcsnicmp(pArgStart, _T("/MACROFILE="), 11)) + PrintMacros(exe, L""); + } + else if (!_wcsnicmp(pArgStart, L"/MACROFILE=", 11)) { ReadFromFile(RemoveQuotes(pArgStart + 11)); }
Modified: trunk/reactos/base/applications/cmdutils/doskey/doskey.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/cmdutils/... ============================================================================== --- trunk/reactos/base/applications/cmdutils/doskey/doskey.h [iso-8859-1] (original) +++ trunk/reactos/base/applications/cmdutils/doskey/doskey.h [iso-8859-1] Thu Sep 30 18:45:58 2010 @@ -23,11 +23,6 @@ BOOL WINAPI AddConsoleAliasW(LPWSTR, LPWSTR, LPWSTR); #define AddConsoleAlias TNAME(AddConsoleAlias) #endif -#ifndef ExpungeConsoleCommandHistory -BOOL WINAPI ExpungeConsoleCommandHistoryA(LPSTR); -BOOL WINAPI ExpungeConsoleCommandHistoryW(LPWSTR); -#define ExpungeConsoleCommandHistory TNAME(ExpungeConsoleCommandHistory) -#endif #ifndef GetConsoleAliases DWORD WINAPI GetConsoleAliasesA(LPSTR, DWORD, LPSTR); DWORD WINAPI GetConsoleAliasesW(LPWSTR, DWORD, LPWSTR); @@ -48,20 +43,5 @@ DWORD WINAPI GetConsoleAliasExesLengthW(VOID); #define GetConsoleAliasExesLength TNAME(GetConsoleAliasExesLength) #endif -#ifndef GetConsoleCommandHistory -DWORD WINAPI GetConsoleCommandHistoryA(LPSTR, DWORD, LPSTR); -DWORD WINAPI GetConsoleCommandHistoryW(LPWSTR, DWORD, LPWSTR); -#define GetConsoleCommandHistory TNAME(GetConsoleCommandHistory) -#endif -#ifndef GetConsoleCommandHistoryLength -DWORD WINAPI GetConsoleCommandHistoryLengthA(LPSTR); -DWORD WINAPI GetConsoleCommandHistoryLengthW(LPWSTR); -#define GetConsoleCommandHistoryLength TNAME(GetConsoleCommandHistoryLength) -#endif -#ifndef SetConsoleNumberOfCommands -BOOL WINAPI SetConsoleNumberOfCommandsA(DWORD, LPSTR); -BOOL WINAPI SetConsoleNumberOfCommandsW(DWORD, LPWSTR); -#define SetConsoleNumberOfCommands TNAME(SetConsoleNumberOfCommands) -#endif
#endif /* RC_INVOKED */