[CMD]: Improvements for the CHCP command.
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Wed, 26 Apr 2017 22:29:07 +0000 (22:29 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Wed, 26 Apr 2017 22:29:07 +0000 (22:29 +0000)
- 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

reactos/base/shell/cmd/chcp.c

index 3db6d36..146e5fa 100644 (file)
 
 #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);
+
+        /* Update our local codepage cache */
+        InputCodePage  = GetConsoleCP();
+        OutputCodePage = GetConsoleOutputCP();
+
+        InitLocale();
 
-        SetConsoleOutputCP (uNewCodePage);
-        InitLocale ();
-        InputCodePage= GetConsoleCP();
+        /* Display the active code page number */
+        ConOutResPrintf(STRING_CHCP_ERROR1, OutputCodePage);
     }
 
-    freep (arg);
     return 0;
 }