⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util_str.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    Unix SMB/CIFS implementation.   Samba utility functions      Copyright (C) Andrew Tridgell 1992-2001   Copyright (C) Simo Sorce      2001-2002   Copyright (C) Martin Pool     2003   Copyright (C) James Peach	 2005      This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 3 of the License, or   (at your option) any later version.      This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.      You should have received a copy of the GNU General Public License   along with this program.  If not, see <http://www.gnu.org/licenses/>.*/#include "includes.h"#include "libcli/raw/smb.h"#include "system/locale.h"/** * @file * @brief String utilities. **//** Trim the specified elements off the front and back of a string.**/_PUBLIC_ bool trim_string(char *s, const char *front, const char *back){	bool ret = false;	size_t front_len;	size_t back_len;	size_t len;	/* Ignore null or empty strings. */	if (!s || (s[0] == '\0'))		return false;	front_len	= front? strlen(front) : 0;	back_len	= back? strlen(back) : 0;	len = strlen(s);	if (front_len) {		while (len && strncmp(s, front, front_len)==0) {			/* Must use memmove here as src & dest can			 * easily overlap. Found by valgrind. JRA. */			memmove(s, s+front_len, (len-front_len)+1);			len -= front_len;			ret=true;		}	}		if (back_len) {		while ((len >= back_len) && strncmp(s+len-back_len,back,back_len)==0) {			s[len-back_len]='\0';			len -= back_len;			ret=true;		}	}	return ret;}/** Find the number of 'c' chars in a string**/_PUBLIC_ _PURE_ size_t count_chars(const char *s, char c){	size_t count = 0;	while (*s) {		if (*s == c) count++;		s ++;	}	return count;}/** Safe string copy into a known length string. maxlength does not include the terminating zero.**/_PUBLIC_ char *safe_strcpy(char *dest,const char *src, size_t maxlength){	size_t len;	if (!dest) {		DEBUG(0,("ERROR: NULL dest in safe_strcpy\n"));		return NULL;	}#ifdef DEVELOPER	/* We intentionally write out at the extremity of the destination	 * string.  If the destination is too short (e.g. pstrcpy into mallocd	 * or fstring) then this should cause an error under a memory	 * checker. */	dest[maxlength] = '\0';	if (PTR_DIFF(&len, dest) > 0) {  /* check if destination is on the stack, ok if so */		log_suspicious_usage("safe_strcpy", src);	}#endif	if (!src) {		*dest = 0;		return dest;	}  	len = strlen(src);	if (len > maxlength) {		DEBUG(0,("ERROR: string overflow by %u (%u - %u) in safe_strcpy [%.50s]\n",			 (uint_t)(len-maxlength), (unsigned)len, (unsigned)maxlength, src));		len = maxlength;	}      	memmove(dest, src, len);	dest[len] = 0;	return dest;}  /** Safe string cat into a string. maxlength does not include the terminating zero.**/_PUBLIC_ char *safe_strcat(char *dest, const char *src, size_t maxlength){	size_t src_len, dest_len;	if (!dest) {		DEBUG(0,("ERROR: NULL dest in safe_strcat\n"));		return NULL;	}	if (!src)		return dest;	#ifdef DEVELOPER	if (PTR_DIFF(&src_len, dest) > 0) {  /* check if destination is on the stack, ok if so */		log_suspicious_usage("safe_strcat", src);	}#endif	src_len = strlen(src);	dest_len = strlen(dest);	if (src_len + dest_len > maxlength) {		DEBUG(0,("ERROR: string overflow by %d in safe_strcat [%.50s]\n",			 (int)(src_len + dest_len - maxlength), src));		if (maxlength > dest_len) {			memcpy(&dest[dest_len], src, maxlength - dest_len);		}		dest[maxlength] = 0;		return NULL;	}		memcpy(&dest[dest_len], src, src_len);	dest[dest_len + src_len] = 0;	return dest;}/** Routine to get hex characters and turn them into a 16 byte array. the array can be variable length, and any non-hex-numeric characters are skipped.  "0xnn" or "0Xnn" is specially catered for. valid examples: "0A5D15"; "0x15, 0x49, 0xa2"; "59\ta9\te3\n"**/_PUBLIC_ size_t strhex_to_str(char *p, size_t len, const char *strhex){	size_t i;	size_t num_chars = 0;	uint8_t   lonybble, hinybble;	const char     *hexchars = "0123456789ABCDEF";	char           *p1 = NULL, *p2 = NULL;	for (i = 0; i < len && strhex[i] != 0; i++) {		if (strncasecmp(hexchars, "0x", 2) == 0) {			i++; /* skip two chars */			continue;		}		if (!(p1 = strchr(hexchars, toupper((unsigned char)strhex[i]))))			break;		i++; /* next hex digit */		if (!(p2 = strchr(hexchars, toupper((unsigned char)strhex[i]))))			break;		/* get the two nybbles */		hinybble = PTR_DIFF(p1, hexchars);		lonybble = PTR_DIFF(p2, hexchars);		p[num_chars] = (hinybble << 4) | lonybble;		num_chars++;		p1 = NULL;		p2 = NULL;	}	return num_chars;}/**  * Parse a hex string and return a data blob.  */_PUBLIC_ _PURE_ DATA_BLOB strhex_to_data_blob(const char *strhex) {	DATA_BLOB ret_blob = data_blob(NULL, strlen(strhex)/2+1);	ret_blob.length = strhex_to_str((char *)ret_blob.data, 						strlen(strhex), 					strhex);	return ret_blob;}/** * Routine to print a buffer as HEX digits, into an allocated string. */_PUBLIC_ void hex_encode(const unsigned char *buff_in, size_t len, char **out_hex_buffer){	int i;	char *hex_buffer;	*out_hex_buffer = malloc_array_p(char, (len*2)+1);	hex_buffer = *out_hex_buffer;	for (i = 0; i < len; i++)		slprintf(&hex_buffer[i*2], 3, "%02X", buff_in[i]);}/** * talloc version of hex_encode() */_PUBLIC_ char *hex_encode_talloc(TALLOC_CTX *mem_ctx, const unsigned char *buff_in, size_t len){	int i;	char *hex_buffer;	hex_buffer = talloc_array(mem_ctx, char, (len*2)+1);	for (i = 0; i < len; i++)		slprintf(&hex_buffer[i*2], 3, "%02X", buff_in[i]);	return hex_buffer;}/** Substitute a string for a pattern in another string. Make sure there is  enough room! This routine looks for pattern in s and replaces it with  insert. It may do multiple replacements. Any of " ; ' $ or ` in the insert string are replaced with _ if len==0 then the string cannot be extended. This is different from the old use of len==0 which was for no length checks to be done.**/_PUBLIC_ void string_sub(char *s, const char *pattern, const char *insert, size_t len){	char *p;	ssize_t ls, lp, li, i;	if (!insert || !pattern || !*pattern || !s)		return;	ls = (ssize_t)strlen(s);	lp = (ssize_t)strlen(pattern);	li = (ssize_t)strlen(insert);	if (len == 0)		len = ls + 1; /* len is number of *bytes* */	while (lp <= ls && (p = strstr(s, pattern))) {		if (ls + (li-lp) >= len) {			DEBUG(0,("ERROR: string overflow by %d in string_sub(%.50s, %d)\n", 				 (int)(ls + (li-lp) - len),				 pattern, (int)len));			break;		}		if (li != lp) {			memmove(p+li,p+lp,strlen(p+lp)+1);		}		for (i=0;i<li;i++) {			switch (insert[i]) {			case '`':			case '"':			case '\'':			case ';':			case '$':			case '%':			case '\r':			case '\n':				p[i] = '_';				break;			default:				p[i] = insert[i];			}		}		s = p + li;		ls += (li-lp);	}}/** * Talloc'ed version of string_sub */_PUBLIC_ char *string_sub_talloc(TALLOC_CTX *mem_ctx, const char *s, 				const char *pattern, const char *insert){	const char *p;	char *ret;	size_t len, alloc_len;	if (insert == NULL || pattern == NULL || !*pattern || s == NULL)		return NULL;	/* determine length needed */	len = strlen(s);		for (p = strstr(s, pattern); p != NULL; 	     p = strstr(p+strlen(pattern), pattern)) {		len += strlen(insert) - strlen(pattern);	}	alloc_len = MAX(len, strlen(s))+1;	ret = talloc_array(mem_ctx, char, alloc_len);	if (ret == NULL)		return NULL;	strncpy(ret, s, alloc_len);	string_sub(ret, pattern, insert, alloc_len);	ret = talloc_realloc(mem_ctx, ret, char, len+1);	if (ret == NULL)		return NULL;	SMB_ASSERT(ret[len] == '\0');	return ret;}/** Similar to string_sub() but allows for any character to be substituted.  Use with caution! if len==0 then the string cannot be extended. This is different from the old use of len==0 which was for no length checks to be done.**/_PUBLIC_ void all_string_sub(char *s,const char *pattern,const char *insert, size_t len){	char *p;	ssize_t ls,lp,li;	if (!insert || !pattern || !s)		return;	ls = (ssize_t)strlen(s);	lp = (ssize_t)strlen(pattern);	li = (ssize_t)strlen(insert);	if (!*pattern)		return;		if (len == 0)		len = ls + 1; /* len is number of *bytes* */		while (lp <= ls && (p = strstr(s,pattern))) {		if (ls + (li-lp) >= len) {			DEBUG(0,("ERROR: string overflow by %d in all_string_sub(%.50s, %d)\n", 				 (int)(ls + (li-lp) - len),				 pattern, (int)len));			break;		}		if (li != lp) {			memmove(p+li,p+lp,strlen(p+lp)+1);		}		memcpy(p, insert, li);		s = p + li;		ls += (li-lp);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -