Reactos
1/*
2 * ALIAS.C - alias administration module.
3 *
4 *
5 * History:
6 *
7 * 02/02/1996 (Oliver Mueller)
8 * started.
9 *
10 * 02/03/1996 (Oliver Mueller)
11 * Added sorting algorithm and case sensitive substitution by using
12 * partstrupr().
13 *
14 * 27 Jul 1998 John P. Price
15 * added config.h include
16 * added ifdef's to disable aliases
17 *
18 * 09-Dec-1998 Eric Kohl
19 * Fixed crash when removing an alias in DeleteAlias().
20 * Added help text ("/?").
21 *
22 * 14-Jan-1998 Eric Kohl
23 * Clean up and Unicode safe!
24 *
25 * 24-Jan-1998 Eric Kohl
26 * Redirection safe!
27 *
28 * 02-Apr-2005 (Magnus Olsen <magnus@greatlord.com>)
29 * Remove all hardcoded strings in En.rc
30 *
31 * 02-Feb-2008 (Christoph von Wittich <christoph_vw@reactos.org>)
32 * rewrote alias handling for doskey compat
33 */
34
35
36#include "precomp.h"
37
38#ifdef FEATURE_ALIASES
39
40/* module internal functions */
41/* strlwr only for first word in string */
42static VOID
43partstrlwr (LPTSTR str)
44{
45 LPTSTR c = str;
46 while (*c && !_istspace (*c) && *c != _T('='))
47 {
48 *c = _totlower (*c);
49 c++;
50 }
51}
52
53static VOID
54PrintAlias (VOID)
55{
56 LPTSTR Aliases;
57 LPTSTR ptr;
58 DWORD len;
59
60 len = GetConsoleAliasesLength(_T("cmd.exe"));
61 if (len == 0)
62 return;
63
64 /* allocate memory for an extra \0 char to make parsing easier */
65 ptr = cmd_alloc(len + sizeof(TCHAR));
66 if (!ptr)
67 {
68 WARN("Cannot allocate memory for ptr!\n");
69 return;
70 }
71
72 Aliases = ptr;
73
74 ZeroMemory(Aliases, len + sizeof(TCHAR));
75
76 if (GetConsoleAliases(Aliases, len, _T("cmd.exe")) != 0)
77 {
78 while (*Aliases != '\0')
79 {
80 ConOutPrintf(_T("%s\n"), Aliases);
81 Aliases = Aliases + lstrlen(Aliases);
82 Aliases++;
83 }
84 }
85 cmd_free(ptr);
86}
87
88/* specified routines */
89VOID ExpandAlias (LPTSTR cmd, INT maxlen)
90{
91 LPTSTR buffer;
92 TCHAR *position, *in, *out;
93 LPTSTR Token;
94 LPTSTR tmp;
95
96 tmp = cmd_dup(cmd);
97 if (!tmp)
98 return;
99
100 /* first part is the macro name */
101 position = tmp + _tcscspn(tmp, _T(" \n"));
102 if (position == tmp)
103 {
104 cmd_free(tmp);
105 return;
106 }
107 *position++ = _T('\0');
108 position += _tcsspn(position, _T(" "));
109
110 buffer = cmd_alloc(maxlen);
111 if (!buffer)
112 {
113 WARN("Cannot allocate memory for alias buffer!\n");
114 cmd_free(tmp);
115 return;
116 }
117
118 if (GetConsoleAlias(tmp, buffer, maxlen, _T("cmd.exe")) == 0)
119 {
120 cmd_free(tmp);
121 cmd_free(buffer);
122 return;
123 }
124
125 in = buffer;
126 out = cmd;
127 while (*in)
128 {
129 if (*in == _T('$'))
130 {
131 Token = position;
132 if (in[1] >= _T('1') && in[1] <= _T('9'))
133 {
134 /* Copy a single space-delimited token from the input line */
135 INT num;
136 for (num = in[1] - _T('1'); num > 0; num--)
137 {
138 Token += _tcscspn(Token, _T(" \n"));
139 Token += _tcsspn(Token, _T(" "));
140 }
141 while (!_tcschr(_T(" \n"), *Token))
142 {
143 if (out >= &cmd[maxlen - 1])
144 break;
145 *out++ = *Token++;
146 }
147 in += 2;
148 continue;
149 }
150 else if (in[1] == _T('*'))
151 {
152 /* Copy the entire remainder of the line */
153 while (*Token && *Token != _T('\n'))
154 {
155 if (out >= &cmd[maxlen - 1])
156 break;
157 *out++ = *Token++;
158 }
159 in += 2;
160 continue;
161 }
162 }
163 if (out >= &cmd[maxlen - 1])
164 break;
165 *out++ = *in++;
166 }
167 *out++ = _T('\n');
168 *out = _T('\0');
169
170 cmd_free(buffer);
171 cmd_free(tmp);
172}
173
174INT CommandAlias (LPTSTR param)
175{
176 LPTSTR ptr;
177
178 if (!_tcsncmp (param, _T("/?"), 2))
179 {
180 ConOutResPaging(TRUE,STRING_ALIAS_HELP);
181 return 0;
182 }
183
184 nErrorLevel = 0;
185
186 if (param[0] == _T('\0'))
187 {
188 PrintAlias ();
189 return 0;
190 }
191
192 nErrorLevel = 0;
193
194 /* error if no '=' found */
195 if ((ptr = _tcschr (param, _T('='))) == 0)
196 {
197 nErrorLevel = 1;
198 return 1;
199 }
200
201 /* Split rest into name and substitute */
202 *ptr++ = _T('\0');
203
204 partstrlwr (param);
205
206 if (ptr[0] == _T('\0'))
207 AddConsoleAlias(param, NULL, _T("cmd.exe"));
208 else
209 AddConsoleAlias(param, ptr, _T("cmd.exe"));
210
211 return 0;
212}
213#endif