[CMD]: Improvements for the CHCP command.

- Display the informative CP-change message on stdout, using the *output* code page (and not the input CP);
- Correctly update the local codepage cache;
- Display the informative CP-change message when the CP change succeeded;
- Add source comments + informative TODO for what remains to be done.

svn path=/trunk/; revision=74416
This commit is contained in:
Hermès Bélusca-Maïto 2017-04-26 22:29:07 +00:00
parent f25d0ce422
commit 01a6b1023f

View file

@ -15,14 +15,14 @@
#ifdef INCLUDE_CMD_CHCP
INT CommandChcp (LPTSTR param)
INT CommandChcp(LPTSTR param)
{
LPTSTR *arg;
INT args;
UINT uNewCodePage;
/* print help */
if (!_tcsncmp (param, _T("/?"), 2))
/* Print help */
if (!_tcsncmp(param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_CHCP_HELP);
return 0;
@ -30,23 +30,23 @@ INT CommandChcp (LPTSTR param)
nErrorLevel = 0;
/* get parameters */
arg = split (param, &args, FALSE, FALSE);
/* Get parameters */
arg = split(param, &args, FALSE, FALSE);
if (args == 0)
{
/* display active code page number */
ConErrResPrintf(STRING_CHCP_ERROR1, InputCodePage);
freep (arg);
/* Display the active code page number */
ConOutResPrintf(STRING_CHCP_ERROR1, OutputCodePage);
freep(arg);
return 0;
}
if (args >= 2)
{
/* too many parameters */
/* Too many parameters */
ConErrResPrintf(STRING_ERROR_INVALID_PARAM_FORMAT, param);
freep(arg);
nErrorLevel = 1;
freep (arg);
return 1;
}
@ -55,24 +55,38 @@ INT CommandChcp (LPTSTR param)
if (uNewCodePage == 0)
{
ConErrResPrintf(STRING_ERROR_INVALID_PARAM_FORMAT, arg[0]);
freep (arg);
freep(arg);
nErrorLevel = 1;
return 1;
}
freep(arg);
// TODO: In case of failure of SetConsoleCP or SetConsoleOutputCP,
// restore the old code page!
/*
* Try changing the console input codepage. If it works then also change
* the console output codepage, and refresh our local codepage cache.
*/
if (!SetConsoleCP(uNewCodePage))
{
ConErrResPuts(STRING_CHCP_ERROR4);
}
else
{
SetConsoleOutputCP(uNewCodePage);
SetConsoleOutputCP (uNewCodePage);
InitLocale ();
InputCodePage= GetConsoleCP();
/* Update our local codepage cache */
InputCodePage = GetConsoleCP();
OutputCodePage = GetConsoleOutputCP();
InitLocale();
/* Display the active code page number */
ConOutResPrintf(STRING_CHCP_ERROR1, OutputCodePage);
}
freep (arg);
return 0;
}