📄 util_str.c
字号:
size_t mb_back_len = str_charnum(back); size_t mb_s_len = str_charnum(s); while(mb_s_len >= mb_back_len) { size_t charcount = 0; char *mbp = s; while(charcount < (mb_s_len - mb_back_len)) { size_t skip = skip_multibyte_char(*mbp); mbp += (skip ? skip : 1); charcount++; } /* * mbp now points at mb_back_len multibyte * characters from the end of s. */ if(strcmp(mbp, back) == 0) { ret = True; *mbp = '\0'; mb_s_len = str_charnum(s); mbp = s; } else break; } /* end while mb_s_len... */ } /* end else .. */ } /* end if back_len .. */ return(ret);}/****************************************************************************does a string have any uppercase chars in it?****************************************************************************/BOOL strhasupper(const char *s){ while (*s) {#if !defined(KANJI_WIN95_COMPATIBILITY) /* * For completeness we should put in equivalent code for code pages * 949 (Korean hangul) and 950 (Big5 Traditional Chinese) here - but * doubt anyone wants Samba to behave differently from Win95 and WinNT * here. They both treat full width ascii characters as case senstive * filenames (ie. they don't do the work we do here). * JRA. */ if(lp_client_code_page() == KANJI_CODEPAGE) { /* Win95 treats full width ascii characters as case sensitive. */ if (is_shift_jis (*s)) s += 2; else if (is_kana (*s)) s++; else { if (isupper(*s)) return(True); s++; } } else#endif /* KANJI_WIN95_COMPATIBILITY */ { size_t skip = skip_multibyte_char( *s ); if( skip != 0 ) s += skip; else { if (isupper(*s)) return(True); s++; } } } return(False);}/****************************************************************************does a string have any lowercase chars in it?****************************************************************************/BOOL strhaslower(const char *s){ while (*s) {#if !defined(KANJI_WIN95_COMPATIBILITY) /* * For completeness we should put in equivalent code for code pages * 949 (Korean hangul) and 950 (Big5 Traditional Chinese) here - but * doubt anyone wants Samba to behave differently from Win95 and WinNT * here. They both treat full width ascii characters as case senstive * filenames (ie. they don't do the work we do here). * JRA. */ if(lp_client_code_page() == KANJI_CODEPAGE) { /* Win95 treats full width ascii characters as case sensitive. */ if (is_shift_jis (*s)) { if (is_sj_upper (s[0], s[1])) return(True); if (is_sj_lower (s[0], s[1])) return (True); s += 2; } else if (is_kana (*s)) { s++; } else { if (islower(*s)) return(True); s++; } } else#endif /* KANJI_WIN95_COMPATIBILITY */ { size_t skip = skip_multibyte_char( *s ); if( skip != 0 ) s += skip; else { if (islower(*s)) return(True); s++; } } } return(False);}/****************************************************************************find the number of chars in a string****************************************************************************/size_t count_chars(const char *s,char c){ size_t count=0;#if !defined(KANJI_WIN95_COMPATIBILITY) /* * For completeness we should put in equivalent code for code pages * 949 (Korean hangul) and 950 (Big5 Traditional Chinese) here - but * doubt anyone wants Samba to behave differently from Win95 and WinNT * here. They both treat full width ascii characters as case senstive * filenames (ie. they don't do the work we do here). * JRA. */ if(lp_client_code_page() == KANJI_CODEPAGE) { /* Win95 treats full width ascii characters as case sensitive. */ while (*s) { if (is_shift_jis (*s)) s += 2; else { if (*s == c) count++; s++; } } } else#endif /* KANJI_WIN95_COMPATIBILITY */ { while (*s) { size_t skip = skip_multibyte_char( *s ); if( skip != 0 ) s += skip; else { if (*s == c) count++; s++; } } } return(count);}/*******************************************************************safe string copy into a known length string. maxlength does notinclude the terminating zero.********************************************************************/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; } if (!src) { *dest = 0; return dest; } len = strlen(src); if (len > maxlength) { DEBUG(0,("ERROR: string overflow by %d in safe_strcpy [%.50s]\n", (int)(len-maxlength), src)); len = maxlength; } memcpy(dest, src, len); dest[len] = 0; return dest;} /*******************************************************************safe string cat into a string. maxlength does notinclude the terminating zero.********************************************************************/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; } 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)); src_len = maxlength - dest_len; } memcpy(&dest[dest_len], src, src_len); dest[dest_len + src_len] = 0; return dest;}/****************************************************************************this is a safer strcpy(), meant to prevent core dumps when nasty things happen****************************************************************************/char *StrCpy(char *dest,const char *src){ char *d = dest; /* I don't want to get lazy with these ... */ SMB_ASSERT(dest && src); if (!dest) return(NULL); if (!src) { *dest = 0; return(dest); } while ((*d++ = *src++)) ; return(dest);}/****************************************************************************like strncpy but always null terminates. Make sure there is room!****************************************************************************/char *StrnCpy(char *dest,const char *src,size_t n){ char *d = dest; if (!dest) return(NULL); if (!src) { *dest = 0; return(dest); } while (n-- && (*d++ = *src++)) ; *d = 0; return(dest);}/****************************************************************************like strncpy but copies up to the character marker. always null terminates.returns a pointer to the character marker in the source string (src).****************************************************************************/char *strncpyn(char *dest, const char *src,size_t n, char c){ char *p; size_t str_len; p = strchr(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;}/************************************************************* 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; 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(hexchars, toupper(strhex[i])))) { break; } i++; /* next hex digit */ if (!(p2 = strchr(hexchars, toupper(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;}/****************************************************************************check if a string is part of a list****************************************************************************/BOOL in_list(char *s,char *list,BOOL casesensitive){ pstring tok; 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****************************************************************************/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 *)malloc(1)) == NULL) { DEBUG(0,("string_init: malloc fail for null_string.\n")); return False; } *null_string = 0; } *dest = null_string; } else { (*dest) = (char *)malloc(l+1); if ((*dest) == NULL) { DEBUG(0,("Out of memory in string_init\n")); return False; } pstrcpy(*dest,src); } return(True);}/****************************************************************************free a string value****************************************************************************/void string_free(char **s){ if (!s || !(*s)) return; if (*s == null_string) *s = NULL; if (*s) free(*s); *s = NULL;}/****************************************************************************set a string value, allocing the space for the string, and deallocating any existing space****************************************************************************/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.any of " ; ' or ` in the insert string are replaced with _****************************************************************************/void string_sub(char *s,const char *pattern,const char *insert){ char *p; size_t ls,lp,li, i; if (!insert || !pattern || !s) return; ls = strlen(s); lp = strlen(pattern); li = strlen(insert); if (!*pattern) return; while (lp <= ls && (p = strstr(s,pattern))) { memmove(p+li,p+lp,ls + 1 - (PTR_DIFF(p,s) + lp)); for (i=0;i<li;i++) { switch (insert[i]) { case '`': case '"': case '\'': case ';': p[i] = '_'; break; default: p[i] = insert[i]; } } s = p + li; ls += (li-lp); }}/****************************************************************************similar to string_sub() but allows for any character to be substituted. Use with caution!****************************************************************************/void all_string_sub(char *s,const char *pattern,const char *insert){ char *p; size_t ls,lp,li; if (!insert || !pattern || !s) return; ls = strlen(s); lp = strlen(pattern); li = strlen(insert); if (!*pattern) return; while (lp <= ls && (p = strstr(s,pattern))) { memmove(p+li,p+lp,ls + 1 - (PTR_DIFF(p,s) + lp)); memcpy(p, insert, li); s = p + li; ls += (li-lp); }}/**************************************************************************** splits out the front and back at a separator.****************************************************************************/void split_at_last_component(char *path, char *front, char sep, char *back){ char *p = strrchr(path, sep); if (p != NULL) { *p = 0; } if (front != NULL) { pstrcpy(front, path); } if (p != NULL) { if (back != NULL) { pstrcpy(back, p+1); } *p = '\\'; } else { if (back != NULL) { back[0] = 0; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -