regex.cpp 1.9 KB

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