ReactOS 0.4.15-dev-8348-gc1b9bb5
cmd.c
Go to the documentation of this file.
1/*
2 * ReactOS log2lines
3 * Written by Jan Roeloffzen
4 *
5 * - Cli for escape commands
6 */
7
8#include <stdio.h>
9#include <string.h>
10#include <stdlib.h>
11
12#include "util.h"
13#include "cmd.h"
14#include "options.h"
15#include "log2lines.h"
16#include "help.h"
17
18/* When you edit the cmd line and/or use the history instead of just typing,
19 * a bunch of editing BS and space characters
20 * is inserted, so the string looks right on the console but still
21 * contains the original string, plus other garbage:
22 */
23static char
25{
26 char c;
27 char *edit = s;
28 char *text = s;
29
30 while (( c = *edit++ ))
31 {
32 switch (c)
33 {
34 case KDBG_BS_CHAR:
35 if (text > s)
36 text --;
37 break;
38 default:
39 *text++ = c;
40 }
41 }
42 *text = '\0';
43
44 return s;
45}
46
47static int
48handle_switch(FILE *outFile, int *sw, char *arg, char *desc)
49{
50 int changed =0;
51 int x = 0;
52
53 if (arg && (strcmp(arg,"") != 0))
54 {
55 x = atoi(arg);
56 if (x != *sw)
57 {
58 *sw = x;
59 changed = 1;
60 }
61 }
62 if (desc)
63 {
64 esclog(outFile, "%s is %d (%s)\n", desc, *sw, changed ? "changed":"unchanged");
65 if (!arg)
66 esclog(outFile, "(readonly)\n");
67 }
68
69 return changed;
70}
71
72static int
73handle_switch_str(FILE *outFile, char *sw, char *arg, char *desc)
74{
75 int changed =0;
76
77 if (arg)
78 {
79 if (strcmp(arg,"") != 0)
80 {
81 if (strcmp(arg,KDBG_ESC_OFF) == 0)
82 {
83 if (*sw)
84 changed = 1;
85 *sw = '\0';
86 }
87 else if (strcmp(arg, sw) != 0)
88 {
89 strcpy(sw, arg);
90 changed = 1;
91 }
92 }
93 }
94 if (desc)
95 {
96 esclog(outFile, "%s is \"%s\" (%s)\n", desc, sw, changed ? "changed":"unchanged");
97 if (!arg)
98 esclog(outFile, "(readonly)\n");
99 }
100
101 return changed;
102}
103
104static int
106{
107 PLIST_MEMBER plm;
108 char Image[NAMESIZE];
110 int cnt;
111 char *s;
112
113 if(( s = strchr(arg, ':') ))
114 {
115 *s = ' ';
116 if ( (cnt = sscanf(arg,"%20s %x", Image, &Offset)) == 2)
117 {
118 if (( plm = entry_lookup(&cache, Image) ))
119 {
120 if (plm->RelBase != INVALID_BASE)
121 esclog(outFile, "Address: 0x%lx\n", plm->RelBase + Offset)
122 else
123 esclog(outFile, "Relocated base missing for '%s' ('mod' will update)\n", Image);
124 }
125 else
126 esclog(outFile, "Image '%s' not found\n", Image);
127 }
128 else
129 esclog(outFile, "usage: `a <Image>:<offset>\n");
130 }
131 else
132 esclog(outFile, "':' expected\n");
133
134 return 1;
135}
136
137char
139{
140 char cmd;
141 char sep = '\n';
142 char *arg;
143 char *l = Line;
144 int res = 1;
145 int cnt = 0;
146 int changed = 0;
147
148 l = backSpaceEdit(l);
149 if (l[1] != KDBG_ESC_CHAR)
150 return l[1]; //for reprocessing as not escaped
151
152 log(outFile, "\n");
153
154 l += 2; //skip space+escape character
155 if ( (cnt=sscanf(l,"%c%c",&cmd,&sep)) < 1)
156 {
157 esclog(outFile, "Command expected\n");
158 res = 0;
159 }
160
161 if (res && cnt==2 && sep != ' ')
162 {
163 esclog(outFile, "' ' expected\n");
164 res = 0;
165 }
166 l++; //skip cmd
167 while ( *l == ' ')l++; //skip more spaces
168 arg = l;
169 opt_cli = 1;
170 switch (cmd)
171 {
172 case 'a':
173 handle_address_cmd(outFile, arg);
174 break;
175 case 'h':
176 usage(1);
177 break;
178 case 'b':
179 if (handle_switch(outFile, &opt_buffered, arg, "-b Logfile buffering"))
180 set_LogFile(&logFile); //re-open same logfile
181 break;
182 case 'c':
183 handle_switch(outFile, &opt_console, NULL, "-c Console option");
184 break;
185 case 'd':
186 handle_switch_str(outFile, opt_dir, NULL, "-d Directory option");
187 break;
188 case 'l':
189 if (handle_switch_str(outFile, opt_logFile, arg, "-l logfile") || (strcmp(opt_mod,"a")!=0))
190 {
191 opt_mod = "a";
192 set_LogFile(&logFile); //open new logfile
193 }
194 break;
195 case 'L':
196 if (handle_switch_str(outFile, opt_logFile, arg, "-L logfile") || (strcmp(opt_mod,"w")!=0))
197 {
198 opt_mod = "w";
199 set_LogFile(&logFile); //open new logfile
200 }
201 break;
202 case 'm':
203 handle_switch(outFile, &opt_Mark, arg, "-m mark (*)");
204 break;
205 case 'M':
206 handle_switch(outFile, &opt_Mark, arg, "-M Mark (?)");
207 break;
208 case 'P':
209 handle_switch_str(outFile, opt_Pipe, NULL, "-P Pipeline option");
210 break;
211 case 'q':
212 opt_quit = 1;
213 esclog(outFile, "Bye!\n");
214 break;
215 case 'r':
216 handle_switch(outFile, &opt_raw, arg, "-r Raw");
217 break;
218 case 's':
219 if (strcmp(arg,"clear") == 0)
220 {
221 memset(&summ, 0, sizeof(SUMM));
222 esclog(outFile, "Statistics cleared\n");
223 }
224 else
225 stat_print(outFile, &summ);
226 break;
227 case 'S':
228 cnt = sscanf(arg, "%d+%d", &opt_Source, &opt_SrcPlus);
229 if (opt_Source)
230 {
231 handle_switch(outFile, &opt_undo, "1", "-u Undo");
232 handle_switch(outFile, &opt_redo, "1", "-U Undo and reprocess");
233 }
234 esclog(outFile, "-S Sources option is %d+%d,\"%s\"\n", opt_Source, opt_SrcPlus, opt_SourcesPath);
235 esclog(outFile, "(Setting source tree not implemented)\n");
236 break;
237 case 't':
238 handle_switch(outFile, &opt_twice, arg, "-t Translate twice");
239 break;
240 case 'T':
241 handle_switch(outFile, &opt_twice, arg, NULL);
242 handle_switch(outFile, &opt_Twice, arg, "-T Translate for (address-1)");
243 break;
244 case 'u':
245 handle_switch(outFile, &opt_undo, arg, "-u undo");
246 break;
247 case 'U':
248 handle_switch(outFile, &opt_undo, arg, NULL);
249 handle_switch(outFile, &opt_redo, arg, "-U Undo and reprocess");
250 break;
251 case 'v':
252 handle_switch(outFile, &opt_verbose, arg, "-v Verbosity");
253 break;
254 case 'z':
255 handle_switch_str(outFile, opt_7z, NULL, "-z 7z path");
256 break;
257 default:
258 if (strchr(optchars, cmd))
259 esclog(outFile, "Command not implemented in cli: %c %s\n",cmd, arg)
260 else
261 esclog(outFile, "Unknown command: %c %s\n",cmd, arg);
262 }
263 opt_cli = 0;
264
265 memset(Line, '\0', LINESIZE); // flushed
266
267 return KDBG_ESC_CHAR; //handled escaped command
268}
269
270/* EOF */
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
char * strchr(const char *String, int ch)
Definition: utclib.c:501
r l[0]
Definition: byte_order.h:168
#define LINESIZE
Definition: chargen.c:18
#define NULL
Definition: types.h:112
const WCHAR * text
Definition: package.c:1799
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLdouble s
Definition: gl.h:2039
GLuint res
Definition: glext.h:9613
const GLubyte * c
Definition: glext.h:8905
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
_Check_return_ _CRTIMP int __cdecl sscanf(_In_z_ const char *_Src, _In_z_ _Scanf_format_string_ const char *_Format,...)
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
#define c
Definition: ke_i.h:80
SUMM summ
Definition: log2lines.c:36
static const WCHAR desc[]
Definition: protectdata.c:36
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
#define memset(x, y, z)
Definition: compat.h:39
static int handle_switch_str(FILE *outFile, char *sw, char *arg, char *desc)
Definition: cmd.c:73
static int handle_address_cmd(FILE *outFile, char *arg)
Definition: cmd.c:105
static char * backSpaceEdit(char *s)
Definition: cmd.c:24
static int handle_switch(FILE *outFile, int *sw, char *arg, char *desc)
Definition: cmd.c:48
char handle_escape_cmd(FILE *outFile, char *Line)
Definition: cmd.c:138
#define KDBG_ESC_OFF
Definition: cmd.h:16
#define KDBG_BS_CHAR
Definition: cmd.h:12
#define KDBG_ESC_CHAR
Definition: cmd.h:13
#define NAMESIZE
Definition: config.h:31
#define INVALID_BASE
Definition: config.h:5
PLIST_MEMBER entry_lookup(PLIST list, char *name)
Definition: list.c:19
int opt_undo
Definition: options.c:38
char opt_SourcesPath[LINESIZE]
Definition: options.c:45
int opt_cli
Definition: options.c:31
char * opt_Pipe
Definition: options.c:29
char * opt_mod
Definition: options.c:42
int opt_redo
Definition: options.c:39
int opt_SrcPlus
Definition: options.c:35
int opt_raw
Definition: options.c:32
int opt_verbose
Definition: options.c:25
char * optchars
Definition: options.c:20
int opt_quit
Definition: options.c:30
char opt_dir[PATH_MAX]
Definition: options.c:40
int opt_Mark
Definition: options.c:28
int opt_twice
Definition: options.c:36
char opt_7z[PATH_MAX]
Definition: options.c:43
int opt_console
Definition: options.c:26
int opt_buffered
Definition: options.c:21
char opt_logFile[PATH_MAX]
Definition: options.c:41
int opt_Source
Definition: options.c:34
int opt_Twice
Definition: options.c:37
int set_LogFile(FILE **plogFile)
Definition: util.c:19
#define esclog(outFile, fmt,...)
Definition: util.h:22
#define log(outFile, fmt,...)
Definition: util.h:15
Definition: ncftp.h:79
Definition: cache.c:49
Definition: ftp_var.h:139
size_t RelBase
Definition: list.h:9
char logFile[_MAX_PATH]
Definition: tftpd.cpp:38
void stat_print(FILE *outFile, PSUMM psumm)
Definition: stat.c:17
void * arg
Definition: msvc.h:10