export function parseArgsString()

in src/utils/argsUtil.ts [21:89]


export function parseArgsString(args: string): string[] | ParseError {
	const result: string[] = [];
	let word = '';
	let bufferedWord = false;

	for (let i = 0; i < args.length; ) {
		if (args[i] === "'" || args[i] === '"') {
			const quoteBegin = args[i];
			let j = i + 1;
			let k = i + 1;
			for (; k < args.length && args[k] !== quoteBegin; ) {
				// escaped quotes
				if (args[k] === '\\' && k + 1 < args.length && (args[k + 1] === "'" || args[k + 1] === '"')) {
					bufferedWord = true;
					// buffer everything up to this point, skipping backslash
					word += args.slice(j, k);
					word += args.charAt(k + 1);

					j = k + 2;
					k = k + 2;
				} else {
					k++;
				}
			}
			if (k >= args.length) {
				if (quoteBegin === "'") {
					return "args has unmatched single quotes ('). starting index: " + i;
				} else {
					return 'args has unmatched double quotes ("). starting index: ' + i;
				}
			}

			bufferedWord = true;
			word += args.slice(j, k);
			i = k + 1;
		} else if (args[i] === '\\' && i + 1 < args.length && (args[i + 1] === "'" || args[i + 1] === '"')) {
			// escaped quotes
			bufferedWord = true;
			word += args.charAt(i + 1);
			i = i + 2;
		} else if (args[i] !== ' ') {
			// a word
			let j = i + 1;
			// advance until a whitespace, or special char is encountered
			for (; j < args.length && args[j] !== ' ' && args[j] !== "'" && args[j] !== '"' && args[j] !== '\\'; j++) {
				// a word
			}

			bufferedWord = true;
			word += args.slice(i, j);
			i = j;
		} else if (bufferedWord) {
			// also true that args[i] === ' '
			result.push(word);
			word = '';
			bufferedWord = false;
			i++;
		} else {
			// args[i] === ' '
			i++;
		}
	}

	if (bufferedWord) {
		result.push(word);
	}

	return result;
}