regex.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * Copyright (c) 2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Assertions.h>
  7. #include <dlfcn.h>
  8. #include <pthread.h>
  9. #include <regex.h>
  10. static void* s_libregex;
  11. static pthread_mutex_t s_libregex_lock;
  12. static int (*s_regcomp)(regex_t*, char const*, int);
  13. static int (*s_regexec)(regex_t const*, char const*, size_t, regmatch_t[], int);
  14. static size_t (*s_regerror)(int, regex_t const*, char*, size_t);
  15. static void (*s_regfree)(regex_t*);
  16. static void ensure_libregex()
  17. {
  18. pthread_mutex_lock(&s_libregex_lock);
  19. if (!s_libregex) {
  20. s_libregex = dlopen("libregex.so", RTLD_NOW);
  21. VERIFY(s_libregex);
  22. s_regcomp = reinterpret_cast<int (*)(regex_t*, char const*, int)>(dlsym(s_libregex, "regcomp"));
  23. VERIFY(s_regcomp);
  24. s_regexec = reinterpret_cast<int (*)(regex_t const*, char const*, size_t, regmatch_t[], int)>(dlsym(s_libregex, "regexec"));
  25. VERIFY(s_regexec);
  26. s_regerror = reinterpret_cast<size_t (*)(int, regex_t const*, char*, size_t)>(dlsym(s_libregex, "regerror"));
  27. VERIFY(s_regerror);
  28. s_regfree = reinterpret_cast<void (*)(regex_t*)>(dlsym(s_libregex, "regfree"));
  29. VERIFY(s_regerror);
  30. }
  31. pthread_mutex_unlock(&s_libregex_lock);
  32. }
  33. extern "C" {
  34. int __attribute__((weak)) regcomp(regex_t* reg, char const* pattern, int cflags)
  35. {
  36. ensure_libregex();
  37. return s_regcomp(reg, pattern, cflags);
  38. }
  39. int __attribute__((weak)) regexec(regex_t const* reg, char const* string, size_t nmatch, regmatch_t pmatch[], int eflags)
  40. {
  41. ensure_libregex();
  42. return s_regexec(reg, string, nmatch, pmatch, eflags);
  43. }
  44. size_t __attribute__((weak)) regerror(int errcode, regex_t const* reg, char* errbuf, size_t errbuf_size)
  45. {
  46. ensure_libregex();
  47. return s_regerror(errcode, reg, errbuf, errbuf_size);
  48. }
  49. void __attribute__((weak)) regfree(regex_t* reg)
  50. {
  51. ensure_libregex();
  52. return s_regfree(reg);
  53. }
  54. }