// 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.

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).
Map<String, String> ESCAPE_MAPPING = const {
  "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];
        if (mapped == null) mapped = 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;
}
