splitCommandLine function

List<String> splitCommandLine(
  1. String input
)

Implementation

List<String> splitCommandLine(String input) {
  final args = <String>[];
  final current = StringBuffer();
  String? quote;
  var escaping = false;

  for (var i = 0; i < input.length; i++) {
    final char = input[i];

    if (escaping) {
      current.write(char);
      escaping = false;
      continue;
    }

    if (char == '\\') {
      escaping = true;
      continue;
    }

    if (quote != null) {
      if (char == quote) {
        quote = null;
      } else {
        current.write(char);
      }
      continue;
    }

    if (char == '"' || char == "'") {
      quote = char;
      continue;
    }

    if (char.trim().isEmpty) {
      if (current.length > 0) {
        args.add(current.toString());
        current.clear();
      }
      continue;
    }

    current.write(char);
  }

  if (escaping) {
    current.write('\\');
  }
  if (quote != null) {
    throw const FormatException('Unterminated quoted string');
  }
  if (current.length > 0) {
    args.add(current.toString());
  }

  return args;
}