// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart=2.12

library dart2js.util.command_line;

/// The accepted escapes in the input of the --batch processor.
///
/// Contrary to Dart strings it does not contain hex escapes (\u or \x).
const Map<String, String> ESCAPE_MAPPING = {
  'n': '\n',
  'r': '\r',
  't': '\t',
  'b': '\b',
  'f': '\f',
  'v': '\v',
  '\\': '\\',
};

/// Splits the [line] similar to how a shell would split arguments. If [windows]
/// is `true` escapes will be handled like on the Windows command-line.
///
/// Example:
///
///     splitLine("""--args "ab"c 'with " \'spaces'""").forEach(print);
///     // --args
///     // abc
///     // with " 'spaces
List<String> splitLine(String line, {bool windows = false}) {
  List<String> result = <String>[];
  bool inQuotes = false;
  String? openingQuote;
  StringBuffer buffer = new StringBuffer();
  for (int i = 0; i < line.length; i++) {
    String c = line[i];
    if (inQuotes && c == openingQuote) {
      inQuotes = false;
      continue;
    }
    if (!inQuotes && (c == '"' || (c == "'" && !windows))) {
      inQuotes = true;
      openingQuote = c;
      continue;
    }
    if (c == '\\') {
      if (i == line.length - 1) {
        throw new FormatException('Unfinished escape: $line');
      }
      if (windows) {
        String next = line[i + 1];
        if (next == '"' || next == r'\') {
          buffer.write(next);
          i++;
          continue;
        }
      } else {
        i++;

        c = line[i];
        String mapped = ESCAPE_MAPPING[c] ?? c;
        buffer.write(mapped);
        continue;
      }
    }
    if (!inQuotes && c == ' ') {
      if (buffer.isNotEmpty) {
        result.add(buffer.toString());
        buffer.clear();
      }
      continue;
    }
    buffer.write(c);
  }
  if (inQuotes) throw new FormatException('Unclosed quotes: $line');
  if (buffer.isNotEmpty) result.add(buffer.toString());
  return result;
}
