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