www.pudn.com > truecrypt.zip > CMDLINE.C


/* Copyright (C) 2004 TrueCrypt Team, truecrypt.org 
   This product uses components written by Paul Le Roux  */ 
 
#include "TCdefs.h" 
 
#include  
#include  
#include "cmdline.h" 
 
#include "resource.h" 
#include "crypto.h" 
#include "apidrvr.h" 
#include "dlgcode.h" 
 
/* Except in response to the WM_INITDIALOG message, the dialog box procedure 
   should return nonzero if it processes the message, and zero if it does 
   not. - see DialogProc */ 
BOOL WINAPI 
CommandHelpDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
	if (lParam);		/* remove warning */ 
	if (wParam);		/* remove warning */ 
 
	switch (msg) 
	{ 
	case WM_INITDIALOG: 
		{ 
		char * tmp = err_malloc(8192); 
		char tmp2[256]; 
		argumentspec *as; 
		int i; 
 
		SetDefaultUserFont (hwndDlg); 
 
		as = (argumentspec*) lParam; 
 
		*tmp = 0; 
 
		for (i = 0; i < as->arg_cnt; i ++) 
		{ 
			sprintf(tmp2, "%s       %s\n", as->args[i].long_name,  
					as->args[i].short_name); 
			strcat(tmp,tmp2); 
		} 
 
		SetWindowText (GetDlgItem (hwndDlg, IDC_COMMANDHELP_TEXT), (char*) tmp); 
		return 1; 
		} 
 
	case WM_COMMAND: 
		EndDialog (hwndDlg, IDOK); 
		return 1; 
	case WM_CLOSE: 
		EndDialog (hwndDlg, 0); 
		return 1; 
	} 
 
	return 0; 
} 
 
int 
Win32CommandLine (char *lpszCommandLine, char ***lpszArgs) 
{ 
	int i = 0, k = 0, x = 0, nValid = TRUE; 
	int nLen = strlen (lpszCommandLine); 
	int nArrSize = 16; 
	char szTmp[256]; 
 
	*lpszArgs = malloc (sizeof (char *)* nArrSize); 
 
	if (*lpszArgs == NULL) 
		return 0; 
 
	while (i < nLen) 
	{ 
		if (lpszCommandLine[i] == ' ') 
		{ 
			if (k > 0) 
			{ 
				szTmp[k] = 0; 
				(*lpszArgs)[x] = _strdup (szTmp); 
				if ((*lpszArgs)[x] == NULL) 
				{ 
					free (*lpszArgs); 
					return 0; 
				} 
				x++; 
				k = 0; 
				if (x == nArrSize) 
				{ 
					break; 
				} 
			} 
			i++; 
			continue; 
		} 
		if (lpszCommandLine[i] == '"') 
		{ 
			i++; 
			while (i < nLen) 
			{ 
				if (lpszCommandLine[i] == '"') 
					break; 
				if (k < sizeof (szTmp)) 
					szTmp[k++] = lpszCommandLine[i++]; 
				else 
				{ 
					free (*lpszArgs); 
					return 0; 
				} 
			} 
 
			if (lpszCommandLine[i] != '"') 
			{ 
				nValid = FALSE; 
				break; 
			} 
		} 
		else 
		{ 
			if (k < sizeof (szTmp)) 
				szTmp[k++] = lpszCommandLine[i]; 
			else 
			{ 
				free (*lpszArgs); 
				return 0; 
			} 
		} 
 
		i++; 
	} 
 
	if (nValid == FALSE) 
	{ 
		free (*lpszArgs); 
		return 0; 
	} 
	else if (k > 0) 
	{ 
		szTmp[k] = 0; 
		(*lpszArgs)[x] = _strdup (szTmp); 
		if ((*lpszArgs)[x] == NULL) 
		{ 
			free (*lpszArgs); 
			return 0; 
		} 
		x++; 
		k = 0; 
	} 
	if (!x) 
	{ 
		free (*lpszArgs); 
		return 0; 
	} 
	return x; 
} 
 
int 
GetArgSepPosOffset (char *lpszArgument) 
{ 
	if (lpszArgument[0] == '/') 
		return 1; 
	else if (lpszArgument[0] == '-' && lpszArgument[1] == '-') 
		return 2; 
	else if (lpszArgument[0] == '-') 
		return 1; 
	else 
		return 0; 
} 
 
int 
GetArgumentID (argumentspec *as, char *lpszArgument, int *nArgPos) 
{ 
	char szTmp[256]; 
	int i; 
 
	i = strlen (lpszArgument); 
	szTmp[i] = 0; 
	while (--i >= 0) 
	{ 
		szTmp[i] = (char) tolower (lpszArgument[i]); 
	} 
 
	for (i = 0; i < as->arg_cnt; i++) 
	{ 
		size_t k; 
 
		k = strlen (as->args[i].long_name); 
		if (memcmp (as->args[i].long_name, szTmp, k * sizeof (char)) == 0) 
		{ 
			int x; 
			for (x = i + 1; x < as->arg_cnt; x++) 
			{ 
				size_t m; 
 
				m = strlen (as->args[x].long_name); 
				if (memcmp (as->args[x].long_name, szTmp, m * sizeof (char)) == 0) 
				{ 
					break; 
				} 
			} 
 
			if (x == as->arg_cnt) 
			{ 
				if (strlen (lpszArgument) != k) 
					*nArgPos = k; 
				else 
					*nArgPos = 0; 
				return as->args[i].short_name[1]; 
			} 
		} 
	} 
 
	for (i = 0; i < as->arg_cnt; i++) 
	{ 
		size_t k; 
 
		k = strlen (as->args[i].short_name); 
		if (memcmp (as->args[i].short_name, szTmp, k * sizeof (char)) == 0) 
		{ 
			int x; 
			for (x = i + 1; x < as->arg_cnt; x++) 
			{ 
				size_t m; 
 
				m = strlen (as->args[x].short_name); 
				if (memcmp (as->args[x].short_name, szTmp, m * sizeof (char)) == 0) 
				{ 
					break; 
				} 
			} 
 
			if (x == as->arg_cnt) 
			{ 
				if (strlen (lpszArgument) != k) 
					*nArgPos = k; 
				else 
					*nArgPos = 0; 
				return as->args[i].short_name[1]; 
			} 
		} 
	} 
 
 
	return -1; 
} 
 
int 
GetArgumentValue (char **lpszCommandLineArgs, int nArgPos, int *nArgIdx, 
		  int nNoCommandLineArgs, char *lpszValue, int nValueSize) 
{ 
	*lpszValue = 0; 
 
	if (nArgPos) 
	{ 
		/* Handles the case of no space between parameter code and 
		   value */ 
		memcpy (lpszValue, &lpszCommandLineArgs[*nArgIdx][nArgPos], nValueSize * sizeof (char)); 
		lpszValue[nValueSize - 1] = 0; 
		return HAS_ARGUMENT; 
	} 
	else if (*nArgIdx + 1 != nNoCommandLineArgs) 
	{ 
		int x = GetArgSepPosOffset (lpszCommandLineArgs[*nArgIdx + 1]); 
		if (x == 0) 
		{ 
			/* Handles the case of space between parameter code 
			   and value */ 
			memcpy (lpszValue, &lpszCommandLineArgs[*nArgIdx + 1][x], nValueSize * sizeof (char)); 
			lpszValue[nValueSize - 1] = 0; 
			(*nArgIdx)++; 
			return HAS_ARGUMENT; 
		} 
	} 
 
	return HAS_NO_ARGUMENT; 
}