blob: 088e363c578a4f8f4df2e8f3d54cd854ce3a3af2 [file] [log] [blame]
// Copyright (c) 2020, 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.
import 'dart:io';
extension TestGeneratorStringExtension on String {
String upperCaseFirst() => "${this[0].toUpperCase()}${this.substring(1)}";
String lowerCaseFirst() => "${this[0].toLowerCase()}${this.substring(1)}";
String makeCComment() => "// " + split("\n").join("\n// ");
String makeDartDocComment() => "/// " + split("\n").join("\n/// ");
String limitTo(int length) {
if (this.length > length) {
return substring(0, length);
}
return this;
}
String trimCouts() => replaceAll('" << "', '').replaceAll('"<< "', '');
}
Future<void> runProcess(String executable, List<String> arguments) async {
final commandString = [executable, ...arguments].join(' ');
stdout.writeln('Running `$commandString`.');
final process = await Process.start(
executable,
arguments,
runInShell: true,
includeParentEnvironment: true,
).then((process) {
process.stdout.forEach(stdout.add);
process.stderr.forEach(stderr.add);
return process;
});
final exitCode = await process.exitCode;
if (exitCode != 0) {
final message = 'Command `$commandString` failed with exit code $exitCode.';
stderr.writeln(message);
throw Exception(message);
}
stdout.writeln('Command `$commandString` done.');
}
String headerCommon({
required int copyrightYear,
required String generatorPath,
}) {
final year = copyrightYear;
return """
// Copyright (c) $year, 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.
//
// This file has been automatically generated. Please do not edit it manually.
// Generated by $generatorPath.""";
}
String headerC({
required int copyrightYear,
required String generatorPath,
}) {
return """
${headerCommon(copyrightYear: copyrightYear, generatorPath: generatorPath)}
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <sys/types.h>
#include <cmath>
#include <iostream>
#include <limits>
#if defined(_WIN32)
#define DART_EXPORT extern "C" __declspec(dllexport)
#else
#define DART_EXPORT \\
extern "C" __attribute__((visibility("default"))) __attribute((used))
#endif
namespace dart {
#define CHECK(X) \\
if (!(X)) { \\
fprintf(stderr, "%s\\n", "Check failed: " #X); \\
return 1; \\
}
#define CHECK_EQ(X, Y) CHECK((X) == (Y))
// Works for positive, negative and zero.
#define CHECK_APPROX(EXPECTED, ACTUAL) \\
CHECK(((EXPECTED * 0.99) <= (ACTUAL) && (EXPECTED * 1.01) >= (ACTUAL)) || \\
((EXPECTED * 0.99) >= (ACTUAL) && (EXPECTED * 1.01) <= (ACTUAL)))
""";
}
const footerC = """
} // namespace dart
""";