ccan_dir.c 840 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include <ccan/err/err.h>
  2. #include "tools.h"
  3. #include <assert.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. /* Walk up to find /ccan/ => ccan directory. */
  7. static unsigned int ccan_dir_prefix(const char *fulldir)
  8. {
  9. unsigned int i;
  10. assert(fulldir[0] == '/');
  11. for (i = strlen(fulldir) - 1; i > 0; i--) {
  12. if (strncmp(fulldir+i, "/ccan", 5) != 0)
  13. continue;
  14. if (fulldir[i+5] != '\0' && fulldir[i+5] != '/')
  15. continue;
  16. return i + 1;
  17. }
  18. return 0;
  19. }
  20. const char *find_ccan_dir(const char *base)
  21. {
  22. static char *ccan_dir;
  23. if (!ccan_dir) {
  24. if (base[0] != '/') {
  25. const char *tmpctx = tal_getcwd(NULL);
  26. find_ccan_dir(tal_fmt(tmpctx, "%s/%s", tmpctx, base));
  27. tal_free(tmpctx);
  28. } else {
  29. unsigned int prefix = ccan_dir_prefix(base);
  30. if (prefix)
  31. ccan_dir = tal_strndup(NULL, base, prefix);
  32. }
  33. }
  34. return ccan_dir;
  35. }