| // 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; | |
| } |