1// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2// for details. All rights reserved. Use of this source code is governed by a
3// BSD-style license that can be found in the LICENSE file.
4
5#include "bin/platform.h"
6
7#include "bin/dartutils.h"
8#include "bin/file.h"
9#include "bin/utils.h"
10#include "include/dart_api.h"
11
12namespace dart {
13namespace bin {
14
15void FUNCTION_NAME(Platform_NumberOfProcessors)(Dart_NativeArguments args) {
16 Dart_SetReturnValue(args, Dart_NewInteger(Platform::NumberOfProcessors()));
17}
18
19void FUNCTION_NAME(Platform_OperatingSystem)(Dart_NativeArguments args) {
20 Dart_Handle str = DartUtils::NewString(Platform::OperatingSystem());
21 ThrowIfError(str);
22 Dart_SetReturnValue(args, str);
23}
24
25void FUNCTION_NAME(Platform_OperatingSystemVersion)(Dart_NativeArguments args) {
26 const char* version = Platform::OperatingSystemVersion();
27 if (version == NULL) {
28 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
29 } else {
30 Dart_Handle str = DartUtils::NewString(version);
31 ThrowIfError(str);
32 Dart_SetReturnValue(args, str);
33 }
34}
35
36void FUNCTION_NAME(Platform_PathSeparator)(Dart_NativeArguments args) {
37 Dart_Handle str = DartUtils::NewString(File::PathSeparator());
38 ThrowIfError(str);
39 Dart_SetReturnValue(args, str);
40}
41
42void FUNCTION_NAME(Platform_LocalHostname)(Dart_NativeArguments args) {
43 const intptr_t HOSTNAME_LENGTH = 256;
44 char hostname[HOSTNAME_LENGTH];
45 if (Platform::LocalHostname(hostname, HOSTNAME_LENGTH)) {
46 Dart_Handle str = DartUtils::NewString(hostname);
47 ThrowIfError(str);
48 Dart_SetReturnValue(args, str);
49 } else {
50 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
51 }
52}
53
54void FUNCTION_NAME(Platform_ExecutableName)(Dart_NativeArguments args) {
55 if (Platform::GetExecutableName() != NULL) {
56 Dart_SetReturnValue(
57 args, Dart_NewStringFromCString(Platform::GetExecutableName()));
58 } else {
59 Dart_SetReturnValue(args, Dart_Null());
60 }
61}
62
63void FUNCTION_NAME(Platform_ResolvedExecutableName)(Dart_NativeArguments args) {
64 if (Platform::GetResolvedExecutableName() != NULL) {
65 Dart_SetReturnValue(
66 args, Dart_NewStringFromCString(Platform::GetResolvedExecutableName()));
67 } else {
68 Dart_SetReturnValue(args, Dart_Null());
69 }
70}
71
72void FUNCTION_NAME(Platform_ExecutableArguments)(Dart_NativeArguments args) {
73 int end = Platform::GetScriptIndex();
74 char** argv = Platform::GetArgv();
75 Dart_Handle string_type = DartUtils::GetDartType("dart:core", "String");
76 ThrowIfError(string_type);
77 Dart_Handle result =
78 Dart_NewListOfTypeFilled(string_type, Dart_EmptyString(), end - 1);
79 for (intptr_t i = 1; i < end; i++) {
80 Dart_Handle str = DartUtils::NewString(argv[i]);
81 ThrowIfError(str);
82 ThrowIfError(Dart_ListSetAt(result, i - 1, str));
83 }
84 Dart_SetReturnValue(args, result);
85}
86
87void FUNCTION_NAME(Platform_Environment)(Dart_NativeArguments args) {
88 intptr_t count = 0;
89 char** env = Platform::Environment(&count);
90 if (env == NULL) {
91 OSError error(-1, "Failed to retrieve environment variables.",
92 OSError::kUnknown);
93 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
94 } else {
95 Dart_Handle result = Dart_NewList(count);
96 ThrowIfError(result);
97 intptr_t result_idx = 0;
98 for (intptr_t env_idx = 0; env_idx < count; env_idx++) {
99 Dart_Handle str = DartUtils::NewString(env[env_idx]);
100 if (Dart_IsError(str)) {
101 // Silently skip over environment entries that are not valid UTF8
102 // strings.
103 continue;
104 }
105 Dart_Handle error = Dart_ListSetAt(result, result_idx, str);
106 ThrowIfError(error);
107 result_idx++;
108 }
109 Dart_SetReturnValue(args, result);
110 }
111}
112
113void FUNCTION_NAME(Platform_GetVersion)(Dart_NativeArguments args) {
114 Dart_SetReturnValue(args, Dart_NewStringFromCString(Dart_VersionString()));
115}
116
117void FUNCTION_NAME(Platform_LocaleName)(Dart_NativeArguments args) {
118 const char* locale = Platform::LocaleName();
119 if (locale == NULL) {
120 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
121 } else {
122 Dart_SetReturnValue(args, Dart_NewStringFromCString(locale));
123 }
124}
125
126} // namespace bin
127} // namespace dart
128