ptrlen.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * Functions to deal with ptrlens.
  3. */
  4. #include "defs.h"
  5. #include "misc.h"
  6. bool ptrlen_eq_string(ptrlen pl, const char *str)
  7. {
  8. size_t len = strlen(str);
  9. return (pl.len == len && !memcmp(pl.ptr, str, len));
  10. }
  11. bool ptrlen_eq_ptrlen(ptrlen pl1, ptrlen pl2)
  12. {
  13. return (pl1.len == pl2.len && !memcmp(pl1.ptr, pl2.ptr, pl1.len));
  14. }
  15. int ptrlen_strcmp(ptrlen pl1, ptrlen pl2)
  16. {
  17. size_t minlen = pl1.len < pl2.len ? pl1.len : pl2.len;
  18. if (minlen) { /* tolerate plX.ptr==NULL as long as plX.len==0 */
  19. int cmp = memcmp(pl1.ptr, pl2.ptr, minlen);
  20. if (cmp)
  21. return cmp;
  22. }
  23. return pl1.len < pl2.len ? -1 : pl1.len > pl2.len ? +1 : 0;
  24. }
  25. bool ptrlen_startswith(ptrlen whole, ptrlen prefix, ptrlen *tail)
  26. {
  27. if (whole.len >= prefix.len &&
  28. !memcmp(whole.ptr, prefix.ptr, prefix.len)) {
  29. if (tail) {
  30. tail->ptr = (const char *)whole.ptr + prefix.len;
  31. tail->len = whole.len - prefix.len;
  32. }
  33. return true;
  34. }
  35. return false;
  36. }
  37. bool ptrlen_endswith(ptrlen whole, ptrlen suffix, ptrlen *tail)
  38. {
  39. if (whole.len >= suffix.len &&
  40. !memcmp((char *)whole.ptr + (whole.len - suffix.len),
  41. suffix.ptr, suffix.len)) {
  42. if (tail) {
  43. tail->ptr = whole.ptr;
  44. tail->len = whole.len - suffix.len;
  45. }
  46. return true;
  47. }
  48. return false;
  49. }
  50. bool ptrlen_contains(ptrlen input, const char *characters)
  51. {
  52. const char *p, *end; // WINSCP
  53. for (p = input.ptr, end = p + input.len; p < end; p++)
  54. if (strchr(characters, *p))
  55. return true;
  56. return false;
  57. }
  58. bool ptrlen_contains_only(ptrlen input, const char *characters)
  59. {
  60. const char *p, *end; // WINSCP
  61. for (p = input.ptr, end = p + input.len; p < end; p++)
  62. if (!strchr(characters, *p))
  63. return false;
  64. return true;
  65. }
  66. ptrlen ptrlen_get_word(ptrlen *input, const char *separators)
  67. {
  68. const char *p = input->ptr, *end = p + input->len;
  69. ptrlen toret;
  70. while (p < end && strchr(separators, *p))
  71. p++;
  72. toret.ptr = p;
  73. while (p < end && !strchr(separators, *p))
  74. p++;
  75. toret.len = p - (const char *)toret.ptr;
  76. { // WINSCP
  77. size_t to_consume = p - (const char *)input->ptr;
  78. assert(to_consume <= input->len);
  79. input->ptr = (const char *)input->ptr + to_consume;
  80. input->len -= to_consume;
  81. return toret;
  82. } // WINSCP
  83. }
  84. char *mkstr(ptrlen pl)
  85. {
  86. char *p = snewn(pl.len + 1, char);
  87. memcpy(p, pl.ptr, pl.len);
  88. p[pl.len] = '\0';
  89. return p;
  90. }
  91. bool strstartswith(const char *s, const char *t)
  92. {
  93. return !strncmp(s, t, strlen(t));
  94. }
  95. bool strendswith(const char *s, const char *t)
  96. {
  97. size_t slen = strlen(s), tlen = strlen(t);
  98. return slen >= tlen && !strcmp(s + (slen - tlen), t);
  99. }