| // Copyright (c) 2012, 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. | |
| #include "bin/platform.h" | |
| #include "bin/dartutils.h" | |
| #include "bin/file.h" | |
| #include "bin/utils.h" | |
| #include "include/dart_api.h" | |
| namespace dart { | |
| namespace bin { | |
| AcqRelAtomic<const char*> Platform::resolved_executable_name_ = nullptr; | |
| void FUNCTION_NAME(Platform_NumberOfProcessors)(Dart_NativeArguments args) { | |
| Dart_SetReturnValue(args, Dart_NewInteger(Platform::NumberOfProcessors())); | |
| } | |
| void FUNCTION_NAME(Platform_OperatingSystem)(Dart_NativeArguments args) { | |
| Dart_Handle str = DartUtils::NewString(Platform::OperatingSystem()); | |
| ThrowIfError(str); | |
| Dart_SetReturnValue(args, str); | |
| } | |
| void FUNCTION_NAME(Platform_OperatingSystemVersion)(Dart_NativeArguments args) { | |
| const char* version = Platform::OperatingSystemVersion(); | |
| if (version == nullptr) { | |
| Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | |
| } else { | |
| Dart_Handle str = DartUtils::NewString(version); | |
| ThrowIfError(str); | |
| Dart_SetReturnValue(args, str); | |
| } | |
| } | |
| void FUNCTION_NAME(Platform_PathSeparator)(Dart_NativeArguments args) { | |
| Dart_Handle str = DartUtils::NewString(File::PathSeparator()); | |
| ThrowIfError(str); | |
| Dart_SetReturnValue(args, str); | |
| } | |
| void FUNCTION_NAME(Platform_LocalHostname)(Dart_NativeArguments args) { | |
| const intptr_t HOSTNAME_LENGTH = 256; | |
| char hostname[HOSTNAME_LENGTH]; | |
| if (Platform::LocalHostname(hostname, HOSTNAME_LENGTH)) { | |
| Dart_Handle str = DartUtils::NewString(hostname); | |
| ThrowIfError(str); | |
| Dart_SetReturnValue(args, str); | |
| } else { | |
| Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | |
| } | |
| } | |
| void FUNCTION_NAME(Platform_ExecutableName)(Dart_NativeArguments args) { | |
| if (Platform::GetExecutableName() != nullptr) { | |
| Dart_SetReturnValue( | |
| args, Dart_NewStringFromCString(Platform::GetExecutableName())); | |
| } else { | |
| Dart_SetReturnValue(args, Dart_Null()); | |
| } | |
| } | |
| void FUNCTION_NAME(Platform_ResolvedExecutableName)(Dart_NativeArguments args) { | |
| if (Platform::GetResolvedExecutableName() != nullptr) { | |
| Dart_SetReturnValue( | |
| args, Dart_NewStringFromCString(Platform::GetResolvedExecutableName())); | |
| } else { | |
| Dart_SetReturnValue(args, Dart_Null()); | |
| } | |
| } | |
| void FUNCTION_NAME(Platform_ExecutableArguments)(Dart_NativeArguments args) { | |
| int end = Platform::GetScriptIndex(); | |
| char** argv = Platform::GetArgv(); | |
| Dart_Handle string_type = DartUtils::GetDartType("dart:core", "String"); | |
| ThrowIfError(string_type); | |
| Dart_Handle result = | |
| Dart_NewListOfTypeFilled(string_type, Dart_EmptyString(), end - 1); | |
| for (intptr_t i = 1; i < end; i++) { | |
| Dart_Handle str = DartUtils::NewString(argv[i]); | |
| ThrowIfError(str); | |
| ThrowIfError(Dart_ListSetAt(result, i - 1, str)); | |
| } | |
| Dart_SetReturnValue(args, result); | |
| } | |
| void FUNCTION_NAME(Platform_Environment)(Dart_NativeArguments args) { | |
| intptr_t count = 0; | |
| char** env = Platform::Environment(&count); | |
| if (env == nullptr) { | |
| OSError error(-1, "Failed to retrieve environment variables.", | |
| OSError::kUnknown); | |
| Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); | |
| } else { | |
| Dart_Handle result = Dart_NewList(count); | |
| ThrowIfError(result); | |
| intptr_t result_idx = 0; | |
| for (intptr_t env_idx = 0; env_idx < count; env_idx++) { | |
| Dart_Handle str = DartUtils::NewString(env[env_idx]); | |
| if (Dart_IsError(str)) { | |
| // Silently skip over environment entries that are not valid UTF8 | |
| // strings. | |
| continue; | |
| } | |
| Dart_Handle error = Dart_ListSetAt(result, result_idx, str); | |
| ThrowIfError(error); | |
| result_idx++; | |
| } | |
| Dart_SetReturnValue(args, result); | |
| } | |
| } | |
| void FUNCTION_NAME(Platform_GetVersion)(Dart_NativeArguments args) { | |
| Dart_SetReturnValue(args, Dart_NewStringFromCString(Dart_VersionString())); | |
| } | |
| void FUNCTION_NAME(Platform_LocaleName)(Dart_NativeArguments args) { | |
| const char* locale = Platform::LocaleName(); | |
| if (locale == nullptr) { | |
| Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | |
| } else { | |
| Dart_SetReturnValue(args, Dart_NewStringFromCString(locale)); | |
| } | |
| } | |
| } // namespace bin | |
| } // namespace dart |