https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ae9702fcec5e041f4f52b…
commit ae9702fcec5e041f4f52bc0b83b506f4e1cee13b
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sat Dec 16 21:01:08 2017 +0100
[DOSKEY] Improvements when importing aliases definition files.
- The aliases ("macros") definition files have the same format as what
is output by DosKey when one displays the list of defined aliases with
the /macros: command-line switch. It should then, in particular,
understand the format where executable names are also specified:
[exename1]
alias1=command1
...
[exename2]
aliasN=commandN
...
We now behave similarly as Windows' version of this utility in that
regard.
- Use ARRAYSIZE() when needed.
- Take the opportunity to add a license header to the source file.
---
base/applications/cmdutils/doskey/doskey.c | 113 +++++++++++++++++++++-------
base/applications/cmdutils/doskey/doskey.rc | 4 +-
2 files changed, 89 insertions(+), 28 deletions(-)
diff --git a/base/applications/cmdutils/doskey/doskey.c
b/base/applications/cmdutils/doskey/doskey.c
index 0c2694f716..47991c957d 100644
--- a/base/applications/cmdutils/doskey/doskey.c
+++ b/base/applications/cmdutils/doskey/doskey.c
@@ -1,3 +1,12 @@
+/*
+ * PROJECT: ReactOS DosKey Command
+ * LICENSE: GPL-2.0+ (
https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE: Provides history and command aliases management for
+ * command-line programs.
+ * COPYRIGHT: Copyright 2008 Christoph von Wittich
+ * Copyright 2013-2017 Hermès Bélusca-Maïto
+ */
+
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
@@ -8,6 +17,8 @@
#include <wincon.h>
/* Console API functions which are absent from wincon.h */
+#define EXENAME_LENGTH (255 + 1)
+
VOID
WINAPI
ExpungeConsoleCommandHistoryW(LPCWSTR lpExeName);
@@ -37,7 +48,7 @@ static VOID SetInsert(DWORD dwFlag)
{
/*
* NOTE: Enabling the ENABLE_INSERT_MODE mode can also be done by calling
- * kernel32:SetConsoleCommandHistoryMode(CONSOLE_OVERSTRIKE) .
+ * kernel32:SetConsoleCommandHistoryMode(CONSOLE_OVERSTRIKE) (deprecated).
*/
DWORD dwMode;
HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);
@@ -98,7 +109,10 @@ static INT SetMacro(LPWSTR definition)
*nameend = temp;
}
- LoadStringW(GetModuleHandle(NULL), IDS_INVALID_MACRO_DEF, szStringBuf, MAX_STRING);
+ LoadStringW(GetModuleHandle(NULL),
+ IDS_INVALID_MACRO_DEF,
+ szStringBuf,
+ ARRAYSIZE(szStringBuf));
wprintf(szStringBuf, definition);
return 1;
}
@@ -155,29 +169,86 @@ static VOID PrintAllMacros(VOID)
HeapFree(GetProcessHeap(), 0, ExeNameBuf);
}
-static VOID ReadFromFile(LPWSTR param)
+/* Remove starting and ending quotes from a string, if present */
+static LPWSTR RemoveQuotes(LPWSTR str)
+{
+ WCHAR *end;
+ if (*str == L'"' && *(end = str + wcslen(str) - 1) ==
L'"')
+ {
+ str++;
+ *end = L'\0';
+ }
+ return str;
+}
+
+static VOID ReadFromFile(LPWSTR FileName)
{
FILE* fp;
WCHAR line[MAX_PATH];
+ WCHAR ExeNameBuffer[EXENAME_LENGTH];
+ LPWSTR pszOrgExeName = pszExeName;
- fp = _wfopen(param, L"r");
+ /* Open the file */
+ fp = _wfopen(FileName, L"rt");
if (!fp)
{
- _wperror(param);
+ _wperror(FileName);
return;
}
- while ( fgetws(line, MAX_PATH, fp) != NULL)
+ while (fgetws(line, ARRAYSIZE(line), fp) != NULL)
{
- /* Remove newline character */
- WCHAR *end = &line[wcslen(line) - 1];
+ PWCHAR end;
+
+ if (!*line)
+ continue;
+
+ /* Remove trailing newline character */
+ end = &line[wcslen(line) - 1];
if (*end == L'\n')
*end = L'\0';
- if (*line)
+ if (!*line)
+ continue;
+
+ /* Check for any section redefining the current executable name */
+ end = NULL;
+ if (*line == L'[')
+ end = wcschr(line, L']');
+
+ if (end != NULL)
+ {
+ /* New section: change the current executable name */
+
+ *end = L'\0'; // NULL-terminate it
+ pszExeName = RemoveQuotes(line + 1);
+ if (*pszExeName)
+ {
+ /* Capture the new executable name and truncate it if needed */
+ end = &pszExeName[wcslen(pszExeName)];
+ if (end - pszExeName >= EXENAME_LENGTH)
+ end = &pszExeName[EXENAME_LENGTH - 1];
+ *end = L'\0'; // Truncate it
+ wcscpy(ExeNameBuffer, pszExeName);
+ pszExeName = ExeNameBuffer;
+ }
+ else
+ {
+ /* Restore the original current executable name */
+ pszExeName = pszOrgExeName;
+ }
+ }
+ else
+ {
+ /* Set the new macro for the current executable */
SetMacro(line);
+ }
}
+ /* Restore the original current executable name if it has changed */
+ pszExeName = pszOrgExeName;
+
+ /* Close the file and return */
fclose(fp);
return;
}
@@ -201,23 +272,10 @@ static BOOL GetArg(WCHAR **pStart, WCHAR **pEnd)
return TRUE;
}
-/* Remove starting and ending quotes from a string, if present */
-static LPWSTR RemoveQuotes(LPWSTR str)
-{
- WCHAR *end;
- if (*str == L'"' && *(end = str + wcslen(str) - 1) ==
L'"')
- {
- str++;
- *end = L'\0';
- }
- return str;
-}
-
int
wmain(VOID)
{
- WCHAR *pArgStart;
- WCHAR *pArgEnd;
+ LPWSTR pArgStart, pArgEnd;
setlocale(LC_ALL, "");
@@ -230,13 +288,16 @@ wmain(VOID)
while (GetArg(&pArgStart, &pArgEnd))
{
- /* NUL-terminate this argument to make processing easier */
+ /* NULL-terminate this argument to make processing easier */
WCHAR tmp = *pArgEnd;
*pArgEnd = L'\0';
if (!wcscmp(pArgStart, L"/?"))
{
- LoadStringW(GetModuleHandle(NULL), IDS_HELP, szStringBuf, MAX_STRING);
+ LoadStringW(GetModuleHandle(NULL),
+ IDS_HELP,
+ szStringBuf,
+ ARRAYSIZE(szStringBuf));
wprintf(szStringBuf);
break;
}
@@ -287,7 +348,7 @@ wmain(VOID)
{
/* This is the beginning of a macro definition. It includes
* the entire remainder of the line, so first put back the
- * character that we replaced with NUL. */
+ * character that we replaced with NULL. */
*pArgEnd = tmp;
return SetMacro(pArgStart);
}
diff --git a/base/applications/cmdutils/doskey/doskey.rc
b/base/applications/cmdutils/doskey/doskey.rc
index 64d6a041b6..d17a967856 100644
--- a/base/applications/cmdutils/doskey/doskey.rc
+++ b/base/applications/cmdutils/doskey/doskey.rc
@@ -2,7 +2,7 @@
#include "doskey.h"
-#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Doskey Command"
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS DosKey Command"
#define REACTOS_STR_INTERNAL_NAME "doskey"
#define REACTOS_STR_ORIGINAL_FILENAME "doskey.exe"
#include <reactos/version.rc>
@@ -54,4 +54,4 @@
#endif
#ifdef LANGUAGE_ZH_TW
#include "lang/zh-TW.rc"
-#endif
\ No newline at end of file
+#endif