Makefile: Changes to split Solaris into Solaris2.3 and previous, and 2.4 and after...
[kai/samba.git] / source3 / lib / charset.c
1 /* 
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    Character set handling
5    Copyright (C) Andrew Tridgell 1992-1995
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #define CHARSET_C
23 #include "includes.h"
24
25 extern int DEBUGLEVEL;
26
27 char xx_dos_char_map[256];
28 char xx_upper_char_map[256];
29 char xx_lower_char_map[256];
30
31 char *dos_char_map = xx_dos_char_map;
32 char *upper_char_map = xx_upper_char_map;
33 char *lower_char_map = xx_lower_char_map;
34
35 static void add_dos_char(int lower, int upper)
36 {
37   lower &= 0xff;
38   upper &= 0xff;
39   DEBUG(6,("Adding chars 0%o 0%o\n",lower,upper));
40   if (lower) dos_char_map[lower] = 1;
41   if (upper) dos_char_map[upper] = 1;
42   if (lower && upper) {
43     lower_char_map[upper] = (char)lower;
44     upper_char_map[lower] = (char)upper;
45   }
46 }
47
48 /****************************************************************************
49 initialise the charset arrays
50 ****************************************************************************/
51 void charset_initialise(void)
52 {
53   int i;
54
55 #ifdef LC_ALL
56   /* include <locale.h> in includes.h if available for OS                  */
57   /* we take only standard 7-bit ASCII definitions from ctype              */
58   setlocale(LC_ALL,"C");
59 #endif
60
61   for (i= 0;i<=255;i++) {
62     dos_char_map[i] = 0;
63   }
64
65   for (i=0;i<=127;i++) {
66     if (isalnum((char)i) || strchr("._^$~!#%&-{}()@'`",(char)i))
67       add_dos_char(i,0);
68   }
69
70   for (i=0; i<=255; i++) {
71     char c = (char)i;
72     upper_char_map[i] = lower_char_map[i] = c;
73     if (isupper(c)) lower_char_map[i] = tolower(c);
74     if (islower(c)) upper_char_map[i] = toupper(c);
75   }
76
77 #define CP850
78 #ifdef CP850
79 /* lower->upper mapping for IBM Code Page 850 */
80
81 /* dec col/row oct hex  description */
82 /* 133  08/05  205  85  a grave */
83 /* 183  11/07  267  B7  A grave */      add_dos_char(0205,0267);
84 /* 160  10/00  240  A0  a acute */
85 /* 181  11/05  265  B5  A acute */      add_dos_char(0240,0265);
86 /* 131  08/03  203  83  a circumflex */
87 /* 182  11/06  266  B6  A circumflex */ add_dos_char(0203,0266);
88 /* 198  12/06  306  C6  a tilde */
89 /* 199  12/07  307  C7  A tilde */      add_dos_char(0306,0307);
90 /* 132  08/04  204  84  a diaeresis */
91 /* 142  08/14  216  8E  A diaeresis */  add_dos_char(0204,0216);
92 /* 134  08/06  206  86  a ring */
93 /* 143  08/15  217  8F  A ring */       add_dos_char(0206,0217);
94 /* 145  09/01  221  91  ae diphthong */
95 /* 146  09/02  222  92  AE diphthong */ add_dos_char(0221,0222);
96 /* 128  08/00  200  80  C cedilla */
97 /* 135  08/07  207  87  c cedilla */    add_dos_char(0207,0200);
98 /* 138  08/10  212  8A  e grave */
99 /* 212  13/04  324  D4  E grave */      add_dos_char(0212,0324);
100 /* 130  08/02  202  82  e acute */
101 /* 144  09/00  220  90  E acute */      add_dos_char(0202,0220);
102 /* 136  08/08  210  88  e circumflex */
103 /* 210  13/02  322  D2  E circumflex */ add_dos_char(0210,0322);
104 /* 137  08/09  211  89  e diaeresis */
105 /* 211  13/03  323  D3  E diaeresis */  add_dos_char(0211,0323);
106 /* 141  08/13  215  8D  i grave */
107 /* 222  13/14  336  DE  I grave */      add_dos_char(0215,0336);
108 /* 161  10/01  241  A1  i acute */
109 /* 214  13/06  326  D6  I acute */      add_dos_char(0241,0326);
110 /* 140  08/12  214  8C  i circumflex */
111 /* 215  13/07  327  D7  I circumflex */ add_dos_char(0214,0327);
112 /* 139  08/11  213  8B  i diaeresis */
113 /* 216  13/08  330  D8  I diaeresis */  add_dos_char(0213,0330);
114 /* 208  13/00  320  D0  Icelandic eth */
115 /* 209  13/01  321  D1  Icelandic Eth */ add_dos_char(0320,0321);
116 /* 164  10/04  244  A4  n tilde */
117 /* 165  10/05  245  A5  N tilde */      add_dos_char(0244,0245);
118 /* 149  09/05  225  95  o grave */
119 /* 227  14/03  343  E3  O grave */      add_dos_char(0225,0343);
120 /* 162  10/02  242  A2  o acute */
121 /* 224  14/00  340  E0  O acute */      add_dos_char(0242,0340);
122 /* 147  09/03  223  93  o circumflex */
123 /* 226  14/02  342  E2  O circumflex */ add_dos_char(0223,0342);
124 /* 228  14/04  344  E4  o tilde */
125 /* 229  14/05  345  E5  O tilde */      add_dos_char(0344,0345);
126 /* 148  09/04  224  94  o diaeresis */
127 /* 153  09/09  231  99  O diaeresis */  add_dos_char(0224,0231);
128 /* 155  09/11  233  9B  o slash */
129 /* 157  09/13  235  9D  O slash */      add_dos_char(0233,0235);
130 /* 151  09/07  227  97  u grave */
131 /* 235  14/11  353  EB  U grave */      add_dos_char(0227,0353);
132 /* 163  10/03  243  A3  u acute */
133 /* 233  14/09  351  E9  U acute */      add_dos_char(0243,0351);
134 /* 150  09/06  226  96  u circumflex */
135 /* 234  14/10  352  EA  U circumflex */ add_dos_char(0226,0352);
136 /* 129  08/01  201  81  u diaeresis */
137 /* 154  09/10  232  9A  U diaeresis */  add_dos_char(0201,0232);
138 /* 236  14/12  354  EC  y acute */
139 /* 237  14/13  355  ED  Y acute */      add_dos_char(0354,0355);
140 /* 231  14/07  347  E7  Icelandic thorn */
141 /* 232  14/08  350  E8  Icelandic Thorn */ add_dos_char(0347,0350);
142    
143   add_dos_char(156,0);     /* Pound        */
144 #endif
145 }
146
147 /*******************************************************************
148 add characters depending on a string passed by the user
149 ********************************************************************/
150 void add_char_string(char *s)
151 {
152   char *extra_chars = (char *)strdup(s);
153   char *t;
154   if (!extra_chars) return;
155
156   for (t=strtok(extra_chars," \t\r\n"); t; t=strtok(NULL," \t\r\n")) {
157     char c1=0,c2=0;
158     int i1=0,i2=0;
159     if (isdigit(*t) || (*t)=='-') {
160       sscanf(t,"%i:%i",&i1,&i2);
161       add_dos_char(i1,i2);
162     } else {
163       sscanf(t,"%c:%c",&c1,&c2);
164       add_dos_char(c1,c2);
165     }
166   }
167
168   free(extra_chars);
169 }