annotate foosdk/sdk/foobar2000/shared/shared-nix.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "shared.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include <dirent.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <pfc/wildcard.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <unistd.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 // foobar2000 SDK project method... bah
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 namespace foobar2000_io {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 PFC_NORETURN void nix_io_op_fail();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 using namespace foobar2000_io;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 class uFindFileImpl : public uFindFile {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 uFindFileImpl ( DIR * dir ) : m_dir(dir) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 bool FindNext() override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 m_entry = readdir(m_dir);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 return m_entry != NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 const char * GetFileName() override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 return m_entry->d_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 bool IsDirectory() override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 return m_entry->d_type == DT_DIR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 ~uFindFileImpl() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 closedir(m_dir);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 dirent * m_entry;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 DIR * m_dir;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 class uFindFileFiltered : public uFindFile {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 uFindFileFiltered( DIR * dir, const char * wc ) : m_impl(dir), m_wc(wc) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 bool FindNext() override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 for( ;; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 if (!m_impl.FindNext()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 if ( testWC() ) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 const char * GetFileName() override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 return m_impl.GetFileName();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 bool IsDirectory() override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 return m_impl.IsDirectory();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 bool testWC() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 return wildcard_helper::test(GetFileName(), m_wc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 uFindFileImpl m_impl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 const pfc::string8 m_wc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 puFindFile uFindFirstFile(const char * path) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 if ( wildcard_helper::has_wildcards( path ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 size_t idx = pfc::scan_filename(path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 DIR * dir = opendir( pfc::string8(path, idx) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 if (dir == NULL) nix_io_op_fail();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 uFindFile * ff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 ff = new uFindFileFiltered(dir, path + idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 } catch(...) { closedir( dir ); throw; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 if (ff->FindNext()) return ff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 delete ff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 } catch(...) { closedir( dir ); throw; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 } catch(...) {return NULL;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 DIR * dir = opendir( path );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 if (dir == NULL) nix_io_op_fail();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 uFindFile * ff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 ff = new uFindFileImpl(dir);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 } catch(...) { closedir( dir ); throw; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 if (ff->FindNext()) return ff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 delete ff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 } catch(...) { closedir( dir ); throw; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 } catch(...) {return NULL;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 pfc::string8 uStringPrintf(const char * fmt, ...) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 pfc::string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 va_list list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 va_start(list,fmt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 uPrintfV(ret,fmt,list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 va_end(list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 void uPrintfV(pfc::string_base & out,const char * fmt,va_list arglist) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 pfc::string_printf_here_va(out, fmt, arglist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 void uPrintf(pfc::string_base & out,const char * fmt,...) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 va_list list;va_start(list,fmt);uPrintfV(out,fmt,list);va_end(list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 static int makeInfiniteWaitEvent() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 int fdPipe[2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 pfc::createPipe(fdPipe);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 return fdPipe[0]; // leak the other end
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 int GetInfiniteWaitEvent() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 static int obj = makeInfiniteWaitEvent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 return obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 // DUMMY
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 void SHARED_EXPORT uAddPanicHandler(fb2k::panicHandler*) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 void SHARED_EXPORT uRemovePanicHandler(fb2k::panicHandler*) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 void SHARED_EXPORT uOutputDebugString(const char * msg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 // UGLY: underlying APIs want whole lines, calling code feeds lines terminated with \n or \r\n because Windows
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 pfc::string8 temp ( msg );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 if ( temp.endsWith('\n') ) temp.truncate( temp.length() - 1) ;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 if ( temp.endsWith('\r') ) temp.truncate( temp.length() - 1) ;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 pfc::outputDebugLine(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 namespace pfc { PFC_NORETURN void crashImpl(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 PFC_NORETURN void SHARED_EXPORT uBugCheck() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 pfc::crashImpl();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 int SHARED_EXPORT uStringCompare(const char * elem1, const char * elem2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 return pfc::naturalSortCompareI(elem1, elem2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 void fb2kDebugSelfTest() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 bool uGetTempPath(pfc::string_base & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 auto var = getenv("TMPDIR");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 if ( var == nullptr ) uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 out = var;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 bool uGetTempFileName(const char * path_name,const char * prefix,unsigned unique,pfc::string_base & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 #if 0 // sample use
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 pfc::string8 temp_path, temp_file;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 uGetTempPath(temp_path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 uGetTempFileName(temp_path, "img", 0, temp_file);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 pfc::string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 if ( path_name == nullptr ) uGetTempPath( ret );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 else ret = path_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 pfc::chain_list_v2_t<pfc::string8> segments;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 if ( prefix ) segments += prefix;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 if ( unique ) segments += pfc::format(unique);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 segments += pfc::print_guid(pfc::createGUID());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 pfc::string8 fn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 for( auto & seg : segments ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 if (seg.length() == 0) continue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 if ( fn.length() > 0 ) fn += "-";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 fn += seg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 ret.add_filename( fn );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 out = ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 pfc::string8 uGetTempFileName() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 pfc::string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 uGetTempFileName(nullptr, nullptr, 0, ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 void fb2k::crashWithMessage [[noreturn]] ( const char * msg_ ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 uAddDebugEvent( msg_ );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 pfc::crashWithMessageOnStack(msg_);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 bool uSetCurrentDirectory(const char * path) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 return chdir(path) == 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 bool uGetCurrentDirectory(pfc::string_base & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 pfc::array_t<char> work;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 work.resize( PATH_MAX );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 errno = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 if ( getcwd(work.get_ptr(), work.size()) != nullptr ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 out = work.get_ptr(); return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 if ( errno != ENAMETOOLONG ) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 work.resize( work.size() * 2 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 }