// 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.
///
/// Example:
///
///     splitline("""--args "ab"c 'with " \'spaces'""").forEach(print);
///     // --args
///     // abc
///     // with " 'spaces
List<String> splitLine(String line) {
  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 == '"')) {
      inQuotes = true;
      openingQuote = c;
      continue;
    }
    if (c == '\\') {
      if (i == line.length - 1) {
        throw new FormatException("Unfinished escape: $line");
      }
      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;
}

