From 0e8fd3398771da2f016d72830179507f3edda51b Mon Sep 17 00:00:00 2001 From: Samba Release Account Date: Sat, 4 May 1996 07:50:46 +0000 Subject: Initial version imported to CVS (This used to be commit 291551d80711daab7b7581720bcd9a08d6096517) --- source3/lib/charset.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 source3/lib/charset.c (limited to 'source3/lib/charset.c') diff --git a/source3/lib/charset.c b/source3/lib/charset.c new file mode 100644 index 0000000000..ada3ef790a --- /dev/null +++ b/source3/lib/charset.c @@ -0,0 +1,111 @@ +/* + Unix SMB/Netbios implementation. + Version 1.9. + Character set handling + Copyright (C) Andrew Tridgell 1992-1995 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#define CHARSET_C +#include "includes.h" + +extern int DEBUGLEVEL; + +char xx_dos_char_map[256]; +char xx_upper_char_map[256]; +char xx_lower_char_map[256]; + +char *dos_char_map = NULL; +char *upper_char_map = NULL; +char *lower_char_map = NULL; + +static void add_dos_char(int lower, int upper) +{ + DEBUG(6,("Adding chars 0%o 0%o\n",lower,upper)); + if (lower) dos_char_map[(char)lower] = 1; + if (upper) dos_char_map[(char)upper] = 1; + if (lower && upper) { + lower_char_map[(char)upper] = (char)lower; + upper_char_map[(char)lower] = (char)upper; + } +} + +/**************************************************************************** +initialise the charset arrays +****************************************************************************/ +void charset_initialise(void) +{ + int i; + + dos_char_map = &xx_dos_char_map[128]; + upper_char_map = &xx_upper_char_map[128]; + lower_char_map = &xx_lower_char_map[128]; + + for (i= -128;i<=127;i++) { + dos_char_map[(char)i] = 0; + } + + for (i=0;i<=127;i++) { + if (isalnum((char)i) || strchr("._^$~!#%&-{}()@'`",(char)i)) + add_dos_char(i,0); + } + + for (i= -128;i<=127;i++) { + char c = (char)i; + upper_char_map[i] = lower_char_map[i] = c; + if (isupper(c)) lower_char_map[c] = tolower(c); + if (islower(c)) upper_char_map[c] = toupper(c); + } + + /* valid for all DOS PC */ + add_dos_char(142,0); /* A trema */ + add_dos_char(143,0); /* A o */ + add_dos_char(144,0); /* E ' */ + add_dos_char(146,0); /* AE */ + add_dos_char(153,0); /* O trema */ + add_dos_char(154,0); /* U trema */ + add_dos_char(165,0); /* N tilda */ + add_dos_char(128,0); /* C cedille */ + add_dos_char(156,0); /* Pound */ + add_dos_char(183,0); /* A ` (WIN)*/ + add_dos_char(157,0); /* Phi (WIN)*/ + add_dos_char(212,0); /* E` (WIN)*/ +} + + +/******************************************************************* +add characters depending on a string passed by the user +********************************************************************/ +void add_char_string(char *s) +{ + char *extra_chars = (char *)strdup(s); + char *t; + if (!extra_chars) return; + + 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)=='-') { + sscanf(t,"%i:%i",&i1,&i2); + add_dos_char(i1,i2); + } else { + sscanf(t,"%c:%c",&c1,&c2); + add_dos_char(c1,c2); + } + } + + free(extra_chars); +} -- cgit