-
Notifications
You must be signed in to change notification settings - Fork 24
/
xutils.cpp
136 lines (113 loc) · 3.53 KB
/
xutils.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/************************************************************************************
* Copyright (c) 2023, xeus-cpp contributors *
* *
* Distributed under the terms of the BSD 3-Clause License. *
* *
* The full license is in the file LICENSE, distributed with this software. *
************************************************************************************/
#include <cstddef>
#include <memory>
#include <string>
#include <utility>
#include <signal.h>
#ifdef __GNUC__
#include <stdio.h>
#ifndef XEUS_CPP_EMSCRIPTEN_WASM_BUILD
#include <execinfo.h>
#endif
#include <stdlib.h>
#include <unistd.h>
#endif
#include "xeus/xsystem.hpp"
#include "xeus-cpp/xutils.hpp"
#include "xeus-cpp/xinterpreter.hpp"
namespace xcpp
{
#if defined(__GNUC__) && !defined(XEUS_CPP_EMSCRIPTEN_WASM_BUILD)
void handler(int sig)
{
void* array[10];
// get void*'s for all entries on the stack
std::size_t size = backtrace(array, 10);
// print out all the frames to stderr
fprintf(stderr, "Error: signal %d:\n", sig);
backtrace_symbols_fd(array, size, STDERR_FILENO);
exit(1);
}
#endif
void stop_handler(int /*sig*/)
{
exit(0);
}
bool should_print_version(int argc, char* argv[])
{
for (int i = 0; i < argc; ++i)
{
if (std::string(argv[i]) == "--version")
{
return true;
}
}
return false;
}
std::string extract_filename(int &argc, char* argv[])
{
std::string res = "";
for (int i = 0; i < argc; ++i)
{
if ((std::string(argv[i]) == "-f") && (i + 1 < argc))
{
res = argv[i + 1];
for (int j = i; j < argc - 2; ++j)
{
argv[j] = argv[j + 2];
}
argc -= 2;
break;
}
}
return res;
}
interpreter_ptr build_interpreter(int argc, char** argv)
{
std::vector<const char*> interpreter_argv(argc);
interpreter_argv[0] = "xeus-cpp";
// Copy all arguments in the new vector excepting the process name.
for (int i = 1; i < argc; i++)
{
interpreter_argv[i] = argv[i];
}
interpreter_ptr interp_ptr = std::make_unique<interpreter>(argc, interpreter_argv.data());
return interp_ptr;
}
std::string retrieve_tagconf_dir()
{
const char* tagconf_dir_env = std::getenv("XCPP_TAGCONFS_DIR");
if (tagconf_dir_env != nullptr)
{
return tagconf_dir_env;
}
std::string prefix = xeus::prefix_path();
#if defined(_WIN32)
const char separator = '\\';
#else
const char separator = '/';
#endif
return prefix + separator + "etc" + separator + "xeus-cpp" + separator + "tags.d";
}
std::string retrieve_tagfile_dir()
{
const char* tagfile_dir_env = std::getenv("XCPP_TAGFILES_DIR");
if (tagfile_dir_env != nullptr)
{
return tagfile_dir_env;
}
std::string prefix = xeus::prefix_path();
#if defined(_WIN32)
const char separator = '\\';
#else
const char separator = '/';
#endif
return prefix + separator + "share" + separator + "xeus-cpp" + separator + "tagfiles";
}
}