/** * Counts the number of words inside a string. If format of 1 is specified, * then the function will return an array containing all the words * found inside the string. If format of 2 is specified, then the function * will return an associated array where the position of the word is the key * and the word itself is the value. * * For the purpose of this function, 'word' is defined as a locale dependent * string containing alphabetic characters, which also may contain, but not * start with "'" and "-" characters. */ Variant f_str_word_count(CStrRef str, int64 format /* = 0 */, CStrRef charlist /* = "" */) { int str_len = str.size(); switch (format) { case 1: case 2: if (!str_len) { return Array::Create(); } break; case 0: if (!str_len) { return 0LL; } break; default: throw_invalid_argument("format: %d", format); return false; } char ch[256]; const char *char_list = charlist; if (*char_list) { string_charmask(charlist, charlist.size(), ch); } else { char_list = NULL; } int word_count = 0; const char *s0 = str; const char *p = s0; const char *e = p + str_len; // first character cannot be ' or -, unless explicitly allowed by the user if ((*p == '\'' && (!char_list || !ch[(int)'\''])) || (*p == '-' && (!char_list || !ch[(int)'-']))) { p++; } // last character cannot be -, unless explicitly allowed by the user if (*(e - 1) == '-' && (!char_list || !ch[(int)'-'])) { e--; } Array ret; while (p < e) { const char *s = p; while (p < e && (isalpha(*p) || (char_list && ch[(unsigned char)*p]) || *p == '\'' || *p == '-')) { p++; } if (p > s) { switch (format) { case 1: ret.append(String(s, p - s, CopyString)); break; case 2: ret.set((int)(s - s0), String(s, p - s, CopyString)); break; default: word_count++; break; } } p++; } if (!format) { return word_count; } return ret; }
int PDOConnection::parseDataSource(const char *data_source, int data_source_len, struct pdo_data_src_parser *parsed, int nparams, folly::StringPiece separators/* = ";" */) { int i, j; int valstart = -1; int semi = -1; int optstart = 0; int nlen; int n_matches = 0; char flags[256]; string_charmask(separators.data(), separators.size(), flags); // Can always end with \0 flags[0] = 1; i = 0; while (i < data_source_len) { /* looking for NAME= */ if (data_source[i] == '\0') { break; } if (data_source[i] != '=') { ++i; continue; } valstart = ++i; /* now we're looking for VALUE<separator> or just VALUE<NUL> */ semi = -1; while (i < data_source_len) { if (flags[(unsigned char)data_source[i]]) { semi = i++; break; } ++i; } if (semi == -1) { semi = i; } /* find the entry in the array */ nlen = valstart - optstart - 1; for (j = 0; j < nparams; j++) { if (0 == strncmp(data_source + optstart, parsed[j].optname, nlen) && parsed[j].optname[nlen] == '\0') { /* got a match */ if (parsed[j].freeme) { free(parsed[j].optval); } parsed[j].optval = strndup(data_source + valstart, semi - valstart); parsed[j].freeme = 1; ++n_matches; break; } } while (i < data_source_len && isspace(data_source[i])) { i++; } optstart = i; } return n_matches; }