+ static bool SplitDriverAndScriptArguments (ref string [] driver_args, out string [] script_args)
+ {
+ // split command line arguments into two groups:
+ // - anything before '--' or '-s' goes to the mcs driver, which may
+ // call back into the csharp driver for further processing
+ // - anything after '--' or '-s' is made available to the REPL/script
+ // via the 'Args' global, similar to csi.
+ // - if '-s' is used, the argument immediately following it will
+ // also be processed by the mcs driver (e.g. a source file)
+
+ int driver_args_count = 0;
+ int script_args_offset = 0;
+ string script_file = null;
+
+ while (driver_args_count < driver_args.Length && script_args_offset == 0) {
+ switch (driver_args [driver_args_count]) {
+ case "--":
+ script_args_offset = driver_args_count + 1;
+ break;
+ case "-s":
+ if (driver_args_count + 1 >= driver_args.Length) {
+ script_args = null;
+ Console.Error.WriteLine ("usage is: -s SCRIPT_FILE");
+ return false;
+ }
+ driver_args_count++;
+ script_file = driver_args [driver_args_count];
+ script_args_offset = driver_args_count + 1;
+ break;
+ default:
+ driver_args_count++;
+ break;
+ }
+ }
+
+ if (script_args_offset > 0) {
+ int script_args_count = driver_args.Length - script_args_offset;
+ script_args = new string [script_args_count];
+ Array.Copy (driver_args, script_args_offset, script_args, 0, script_args_count);
+ } else
+ script_args = Array.Empty<string> ();
+
+ Array.Resize (ref driver_args, driver_args_count);
+ if (script_file != null)
+ driver_args [driver_args_count - 1] = script_file;
+
+ return true;
+ }
+