r2577: - I recently found out that charaters below 0x3F are guaranteed not to
authorAndrew Tridgell <tridge@samba.org>
Fri, 24 Sep 2004 01:21:21 +0000 (01:21 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:59:07 +0000 (12:59 -0500)
  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 used to be commit 663b7b75ddd838ce547425b07d7ce4d4606fb479)

source4/client/clitar.c
source4/lib/util_str.c

index 9ce9f2759987e2ccdd6e1d5010080257045e53b2..7797b686d5e991b31a86e9b8129235124bc96602 100644 (file)
 #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);
 
index a71a9ee703bee5958a9f1e89fb3a121e8ff84fb6..cbe5988238994d7a678714f7861786c96d61d90e 100644 (file)
@@ -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)