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

📄 util_str.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 4 页
字号:
	size_t len;	if (!dest) {		DEBUG(0,("ERROR: NULL dest in safe_strcpy, called from [%s][%d]\n", fn, line));		return NULL;	}#ifdef DEVELOPER	clobber_region(fn,line,dest, maxlength+1);#endif	if (!src) {		*dest = 0;		return dest;	}  	len = strnlen(src, maxlength+1);	if (len > maxlength) {		DEBUG(0,("ERROR: string overflow by %lu (%lu - %lu) in safe_strcpy [%.50s]\n",			 (unsigned long)(len-maxlength), (unsigned long)len, 			 (unsigned long)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.**/char *safe_strcat_fn(const char *fn, int line, char *dest, const char *src, size_t maxlength){	size_t src_len, dest_len;	if (!dest) {		DEBUG(0,("ERROR: NULL dest in safe_strcat, called from [%s][%d]\n", fn, line));		return NULL;	}	if (!src)		return dest;		src_len = strnlen(src, maxlength + 1);	dest_len = strnlen(dest, maxlength + 1);#ifdef DEVELOPER	clobber_region(fn, line, dest + dest_len, maxlength + 1 - dest_len);#endif	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;}/** Paranoid strcpy into a buffer of given length (includes terminating zero. Strips out all but 'a-Z0-9' and the character in other_safe_chars and replaces with '_'. Deliberately does *NOT* check for multibyte characters. Don't change it !**/char *alpha_strcpy_fn(const char *fn, int line, char *dest, const char *src, const char *other_safe_chars, size_t maxlength){	size_t len, i;#ifdef DEVELOPER	clobber_region(fn, line, dest, maxlength);#endif	if (!dest) {		DEBUG(0,("ERROR: NULL dest in alpha_strcpy, called from [%s][%d]\n", fn, line));		return NULL;	}	if (!src) {		*dest = 0;		return dest;	}  	len = strlen(src);	if (len >= maxlength)		len = maxlength - 1;	if (!other_safe_chars)		other_safe_chars = "";	for(i = 0; i < len; i++) {		int val = (src[i] & 0xff);		if (isupper_ascii(val) || islower_ascii(val) || isdigit(val) || strchr_m(other_safe_chars, val))			dest[i] = src[i];		else			dest[i] = '_';	}	dest[i] = '\0';	return dest;}/** Like strncpy but always null terminates. Make sure there is room! The variable n should always be one less than the available size.**/char *StrnCpy_fn(const char *fn, int line,char *dest,const char *src,size_t n){	char *d = dest;#ifdef DEVELOPER	clobber_region(fn, line, dest, n+1);#endif	if (!dest) {		DEBUG(0,("ERROR: NULL dest in StrnCpy, called from [%s][%d]\n", fn, line));		return(NULL);	}	if (!src) {		*dest = 0;		return(dest);	}		while (n-- && (*d = *src)) {		d++;		src++;	}	*d = 0;	return(dest);}#if 0/** Like strncpy but copies up to the character marker.  always null terminates. returns a pointer to the character marker in the source string (src).**/static char *strncpyn(char *dest, const char *src, size_t n, char c){	char *p;	size_t str_len;#ifdef DEVELOPER	clobber_region(dest, n+1);#endif	p = strchr_m(src, c);	if (p == NULL) {		DEBUG(5, ("strncpyn: separator character (%c) not found\n", c));		return NULL;	}	str_len = PTR_DIFF(p, src);	strncpy(dest, src, MIN(n, str_len));	dest[str_len] = '\0';	return p;}#endif/** 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"**/size_t strhex_to_str(char *p, size_t len, const char *strhex){	size_t i;	size_t num_chars = 0;	unsigned char   lonybble, hinybble;	const char     *hexchars = "0123456789ABCDEF";	char           *p1 = NULL, *p2 = NULL;	for (i = 0; i < len && strhex[i] != 0; i++) {		if (strnequal(hexchars, "0x", 2)) {			i++; /* skip two chars */			continue;		}		if (!(p1 = strchr_m(hexchars, toupper_ascii(strhex[i]))))			break;		i++; /* next hex digit */		if (!(p2 = strchr_m(hexchars, toupper_ascii(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;}DATA_BLOB strhex_to_data_blob(TALLOC_CTX *mem_ctx, const char *strhex) {	DATA_BLOB ret_blob;	if (mem_ctx != NULL)		ret_blob = data_blob_talloc(mem_ctx, NULL, strlen(strhex)/2+1);	else		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. */char *hex_encode(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;}/** Check if a string is part of a list.**/BOOL in_list(const char *s, const char *list, BOOL casesensitive){	pstring tok;	const char *p=list;	if (!list)		return(False);	while (next_token(&p,tok,LIST_SEP,sizeof(tok))) {		if (casesensitive) {			if (strcmp(tok,s) == 0)				return(True);		} else {			if (StrCaseCmp(tok,s) == 0)				return(True);		}	}	return(False);}/* this is used to prevent lots of mallocs of size 1 */static char *null_string = NULL;/** Set a string value, allocing the space for the string**/static BOOL string_init(char **dest,const char *src){	size_t l;	if (!src)     		src = "";	l = strlen(src);	if (l == 0) {		if (!null_string) {			if((null_string = (char *)SMB_MALLOC(1)) == NULL) {				DEBUG(0,("string_init: malloc fail for null_string.\n"));				return False;			}			*null_string = 0;		}		*dest = null_string;	} else {		(*dest) = SMB_STRDUP(src);		if ((*dest) == NULL) {			DEBUG(0,("Out of memory in string_init\n"));			return False;		}	}	return(True);}/** Free a string value.**/void string_free(char **s){	if (!s || !(*s))		return;	if (*s == null_string)		*s = NULL;	SAFE_FREE(*s);}/** Set a string value, deallocating any existing space, and allocing the space for the string**/BOOL string_set(char **dest,const char *src){	string_free(dest);	return(string_init(dest,src));}/** 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 or just one. 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.**/void string_sub2(char *s,const char *pattern, const char *insert, size_t len, 		 BOOL remove_unsafe_characters, BOOL replace_once){	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_m(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':				if ( remove_unsafe_characters ) {					p[i] = '_';					/* yes this break should be here since we want to 					   fall throw if not replacing unsafe chars */					break;				}			default:				p[i] = insert[i];			}		}		s = p + li;		ls += (li-lp);		if (replace_once)			break;	}}void string_sub_once(char *s, const char *pattern, const char *insert, size_t len){	string_sub2( s, pattern, insert, len, True, True );}void string_sub(char *s,const char *pattern, const char *insert, size_t len){	string_sub2( s, pattern, insert, len, True, False );}void fstring_sub(char *s,const char *pattern,const char *insert){	string_sub(s, pattern, insert, sizeof(fstring));}void pstring_sub(char *s,const char *pattern,const char *insert){	string_sub(s, pattern, insert, sizeof(pstring));}/** Similar to string_sub, but it will accept only allocated strings and may realloc them so pay attention at what you pass on no pointers inside strings, no pstrings or const may be passed as string.**/char *realloc_string_sub(char *string, const char *pattern,			 const char *insert){	char *p, *in;	char *s;	ssize_t ls,lp,li,ld, i;	if (!insert || !pattern || !*pattern || !string || !*string)		return NULL;	s = string;	in = SMB_STRDUP(insert);	if (!in) {		DEBUG(0, ("realloc_string_sub: out of memory!\n"));		return NULL;	}	ls = (ssize_t)strlen(s);	lp = (ssize_t)strlen(pattern);	li = (ssize_t)strlen(insert);	ld = li - lp;	for (i=0;i<li;i++) {		switch (in[i]) {			case '`':			case '"':			case '\'':			case ';':			case '$':			case '%':			case '\r':			case '\n':				in[i] = '_';			default:				/* ok */				break;		}	}		while ((p = strstr_m(s,pattern))) {		if (ld > 0) {			int offset = PTR_DIFF(s,string);			char *t = SMB_REALLOC(string, ls + ld + 1);			if (!t) {				DEBUG(0, ("realloc_string_sub: out of memory!\n"));				SAFE_FREE(in);				return NULL;			}			string = t;			p = t + offset + (p - s);		}		if (li != lp) {			memmove(p+li,p+lp,strlen(p+lp)+1);		}		memcpy(p, in, li);		s = p + li;		ls += ld;	}	SAFE_FREE(in);	return string;}/* Same as string_sub, but returns a talloc'ed string */char *talloc_string_sub(TALLOC_CTX *mem_ctx, const char *src,			const char *pattern, const char *insert){	char *p, *in;	char *s;	char *string;	ssize_t ls,lp,li,ld, i;	if (!insert || !pattern || !*pattern || !src || !*src)		return NULL;	string = talloc_strdup(mem_ctx, src);	if (string == NULL) {		DEBUG(0, ("talloc_strdup failed\n"));		return NULL;	}	s = string;	in = SMB_STRDUP(insert);	if (!in) {		DEBUG(0, ("talloc_string_sub: out of memory!\n"));		return NULL;	}	ls = (ssize_t)strlen(s);	lp = (ssize_t)strlen(pattern);	li = (ssize_t)strlen(insert);	ld = li - lp;	for (i=0;i<li;i++) {		switch (in[i]) {			case '`':			case '"':			case '\'':			case ';':			case '$':			case '%':			case '\r':			case '\n':				in[i] = '_';			default:				/* ok */				break;		}	}		while ((p = strstr_m(s,pattern))) {		if (ld > 0) {			int offset = PTR_DIFF(s,string);			char *t = TALLOC_REALLOC(mem_ctx, string, ls + ld + 1);			if (!t) {				DEBUG(0, ("talloc_string_sub: out of "					  "memory!\n"));				SAFE_FREE(in);				return NULL;			}			string = t;			p = t + offset + (p - s);		}		if (li != lp) {			memmove(p+li,p+lp,strlen(p+lp)+1);		}		memcpy(p, in, li);		s = p + li;		ls += ld;	}	SAFE_FREE(in);	return string;}/** 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.**/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* */	

⌨️ 快捷键说明

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