*/ 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); } }
*/ 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); } }