45c42e08f2
R=ricow@google.com Review URL: https://codereview.chromium.org//23568002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@26704 260f80e4-7a28-3924-810f-c04153c831b5
158 lines
3.9 KiB
Dart
158 lines
3.9 KiB
Dart
// Copyright (c) 2013, 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 utils;
|
|
|
|
import 'dart:async';
|
|
import 'dart:io';
|
|
import 'dart:math' show min;
|
|
import 'dart:utf' as utf;
|
|
|
|
part 'legacy_path.dart';
|
|
|
|
class DebugLogger {
|
|
static IOSink _sink;
|
|
|
|
/**
|
|
* If [path] was null, the DebugLogger will write messages to stdout.
|
|
*/
|
|
static init(Path path, {append: false}) {
|
|
if (path != null) {
|
|
var mode = append ? FileMode.APPEND : FileMode.WRITE;
|
|
_sink = new File(path.toNativePath()).openWrite(mode: mode);
|
|
}
|
|
}
|
|
|
|
static void close() {
|
|
if (_sink != null) {
|
|
_sink.close();
|
|
_sink = null;
|
|
}
|
|
}
|
|
|
|
static String _formatErrorMessage(String msg, error) {
|
|
if (error == null) return msg;
|
|
msg += ": $error";
|
|
// TODO(floitsch): once the dart-executable that is bundled
|
|
// with the Dart sources is updated, uncomment the following
|
|
// lines.
|
|
// var trace = getAttachedStackTrace(error);
|
|
// if (trace != null) msg += "\nStackTrace: $trace";
|
|
return msg;
|
|
}
|
|
static void info(String msg, [error]) {
|
|
msg = _formatErrorMessage(msg, error);
|
|
_print("$_datetime Info: $msg");
|
|
}
|
|
|
|
static void warning(String msg, [error]) {
|
|
msg = _formatErrorMessage(msg, error);
|
|
_print("$_datetime Warning: $msg");
|
|
}
|
|
|
|
static void error(String msg, [error]) {
|
|
msg = _formatErrorMessage(msg, error);
|
|
_print("$_datetime Error: $msg");
|
|
}
|
|
|
|
static void _print(String msg) {
|
|
if (_sink != null) {
|
|
_sink.writeln(msg);
|
|
} else {
|
|
print(msg);
|
|
}
|
|
}
|
|
|
|
static String get _datetime => "${new DateTime.now()}";
|
|
}
|
|
|
|
|
|
/**
|
|
* [areByteArraysEqual] compares a range of bytes from [buffer1] with a
|
|
* range of bytes from [buffer2].
|
|
*
|
|
* Returns [true] if the [count] bytes in [buffer1] (starting at
|
|
* [offset1]) match the [count] bytes in [buffer2] (starting at
|
|
* [offset2]).
|
|
* Otherwise [false] is returned.
|
|
*/
|
|
bool areByteArraysEqual(List<int> buffer1, int offset1,
|
|
List<int> buffer2, int offset2,
|
|
int count) {
|
|
if ((offset1 + count) > buffer1.length ||
|
|
(offset2 + count) > buffer2.length) {
|
|
return false;
|
|
}
|
|
|
|
for (var i = 0; i < count; i++) {
|
|
if (buffer1[offset1 + i] != buffer2[offset2 + i]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* [findBytes] searches for [pattern] in [data] beginning at [startPos].
|
|
*
|
|
* Returns [true] if [pattern] was found in [data].
|
|
* Otherwise [false] is returned.
|
|
*/
|
|
int findBytes(List<int> data, List<int> pattern, [int startPos=0]) {
|
|
// TODO(kustermann): Use one of the fast string-matching algorithms!
|
|
for (int i = startPos; i < (data.length - pattern.length); i++) {
|
|
bool found = true;
|
|
for (int j = 0; j < pattern.length; j++) {
|
|
if (data[i + j] != pattern[j]) {
|
|
found = false;
|
|
break;
|
|
}
|
|
}
|
|
if (found) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
List<int> encodeUtf8(String string) {
|
|
return utf.encodeUtf8(string);
|
|
}
|
|
|
|
// TODO(kustermann,ricow): As soon we have a debug log we should log
|
|
// invalid utf8-encoded input to the log.
|
|
// Currently invalid bytes will be replaced by a replacement character.
|
|
String decodeUtf8(List<int> bytes) {
|
|
return utf.decodeUtf8(bytes);
|
|
}
|
|
|
|
// This function is pretty stupid and only puts quotes around an argument if
|
|
// it the argument contains a space.
|
|
String escapeCommandLineArgument(String argument) {
|
|
if (argument.contains(' ')) {
|
|
return '"$argument"';
|
|
}
|
|
return argument;
|
|
}
|
|
|
|
class HashCodeBuilder {
|
|
int _value = 0;
|
|
|
|
void add(Object object) {
|
|
_value = ((_value * 31) ^ object.hashCode) & 0x3FFFFFFF;
|
|
}
|
|
|
|
int get value => _value;
|
|
}
|
|
|
|
class UniqueObject {
|
|
static int _nextId = 1;
|
|
final int _hashCode;
|
|
|
|
int get hashCode => _hashCode;
|
|
operator==(other) => other is UniqueObject && _hashCode == other._hashCode;
|
|
|
|
UniqueObject() : _hashCode = ++_nextId;
|
|
}
|