2 Unix SMB/CIFS implementation.
3 Samba utility functions
5 Copyright (C) Andrew Tridgell 1992-2001
6 Copyright (C) Simo Sorce 2001-2002
7 Copyright (C) Martin Pool 2003
8 Copyright (C) James Peach 2006
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 * @brief String utilities.
33 * Internal function to get the next token from a string, return False if none
34 * found. Handles double-quotes. This is the work horse function called by
35 * next_token() and next_token_no_ltrim().
37 * Based on a routine by GJC@VILLAGE.COM.
38 * Extensively modified by Andrew.Tridgell@anu.edu.au
40 static BOOL next_token_internal(const char **ptr,
56 /* default to simple separators */
60 /* find the first non sep char, if left-trimming is requested */
62 while (*s && strchr_m(sep,*s))
70 /* copy over the token */
72 for (quoted = False; len < bufsize && *s && (quoted || !strchr_m(sep,*s)); s++) {
81 *ptr = (*s) ? s+1 : s;
88 * Get the next token from a string, return False if none found. Handles
89 * double-quotes. This version trims leading separator characters before
90 * looking for a token.
92 BOOL next_token(const char **ptr, char *buff, const char *sep, size_t bufsize)
94 return next_token_internal(ptr, buff, sep, bufsize, True);
98 * Get the next token from a string, return False if none found. Handles
99 * double-quotes. This version does not trim leading separator characters
100 * before looking for a token.
102 BOOL next_token_no_ltrim(const char **ptr,
107 return next_token_internal(ptr, buff, sep, bufsize, False);
111 This is like next_token but is not re-entrant and "remembers" the first
112 parameter so you can pass NULL. This is useful for user interface code
113 but beware the fact that it is not re-entrant!
116 static const char *last_ptr=NULL;
118 BOOL next_token_nr(const char **ptr,char *buff, const char *sep, size_t bufsize)
124 ret = next_token(ptr, buff, sep, bufsize);
129 static uint16 tmpbuf[sizeof(pstring)];
131 void set_first_token(char *ptr)
137 Convert list of tokens to array; dependent on above routine.
138 Uses last_ptr from above - bit of a hack.
141 char **toktocliplist(int *ctok, const char *sep)
143 char *s=(char *)last_ptr;
150 while(*s && strchr_m(sep,*s))
159 while(*s && (!strchr_m(sep,*s)))
161 while(*s && strchr_m(sep,*s))
168 if (!(ret=iret=SMB_MALLOC_ARRAY(char *,ictok+1)))
186 * Case insensitive string compararison.
188 * iconv does not directly give us a way to compare strings in
189 * arbitrary unix character sets -- all we can is convert and then
190 * compare. This is expensive.
192 * As an optimization, we do a first pass that considers only the
193 * prefix of the strings that is entirely 7-bit. Within this, we
194 * check whether they have the same value.
196 * Hopefully this will often give the answer without needing to copy.
197 * In particular it should speed comparisons to literal ascii strings
198 * or comparisons of strings that are "obviously" different.
200 * If we find a non-ascii character we fall back to converting via
203 * This should never be slower than convering the whole thing, and
206 * A different optimization would be to compare for bitwise equality
207 * in the binary encoding. (It would be possible thought hairy to do
208 * both simultaneously.) But in that case if they turn out to be
209 * different, we'd need to restart the whole thing.
211 * Even better is to implement strcasecmp for each encoding and use a
214 int StrCaseCmp(const char *s, const char *t)
219 smb_ucs2_t *buffer_s, *buffer_t;
222 for (ps = s, pt = t; ; ps++, pt++) {
226 return 0; /* both ended */
228 return -1; /* s is a prefix */
230 return +1; /* t is a prefix */
231 else if ((*ps & 0x80) || (*pt & 0x80))
232 /* not ascii anymore, do it the hard way from here on in */
235 us = toupper_ascii(*ps);
236 ut = toupper_ascii(*pt);
245 size = push_ucs2_allocate(&buffer_s, ps);
246 if (size == (size_t)-1) {
247 return strcmp(ps, pt);
248 /* Not quite the right answer, but finding the right one
249 under this failure case is expensive, and it's pretty close */
252 size = push_ucs2_allocate(&buffer_t, pt);
253 if (size == (size_t)-1) {
255 return strcmp(ps, pt);
256 /* Not quite the right answer, but finding the right one
257 under this failure case is expensive, and it's pretty close */
260 ret = strcasecmp_w(buffer_s, buffer_t);
268 Case insensitive string compararison, length limited.
270 int StrnCaseCmp(const char *s, const char *t, size_t n)
273 unix_strupper(s, strlen(s)+1, buf1, sizeof(buf1));
274 unix_strupper(t, strlen(t)+1, buf2, sizeof(buf2));
275 return strncmp(buf1,buf2,n);
281 * @note The comparison is case-insensitive.
283 BOOL strequal(const char *s1, const char *s2)
290 return(StrCaseCmp(s1,s2)==0);
294 * Compare 2 strings up to and including the nth char.
296 * @note The comparison is case-insensitive.
298 BOOL strnequal(const char *s1,const char *s2,size_t n)
302 if (!s1 || !s2 || !n)
305 return(StrnCaseCmp(s1,s2,n)==0);
309 Compare 2 strings (case sensitive).
312 BOOL strcsequal(const char *s1,const char *s2)
319 return(strcmp(s1,s2)==0);
323 Do a case-insensitive, whitespace-ignoring string compare.
326 int strwicmp(const char *psz1, const char *psz2)
328 /* if BOTH strings are NULL, return TRUE, if ONE is NULL return */
329 /* appropriate value. */
332 else if (psz1 == NULL)
334 else if (psz2 == NULL)
337 /* sync the strings on first non-whitespace */
339 while (isspace((int)*psz1))
341 while (isspace((int)*psz2))
343 if (toupper_ascii(*psz1) != toupper_ascii(*psz2) || *psz1 == '\0'
349 return (*psz1 - *psz2);
354 Convert a string to upper case, but don't modify it.
357 char *strupper_static(const char *s)
368 Convert a string to "normal" form.
371 void strnorm(char *s, int case_default)
373 if (case_default == CASE_UPPER)
380 Check if a string is in "normal" case.
383 BOOL strisnormal(const char *s, int case_default)
385 if (case_default == CASE_UPPER)
386 return(!strhaslower(s));
388 return(!strhasupper(s));
394 NOTE: oldc and newc must be 7 bit characters
397 void string_replace( pstring s, char oldc, char newc )
401 /* this is quite a common operation, so we want it to be
402 fast. We optimise for the ascii case, knowing that all our
403 supported multi-byte character sets are ascii-compatible
404 (ie. they match for the first 128 chars) */
406 for (p = s; *p; p++) {
407 if (*p & 0x80) /* mb string - slow path. */
416 /* Slow (mb) path. */
417 #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS
418 /* With compose characters we must restart from the beginning. JRA. */
421 push_ucs2(NULL, tmpbuf, p, sizeof(tmpbuf), STR_TERMINATE);
422 string_replace_w(tmpbuf, UCS2_CHAR(oldc), UCS2_CHAR(newc));
423 pull_ucs2(NULL, p, tmpbuf, -1, sizeof(tmpbuf), STR_TERMINATE);
427 * Skip past some strings in a buffer - old version - no checks.
430 char *push_skip_string(char *buf,size_t n)
433 buf += strlen(buf) + 1;
438 Skip past some strings in a buffer. Buffer may not be
439 null terminated. end_ptr points to the first byte after
440 then end of the buffer.
443 char *skip_string(const char *base, size_t len, char *buf, size_t n)
445 const char *end_ptr = base + len;
447 if (end_ptr < base || !base || !buf || buf >= end_ptr) {
452 /* Skip the string */
455 if (buf >= end_ptr) {
467 Count the number of characters in a string. Normally this will
468 be the same as the number of bytes in a string for single byte strings,
469 but will be different for multibyte.
472 size_t str_charnum(const char *s)
474 uint16 tmpbuf2[sizeof(pstring)];
475 push_ucs2(NULL, tmpbuf2,s, sizeof(tmpbuf2), STR_TERMINATE);
476 return strlen_w(tmpbuf2);
480 Count the number of characters in a string. Normally this will
481 be the same as the number of bytes in a string for single byte strings,
482 but will be different for multibyte.
485 size_t str_ascii_charnum(const char *s)
488 push_ascii(tmpbuf2, s, sizeof(tmpbuf2), STR_TERMINATE);
489 return strlen(tmpbuf2);
492 BOOL trim_char(char *s,char cfront,char cback)
498 /* Ignore null or empty strings. */
499 if (!s || (s[0] == '\0'))
503 while (*fp && *fp == cfront)
506 /* We ate the string. */
514 ep = fp + strlen(fp) - 1;
516 /* Attempt ascii only. Bail for mb strings. */
517 while ((ep >= fp) && (*ep == cback)) {
519 if ((ep > fp) && (((unsigned char)ep[-1]) & 0x80)) {
520 /* Could be mb... bail back to tim_string. */
528 return trim_string(s, cfront ? fs : NULL, bs);
534 /* We ate the string. */
541 memmove(s, fp, ep-fp+2);
546 Trim the specified elements off the front and back of a string.
549 BOOL trim_string(char *s,const char *front,const char *back)
556 /* Ignore null or empty strings. */
557 if (!s || (s[0] == '\0'))
560 front_len = front? strlen(front) : 0;
561 back_len = back? strlen(back) : 0;
566 while (len && strncmp(s, front, front_len)==0) {
567 /* Must use memmove here as src & dest can
568 * easily overlap. Found by valgrind. JRA. */
569 memmove(s, s+front_len, (len-front_len)+1);
576 while ((len >= back_len) && strncmp(s+len-back_len,back,back_len)==0) {
577 s[len-back_len]='\0';
586 Does a string have any uppercase chars in it?
589 BOOL strhasupper(const char *s)
592 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
593 for(ptr=tmpbuf;*ptr;ptr++)
600 Does a string have any lowercase chars in it?
603 BOOL strhaslower(const char *s)
606 push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
607 for(ptr=tmpbuf;*ptr;ptr++)
614 Find the number of 'c' chars in a string
617 size_t count_chars(const char *s,char c)
621 smb_ucs2_t *alloc_tmpbuf = NULL;
623 if (push_ucs2_allocate(&alloc_tmpbuf, s) == (size_t)-1) {
627 for(count=0,ptr=alloc_tmpbuf;*ptr;ptr++)
628 if(*ptr==UCS2_CHAR(c))
631 SAFE_FREE(alloc_tmpbuf);
636 Safe string copy into a known length string. maxlength does not
637 include the terminating zero.
640 char *safe_strcpy_fn(const char *fn, int line, char *dest,const char *src, size_t maxlength)
645 DEBUG(0,("ERROR: NULL dest in safe_strcpy, called from [%s][%d]\n", fn, line));
650 clobber_region(fn,line,dest, maxlength+1);
658 len = strnlen(src, maxlength+1);
660 if (len > maxlength) {
661 DEBUG(0,("ERROR: string overflow by %lu (%lu - %lu) in safe_strcpy [%.50s]\n",
662 (unsigned long)(len-maxlength), (unsigned long)len,
663 (unsigned long)maxlength, src));
667 memmove(dest, src, len);
673 Safe string cat into a string. maxlength does not
674 include the terminating zero.
676 char *safe_strcat_fn(const char *fn, int line, char *dest, const char *src, size_t maxlength)
678 size_t src_len, dest_len;
681 DEBUG(0,("ERROR: NULL dest in safe_strcat, called from [%s][%d]\n", fn, line));
688 src_len = strnlen(src, maxlength + 1);
689 dest_len = strnlen(dest, maxlength + 1);
692 clobber_region(fn, line, dest + dest_len, maxlength + 1 - dest_len);
695 if (src_len + dest_len > maxlength) {
696 DEBUG(0,("ERROR: string overflow by %d in safe_strcat [%.50s]\n",
697 (int)(src_len + dest_len - maxlength), src));
698 if (maxlength > dest_len) {
699 memcpy(&dest[dest_len], src, maxlength - dest_len);
705 memcpy(&dest[dest_len], src, src_len);
706 dest[dest_len + src_len] = 0;
711 Paranoid strcpy into a buffer of given length (includes terminating
712 zero. Strips out all but 'a-Z0-9' and the character in other_safe_chars
713 and replaces with '_'. Deliberately does *NOT* check for multibyte
714 characters. Don't change it !
716 char *alpha_strcpy_fn(const char *fn, int line, char *dest, const char *src, const char *other_safe_chars, size_t maxlength)
721 clobber_region(fn, line, dest, maxlength);
725 DEBUG(0,("ERROR: NULL dest in alpha_strcpy, called from [%s][%d]\n", fn, line));
735 if (len >= maxlength)
738 if (!other_safe_chars)
739 other_safe_chars = "";
741 for(i = 0; i < len; i++) {
742 int val = (src[i] & 0xff);
743 if (isupper_ascii(val) || islower_ascii(val) || isdigit(val) || strchr_m(other_safe_chars, val))
755 Like strncpy but always null terminates. Make sure there is room!
756 The variable n should always be one less than the available size.
758 char *StrnCpy_fn(const char *fn, int line,char *dest,const char *src,size_t n)
763 clobber_region(fn, line, dest, n+1);
767 DEBUG(0,("ERROR: NULL dest in StrnCpy, called from [%s][%d]\n", fn, line));
776 while (n-- && (*d = *src)) {
787 Like strncpy but copies up to the character marker. always null terminates.
788 returns a pointer to the character marker in the source string (src).
791 static char *strncpyn(char *dest, const char *src, size_t n, char c)
797 clobber_region(dest, n+1);
799 p = strchr_m(src, c);
801 DEBUG(5, ("strncpyn: separator character (%c) not found\n", c));
805 str_len = PTR_DIFF(p, src);
806 strncpy(dest, src, MIN(n, str_len));
807 dest[str_len] = '\0';
814 Routine to get hex characters and turn them into a 16 byte array.
815 the array can be variable length, and any non-hex-numeric
816 characters are skipped. "0xnn" or "0Xnn" is specially catered
819 valid examples: "0A5D15"; "0x15, 0x49, 0xa2"; "59\ta9\te3\n"
823 size_t strhex_to_str(char *p, size_t len, const char *strhex)
826 size_t num_chars = 0;
827 unsigned char lonybble, hinybble;
828 const char *hexchars = "0123456789ABCDEF";
829 char *p1 = NULL, *p2 = NULL;
831 for (i = 0; i < len && strhex[i] != 0; i++) {
832 if (strnequal(hexchars, "0x", 2)) {
833 i++; /* skip two chars */
837 if (!(p1 = strchr_m(hexchars, toupper_ascii(strhex[i]))))
840 i++; /* next hex digit */
842 if (!(p2 = strchr_m(hexchars, toupper_ascii(strhex[i]))))
845 /* get the two nybbles */
846 hinybble = PTR_DIFF(p1, hexchars);
847 lonybble = PTR_DIFF(p2, hexchars);
849 p[num_chars] = (hinybble << 4) | lonybble;
858 DATA_BLOB strhex_to_data_blob(TALLOC_CTX *mem_ctx, const char *strhex)
863 ret_blob = data_blob_talloc(mem_ctx, NULL, strlen(strhex)/2+1);
865 ret_blob = data_blob(NULL, strlen(strhex)/2+1);
867 ret_blob.length = strhex_to_str((char*)ret_blob.data,
875 * Routine to print a buffer as HEX digits, into an allocated string.
878 char *hex_encode(TALLOC_CTX *mem_ctx, const unsigned char *buff_in, size_t len)
883 hex_buffer = TALLOC_ARRAY(mem_ctx, char, (len*2)+1);
885 for (i = 0; i < len; i++)
886 slprintf(&hex_buffer[i*2], 3, "%02X", buff_in[i]);
892 Check if a string is part of a list.
895 BOOL in_list(const char *s, const char *list, BOOL casesensitive)
903 while (next_token(&p,tok,LIST_SEP,sizeof(tok))) {
905 if (strcmp(tok,s) == 0)
908 if (StrCaseCmp(tok,s) == 0)
915 /* this is used to prevent lots of mallocs of size 1 */
916 static const char *null_string = "";
919 Set a string value, allocing the space for the string
922 static BOOL string_init(char **dest,const char *src)
932 *dest = CONST_DISCARD(char*, null_string);
934 (*dest) = SMB_STRDUP(src);
935 if ((*dest) == NULL) {
936 DEBUG(0,("Out of memory in string_init\n"));
947 void string_free(char **s)
951 if (*s == null_string)
957 Set a string value, deallocating any existing space, and allocing the space
961 BOOL string_set(char **dest,const char *src)
964 return(string_init(dest,src));
968 Substitute a string for a pattern in another string. Make sure there is
971 This routine looks for pattern in s and replaces it with
972 insert. It may do multiple replacements or just one.
974 Any of " ; ' $ or ` in the insert string are replaced with _
975 if len==0 then the string cannot be extended. This is different from the old
976 use of len==0 which was for no length checks to be done.
979 void string_sub2(char *s,const char *pattern, const char *insert, size_t len,
980 BOOL remove_unsafe_characters, BOOL replace_once, BOOL allow_trailing_dollar)
985 if (!insert || !pattern || !*pattern || !s)
988 ls = (ssize_t)strlen(s);
989 lp = (ssize_t)strlen(pattern);
990 li = (ssize_t)strlen(insert);
993 len = ls + 1; /* len is number of *bytes* */
995 while (lp <= ls && (p = strstr_m(s,pattern))) {
996 if (ls + (li-lp) >= len) {
997 DEBUG(0,("ERROR: string overflow by %d in string_sub(%.50s, %d)\n",
998 (int)(ls + (li-lp) - len),
1003 memmove(p+li,p+lp,strlen(p+lp)+1);
1005 for (i=0;i<li;i++) {
1006 switch (insert[i]) {
1012 /* allow a trailing $ (as in machine accounts) */
1013 if (allow_trailing_dollar && (i == li - 1 )) {
1020 if ( remove_unsafe_characters ) {
1022 /* yes this break should be here since we want to
1023 fall throw if not replacing unsafe chars */
1038 void string_sub_once(char *s, const char *pattern, const char *insert, size_t len)
1040 string_sub2( s, pattern, insert, len, True, True, False );
1043 void string_sub(char *s,const char *pattern, const char *insert, size_t len)
1045 string_sub2( s, pattern, insert, len, True, False, False );
1048 void fstring_sub(char *s,const char *pattern,const char *insert)
1050 string_sub(s, pattern, insert, sizeof(fstring));
1053 void pstring_sub(char *s,const char *pattern,const char *insert)
1055 string_sub(s, pattern, insert, sizeof(pstring));
1059 Similar to string_sub, but it will accept only allocated strings
1060 and may realloc them so pay attention at what you pass on no
1061 pointers inside strings, no pstrings or const may be passed
1065 char *realloc_string_sub(char *string, const char *pattern,
1070 ssize_t ls,lp,li,ld, i;
1072 if (!insert || !pattern || !*pattern || !string || !*string)
1077 in = SMB_STRDUP(insert);
1079 DEBUG(0, ("realloc_string_sub: out of memory!\n"));
1082 ls = (ssize_t)strlen(s);
1083 lp = (ssize_t)strlen(pattern);
1084 li = (ssize_t)strlen(insert);
1086 for (i=0;i<li;i++) {
1103 while ((p = strstr_m(s,pattern))) {
1105 int offset = PTR_DIFF(s,string);
1106 string = (char *)SMB_REALLOC(string, ls + ld + 1);
1108 DEBUG(0, ("realloc_string_sub: out of memory!\n"));
1112 p = string + offset + (p - s);
1115 memmove(p+li,p+lp,strlen(p+lp)+1);
1125 /* Same as string_sub, but returns a talloc'ed string */
1127 char *talloc_string_sub(TALLOC_CTX *mem_ctx, const char *src,
1128 const char *pattern, const char *insert)
1133 ssize_t ls,lp,li,ld, i;
1135 if (!insert || !pattern || !*pattern || !src || !*src)
1138 string = talloc_strdup(mem_ctx, src);
1139 if (string == NULL) {
1140 DEBUG(0, ("talloc_strdup failed\n"));
1146 in = SMB_STRDUP(insert);
1148 DEBUG(0, ("talloc_string_sub: out of memory!\n"));
1151 ls = (ssize_t)strlen(s);
1152 lp = (ssize_t)strlen(pattern);
1153 li = (ssize_t)strlen(insert);
1155 for (i=0;i<li;i++) {
1172 while ((p = strstr_m(s,pattern))) {
1174 int offset = PTR_DIFF(s,string);
1175 string = (char *)TALLOC_REALLOC(mem_ctx, string,
1178 DEBUG(0, ("talloc_string_sub: out of "
1183 p = string + offset + (p - s);
1186 memmove(p+li,p+lp,strlen(p+lp)+1);
1197 Similar to string_sub() but allows for any character to be substituted.
1199 if len==0 then the string cannot be extended. This is different from the old
1200 use of len==0 which was for no length checks to be done.
1203 void all_string_sub(char *s,const char *pattern,const char *insert, size_t len)
1208 if (!insert || !pattern || !s)
1211 ls = (ssize_t)strlen(s);
1212 lp = (ssize_t)strlen(pattern);
1213 li = (ssize_t)strlen(insert);
1219 len = ls + 1; /* len is number of *bytes* */
1221 while (lp <= ls && (p = strstr_m(s,pattern))) {
1222 if (ls + (li-lp) >= len) {
1223 DEBUG(0,("ERROR: string overflow by %d in all_string_sub(%.50s, %d)\n",
1224 (int)(ls + (li-lp) - len),
1225 pattern, (int)len));
1229 memmove(p+li,p+lp,strlen(p+lp)+1);
1231 memcpy(p, insert, li);
1238 Similar to all_string_sub but for unicode strings.
1239 Return a new allocated unicode string.
1240 similar to string_sub() but allows for any character to be substituted.
1244 static smb_ucs2_t *all_string_sub_w(const smb_ucs2_t *s, const smb_ucs2_t *pattern,
1245 const smb_ucs2_t *insert)
1248 const smb_ucs2_t *sp;
1249 size_t lr, lp, li, lt;
1251 if (!insert || !pattern || !*pattern || !s)
1254 lt = (size_t)strlen_w(s);
1255 lp = (size_t)strlen_w(pattern);
1256 li = (size_t)strlen_w(insert);
1259 const smb_ucs2_t *st = s;
1261 while ((sp = strstr_w(st, pattern))) {
1267 r = rp = SMB_MALLOC_ARRAY(smb_ucs2_t, lt + 1);
1269 DEBUG(0, ("all_string_sub_w: out of memory!\n"));
1273 while ((sp = strstr_w(s, pattern))) {
1274 memcpy(rp, s, (sp - s));
1275 rp += ((sp - s) / sizeof(smb_ucs2_t));
1276 memcpy(rp, insert, (li * sizeof(smb_ucs2_t)));
1280 lr = ((rp - r) / sizeof(smb_ucs2_t));
1282 memcpy(rp, s, ((lt - lr) * sizeof(smb_ucs2_t)));
1290 smb_ucs2_t *all_string_sub_wa(smb_ucs2_t *s, const char *pattern,
1295 if (!insert || !pattern || !s)
1297 push_ucs2(NULL, p, pattern, sizeof(wpstring) - 1, STR_TERMINATE);
1298 push_ucs2(NULL, i, insert, sizeof(wpstring) - 1, STR_TERMINATE);
1299 return all_string_sub_w(s, p, i);
1304 Splits out the front and back at a separator.
1307 static void split_at_last_component(char *path, char *front, char sep, char *back)
1309 char *p = strrchr_m(path, sep);
1315 pstrcpy(front, path);
1329 Write an octal as a string.
1332 const char *octal_string(int i)
1334 static char ret[64];
1337 slprintf(ret, sizeof(ret)-1, "0%o", i);
1343 Truncate a string at a specified length.
1346 char *string_truncate(char *s, unsigned int length)
1348 if (s && strlen(s) > length)
1354 Strchr and strrchr_m are very hard to do on general multi-byte strings.
1355 We convert via ucs2 for now.
1358 char *strchr_m(const char *src, char c)
1365 /* characters below 0x3F are guaranteed to not appear in
1366 non-initial position in multi-byte charsets */
1367 if ((c & 0xC0) == 0) {
1368 return strchr(src, c);
1371 /* this is quite a common operation, so we want it to be
1372 fast. We optimise for the ascii case, knowing that all our
1373 supported multi-byte character sets are ascii-compatible
1374 (ie. they match for the first 128 chars) */
1376 for (s = src; *s && !(((unsigned char)s[0]) & 0x80); s++) {
1384 #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS
1385 /* With compose characters we must restart from the beginning. JRA. */
1389 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1390 p = strchr_w(ws, UCS2_CHAR(c));
1394 pull_ucs2_pstring(s2, ws);
1395 return (char *)(s+strlen(s2));
1398 char *strrchr_m(const char *s, char c)
1400 /* characters below 0x3F are guaranteed to not appear in
1401 non-initial position in multi-byte charsets */
1402 if ((c & 0xC0) == 0) {
1403 return strrchr(s, c);
1406 /* this is quite a common operation, so we want it to be
1407 fast. We optimise for the ascii case, knowing that all our
1408 supported multi-byte character sets are ascii-compatible
1409 (ie. they match for the first 128 chars). Also, in Samba
1410 we only search for ascii characters in 'c' and that
1411 in all mb character sets with a compound character
1412 containing c, if 'c' is not a match at position
1413 p, then p[-1] > 0x7f. JRA. */
1416 size_t len = strlen(s);
1418 BOOL got_mb = False;
1425 /* Could be a match. Part of a multibyte ? */
1426 if ((cp > s) && (((unsigned char)cp[-1]) & 0x80)) {
1427 /* Yep - go slow :-( */
1431 /* No - we have a match ! */
1434 } while (cp-- != s);
1439 /* String contained a non-ascii char. Slow path. */
1445 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1446 p = strrchr_w(ws, UCS2_CHAR(c));
1450 pull_ucs2_pstring(s2, ws);
1451 return (char *)(s+strlen(s2));
1455 /***********************************************************************
1456 Return the equivalent of doing strrchr 'n' times - always going
1458 ***********************************************************************/
1460 char *strnrchr_m(const char *s, char c, unsigned int n)
1466 push_ucs2(NULL, ws, s, sizeof(ws), STR_TERMINATE);
1467 p = strnrchr_w(ws, UCS2_CHAR(c), n);
1471 pull_ucs2_pstring(s2, ws);
1472 return (char *)(s+strlen(s2));
1475 /***********************************************************************
1476 strstr_m - We convert via ucs2 for now.
1477 ***********************************************************************/
1479 char *strstr_m(const char *src, const char *findstr)
1482 smb_ucs2_t *src_w, *find_w;
1487 size_t findstr_len = 0;
1489 /* for correctness */
1494 /* Samba does single character findstr calls a *lot*. */
1495 if (findstr[1] == '\0')
1496 return strchr_m(src, *findstr);
1498 /* We optimise for the ascii case, knowing that all our
1499 supported multi-byte character sets are ascii-compatible
1500 (ie. they match for the first 128 chars) */
1502 for (s = src; *s && !(((unsigned char)s[0]) & 0x80); s++) {
1503 if (*s == *findstr) {
1505 findstr_len = strlen(findstr);
1507 if (strncmp(s, findstr, findstr_len) == 0) {
1516 #if 1 /* def BROKEN_UNICODE_COMPOSE_CHARACTERS */
1517 /* 'make check' fails unless we do this */
1519 /* With compose characters we must restart from the beginning. JRA. */
1523 if (push_ucs2_allocate(&src_w, src) == (size_t)-1) {
1524 DEBUG(0,("strstr_m: src malloc fail\n"));
1528 if (push_ucs2_allocate(&find_w, findstr) == (size_t)-1) {
1530 DEBUG(0,("strstr_m: find malloc fail\n"));
1534 p = strstr_w(src_w, find_w);
1543 if (pull_ucs2_allocate(&s2, src_w) == (size_t)-1) {
1546 DEBUG(0,("strstr_m: dest malloc fail\n"));
1549 retp = (char *)(s+strlen(s2));
1557 Convert a string to lower case.
1560 void strlower_m(char *s)
1565 /* this is quite a common operation, so we want it to be
1566 fast. We optimise for the ascii case, knowing that all our
1567 supported multi-byte character sets are ascii-compatible
1568 (ie. they match for the first 128 chars) */
1570 while (*s && !(((unsigned char)s[0]) & 0x80)) {
1571 *s = tolower_ascii((unsigned char)*s);
1578 /* I assume that lowercased string takes the same number of bytes
1579 * as source string even in UTF-8 encoding. (VIV) */
1580 len = strlen(s) + 1;
1583 unix_strlower(s,len,s,len);
1584 /* Catch mb conversion errors that may not terminate. */
1591 Convert a string to upper case.
1594 void strupper_m(char *s)
1599 /* this is quite a common operation, so we want it to be
1600 fast. We optimise for the ascii case, knowing that all our
1601 supported multi-byte character sets are ascii-compatible
1602 (ie. they match for the first 128 chars) */
1604 while (*s && !(((unsigned char)s[0]) & 0x80)) {
1605 *s = toupper_ascii((unsigned char)*s);
1612 /* I assume that lowercased string takes the same number of bytes
1613 * as source string even in multibyte encoding. (VIV) */
1614 len = strlen(s) + 1;
1617 unix_strupper(s,len,s,len);
1618 /* Catch mb conversion errors that may not terminate. */
1625 Count the number of UCS2 characters in a string. Normally this will
1626 be the same as the number of bytes in a string for single byte strings,
1627 but will be different for multibyte.
1630 size_t strlen_m(const char *s)
1638 while (*s && !(((uint8_t)*s) & 0x80)) {
1649 codepoint_t c = next_codepoint(s, &c_size);
1651 /* Unicode char fits into 16 bits. */
1654 /* Double-width unicode char - 32 bits. */
1664 Count the number of UCS2 characters in a string including the null
1668 size_t strlen_m_term(const char *s)
1673 return strlen_m(s) + 1;
1677 * Weird helper routine for the winreg pipe: If nothing is around, return 0,
1678 * if a string is there, include the terminator.
1681 size_t strlen_m_term_null(const char *s)
1695 Return a RFC2254 binary string representation of a buffer.
1696 Used in LDAP filters.
1700 char *binary_string_rfc2254(char *buf, int len)
1704 const char *hex = "0123456789ABCDEF";
1705 s = (char *)SMB_MALLOC(len * 3 + 1);
1708 for (j=i=0;i<len;i++) {
1710 s[j+1] = hex[((unsigned char)buf[i]) >> 4];
1711 s[j+2] = hex[((unsigned char)buf[i]) & 0xF];
1718 char *binary_string(char *buf, int len)
1722 const char *hex = "0123456789ABCDEF";
1723 s = (char *)SMB_MALLOC(len * 2 + 1);
1726 for (j=i=0;i<len;i++) {
1727 s[j] = hex[((unsigned char)buf[i]) >> 4];
1728 s[j+1] = hex[((unsigned char)buf[i]) & 0xF];
1735 Just a typesafety wrapper for snprintf into a pstring.
1738 int pstr_sprintf(pstring s, const char *fmt, ...)
1744 ret = vsnprintf(s, PSTRING_LEN, fmt, ap);
1751 Just a typesafety wrapper for snprintf into a fstring.
1754 int fstr_sprintf(fstring s, const char *fmt, ...)
1760 ret = vsnprintf(s, FSTRING_LEN, fmt, ap);
1766 List of Strings manipulation functions
1769 #define S_LIST_ABS 16 /* List Allocation Block Size */
1771 static char **str_list_make_internal(TALLOC_CTX *mem_ctx, const char *string, const char *sep)
1773 char **list, **rlist;
1779 if (!string || !*string)
1782 s = talloc_strdup(mem_ctx, string);
1784 s = SMB_STRDUP(string);
1787 DEBUG(0,("str_list_make: Unable to allocate memory"));
1790 if (!sep) sep = LIST_SEP;
1796 while (next_token(&str, tok, sep, sizeof(tok))) {
1798 lsize += S_LIST_ABS;
1800 rlist = TALLOC_REALLOC_ARRAY(mem_ctx, list, char *, lsize +1);
1802 /* We need to keep the old list on error so we can free the elements
1803 if the realloc fails. */
1804 rlist = SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(list, char *, lsize +1);
1807 DEBUG(0,("str_list_make: Unable to allocate memory"));
1808 str_list_free(&list);
1818 memset (&list[num], 0, ((sizeof(char**)) * (S_LIST_ABS +1)));
1822 list[num] = talloc_strdup(mem_ctx, tok);
1824 list[num] = SMB_STRDUP(tok);
1828 DEBUG(0,("str_list_make: Unable to allocate memory"));
1829 str_list_free(&list);
1850 char **str_list_make_talloc(TALLOC_CTX *mem_ctx, const char *string, const char *sep)
1852 return str_list_make_internal(mem_ctx, string, sep);
1855 char **str_list_make(const char *string, const char *sep)
1857 return str_list_make_internal(NULL, string, sep);
1860 BOOL str_list_copy(char ***dest, const char **src)
1862 char **list, **rlist;
1874 lsize += S_LIST_ABS;
1875 rlist = SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(list, char *, lsize +1);
1877 DEBUG(0,("str_list_copy: Unable to re-allocate memory"));
1878 str_list_free(&list);
1883 memset (&list[num], 0, ((sizeof(char **)) * (S_LIST_ABS +1)));
1886 list[num] = SMB_STRDUP(src[num]);
1888 DEBUG(0,("str_list_copy: Unable to allocate memory"));
1889 str_list_free(&list);
1901 * Return true if all the elements of the list match exactly.
1903 BOOL str_list_compare(char **list1, char **list2)
1907 if (!list1 || !list2)
1908 return (list1 == list2);
1910 for (num = 0; list1[num]; num++) {
1913 if (!strcsequal(list1[num], list2[num]))
1917 return False; /* if list2 has more elements than list1 fail */
1922 static void str_list_free_internal(TALLOC_CTX *mem_ctx, char ***list)
1926 if (!list || !*list)
1929 for(; *tlist; tlist++) {
1931 TALLOC_FREE(*tlist);
1937 TALLOC_FREE(*tlist);
1943 void str_list_free_talloc(TALLOC_CTX *mem_ctx, char ***list)
1945 str_list_free_internal(mem_ctx, list);
1948 void str_list_free(char ***list)
1950 str_list_free_internal(NULL, list);
1953 /******************************************************************************
1954 *****************************************************************************/
1956 int str_list_count( const char **list )
1963 /* count the number of list members */
1965 for ( i=0; *list; i++, list++ );
1970 /******************************************************************************
1971 version of standard_sub_basic() for string lists; uses alloc_sub_basic()
1973 *****************************************************************************/
1975 BOOL str_list_sub_basic( char **list, const char *smb_name,
1976 const char *domain_name )
1982 tmpstr = alloc_sub_basic(smb_name, domain_name, s);
1984 DEBUG(0,("str_list_sub_basic: alloc_sub_basic() return NULL!\n"));
1997 /******************************************************************************
1998 substritute a specific pattern in a string list
1999 *****************************************************************************/
2001 BOOL str_list_substitute(char **list, const char *pattern, const char *insert)
2004 ssize_t ls, lp, li, ld, i, d;
2013 lp = (ssize_t)strlen(pattern);
2014 li = (ssize_t)strlen(insert);
2019 ls = (ssize_t)strlen(s);
2021 while ((p = strstr_m(s, pattern))) {
2025 t = (char *) SMB_MALLOC(ls +ld +1);
2027 DEBUG(0,("str_list_substitute: Unable to allocate memory"));
2030 memcpy(t, *list, d);
2031 memcpy(t +d +li, p +lp, ls -d -lp +1);
2038 for (i = 0; i < li; i++) {
2039 switch (insert[i]) {
2051 t[d +i] = insert[i];
2064 #define IPSTR_LIST_SEP ","
2065 #define IPSTR_LIST_CHAR ','
2068 * Add ip string representation to ipstr list. Used also
2069 * as part of @function ipstr_list_make
2071 * @param ipstr_list pointer to string containing ip list;
2072 * MUST BE already allocated and IS reallocated if necessary
2073 * @param ipstr_size pointer to current size of ipstr_list (might be changed
2074 * as a result of reallocation)
2075 * @param ip IP address which is to be added to list
2076 * @return pointer to string appended with new ip and possibly
2077 * reallocated to new length
2080 char* ipstr_list_add(char** ipstr_list, const struct ip_service *service)
2082 char* new_ipstr = NULL;
2084 /* arguments checking */
2085 if (!ipstr_list || !service) return NULL;
2087 /* attempt to convert ip to a string and append colon separator to it */
2089 asprintf(&new_ipstr, "%s%s%s:%d", *ipstr_list, IPSTR_LIST_SEP,
2090 inet_ntoa(service->ip), service->port);
2091 SAFE_FREE(*ipstr_list);
2093 asprintf(&new_ipstr, "%s:%d", inet_ntoa(service->ip), service->port);
2095 *ipstr_list = new_ipstr;
2101 * Allocate and initialise an ipstr list using ip adresses
2102 * passed as arguments.
2104 * @param ipstr_list pointer to string meant to be allocated and set
2105 * @param ip_list array of ip addresses to place in the list
2106 * @param ip_count number of addresses stored in ip_list
2107 * @return pointer to allocated ip string
2110 char* ipstr_list_make(char** ipstr_list, const struct ip_service* ip_list, int ip_count)
2114 /* arguments checking */
2115 if (!ip_list || !ipstr_list) return 0;
2119 /* process ip addresses given as arguments */
2120 for (i = 0; i < ip_count; i++)
2121 *ipstr_list = ipstr_list_add(ipstr_list, &ip_list[i]);
2123 return (*ipstr_list);
2128 * Parse given ip string list into array of ip addresses
2129 * (as ip_service structures)
2130 * e.g. 192.168.1.100:389,192.168.1.78, ...
2132 * @param ipstr ip string list to be parsed
2133 * @param ip_list pointer to array of ip addresses which is
2134 * allocated by this function and must be freed by caller
2135 * @return number of succesfully parsed addresses
2138 int ipstr_list_parse(const char* ipstr_list, struct ip_service **ip_list)
2144 if (!ipstr_list || !ip_list)
2147 count = count_chars(ipstr_list, IPSTR_LIST_CHAR) + 1;
2148 if ( (*ip_list = SMB_MALLOC_ARRAY(struct ip_service, count)) == NULL ) {
2149 DEBUG(0,("ipstr_list_parse: malloc failed for %lu entries\n", (unsigned long)count));
2154 next_token(&ipstr_list, token_str, IPSTR_LIST_SEP, FSTRING_LEN) && i<count;
2157 struct in_addr addr;
2159 char *p = strchr(token_str, ':');
2166 /* convert single token to ip address */
2167 if ( (addr.s_addr = inet_addr(token_str)) == INADDR_NONE )
2170 (*ip_list)[i].ip = addr;
2171 (*ip_list)[i].port = port;
2179 * Safely free ip string list
2181 * @param ipstr_list ip string list to be freed
2184 void ipstr_list_free(char* ipstr_list)
2186 SAFE_FREE(ipstr_list);
2191 Unescape a URL encoded string, in place.
2194 void rfc1738_unescape(char *buf)
2198 while (p && *p && (p=strchr_m(p,'%'))) {
2202 if (c1 >= '0' && c1 <= '9')
2204 else if (c1 >= 'A' && c1 <= 'F')
2206 else if (c1 >= 'a' && c1 <= 'f')
2208 else {p++; continue;}
2210 if (c2 >= '0' && c2 <= '9')
2212 else if (c2 >= 'A' && c2 <= 'F')
2214 else if (c2 >= 'a' && c2 <= 'f')
2216 else {p++; continue;}
2220 memmove(p+1, p+3, strlen(p+3)+1);
2225 static const char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
2228 * Decode a base64 string into a DATA_BLOB - simple and slow algorithm
2230 DATA_BLOB base64_decode_data_blob(const char *s)
2232 int bit_offset, byte_offset, idx, i, n;
2233 DATA_BLOB decoded = data_blob(s, strlen(s)+1);
2234 unsigned char *d = decoded.data;
2239 while (*s && (p=strchr_m(b64,*s))) {
2240 idx = (int)(p - b64);
2241 byte_offset = (i*6)/8;
2242 bit_offset = (i*6)%8;
2243 d[byte_offset] &= ~((1<<(8-bit_offset))-1);
2244 if (bit_offset < 3) {
2245 d[byte_offset] |= (idx << (2-bit_offset));
2248 d[byte_offset] |= (idx >> (bit_offset-2));
2249 d[byte_offset+1] = 0;
2250 d[byte_offset+1] |= (idx << (8-(bit_offset-2))) & 0xFF;
2256 if ((n > 0) && (*s == '=')) {
2266 * Decode a base64 string in-place - wrapper for the above
2268 void base64_decode_inplace(char *s)
2270 DATA_BLOB decoded = base64_decode_data_blob(s);
2272 if ( decoded.length != 0 ) {
2273 memcpy(s, decoded.data, decoded.length);
2275 /* null terminate */
2276 s[decoded.length] = '\0';
2281 data_blob_free(&decoded);
2285 * Encode a base64 string into a malloc()ed string caller to free.
2287 *From SQUID: adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments
2289 char * base64_encode_data_blob(DATA_BLOB data)
2293 size_t out_cnt, len, output_len;
2296 if (!data.length || !data.data)
2301 output_len = data.length * 2;
2302 result = (char *)SMB_MALLOC(output_len); /* get us plenty of space */
2304 while (len-- && out_cnt < (data.length * 2) - 5) {
2305 int c = (unsigned char) *(data.data++);
2308 if (char_count == 3) {
2309 result[out_cnt++] = b64[bits >> 18];
2310 result[out_cnt++] = b64[(bits >> 12) & 0x3f];
2311 result[out_cnt++] = b64[(bits >> 6) & 0x3f];
2312 result[out_cnt++] = b64[bits & 0x3f];
2319 if (char_count != 0) {
2320 bits <<= 16 - (8 * char_count);
2321 result[out_cnt++] = b64[bits >> 18];
2322 result[out_cnt++] = b64[(bits >> 12) & 0x3f];
2323 if (char_count == 1) {
2324 result[out_cnt++] = '=';
2325 result[out_cnt++] = '=';
2327 result[out_cnt++] = b64[(bits >> 6) & 0x3f];
2328 result[out_cnt++] = '=';
2331 result[out_cnt] = '\0'; /* terminate */
2335 /* read a SMB_BIG_UINT from a string */
2336 SMB_BIG_UINT STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr)
2339 SMB_BIG_UINT val = -1;
2340 const char *p = nptr;
2349 while (*p && isspace(*p))
2352 #ifdef LARGE_SMB_OFF_T
2353 sscanf(p,"%llu",&val);
2354 #else /* LARGE_SMB_OFF_T */
2355 sscanf(p,"%lu",&val);
2356 #endif /* LARGE_SMB_OFF_T */
2358 while (*p && isdigit(*p))
2366 /* Convert a size specification to a count of bytes. We accept the following
2368 * bytes if there is no suffix
2373 * pP whatever the ISO name for petabytes is
2375 * Returns 0 if the string can't be converted.
2377 SMB_OFF_T conv_str_size(const char * str)
2382 if (str == NULL || *str == '\0') {
2386 #ifdef HAVE_STRTOULL
2387 if (sizeof(SMB_OFF_T) == 8) {
2388 lval = strtoull(str, &end, 10 /* base */);
2390 lval = strtoul(str, &end, 10 /* base */);
2393 lval = strtoul(str, &end, 10 /* base */);
2396 if (end == NULL || end == str) {
2401 SMB_OFF_T lval_orig = lval;
2403 if (strwicmp(end, "K") == 0) {
2404 lval *= (SMB_OFF_T)1024;
2405 } else if (strwicmp(end, "M") == 0) {
2406 lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024);
2407 } else if (strwicmp(end, "G") == 0) {
2408 lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
2410 } else if (strwicmp(end, "T") == 0) {
2411 lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
2412 (SMB_OFF_T)1024 * (SMB_OFF_T)1024);
2413 } else if (strwicmp(end, "P") == 0) {
2414 lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
2415 (SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
2421 /* Primitive attempt to detect wrapping on platforms with
2422 * 4-byte SMB_OFF_T. It's better to let the caller handle
2423 * a failure than some random number.
2425 if (lval_orig <= lval) {
2433 void string_append(char **left, const char *right)
2435 int new_len = strlen(right) + 1;
2437 if (*left == NULL) {
2438 *left = (char *)SMB_MALLOC(new_len);
2441 new_len += strlen(*left);
2442 *left = (char *)SMB_REALLOC(*left, new_len);
2445 if (*left == NULL) {
2449 safe_strcat(*left, right, new_len-1);
2452 BOOL add_string_to_array(TALLOC_CTX *mem_ctx,
2453 const char *str, const char ***strings,
2456 char *dup_str = talloc_strdup(mem_ctx, str);
2458 *strings = TALLOC_REALLOC_ARRAY(mem_ctx, *strings, const char *, (*num)+1);
2460 if ((*strings == NULL) || (dup_str == NULL)) {
2465 (*strings)[*num] = dup_str;
2470 /* Append an sprintf'ed string. Double buffer size on demand. Usable without
2471 * error checking in between. The indiation that something weird happened is
2474 void sprintf_append(TALLOC_CTX *mem_ctx, char **string, ssize_t *len,
2475 size_t *bufsize, const char *fmt, ...)
2482 /* len<0 is an internal marker that something failed */
2486 if (*string == NULL) {
2490 *string = TALLOC_ARRAY(mem_ctx, char, *bufsize);
2491 if (*string == NULL)
2496 ret = vasprintf(&newstr, fmt, ap);
2504 while ((*len)+ret >= *bufsize) {
2507 if (*bufsize >= (1024*1024*256))
2512 *string = TALLOC_REALLOC_ARRAY(mem_ctx, *string, char,
2514 if (*string == NULL) {
2519 StrnCpy((*string)+(*len), newstr, ret);
2530 Returns the substring from src between the first occurrence of
2531 the char "front" and the first occurence of the char "back".
2532 Mallocs the return string which must be freed. Not for use
2533 with wide character strings.
2535 char *sstring_sub(const char *src, char front, char back)
2537 char *temp1, *temp2, *temp3;
2540 temp1 = strchr(src, front);
2541 if (temp1 == NULL) return NULL;
2542 temp2 = strchr(src, back);
2543 if (temp2 == NULL) return NULL;
2544 len = temp2 - temp1;
2545 if (len <= 0) return NULL;
2546 temp3 = (char*)SMB_MALLOC(len);
2547 if (temp3 == NULL) {
2548 DEBUG(1,("Malloc failure in sstring_sub\n"));
2551 memcpy(temp3, temp1+1, len-1);
2552 temp3[len-1] = '\0';
2556 /********************************************************************
2557 Check a string for any occurrences of a specified list of invalid
2559 ********************************************************************/
2561 BOOL validate_net_name( const char *name, const char *invalid_chars, int max_len )
2565 for ( i=0; i<max_len && name[i]; i++ ) {
2566 /* fail if strchr_m() finds one of the invalid characters */
2567 if ( name[i] && strchr_m( invalid_chars, name[i] ) ) {
2577 return the number of bytes occupied by a buffer in ASCII format
2578 the result includes the null termination
2579 limited by 'n' bytes
2581 size_t ascii_len_n(const char *src, size_t n)
2585 len = strnlen(src, n);
2594 return the number of bytes occupied by a buffer in CH_UTF16 format
2595 the result includes the null termination
2597 size_t utf16_len(const void *buf)
2601 for (len = 0; SVAL(buf,len); len += 2) ;
2607 return the number of bytes occupied by a buffer in CH_UTF16 format
2608 the result includes the null termination
2609 limited by 'n' bytes
2611 size_t utf16_len_n(const void *src, size_t n)
2615 for (len = 0; (len+2 < n) && SVAL(src, len); len += 2) ;