root/src/vfs/smbfs/helpers/lib/charcnv.c

/* [previous][next][first][last][top][bottom][index][help]  */

DEFINITIONS

This source file includes following definitions.
  1. initmaps
  2. update_map
  3. init_iso8859_1
  4. init_iso8859_2
  5. init_iso8859_5
  6. init_koi8_r
  7. unix2dos_format
  8. dos2unix_format
  9. interpret_character_set

   1 /*
   2    Unix SMB/Netbios implementation.
   3    Version 1.9.
   4    Character set conversion Extensions
   5 
   6    Copyright (C) Andrew Tridgell 1992-1998
   7 
   8    Copyright (C) 2011-2019
   9    Free Software Foundation, Inc.
  10 
  11    This file is part of the Midnight Commander.
  12 
  13    The Midnight Commander is free software: you can redistribute it
  14    and/or modify it under the terms of the GNU General Public License as
  15    published by the Free Software Foundation, either version 3 of the License,
  16    or (at your option) any later version.
  17 
  18    The Midnight Commander is distributed in the hope that it will be useful,
  19    but WITHOUT ANY WARRANTY; without even the implied warranty of
  20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21    GNU General Public License for more details.
  22 
  23    You should have received a copy of the GNU General Public License
  24    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  25  */
  26 
  27 #include "includes.h"
  28 #define CTRLZ 26
  29 extern int DEBUGLEVEL;
  30 
  31 static char cvtbuf[1024];
  32 
  33 static BOOL mapsinited = 0;
  34 
  35 static char unix2dos[256];
  36 static char dos2unix[256];
  37 
  38 static void
  39 initmaps (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
  40 {
  41     int k;
  42 
  43     for (k = 0; k < 256; k++)
  44         unix2dos[k] = k;
  45     for (k = 0; k < 256; k++)
  46         dos2unix[k] = k;
  47 
  48     mapsinited = True;
  49 }
  50 
  51 static void
  52 update_map (const char *str)
     /* [previous][next][first][last][top][bottom][index][help]  */
  53 {
  54     const char *p;
  55 
  56     for (p = str; *p; p++)
  57     {
  58         if (p[1])
  59         {
  60             unix2dos[(unsigned char) *p] = p[1];
  61             dos2unix[(unsigned char) p[1]] = *p;
  62             p++;
  63         }
  64     }
  65 }
  66 
  67 static void
  68 init_iso8859_1 (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
  69 {
  70 
  71     int i;
  72     if (!mapsinited)
  73         initmaps ();
  74 
  75     /* Do not map undefined characters to some accidental code */
  76     for (i = 128; i < 256; i++)
  77     {
  78         unix2dos[i] = CTRLZ;
  79         dos2unix[i] = CTRLZ;
  80     }
  81 
  82     /* MSDOS Code Page 850 -> ISO-8859 */
  83     update_map ("\240\377\241\255\242\275\243\234\244\317\245\276\246\335\247\365");
  84     update_map ("\250\371\251\270\252\246\253\256\254\252\255\360\256\251\257\356");
  85     update_map ("\260\370\261\361\262\375\263\374\264\357\265\346\266\364\267\372");
  86     update_map ("\270\367\271\373\272\247\273\257\274\254\275\253\276\363\277\250");
  87     update_map ("\300\267\301\265\302\266\303\307\304\216\305\217\306\222\307\200");
  88     update_map ("\310\324\311\220\312\322\313\323\314\336\315\326\316\327\317\330");
  89     update_map ("\320\321\321\245\322\343\323\340\324\342\325\345\326\231\327\236");
  90     update_map ("\330\235\331\353\332\351\333\352\334\232\335\355\336\350\337\341");
  91     update_map ("\340\205\341\240\342\203\343\306\344\204\345\206\346\221\347\207");
  92     update_map ("\350\212\351\202\352\210\353\211\354\215\355\241\356\214\357\213");
  93     update_map ("\360\320\361\244\362\225\363\242\364\223\365\344\366\224\367\366");
  94     update_map ("\370\233\371\227\372\243\373\226\374\201\375\354\376\347\377\230");
  95 
  96 }
  97 
  98 /* Init for eastern european languages. */
  99 
 100 static void
 101 init_iso8859_2 (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 102 {
 103 
 104     int i;
 105     if (!mapsinited)
 106         initmaps ();
 107 
 108     /* Do not map undefined characters to some accidental code */
 109     for (i = 128; i < 256; i++)
 110     {
 111         unix2dos[i] = CTRLZ;
 112         dos2unix[i] = CTRLZ;
 113     }
 114 
 115     /*
 116      * Tranlation table created by Petr Hubeny <psh@capitol.cz>
 117      * Requires client code page = 852
 118      * and character set = ISO8859-2 in smb.conf
 119      */
 120 
 121     /* MSDOS Code Page 852 -> ISO-8859-2 */
 122     update_map ("\241\244\242\364\243\235\244\317\245\225\246\227\247\365");
 123     update_map ("\250\371\251\346\252\270\253\233\254\215\256\246\257\275");
 124     update_map ("\261\245\262\362\263\210\264\357\265\226\266\230\267\363");
 125     update_map ("\270\367\271\347\272\255\273\234\274\253\275\361\276\247\277\276");
 126     update_map ("\300\350\301\265\302\266\303\306\304\216\305\221\306\217\307\200");
 127     update_map ("\310\254\311\220\312\250\313\323\314\267\315\326\316\327\317\322");
 128     update_map ("\320\321\321\343\322\325\323\340\324\342\325\212\326\231\327\236");
 129     update_map ("\330\374\331\336\332\351\333\353\334\232\335\355\336\335\337\341");
 130     update_map ("\340\352\341\240\342\203\343\307\344\204\345\222\346\206\347\207");
 131     update_map ("\350\237\351\202\352\251\353\211\354\330\355\241\356\214\357\324");
 132     update_map ("\360\320\361\344\362\345\363\242\364\223\365\213\366\224\367\366");
 133     update_map ("\370\375\371\205\372\243\373\373\374\201\375\354\376\356\377\372");
 134 }
 135 
 136 /* Init for russian language (iso8859-5) */
 137 
 138 /* Added by Max Khon <max@iclub.nsu.ru> */
 139 
 140 static void
 141 init_iso8859_5 (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 142 {
 143     int i;
 144     if (!mapsinited)
 145         initmaps ();
 146 
 147     /* Do not map undefined characters to some accidental code */
 148     for (i = 128; i < 256; i++)
 149     {
 150         unix2dos[i] = CTRLZ;
 151         dos2unix[i] = CTRLZ;
 152     }
 153 
 154     /* MSDOS Code Page 866 -> ISO8859-5 */
 155     update_map ("\260\200\261\201\262\202\263\203\264\204\265\205\266\206\267\207");
 156     update_map ("\270\210\271\211\272\212\273\213\274\214\275\215\276\216\277\217");
 157     update_map ("\300\220\301\221\302\222\303\223\304\224\305\225\306\226\307\227");
 158     update_map ("\310\230\311\231\312\232\313\233\314\234\315\235\316\236\317\237");
 159     update_map ("\320\240\321\241\322\242\323\243\324\244\325\245\326\246\327\247");
 160     update_map ("\330\250\331\251\332\252\333\253\334\254\335\255\336\256\337\257");
 161     update_map ("\340\340\341\341\342\342\343\343\344\344\345\345\346\346\347\347");
 162     update_map ("\350\350\351\351\352\352\353\353\354\354\355\355\356\356\357\357");
 163     update_map ("\241\360\361\361\244\362\364\363\247\364\367\365\256\366\376\367");
 164     update_map ("\360\374\240\377");
 165 }
 166 
 167 /* Init for russian language (koi8) */
 168 
 169 static void
 170 init_koi8_r (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 171 {
 172     if (!mapsinited)
 173         initmaps ();
 174 
 175     /* There aren't undefined characters between 128 and 255 */
 176 
 177     /* MSDOS Code Page 866 -> KOI8-R */
 178     update_map ("\200\304\201\263\202\332\203\277\204\300\205\331\206\303\207\264");
 179     update_map ("\210\302\211\301\212\305\213\337\214\334\215\333\216\335\217\336");
 180     update_map ("\220\260\221\261\222\262\223\364\224\376\225\371\226\373\227\367");
 181     update_map ("\230\363\231\362\232\377\233\365\234\370\235\375\236\372\237\366");
 182     update_map ("\240\315\241\272\242\325\243\361\244\326\245\311\246\270\247\267");
 183     update_map ("\250\273\251\324\252\323\253\310\254\276\255\275\256\274\257\306");
 184     update_map ("\260\307\261\314\262\265\263\360\264\266\265\271\266\321\267\322");
 185     update_map ("\270\313\271\317\272\320\273\312\274\330\275\327\276\316\277\374");
 186     update_map ("\300\356\301\240\302\241\303\346\304\244\305\245\306\344\307\243");
 187     update_map ("\310\345\311\250\312\251\313\252\314\253\315\254\316\255\317\256");
 188     update_map ("\320\257\321\357\322\340\323\341\324\342\325\343\326\246\327\242");
 189     update_map ("\330\354\331\353\332\247\333\350\334\355\335\351\336\347\337\352");
 190     update_map ("\340\236\341\200\342\201\343\226\344\204\345\205\346\224\347\203");
 191     update_map ("\350\225\351\210\352\211\353\212\354\213\355\214\356\215\357\216");
 192     update_map ("\360\217\361\237\362\220\363\221\364\222\365\223\366\206\367\202");
 193     update_map ("\370\234\371\233\372\207\373\230\374\235\375\231\376\227\377\232");
 194 }
 195 
 196 /*
 197  * Convert unix to dos
 198  */
 199 char *
 200 unix2dos_format (char *str, BOOL overwrite)
     /* [previous][next][first][last][top][bottom][index][help]  */
 201 {
 202     char *p;
 203     char *dp;
 204 
 205     if (!mapsinited)
 206         initmaps ();
 207 
 208     if (overwrite)
 209     {
 210         for (p = str; *p; p++)
 211             *p = unix2dos[(unsigned char) *p];
 212         return str;
 213     }
 214     else
 215     {
 216         for (p = str, dp = cvtbuf; *p && dp < &(cvtbuf[sizeof (cvtbuf) - 1]); p++, dp++)
 217             *dp = unix2dos[(unsigned char) *p];
 218         *dp = 0;
 219         return cvtbuf;
 220     }
 221 }
 222 
 223 /*
 224  * Convert dos to unix
 225  */
 226 char *
 227 dos2unix_format (char *str, BOOL overwrite)
     /* [previous][next][first][last][top][bottom][index][help]  */
 228 {
 229     char *p;
 230     char *dp;
 231 
 232     if (!mapsinited)
 233         initmaps ();
 234 
 235     if (overwrite)
 236     {
 237         for (p = str; *p; p++)
 238             *p = dos2unix[(unsigned char) *p];
 239         return str;
 240     }
 241     else
 242     {
 243         for (p = str, dp = cvtbuf; *p && dp < &(cvtbuf[sizeof (cvtbuf) - 1]); p++, dp++)
 244             *dp = dos2unix[(unsigned char) *p];
 245         *dp = 0;
 246         return cvtbuf;
 247     }
 248 }
 249 
 250 
 251 /*
 252  * Interpret character set.
 253  */
 254 void
 255 interpret_character_set (const char *str)
     /* [previous][next][first][last][top][bottom][index][help]  */
 256 {
 257     if (strequal (str, "iso8859-1"))
 258     {
 259         init_iso8859_1 ();
 260     }
 261     else if (strequal (str, "iso8859-2"))
 262     {
 263         init_iso8859_2 ();
 264     }
 265     else if (strequal (str, "iso8859-5"))
 266     {
 267         init_iso8859_5 ();
 268     }
 269     else if (strequal (str, "koi8-r"))
 270     {
 271         init_koi8_r ();
 272     }
 273     else
 274     {
 275         DEBUG (0, ("unrecognized character set %s\n", str));
 276     }
 277 }

/* [previous][next][first][last][top][bottom][index][help]  */