Beispiel #1
0
*/	static void Insert_Command_Arg(REBCHR *cmd, REBCHR *arg, REBINT limit)
/*
**		Insert an argument into a command line at the %1 position,
**		or at the end if there is no %1. (An INSERT action.)
**		Do not exceed the specified limit length.
**
**		Too bad std Clib does not provide INSERT or REPLACE functions.
**
***********************************************************************/
{
	#define HOLD_SIZE 2000
	REBCHR *spot;
	REBCHR hold[HOLD_SIZE+4];

	if ((REBINT)LEN_STR(cmd) >= limit) return; // invalid case, ignore it.

	// Find %1:
	spot = FIND_STR(cmd, TEXT("%1"));

	if (spot) {
		// Save rest of cmd line (such as end quote, -flags, etc.)
		COPY_STR(hold, spot+2, HOLD_SIZE);

		// Terminate at the arg location:
		spot[0] = 0;

		// Insert the arg:
		JOIN_STR(spot, arg, limit - LEN_STR(cmd) - 1);

		// Add back the rest of cmd:
		JOIN_STR(spot, hold, limit - LEN_STR(cmd) - 1);
	}
	else {
		JOIN_STR(cmd, TEXT(" "), 1);
		JOIN_STR(cmd, arg, limit - LEN_STR(cmd) - 1);
	}
}
Beispiel #2
0
*/	void Parse_Args(int argc, REBCHR **argv, REBARGS *rargs)
/*
**		Parse REBOL's command line arguments, setting options
**		and values in the provided args structure.
**
***********************************************************************/
{
	REBCHR *arg;
	REBCHR *args = 0; // holds trailing args
	int flag;
	int i;

	CLEARS(rargs);

	// First arg is path to execuable (on most systems):
	if (argc > 0) rargs->exe_path = *argv;

	OS_Get_Current_Dir(&rargs->home_dir);

	// Parse each argument:
	for (i = 1; i < argc ; i++) {
		arg = argv[i];
		if (arg == 0) continue; // shell bug
		if (*arg == '-') {
			if (arg[1] == '-') {
				// --option words
				flag = find_option_word(arg+2);
				if (flag & RO_EXT) {
					flag = Get_Ext_Arg(flag, rargs, (i+1 >= argc) ? 0 : argv[i+1]);
					if ((flag & RO_EXT) == 0) i++; // used it
					else flag &= ~RO_EXT;
				}
				if (!flag) flag = RO_HELP;
				rargs->options |= flag;
			}
			else {
				// -x option chars
				while (*++arg) {
					flag = find_option_char(*arg, arg_chars);
					if (flag & RO_EXT) {
						flag = Get_Ext_Arg(flag, rargs, (i+1 >= argc) ? 0 : argv[i+1]);
						if ((flag & RO_EXT) == 0) i++; // used it
						else flag &= ~RO_EXT;
					}
					if (!flag) flag = RO_HELP;
					rargs->options |= flag;
				}
			}
		}
		else if (*arg == '+') {
			// +x option chars
			while (*++arg) {
				flag = find_option_char(*arg, arg_chars2);
				if (flag & RO_EXT) {
					flag = Get_Ext_Arg(flag, rargs, (i+1 >= argc) ? 0 : argv[i+1]);
					if ((flag & RO_EXT) == 0) i++; // used it
					else flag &= ~RO_EXT;
				}
				if (!flag) flag = RO_HELP;
				rargs->options |= flag;
			}
		}
		else {
			// script filename
			if (!rargs->script)
				rargs->script = arg;
			else {
				int len;
				if (!args) {
					args = MAKE_STR(ARG_BUF_SIZE);
					args[0] = 0;
				}
				len = ARG_BUF_SIZE - LEN_STR(args) - 2; // space remaining
				JOIN_STR(args, arg, len);
				JOIN_STR(args, TXT(" "), 1);
			}
		}
	}

	if (args) {
		args[LEN_STR(args)-1] = 0; // remove trailing space
		Get_Ext_Arg(RO_ARGS, rargs, args);
	}
}