forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			107 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
package haxe;
 | 
						|
 | 
						|
import haxe.ds.ReadOnlyArray;
 | 
						|
 | 
						|
class SysTools {
 | 
						|
	/**
 | 
						|
		Character codes of the characters that will be escaped by `quoteWinArg(_, true)`.
 | 
						|
	**/
 | 
						|
	public static final winMetaCharacters:ReadOnlyArray<Int> = [
 | 
						|
		" ".code, "(".code, ")".code, "%".code, "!".code, "^".code, "\"".code, "<".code, ">".code, "&".code, "|".code, "\n".code, "\r".code, ",".code, ";".code
 | 
						|
	];
 | 
						|
 | 
						|
	/**
 | 
						|
		Returns a String that can be used as a single command line argument
 | 
						|
		on Unix.
 | 
						|
		The input will be quoted, or escaped if necessary.
 | 
						|
	**/
 | 
						|
	public static function quoteUnixArg(argument:String):String {
 | 
						|
		// Based on cpython's shlex.quote().
 | 
						|
		// https://hg.python.org/cpython/file/a3f076d4f54f/Lib/shlex.py#l278
 | 
						|
 | 
						|
		if (argument == "")
 | 
						|
			return "''";
 | 
						|
 | 
						|
		if (!~/[^a-zA-Z0-9_@%+=:,.\/-]/.match(argument))
 | 
						|
			return argument;
 | 
						|
 | 
						|
		// use single quotes, and put single quotes into double quotes
 | 
						|
		// the string $'b is then quoted as '$'"'"'b'
 | 
						|
		return "'" + StringTools.replace(argument, "'", "'\"'\"'") + "'";
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
		Returns a String that can be used as a single command line argument
 | 
						|
		on Windows.
 | 
						|
		The input will be quoted, or escaped if necessary, such that the output
 | 
						|
		will be parsed as a single argument using the rule specified in
 | 
						|
		http://msdn.microsoft.com/en-us/library/ms880421
 | 
						|
 | 
						|
		Examples:
 | 
						|
		```haxe
 | 
						|
		quoteWinArg("abc") == "abc";
 | 
						|
		quoteWinArg("ab c") == '"ab c"';
 | 
						|
		```
 | 
						|
	**/
 | 
						|
	public static function quoteWinArg(argument:String, escapeMetaCharacters:Bool):String {
 | 
						|
		// If there is no space, tab, back-slash, or double-quotes, and it is not an empty string.
 | 
						|
		if (!~/^[^ \t\\"]+$/.match(argument)) {
 | 
						|
			// Based on cpython's subprocess.list2cmdline().
 | 
						|
			// https://hg.python.org/cpython/file/50741316dd3a/Lib/subprocess.py#l620
 | 
						|
 | 
						|
			var result = new StringBuf();
 | 
						|
			var needquote = argument.indexOf(" ") != -1 || argument.indexOf("\t") != -1 || argument == "";
 | 
						|
 | 
						|
			if (needquote)
 | 
						|
				result.add('"');
 | 
						|
 | 
						|
			var bs_buf = new StringBuf();
 | 
						|
			for (i in 0...argument.length) {
 | 
						|
				switch (argument.charCodeAt(i)) {
 | 
						|
					case "\\".code:
 | 
						|
						// Don't know if we need to double yet.
 | 
						|
						bs_buf.add("\\");
 | 
						|
					case '"'.code:
 | 
						|
						// Double backslashes.
 | 
						|
						var bs = bs_buf.toString();
 | 
						|
						result.add(bs);
 | 
						|
						result.add(bs);
 | 
						|
						bs_buf = new StringBuf();
 | 
						|
						result.add('\\"');
 | 
						|
					case var c:
 | 
						|
						// Normal char
 | 
						|
						if (bs_buf.length > 0) {
 | 
						|
							result.add(bs_buf.toString());
 | 
						|
							bs_buf = new StringBuf();
 | 
						|
						}
 | 
						|
						result.addChar(c);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			// Add remaining backslashes, if any.
 | 
						|
			result.add(bs_buf.toString());
 | 
						|
 | 
						|
			if (needquote) {
 | 
						|
				result.add(bs_buf.toString());
 | 
						|
				result.add('"');
 | 
						|
			}
 | 
						|
 | 
						|
			argument = result.toString();
 | 
						|
		}
 | 
						|
 | 
						|
		if (escapeMetaCharacters) {
 | 
						|
			var result = new StringBuf();
 | 
						|
			for (i in 0...argument.length) {
 | 
						|
				var c = argument.charCodeAt(i);
 | 
						|
				if (winMetaCharacters.indexOf(c) >= 0) {
 | 
						|
					result.addChar("^".code);
 | 
						|
				}
 | 
						|
				result.addChar(c);
 | 
						|
			}
 | 
						|
			return result.toString();
 | 
						|
		} else {
 | 
						|
			return argument;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |