Initial revision
[reactos.git] / rosapps / cmd / cmd.c
1 #include <stdarg.h>
2 #include <windows.h>
3
4 HANDLE stdin;
5 HANDLE stdout;
6
7
8 void Console_puts(char* str)
9 {
10 ULONG nchar;
11
12 WriteConsole(stdout,
13 str,
14 strlen(str),
15 &nchar,
16 NULL);
17 }
18
19 void Console_printf(char* fmt, ...)
20 {
21 char buffer[255];
22 va_list vargs;
23
24 va_start(vargs,fmt);
25 vsprintf(buffer,fmt,vargs);
26 Console_puts(buffer);
27 va_end(vargs);
28 }
29
30 void Console_getline(PCH Prompt, PCH Output, DWORD OutputLength)
31 {
32 char ch;
33 DWORD nbytes;
34
35 Console_puts(Prompt);
36
37 ReadConsole(stdin,
38 Output,
39 OutputLength,
40 &nbytes,
41 NULL);
42 Output[nbytes-2]=0;
43 }
44
45 void func_cd(char* s)
46 {
47 Console_printf("Changing directory to %s\n",s);
48 if (!SetCurrentDirectory(s))
49 {
50 Console_puts("Failed to change to directory\n");
51 }
52 }
53
54 void func_dir(char* s)
55 {
56 HANDLE shandle;
57 WIN32_FIND_DATA FindData;
58
59 shandle = FindFirstFile("*.*",&FindData);
60
61 if (shandle==INVALID_HANDLE_VALUE)
62 {
63 return;
64 }
65 do
66 {
67 Console_printf("Scanning %s\n",FindData.cFileName);
68 } while(FindNextFile(shandle,&FindData));
69 }
70
71 int is_builtin(char* name, char* args)
72 {
73 if (strcmp(name,"dir")==0)
74 {
75 func_dir(args);
76 return(1);
77 }
78 if (strcmp(name,"cd")==0)
79 {
80 func_cd(args);
81 return(1);
82 }
83 return(0);
84 }
85
86 int process_command(char* str)
87 {
88 char* name;
89 char* args;
90 PROCESS_INFORMATION pi;
91 STARTUPINFO si;
92 char process_arg[255];
93
94 if (strcmp(str,"exit")==0)
95 {
96 return(1);
97 }
98
99 name = strtok(str," \t");
100 args = strtok(NULL,"");
101
102 if (is_builtin(name,args))
103 {
104 return(0);
105 }
106 memset(&si,0,sizeof(STARTUPINFO));
107 si.cb=sizeof(STARTUPINFO);
108 si.lpTitle=strdup(name);
109
110 strcpy(process_arg,name);
111 strcat(process_arg," ");
112 if(args!=NULL)
113 {
114 strcat(process_arg,args);
115 }
116 Console_printf("name '%s' process_arg '%s'\n",name,process_arg);
117 if (!CreateProcess(NULL,process_arg,NULL,NULL,FALSE,
118 CREATE_NEW_CONSOLE,
119 NULL,NULL,&si,&pi))
120 {
121 Console_printf("Failed to execute process\n");
122 }
123 return(0);
124 }
125
126 void build_prompt(char* prompt)
127 {
128 int len;
129
130 len = GetCurrentDirectory(255,prompt);
131 strcat(prompt,">");
132 }
133
134 void command_loop()
135 {
136 char line[255];
137 char prompt[255];
138 int do_exit = 0;
139
140 while (!do_exit)
141 {
142 build_prompt(prompt);
143 Console_getline(prompt,line,255);
144 Console_printf("Processing command '%s'\n",line);
145 do_exit = process_command(line);
146 }
147 }
148
149 int STDCALL WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
150 {
151 AllocConsole();
152 stdin = GetStdHandle(STD_INPUT_HANDLE);
153 stdout = GetStdHandle(STD_OUTPUT_HANDLE);
154
155 command_loop();
156
157 return 0;
158 }