00001
00002
00003 #ifndef COMMONS_STRINGS_H
00004 #define COMMONS_STRINGS_H
00005
00006 #include <strings.h>
00007
00008 #include <commons/check.h>
00009
00010 namespace commons
00011 {
00012
00013 using namespace std;
00014
00018 inline const char *
00019 strchrrep(const char *p, char c, int n)
00020 {
00021 for (int i = 0; i < n; i++) {
00022 p = strchr(p, c);
00023 check(p);
00024 p++;
00025 }
00026 return p;
00027 }
00028
00032 inline char *
00033 strchrrep(char *p, char c, int n)
00034 {
00035 return const_cast<char *>(strchrrep(const_cast<const char *>(p), c, n));
00036 }
00037
00042 struct eqstr
00043 {
00044 bool operator()(const char* s1, const char* s2) const
00045 {
00046 return strcmp(s1, s2) == 0;
00047 }
00048 };
00049
00055 inline char *
00056 unsafe_strstr(char *p, const char *, const char *lim)
00057 {
00058 if (lim == 0) {
00059 while (true) {
00060 for (; !(*p == '\0' && *(p+1) == '\0'); p++) {}
00061 return p;
00062 }
00063 } else {
00064 check(p < lim);
00065 while (true) {
00066 for (; !(*p == '\0' && *(p+1) == '\0') && p < lim; p++) {}
00067 if (p == lim) return NULL;
00068 return p;
00069 }
00070 }
00071 }
00072
00076 inline const char*
00077 unsafe_strstr(const char *p, const char *q, const char *lim)
00078 {
00079 return unsafe_strstr(const_cast<char*>(p), q, lim);
00080 }
00081
00088 inline char
00089 scan(const void* buf, size_t len)
00090 {
00091 char sum = 0;
00092 const char* start = reinterpret_cast<const char*>(buf);
00093 for (const char* p = start; p < start + len; p++) {
00094 sum = static_cast<char>(sum | *p);
00095 }
00096 return sum;
00097 }
00098
00105 inline char
00106 scan_big_step(const void* buf, size_t len)
00107 {
00108 const size_t sz = 1024;
00109 char tmp[sz];
00110 const char* p = reinterpret_cast<const char*>(buf);
00111 const char* end = p + len;
00112 for (; p + sz < end; p += 1024) {
00113 memcpy(tmp, p, sz);
00114 }
00115 memcpy(tmp, p, end - p);
00116 return sz == 0 ? 0 : tmp[0];
00117 }
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 }
00137
00138 #endif