crtnone.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. /*
  2. * Copyright 2010-2020 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
  4. */
  5. #include "bx_p.h"
  6. #include <bx/debug.h>
  7. #include <bx/file.h>
  8. #include <bx/math.h>
  9. #include <bx/sort.h>
  10. #include <bx/timer.h>
  11. #if BX_CRT_NONE
  12. #include "crt0.h"
  13. #define NOT_IMPLEMENTED() \
  14. { bx::debugPrintf("crtnone: %s not implemented\n", BX_FUNCTION); abort(); }
  15. extern "C" void* memcpy(void* _dst, const void* _src, size_t _numBytes)
  16. {
  17. bx::memCopy(_dst, _src, _numBytes);
  18. return _dst;
  19. }
  20. extern "C" void* memmove(void* _dst, const void* _src, size_t _numBytes)
  21. {
  22. bx::memMove(_dst, _src, _numBytes);
  23. return _dst;
  24. }
  25. extern "C" void* memset(void* _dst, int _ch, size_t _numBytes)
  26. {
  27. bx::memSet(_dst, uint8_t(_ch), _numBytes);
  28. return _dst;
  29. }
  30. #if !BX_PLATFORM_NONE
  31. typedef int64_t off64_t;
  32. typedef int32_t pid_t;
  33. extern "C" int32_t memcmp(const void* _lhs, const void* _rhs, size_t _numBytes)
  34. {
  35. return bx::memCmp(_lhs, _rhs, _numBytes);
  36. }
  37. extern "C" size_t strlen(const char* _str)
  38. {
  39. return bx::strLen(_str);
  40. }
  41. extern "C" size_t strnlen(const char* _str, size_t _max)
  42. {
  43. return bx::strLen(_str, _max);
  44. }
  45. extern "C" void* strcpy(char* _dst, const char* _src)
  46. {
  47. bx::strCopy(_dst, INT32_MAX, _src, INT32_MAX);
  48. return _dst;
  49. }
  50. extern "C" void* strncpy(char* _dst, const char* _src, size_t _num)
  51. {
  52. bx::strCopy(_dst, INT32_MAX, _src, _num);
  53. return _dst;
  54. }
  55. extern "C" char* strcat(char* _dst, const char* _src)
  56. {
  57. bx::strCat(_dst, INT32_MAX, _src, INT32_MAX);
  58. return _dst;
  59. }
  60. extern "C" const char* strchr(const char* _str, int _ch)
  61. {
  62. return bx::strFind(_str, _ch).getPtr();
  63. }
  64. extern "C" int32_t strcmp(const char* _lhs, const char* _rhs)
  65. {
  66. return bx::strCmp(_lhs, _rhs);
  67. }
  68. extern "C" int32_t strncmp(const char* _lhs, const char* _rhs, size_t _max)
  69. {
  70. return bx::strCmp(_lhs, _rhs, _max);
  71. }
  72. extern "C" int32_t strcasecmp(const char* _lhs, const char* _rhs)
  73. {
  74. return bx::strCmpI(_lhs, _rhs);
  75. }
  76. extern "C" const char* strstr(const char* _str, const char* _find)
  77. {
  78. return bx::strFind(_str, _find).getPtr();
  79. }
  80. extern "C" void qsort(void* _base, size_t _num, size_t _size, bx::ComparisonFn _fn)
  81. {
  82. BX_ASSERT(_num <= UINT32_MAX && _size <= UINT32_MAX, "");
  83. return bx::quickSort(_base, _num, _size, _fn);
  84. }
  85. extern "C" int isprint(int _ch)
  86. {
  87. return bx::isPrint(_ch);
  88. }
  89. extern "C" int toupper(int _ch)
  90. {
  91. return bx::toUpper(_ch);
  92. }
  93. extern "C" size_t mbstowcs(wchar_t* _dst, const char* _src, size_t _max)
  94. {
  95. BX_UNUSED(_dst, _src, _max);
  96. return 0;
  97. }
  98. extern "C" char* strdup(const char* _src)
  99. {
  100. uint32_t size = bx::strLen(_src)+1;
  101. char* dup = (char*)malloc(size);
  102. bx::strCopy(dup, size, _src);
  103. return dup;
  104. }
  105. extern "C" long int strtol(const char* _str, char** _end, int _base)
  106. {
  107. BX_UNUSED(_str, _end, _base);
  108. NOT_IMPLEMENTED();
  109. return -1;
  110. }
  111. extern "C" int abs(int _value)
  112. {
  113. return _value >= 0 ? _value : -_value;
  114. }
  115. extern "C" float fabsf(float _x)
  116. {
  117. return bx::abs(_x);
  118. }
  119. extern "C" double fabs(double _x)
  120. {
  121. return bx::abs(_x);
  122. }
  123. extern "C" double ldexp(double _x, int _exp)
  124. {
  125. return bx::ldexp(float(_x), _exp);
  126. }
  127. extern "C" float expf(float _x)
  128. {
  129. return bx::exp(_x);
  130. }
  131. extern "C" float logf(float _x)
  132. {
  133. return bx::log(_x);
  134. }
  135. extern "C" float log10f(float _x)
  136. {
  137. BX_UNUSED(_x);
  138. return 0.0f;
  139. }
  140. extern "C" float powf(float _x, float _y)
  141. {
  142. return bx::pow(_x, _y);
  143. }
  144. extern "C" double pow(double _x, float _y)
  145. {
  146. return bx::pow(_x, _y);
  147. }
  148. extern "C" float sinf(float _x)
  149. {
  150. return bx::sin(_x);
  151. }
  152. extern "C" float cosf(float _x)
  153. {
  154. return bx::cos(_x);
  155. }
  156. extern "C" float tanf(float _x)
  157. {
  158. return bx::tan(_x);
  159. }
  160. extern "C" float atan2f(float _y, float _x)
  161. {
  162. return bx::atan2(_y, _x);
  163. }
  164. extern "C" float sqrtf(float _x)
  165. {
  166. return bx::sqrt(_x);
  167. }
  168. extern "C" double sqrt(double _x)
  169. {
  170. return bx::sqrt(_x);
  171. }
  172. extern "C" float ceilf(float _x)
  173. {
  174. return bx::ceil(_x);
  175. }
  176. extern "C" double ceil(double _x)
  177. {
  178. return bx::ceil(_x);
  179. }
  180. extern "C" float floorf(float _x)
  181. {
  182. return bx::floor(_x);
  183. }
  184. extern "C" double floor(double _x)
  185. {
  186. return bx::floor(_x);
  187. }
  188. extern "C" float acosf(float _x)
  189. {
  190. return bx::acos(_x);
  191. }
  192. extern "C" float fmodf(float _numer, float _denom)
  193. {
  194. return bx::mod(_numer, _denom);
  195. }
  196. extern "C" int atoi(const char* _str)
  197. {
  198. int32_t result = 0;
  199. bx::fromString(&result, _str);
  200. return result;
  201. }
  202. extern "C" double atof(const char* _str)
  203. {
  204. double result = 0.0;
  205. bx::fromString(&result, _str);
  206. return result;
  207. }
  208. extern "C" struct DIR* opendir(const char* _dirname)
  209. {
  210. BX_UNUSED(_dirname);
  211. // NOT_IMPLEMENTED();
  212. return NULL;
  213. }
  214. extern "C" struct dirent* readdir(struct DIR* _dirp)
  215. {
  216. BX_UNUSED(_dirp);
  217. NOT_IMPLEMENTED();
  218. return NULL;
  219. }
  220. extern "C" int closedir(struct DIR* _dirp)
  221. {
  222. BX_UNUSED(_dirp);
  223. NOT_IMPLEMENTED();
  224. return 0;
  225. }
  226. extern "C" int vsnprintf(char* _out, size_t _max, const char* _format, va_list _argList)
  227. {
  228. return bx::vsnprintf(_out, _max, _format, _argList);
  229. }
  230. extern "C" int sprintf(char* _out, const char* _format, ...)
  231. {
  232. va_list argList;
  233. va_start(argList, _format);
  234. int32_t len = bx::vsnprintf(_out, INT32_MAX, _format, argList);
  235. va_end(argList);
  236. return len;
  237. }
  238. extern "C" int snprintf(char* _out, size_t _max, const char* _format, ...)
  239. {
  240. va_list argList;
  241. va_start(argList, _format);
  242. int32_t len = bx::vsnprintf(_out, _max, _format, argList);
  243. va_end(argList);
  244. return len;
  245. }
  246. extern "C" int printf(const char* _format, ...)
  247. {
  248. va_list argList;
  249. va_start(argList, _format);
  250. bx::WriterI* writer = bx::getStdOut();
  251. bx::Error err;
  252. int32_t len = bx::write(writer, &err, _format, argList);
  253. va_end(argList);
  254. return len;
  255. }
  256. struct FILE
  257. {
  258. };
  259. extern "C" int fprintf(FILE* _stream, const char* _format, ...)
  260. {
  261. BX_UNUSED(_stream, _format);
  262. return -1;
  263. }
  264. extern "C" int vfprintf(FILE* _stream, const char* _format, va_list _argList)
  265. {
  266. BX_UNUSED(_stream, _format, _argList);
  267. return -1;
  268. }
  269. extern "C" int sscanf(const char* _str, const char* _format, ...)
  270. {
  271. BX_UNUSED(_str, _format);
  272. return -1;
  273. }
  274. extern "C" int fscanf(FILE* _stream, const char* _format, ...)
  275. {
  276. BX_UNUSED(_stream, _format);
  277. return -1;
  278. }
  279. FILE * stdout;
  280. extern "C" FILE* fopen(const char* _filename, const char* _mode)
  281. {
  282. BX_UNUSED(_filename, _mode);
  283. bx::debugPrintf("fopen(\"%s\", \"%s\");\n", _filename, _mode);
  284. // NOT_IMPLEMENTED();
  285. return NULL;
  286. }
  287. extern "C" int fclose(FILE* _stream)
  288. {
  289. BX_UNUSED(_stream);
  290. bx::debugPrintf("fclose(%p);\n", _stream);
  291. // NOT_IMPLEMENTED();
  292. return 0;
  293. }
  294. extern "C" size_t fread(void* _ptr, size_t _size, size_t _count, FILE* _stream)
  295. {
  296. BX_UNUSED(_ptr, _size, _count, _stream);
  297. NOT_IMPLEMENTED();
  298. return -1;
  299. }
  300. extern "C" size_t fwrite(const void* _ptr, size_t _size, size_t _count, FILE* _stream)
  301. {
  302. BX_UNUSED(_ptr, _size, _count, _stream);
  303. NOT_IMPLEMENTED();
  304. return -1;
  305. }
  306. extern "C" int fseek(FILE* _stream, long int _offset, int _origin)
  307. {
  308. BX_UNUSED(_stream, _offset, _origin);
  309. NOT_IMPLEMENTED();
  310. return -1;
  311. }
  312. extern "C" int fseeko64(FILE* _stream, off64_t _offset, int _whence)
  313. {
  314. BX_UNUSED(_stream, _offset, _whence);
  315. NOT_IMPLEMENTED();
  316. return -1;
  317. }
  318. extern "C" long int ftell(FILE* _stream)
  319. {
  320. BX_UNUSED(_stream);
  321. NOT_IMPLEMENTED();
  322. return -1;
  323. }
  324. extern "C" off64_t ftello64(FILE* _stream)
  325. {
  326. BX_UNUSED(_stream);
  327. NOT_IMPLEMENTED();
  328. return -1;
  329. }
  330. extern "C" int feof(FILE* _stream)
  331. {
  332. BX_UNUSED(_stream);
  333. NOT_IMPLEMENTED();
  334. return -1;
  335. }
  336. extern "C" int ferror(FILE* _stream)
  337. {
  338. BX_UNUSED(_stream);
  339. NOT_IMPLEMENTED();
  340. return -1;
  341. }
  342. extern "C" FILE* popen(const char* _command, const char* _type)
  343. {
  344. BX_UNUSED(_command, _type);
  345. NOT_IMPLEMENTED();
  346. return NULL;
  347. }
  348. extern "C" int pclose(FILE* _stream)
  349. {
  350. BX_UNUSED(_stream);
  351. NOT_IMPLEMENTED();
  352. return -1;
  353. }
  354. extern "C" int execvp(const char* _file, char* const _argv[])
  355. {
  356. BX_UNUSED(_file, _argv);
  357. NOT_IMPLEMENTED();
  358. return -1;
  359. }
  360. typedef int32_t clockid_t;
  361. inline void toTimespecNs(timespec& _ts, int64_t _nsecs)
  362. {
  363. _ts.tv_sec = _nsecs/INT64_C(1000000000);
  364. _ts.tv_nsec = _nsecs%INT64_C(1000000000);
  365. }
  366. extern "C" int clock_gettime(clockid_t _clock, struct timespec* _ts)
  367. {
  368. BX_UNUSED(_clock);
  369. int64_t now = crt0::getHPCounter();
  370. toTimespecNs(*_ts, now);
  371. return 0;
  372. }
  373. extern "C" long syscall(long _num, ...)
  374. {
  375. va_list argList;
  376. va_start(argList, _num);
  377. long result = -1;
  378. switch (_num)
  379. {
  380. case 39:
  381. result = crt0::processGetId();
  382. break;
  383. case 228:
  384. {
  385. clockid_t arg0 = va_arg(argList, clockid_t);
  386. timespec* arg1 = va_arg(argList, timespec*);
  387. result = clock_gettime(arg0, arg1);
  388. }
  389. break;
  390. default:
  391. bx::debugPrintf("? syscall %d\n", _num);
  392. break;
  393. }
  394. va_end(argList);
  395. return result;
  396. }
  397. extern "C" long sysconf(int name)
  398. {
  399. BX_UNUSED(name);
  400. NOT_IMPLEMENTED();
  401. return -1;
  402. }
  403. extern "C" pid_t fork(void)
  404. {
  405. NOT_IMPLEMENTED();
  406. return -1;
  407. }
  408. extern "C" int sched_yield(void)
  409. {
  410. NOT_IMPLEMENTED();
  411. return -1;
  412. }
  413. extern "C" int prctl(int _option, unsigned long _arg2, unsigned long _arg3, unsigned long _arg4, unsigned long _arg5)
  414. {
  415. BX_UNUSED(_option, _arg2, _arg3, _arg4, _arg5);
  416. NOT_IMPLEMENTED();
  417. return -1;
  418. }
  419. extern "C" int chdir(const char* _path)
  420. {
  421. BX_UNUSED(_path);
  422. bx::debugPrintf("chdir(%s) not implemented!\n", _path);
  423. return -1;
  424. }
  425. extern "C" char* getcwd(char* _buf, size_t _size)
  426. {
  427. BX_UNUSED(_buf, _size);
  428. NOT_IMPLEMENTED();
  429. return NULL;
  430. }
  431. extern "C" char* getenv(const char* _name)
  432. {
  433. return const_cast<char*>(crt0::getEnv(_name) );
  434. }
  435. extern "C" int setenv(const char* _name, const char* _value, int _overwrite)
  436. {
  437. BX_UNUSED(_name, _value, _overwrite);
  438. bx::debugPrintf("setenv(%s, %s, %d) not implemented!\n", _name, _value, _overwrite);
  439. return -1;
  440. }
  441. extern "C" int unsetenv(const char* _name)
  442. {
  443. BX_UNUSED(_name);
  444. bx::debugPrintf("unsetenv(%s) not implemented!\n", _name);
  445. return -1;
  446. }
  447. #if 0
  448. struct timeval
  449. {
  450. time_t tv_sec;
  451. suseconds_t tv_usec;
  452. };
  453. struct timespec
  454. {
  455. time_t tv_sec;
  456. long tv_nsec;
  457. };
  458. #endif //
  459. extern "C" int gettimeofday(struct timeval* _tv, struct timezone* _tz)
  460. {
  461. BX_UNUSED(_tz);
  462. timespec ts;
  463. if (NULL == _tv)
  464. {
  465. return 0;
  466. }
  467. clock_gettime(0 /*CLOCK_REALTIME*/, &ts);
  468. _tv->tv_sec = ts.tv_sec;
  469. _tv->tv_usec = (int)ts.tv_nsec / 1000;
  470. return 0;
  471. }
  472. typedef int64_t time_t;
  473. extern "C" time_t time(time_t* _arg)
  474. {
  475. timespec ts;
  476. clock_gettime(0 /*CLOCK_REALTIME*/, &ts);
  477. time_t result = ts.tv_sec;
  478. if (NULL != _arg)
  479. {
  480. *_arg = result;
  481. }
  482. return result;
  483. }
  484. extern "C" void* realloc(void* _ptr, size_t _size)
  485. {
  486. return crt0::realloc(_ptr, _size);
  487. }
  488. extern "C" void* malloc(size_t _size)
  489. {
  490. return crt0::realloc(NULL, _size);
  491. }
  492. extern "C" void free(void* _ptr)
  493. {
  494. crt0::realloc(_ptr, 0);
  495. }
  496. #endif // BX_PLATFORM_*
  497. extern "C" void abort(void)
  498. {
  499. bx::debugPrintf("crtnone: abort called!\n");
  500. crt0::exit(bx::kExitFailure);
  501. }
  502. extern "C" void __assert_fail(const char* _assertion, const char* _file, uint32_t _line, const char* _function)
  503. {
  504. BX_UNUSED(_assertion, _file, _line, _function);
  505. abort();
  506. }
  507. void* __dso_handle = (void*)&__dso_handle;
  508. void operator delete(void*)
  509. {
  510. }
  511. extern "C" void __cxa_pure_virtual(void)
  512. {
  513. }
  514. extern "C" int __cxa_atexit(void (*_dtorFn)(void*), void* _arg, void* _dsoHandle)
  515. {
  516. BX_UNUSED(_dtorFn, _arg, _dsoHandle);
  517. return 0;
  518. }
  519. extern "C" void __gxx_personality_v0(void)
  520. {
  521. }
  522. extern "C" void _Unwind_Resume(void*)
  523. {
  524. }
  525. extern "C" int __gcc_personality_v0(int _version, ...)
  526. {
  527. BX_UNUSED(_version);
  528. return 0;
  529. }
  530. namespace __cxxabiv1
  531. {
  532. class __class_type_info
  533. {
  534. public:
  535. virtual ~__class_type_info();
  536. const char* m_name;
  537. };
  538. __class_type_info::~__class_type_info()
  539. {
  540. }
  541. class __si_class_type_info : public __class_type_info
  542. {
  543. public:
  544. virtual ~__si_class_type_info();
  545. };
  546. __si_class_type_info::~__si_class_type_info()
  547. {
  548. }
  549. class __vmi_class_type_info : public __class_type_info
  550. {
  551. public:
  552. virtual ~__vmi_class_type_info();
  553. };
  554. __vmi_class_type_info::~__vmi_class_type_info()
  555. {
  556. }
  557. __extension__ typedef int __guard __attribute__( (mode(__DI__) ) );
  558. extern "C" int __cxa_guard_acquire(__guard* _g)
  559. {
  560. return !*(char*)(_g);
  561. }
  562. extern "C" void __cxa_guard_release(__guard* _g)
  563. {
  564. *(char*)_g = 1;
  565. }
  566. extern "C" void __cxa_guard_abort(__guard* _g)
  567. {
  568. BX_UNUSED(_g);
  569. }
  570. } // namespace __cxxabiv1
  571. #endif // BX_CRT_NONE