mirror of
https://github.com/samba-team/samba.git
synced 2025-02-08 05:57:51 +03:00
r2577: - I recently found out that charaters below 0x3F are guaranteed not to
occur as secondary bytes in any multi-byte character set. This allows for a very simple optimisation in strchr_m() and strrchr_m(). It might be a good idea to pick this up for Samba3. - the horrible toktocliplist() is only used in clitar.c, so move it there, to prevent anyone else from being tempted to use it.
This commit is contained in:
parent
5b88226f90
commit
663b7b75dd
@ -38,6 +38,52 @@
|
||||
#include "includes.h"
|
||||
#include "clitar.h"
|
||||
|
||||
/**
|
||||
Convert list of tokens to array; dependent on above routine.
|
||||
Uses last_ptr from above - bit of a hack.
|
||||
**/
|
||||
|
||||
static char **toktocliplist(const char *ptr, int *ctok, const char *sep)
|
||||
{
|
||||
char *s = ptr;
|
||||
int ictok=0;
|
||||
char **ret, **iret;
|
||||
|
||||
if (!sep)
|
||||
sep = " \t\n\r";
|
||||
|
||||
while(*s && strchr_m(sep,*s))
|
||||
s++;
|
||||
|
||||
/* nothing left? */
|
||||
if (!*s)
|
||||
return(NULL);
|
||||
|
||||
do {
|
||||
ictok++;
|
||||
while(*s && (!strchr_m(sep,*s)))
|
||||
s++;
|
||||
while(*s && strchr_m(sep,*s))
|
||||
*s++=0;
|
||||
} while(*s);
|
||||
|
||||
*ctok=ictok;
|
||||
s = ptr;
|
||||
|
||||
if (!(ret=iret=malloc(ictok*sizeof(char *))))
|
||||
return NULL;
|
||||
|
||||
while(ictok--) {
|
||||
*iret++=s;
|
||||
while(*s++)
|
||||
;
|
||||
while(!*s)
|
||||
s++;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int clipfind(char **aret, int ret, char *tok);
|
||||
void dos_clean_name(char *s);
|
||||
|
||||
|
@ -76,51 +76,6 @@ BOOL next_token(const char **ptr,char *buff, const char *sep, size_t bufsize)
|
||||
|
||||
static uint16_t tmpbuf[sizeof(pstring)];
|
||||
|
||||
/**
|
||||
Convert list of tokens to array; dependent on above routine.
|
||||
Uses last_ptr from above - bit of a hack.
|
||||
**/
|
||||
|
||||
char **toktocliplist(const char *ptr, int *ctok, const char *sep)
|
||||
{
|
||||
char *s = ptr;
|
||||
int ictok=0;
|
||||
char **ret, **iret;
|
||||
|
||||
if (!sep)
|
||||
sep = " \t\n\r";
|
||||
|
||||
while(*s && strchr_m(sep,*s))
|
||||
s++;
|
||||
|
||||
/* nothing left? */
|
||||
if (!*s)
|
||||
return(NULL);
|
||||
|
||||
do {
|
||||
ictok++;
|
||||
while(*s && (!strchr_m(sep,*s)))
|
||||
s++;
|
||||
while(*s && strchr_m(sep,*s))
|
||||
*s++=0;
|
||||
} while(*s);
|
||||
|
||||
*ctok=ictok;
|
||||
s = ptr;
|
||||
|
||||
if (!(ret=iret=malloc(ictok*sizeof(char *))))
|
||||
return NULL;
|
||||
|
||||
while(ictok--) {
|
||||
*iret++=s;
|
||||
while(*s++)
|
||||
;
|
||||
while(!*s)
|
||||
s++;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
Case insensitive string compararison.
|
||||
@ -736,6 +691,12 @@ char *strchr_m(const char *s, char c)
|
||||
pstring s2;
|
||||
smb_ucs2_t *p;
|
||||
|
||||
/* characters below 0x3F are guaranteed to not appear in
|
||||
non-initial position in multi-byte charsets */
|
||||
if ((c & 0xC0) == 0) {
|
||||
return strchr(s, c);
|
||||
}
|
||||
|
||||
push_ucs2(ws, s, sizeof(ws), STR_TERMINATE);
|
||||
p = strchr_w(ws, UCS2_CHAR(c));
|
||||
if (!p)
|
||||
@ -751,6 +712,12 @@ char *strrchr_m(const char *s, char c)
|
||||
pstring s2;
|
||||
smb_ucs2_t *p;
|
||||
|
||||
/* characters below 0x3F are guaranteed to not appear in
|
||||
non-initial position in multi-byte charsets */
|
||||
if ((c & 0xC0) == 0) {
|
||||
return strrchr(s, c);
|
||||
}
|
||||
|
||||
push_ucs2(ws, s, sizeof(ws), STR_TERMINATE);
|
||||
p = strrchr_w(ws, UCS2_CHAR(c));
|
||||
if (!p)
|
||||
|
Loading…
x
Reference in New Issue
Block a user