|
|
1.1 root 1: /* Copyright (C) 2004 TrueCrypt Team, truecrypt.org
2: This product uses components written by Paul Le Roux <[email protected]> */
3:
4: #include "TCdefs.h"
5:
6: #include <malloc.h>
7: #include <ctype.h>
8: #include "cmdline.h"
9:
10: #include "resource.h"
11: #include "crypto.h"
12: #include "apidrvr.h"
13: #include "dlgcode.h"
14:
15: /* Except in response to the WM_INITDIALOG message, the dialog box procedure
16: should return nonzero if it processes the message, and zero if it does
17: not. - see DialogProc */
18: BOOL WINAPI
19: CommandHelpDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
20: {
21: if (lParam); /* remove warning */
22: if (wParam); /* remove warning */
23:
24: switch (msg)
25: {
26: case WM_INITDIALOG:
27: {
28: char * tmp = err_malloc(8192);
29: char tmp2[256];
30: argumentspec *as;
31: int i;
32:
33: SetDefaultUserFont (hwndDlg);
34:
35: as = (argumentspec*) lParam;
36:
37: *tmp = 0;
38:
39: for (i = 0; i < as->arg_cnt; i ++)
40: {
41: sprintf(tmp2, "%s %s\n", as->args[i].long_name,
42: as->args[i].short_name);
43: strcat(tmp,tmp2);
44: }
45:
46: SetWindowText (GetDlgItem (hwndDlg, IDC_COMMANDHELP_TEXT), (char*) tmp);
47: return 1;
48: }
49:
50: case WM_COMMAND:
51: EndDialog (hwndDlg, IDOK);
52: return 1;
53: case WM_CLOSE:
54: EndDialog (hwndDlg, 0);
55: return 1;
56: }
57:
58: return 0;
59: }
60:
61: int
62: Win32CommandLine (char *lpszCommandLine, char ***lpszArgs)
63: {
64: int i = 0, k = 0, x = 0, nValid = TRUE;
65: int nLen = strlen (lpszCommandLine);
66: int nArrSize = 16;
67: char szTmp[256];
68:
69: *lpszArgs = malloc (sizeof (char *)* nArrSize);
70:
71: if (*lpszArgs == NULL)
72: return 0;
73:
74: while (i < nLen)
75: {
76: if (lpszCommandLine[i] == ' ')
77: {
78: if (k > 0)
79: {
80: szTmp[k] = 0;
81: (*lpszArgs)[x] = _strdup (szTmp);
82: if ((*lpszArgs)[x] == NULL)
83: {
84: free (*lpszArgs);
85: return 0;
86: }
87: x++;
88: k = 0;
89: if (x == nArrSize)
90: {
91: break;
92: }
93: }
94: i++;
95: continue;
96: }
97: if (lpszCommandLine[i] == '"')
98: {
99: i++;
100: while (i < nLen)
101: {
102: if (lpszCommandLine[i] == '"')
103: break;
104: if (k < sizeof (szTmp))
105: szTmp[k++] = lpszCommandLine[i++];
106: else
107: {
108: free (*lpszArgs);
109: return 0;
110: }
111: }
112:
113: if (lpszCommandLine[i] != '"')
114: {
115: nValid = FALSE;
116: break;
117: }
118: }
119: else
120: {
121: if (k < sizeof (szTmp))
122: szTmp[k++] = lpszCommandLine[i];
123: else
124: {
125: free (*lpszArgs);
126: return 0;
127: }
128: }
129:
130: i++;
131: }
132:
133: if (nValid == FALSE)
134: {
135: free (*lpszArgs);
136: return 0;
137: }
138: else if (k > 0)
139: {
140: szTmp[k] = 0;
141: (*lpszArgs)[x] = _strdup (szTmp);
142: if ((*lpszArgs)[x] == NULL)
143: {
144: free (*lpszArgs);
145: return 0;
146: }
147: x++;
148: k = 0;
149: }
150: if (!x)
151: {
152: free (*lpszArgs);
153: return 0;
154: }
155: return x;
156: }
157:
158: int
159: GetArgSepPosOffset (char *lpszArgument)
160: {
161: if (lpszArgument[0] == '/')
162: return 1;
163: else if (lpszArgument[0] == '-' && lpszArgument[1] == '-')
164: return 2;
165: else if (lpszArgument[0] == '-')
166: return 1;
167: else
168: return 0;
169: }
170:
171: int
172: GetArgumentID (argumentspec *as, char *lpszArgument, int *nArgPos)
173: {
174: char szTmp[256];
175: int i;
176:
177: i = strlen (lpszArgument);
178: szTmp[i] = 0;
179: while (--i >= 0)
180: {
181: szTmp[i] = (char) tolower (lpszArgument[i]);
182: }
183:
184: for (i = 0; i < as->arg_cnt; i++)
185: {
186: size_t k;
187:
188: k = strlen (as->args[i].long_name);
189: if (memcmp (as->args[i].long_name, szTmp, k * sizeof (char)) == 0)
190: {
191: int x;
192: for (x = i + 1; x < as->arg_cnt; x++)
193: {
194: size_t m;
195:
196: m = strlen (as->args[x].long_name);
197: if (memcmp (as->args[x].long_name, szTmp, m * sizeof (char)) == 0)
198: {
199: break;
200: }
201: }
202:
203: if (x == as->arg_cnt)
204: {
205: if (strlen (lpszArgument) != k)
206: *nArgPos = k;
207: else
208: *nArgPos = 0;
209: return as->args[i].short_name[1];
210: }
211: }
212: }
213:
214: for (i = 0; i < as->arg_cnt; i++)
215: {
216: size_t k;
217:
218: k = strlen (as->args[i].short_name);
219: if (memcmp (as->args[i].short_name, szTmp, k * sizeof (char)) == 0)
220: {
221: int x;
222: for (x = i + 1; x < as->arg_cnt; x++)
223: {
224: size_t m;
225:
226: m = strlen (as->args[x].short_name);
227: if (memcmp (as->args[x].short_name, szTmp, m * sizeof (char)) == 0)
228: {
229: break;
230: }
231: }
232:
233: if (x == as->arg_cnt)
234: {
235: if (strlen (lpszArgument) != k)
236: *nArgPos = k;
237: else
238: *nArgPos = 0;
239: return as->args[i].short_name[1];
240: }
241: }
242: }
243:
244:
245: return -1;
246: }
247:
248: int
249: GetArgumentValue (char **lpszCommandLineArgs, int nArgPos, int *nArgIdx,
250: int nNoCommandLineArgs, char *lpszValue, int nValueSize)
251: {
252: *lpszValue = 0;
253:
254: if (nArgPos)
255: {
256: /* Handles the case of no space between parameter code and
257: value */
258: memcpy (lpszValue, &lpszCommandLineArgs[*nArgIdx][nArgPos], nValueSize * sizeof (char));
259: lpszValue[nValueSize - 1] = 0;
260: return HAS_ARGUMENT;
261: }
262: else if (*nArgIdx + 1 != nNoCommandLineArgs)
263: {
264: int x = GetArgSepPosOffset (lpszCommandLineArgs[*nArgIdx + 1]);
265: if (x == 0)
266: {
267: /* Handles the case of space between parameter code
268: and value */
269: memcpy (lpszValue, &lpszCommandLineArgs[*nArgIdx + 1][x], nValueSize * sizeof (char));
270: lpszValue[nValueSize - 1] = 0;
271: (*nArgIdx)++;
272: return HAS_ARGUMENT;
273: }
274: }
275:
276: return HAS_NO_ARGUMENT;
277: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.