[CMD]: Continue refactoring to lay out the way to using the CONUTILS library in CMD...
[reactos.git] / reactos / base / shell / cmd / type.c
1 /*
2 * TYPE.C - type internal command.
3 *
4 * History:
5 *
6 * 07/08/1998 (John P. Price)
7 * started.
8 *
9 * 07/12/98 (Rob Lake)
10 * Changed error messages
11 *
12 * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
13 * added config.h include
14 *
15 * 07-Jan-1999 (Eric Kohl)
16 * Added support for quoted arguments (type "test file.dat").
17 * Cleaned up.
18 *
19 * 19-Jan-1999 (Eric Kohl)
20 * Unicode and redirection ready!
21 *
22 * 19-Jan-1999 (Paolo Pantaleo <paolopan@freemail.it>)
23 * Added multiple file support (copied from y.c)
24 *
25 * 30-Apr-2005 (Magnus Olsen <magnus@greatlord.com>)
26 * Remove all hardcoded strings in En.rc
27 */
28
29 #include "precomp.h"
30
31 #ifdef INCLUDE_CMD_TYPE
32
33
34 INT cmd_type(LPTSTR param)
35 {
36 TCHAR buff[256];
37 HANDLE hFile, hConsoleOut;
38 DWORD dwRet;
39 INT argc,i;
40 LPTSTR *argv;
41 LPTSTR errmsg;
42 BOOL bPaging = FALSE;
43 BOOL bFirstTime = TRUE;
44
45 hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
46
47 if (!_tcsncmp(param, _T("/?"), 2))
48 {
49 ConOutResPaging(TRUE,STRING_TYPE_HELP1);
50 return 0;
51 }
52
53 if (!*param)
54 {
55 error_req_param_missing();
56 return 1;
57 }
58
59 argv = split(param, &argc, TRUE, FALSE);
60
61 for (i = 0; i < argc; i++)
62 {
63 if (argv[i][0] == _T('/') && _tcslen(argv[i]) == 2 && _totupper(argv[i][1]) == _T('P'))
64 {
65 bPaging = TRUE;
66 }
67 }
68
69 for (i = 0; i < argc; i++)
70 {
71 if (argv[i][0] == _T('/') && _totupper(argv[i][1]) != _T('P'))
72 {
73 ConErrResPrintf(STRING_TYPE_ERROR1, argv[i] + 1);
74 continue;
75 }
76 if (argv[i][0] == _T('/') && _tcslen(argv[i]) == 2 && _totupper(argv[i][1]) == _T('P'))
77 {
78 continue;
79 }
80
81 nErrorLevel = 0;
82
83 hFile = CreateFile(argv[i],
84 GENERIC_READ,
85 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
86 OPEN_EXISTING,
87 FILE_ATTRIBUTE_NORMAL, NULL);
88
89 if (hFile == INVALID_HANDLE_VALUE)
90 {
91 FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
92 FORMAT_MESSAGE_IGNORE_INSERTS |
93 FORMAT_MESSAGE_FROM_SYSTEM,
94 NULL,
95 GetLastError(),
96 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
97 (LPTSTR) &errmsg,
98 0,
99 NULL);
100 ConErrPrintf (_T("%s - %s"), argv[i], errmsg);
101 LocalFree (errmsg);
102 nErrorLevel = 1;
103 continue;
104 }
105
106 if (bPaging)
107 {
108 while (FileGetString(hFile, buff, ARRAYSIZE(buff)))
109 {
110 if (!ConOutPrintfPaging(bFirstTime, _T("%s"), buff))
111 {
112 bCtrlBreak = FALSE;
113 CloseHandle(hFile);
114 freep(argv);
115 return 0;
116 }
117 bFirstTime = FALSE;
118 }
119 }
120 else
121 {
122 while (ReadFile(hFile, buff, sizeof(buff), &dwRet, NULL) && dwRet > 0)
123 {
124 WriteFile(hConsoleOut, buff, dwRet, &dwRet, NULL);
125 if (bCtrlBreak)
126 {
127 bCtrlBreak = FALSE;
128 CloseHandle(hFile);
129 freep(argv);
130 return 0;
131 }
132 }
133 }
134
135 CloseHandle(hFile);
136 }
137
138 freep(argv);
139 return 0;
140 }
141
142 #endif