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

📄 util_str.c

📁 MC Linux/Unix 终端下文件管理器
💻 C
📖 第 1 页 / 共 2 页
字号:
      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 + -