summaryrefslogtreecommitdiffstats
path: root/source/lib/charset.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/lib/charset.c')
-rw-r--r--source/lib/charset.c111
1 files changed, 111 insertions, 0 deletions
diff --git a/source/lib/charset.c b/source/lib/charset.c
new file mode 100644
index 00000000000..ada3ef790aa
--- /dev/null
+++ b/source/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);
+}