charset.c: Fixed bug with 'valid chars' param.
[jra/samba/.git] / source3 / lib / charset.c
index a83d1133fef7d7432125a70776b250cfc7b6db9a..55e2239b55900bf0013cb641450e01074079c5ce 100644 (file)
@@ -198,10 +198,9 @@ static void add_dos_char(int lower, BOOL map_lower_to_upper,
 /****************************************************************************
 initialise the charset arrays
 ****************************************************************************/
-void charset_initialise(int client_codepage)
+void charset_initialise()
 {
   int i;
-  unsigned char (*cp)[4];
 
 #ifdef LC_ALL
   /* include <locale.h> in includes.h if available for OS                  */
@@ -215,7 +214,7 @@ void charset_initialise(int client_codepage)
 
   for (i=0;i<=127;i++) {
     if (isalnum((char)i) || strchr("._^$~!#%&-{}()@'`",(char)i))
-      add_dos_char(i,0,False,False);
+      add_dos_char(i,False,0,False);
   }
 
   for (i=0; i<=255; i++) {
@@ -224,9 +223,26 @@ void charset_initialise(int client_codepage)
     if (isupper(c)) lower_char_map[i] = tolower(c);
     if (islower(c)) upper_char_map[i] = toupper(c);
   }
+}
 
- if(client_codepage != -1)
-   DEBUG(1,("charset_initialise: client code page = %d\n", client_codepage));
+/****************************************************************************
+initialise the client codepage.
+****************************************************************************/
+void codepage_initialise(int client_codepage)
+{
+  int i;
+  unsigned char (*cp)[4] = NULL;
+  static BOOL done = False;
+
+  if(done == True) 
+  {
+    DEBUG(6,
+      ("codepage_initialise: called twice - ignoring second client code page = %d\n",
+      client_codepage));
+    return;
+  }
+
+  DEBUG(6,("codepage_initialise: client code page = %d\n", client_codepage));
 
   /*
    * Known client codepages - these can be added to.
@@ -239,16 +255,12 @@ void charset_initialise(int client_codepage)
     case 437:
       cp = cp_437;
       break;
-    case -1: /* pre-initialize call so that toupper/tolower work
-                before smb.conf is read. */
-      cp = NULL;
-      break;
     default:
-      /* Default charset - currently 850 */
-      DEBUG(1,("charset_initialise: Using default client codepage %d\n", 850));
+      /* Use default codepage - currently 850 */
+      DEBUG(6,("codepage_initialise: Using default client codepage %d\n", 
+               850));
       cp = cp_850;
       break;
-    
   }
 
   if(cp)
@@ -256,6 +268,8 @@ void charset_initialise(int client_codepage)
     for(i = 0; (cp[i][0] != '\0') && (cp[i][1] != '\0'); i++)
       add_dos_char(cp[i][0], (BOOL)cp[i][2], cp[i][1], (BOOL)cp[i][3]);
   }
+
+  done = True;
 }
 
 /*******************************************************************
@@ -270,12 +284,12 @@ void add_char_string(char *s)
   for (t=strtok(extra_chars," \t\r\n"); t; t=strtok(NULL," \t\r\n")) {
     char c1=0,c2=0;
     int i1=0,i2=0;
-    if (isdigit(*t) || (*t)=='-') {
+    if (isdigit((unsigned char)*t) || (*t)=='-') {
       sscanf(t,"%i:%i",&i1,&i2);
       add_dos_char(i1,True,i2,True);
     } else {
       sscanf(t,"%c:%c",&c1,&c2);
-      add_dos_char(c1,True,c2, True);
+      add_dos_char((unsigned char)c1,True,(unsigned char)c2, True);
     }
   }