trim_cstr.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. //
  2. // $Id$
  3. //
  4. #include<__vic/string_utils.h>
  5. #include<__vic/algorithm.h>
  6. #include<__vic/tchar.h>
  7. #include<__vic/char_predicates.h>
  8. #include<cstring>
  9. namespace __vic {
  10. namespace {
  11. //----------------------------------------------------------------------------
  12. template<class charT, class Pred>
  13. inline void trim_if_back(charT *st, Pred pred)
  14. {
  15. charT *end = tchar::end(st);
  16. charT *p = skip_if_back(st, end, pred);
  17. if(p != end) *p = charT();
  18. }
  19. //----------------------------------------------------------------------------
  20. template<class charT, class Pred>
  21. inline void trim_if_front(charT *st, Pred pred)
  22. {
  23. charT *p = st;
  24. while(*p && pred(*p)) p++;
  25. if(p != st) tchar::move(st, p);
  26. }
  27. //----------------------------------------------------------------------------
  28. template<class charT, class Pred>
  29. inline void trim_if(charT *st, Pred pred)
  30. {
  31. charT *end = tchar::end(st);
  32. // trim back
  33. charT *e = skip_if_back(st, end, pred);
  34. if(e != end) *e = charT();
  35. // trim front
  36. charT *b = skip_if_front(st, e, pred);
  37. if(b != st) std::memmove(st, b, (e - b + 1) * sizeof(charT));
  38. }
  39. //----------------------------------------------------------------------------
  40. } // namespace
  41. //----------------------------------------------------------------------------
  42. char *trim(char *st) noexcept
  43. {
  44. if(st) trim_if(st, is_ascii_ws());
  45. return st;
  46. }
  47. //----------------------------------------------------------------------------
  48. char *trim_back(char *st) noexcept
  49. {
  50. if(st) trim_if_back(st, is_ascii_ws());
  51. return st;
  52. }
  53. //----------------------------------------------------------------------------
  54. char *trim_front(char *st) noexcept
  55. {
  56. if(st) trim_if_front(st, is_ascii_ws());
  57. return st;
  58. }
  59. //----------------------------------------------------------------------------
  60. char *trim(char *st, char ch) noexcept
  61. {
  62. if(st) trim_if(st, is_eq_char(ch));
  63. return st;
  64. }
  65. //----------------------------------------------------------------------------
  66. char *trim_back(char *st, char ch) noexcept
  67. {
  68. if(st) trim_if_back(st, is_eq_char(ch));
  69. return st;
  70. }
  71. //----------------------------------------------------------------------------
  72. char *trim_front(char *st, char ch) noexcept
  73. {
  74. if(st) trim_if_front(st, is_eq_char(ch));
  75. return st;
  76. }
  77. //----------------------------------------------------------------------------
  78. char *trim(char *st, const char *set) noexcept
  79. {
  80. if(st && set) trim_if(st, is_one_of_chars(set));
  81. return st;
  82. }
  83. //----------------------------------------------------------------------------
  84. char *trim_back(char *st, const char *set) noexcept
  85. {
  86. if(st && set) trim_if_back(st, is_one_of_chars(set));
  87. return st;
  88. }
  89. //----------------------------------------------------------------------------
  90. char *trim_front(char *st, const char *set) noexcept
  91. {
  92. if(st && set) trim_if_front(st, is_one_of_chars(set));
  93. return st;
  94. }
  95. //----------------------------------------------------------------------------
  96. } // namespace