mirror of
https://github.com/samba-team/samba.git
synced 2025-02-19 21:57:57 +03:00
Kanji support is one case of multibyte character support, rather than being a specific case in single byte character support. This allows us to add Big5 Chinese support (code page 950) and Korean Hangul support (code page 949) at very little cost. Also allows us to easily add future multibyte code pages. Makefile: Added codepages 949, 950 as we now support more multibyte codepages. asyncdns.c: Fixed problem with child being re-spawned when parent killed. charcnv.c charset.c client.c clitar.c kanji.c kanji.h smb.h util.c loadparm.c: Generic multibyte codepage support (adding Big5 Chinese and Korean Hangul). nmbd.c: Fixed problem with child being re-spawned when parent killed. mangle.c: Modified str_checksum so that first 15 characters have more effect on outcome. This helps with short name mangling as most 'long' names are still shorter than 15 chars (bug was foobar_mng and foobar_sum would hash to the same value, with the modified code they hash differently. Jeremy.
-
168 lines
5.6 KiB
C
168 lines
5.6 KiB
C
/*
|
|
Unix SMB/Netbios implementation.
|
|
Version 1.9.
|
|
Kanji Extensions
|
|
Copyright (C) Andrew Tridgell 1992-1998
|
|
|
|
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.
|
|
|
|
Adding for Japanese language by <fujita@ainix.isac.co.jp> 1994.9.5
|
|
and extend coding system to EUC/SJIS/JIS/HEX at 1994.10.11
|
|
and add all jis codes sequence at 1995.8.16
|
|
Notes: Hexadecimal code by <ohki@gssm.otuka.tsukuba.ac.jp>
|
|
and add upper/lower case conversion 1997.8.21
|
|
*/
|
|
#ifndef _KANJI_H_
|
|
#define _KANJI_H_
|
|
|
|
/* FOR SHIFT JIS CODE */
|
|
#define is_shift_jis(c) \
|
|
((0x81 <= ((unsigned char) (c)) && ((unsigned char) (c)) <= 0x9f) \
|
|
|| (0xe0 <= ((unsigned char) (c)) && ((unsigned char) (c)) <= 0xef))
|
|
#define is_shift_jis2(c) \
|
|
(0x40 <= ((unsigned char) (c)) && ((unsigned char) (c)) <= 0xfc \
|
|
&& ((unsigned char) (c)) != 0x7f)
|
|
#define is_kana(c) ((0xa0 <= ((unsigned char) (c)) && ((unsigned char) (c)) <= 0xdf))
|
|
|
|
/* case conversion */
|
|
#define is_sj_upper2(c) \
|
|
((0x60 <= (unsigned char) (c)) && ((unsigned char) (c) <= 0x79))
|
|
#define is_sj_lower2(c) \
|
|
((0x81 <= (unsigned char) (c)) && ((unsigned char) (c) <= 0x9A))
|
|
#define sjis_alph 0x82
|
|
#define is_sj_alph(c) (sjis_alph == (unsigned char) (c))
|
|
#define is_sj_upper(c1, c2) (is_sj_alph (c1) && is_sj_upper2 (c2))
|
|
#define is_sj_lower(c1, c2) (is_sj_alph (c1) && is_sj_lower2 (c2))
|
|
#define sj_toupper2(c) \
|
|
(is_sj_lower2 (c) ? ((int) ((unsigned char) (c) - 0x81 + 0x60)) : \
|
|
((int) (unsigned char) (c)))
|
|
#define sj_tolower2(c) \
|
|
(is_sj_upper2 (c) ? ((int) ((unsigned char) (c) - 0x60 + 0x81)) : \
|
|
((int) (unsigned char) (c)))
|
|
|
|
#ifdef _KANJI_C_
|
|
/* FOR EUC CODE */
|
|
#define euc_kana (0x8e)
|
|
#define is_euc_kana(c) (((unsigned char) (c)) == euc_kana)
|
|
#define is_euc(c) (0xa0 < ((unsigned char) (c)) && ((unsigned char) (c)) < 0xff)
|
|
|
|
/* FOR JIS CODE */
|
|
/* default jis third shift code, use for output */
|
|
#ifndef JIS_KSO
|
|
#define JIS_KSO 'B'
|
|
#endif
|
|
#ifndef JIS_KSI
|
|
#define JIS_KSI 'J'
|
|
#endif
|
|
/* in: \E$B or \E$@ */
|
|
/* out: \E(J or \E(B or \E(H */
|
|
#define jis_esc (0x1b)
|
|
#define jis_so (0x0e)
|
|
#define jis_so1 ('$')
|
|
#define jis_so2 ('B')
|
|
#define jis_si (0x0f)
|
|
#define jis_si1 ('(')
|
|
#define jis_si2 ('J')
|
|
#define is_esc(c) (((unsigned char) (c)) == jis_esc)
|
|
#define is_so1(c) (((unsigned char) (c)) == jis_so1)
|
|
#define is_so2(c) (((unsigned char) (c)) == jis_so2 || ((unsigned char) (c)) == '@')
|
|
#define is_si1(c) (((unsigned char) (c)) == jis_si1)
|
|
#define is_si2(c) (((unsigned char) (c)) == jis_si2 || ((unsigned char) (c)) == 'B' \
|
|
|| ((unsigned char) (c)) == 'H')
|
|
#define is_so(c) (((unsigned char) (c)) == jis_so)
|
|
#define is_si(c) (((unsigned char) (c)) == jis_si)
|
|
#define junet_kana1 ('(')
|
|
#define junet_kana2 ('I')
|
|
#define is_juk1(c) (((unsigned char) (c)) == junet_kana1)
|
|
#define is_juk2(c) (((unsigned char) (c)) == junet_kana2)
|
|
|
|
#define _KJ_ROMAN (0)
|
|
#define _KJ_KANJI (1)
|
|
#define _KJ_KANA (2)
|
|
|
|
/* FOR HEX */
|
|
#define HEXTAG ':'
|
|
#define hex2bin(x) \
|
|
( ((int) '0' <= ((int) (x)) && ((int) (x)) <= (int)'9')? \
|
|
(((int) (x))-(int)'0'): \
|
|
((int) 'a'<= ((int) (x)) && ((int) (x))<= (int) 'f')? \
|
|
(((int) (x)) - (int)'a'+10): \
|
|
(((int) (x)) - (int)'A'+10) )
|
|
#define bin2hex(x) \
|
|
( (((int) (x)) >= 10)? (((int) (x))-10 + (int) 'a'): (((int) (x)) + (int) '0') )
|
|
|
|
/* For Hangul (Korean - code page 949). */
|
|
#define is_hangul(c) ((0x81 <= ((unsigned char) (c)) && ((unsigned char) (c)) <= 0xfd))
|
|
|
|
/* For traditional Chinese (known as Big5 encoding - code page 950). */
|
|
#define is_big5_c1(c) ((0xa1 <= ((unsigned char) (c)) && ((unsigned char) (c)) <= 0xf9))
|
|
|
|
#else /* not _KANJI_C_ */
|
|
|
|
/*
|
|
* The following is needed for AIX systems that have
|
|
* their own #defines for strchr, strrchr, strstr
|
|
* and strtok.
|
|
*/
|
|
|
|
#ifdef strchr
|
|
#undef strchr
|
|
#endif /* strchr */
|
|
|
|
#ifdef strrchr
|
|
#undef strrchr
|
|
#endif /* strrchr */
|
|
|
|
#ifdef strstr
|
|
#undef strstr
|
|
#endif /* strstr */
|
|
|
|
#ifdef strtok
|
|
#undef strtok
|
|
#endif /* strtok */
|
|
|
|
/* Ensure we use our definitions in all other files than kanji.c. */
|
|
|
|
/* Function pointers we will replace. */
|
|
extern char *(*multibyte_strchr)(char *s, int c);
|
|
extern char *(*multibyte_strrchr)(char *s, int c);
|
|
extern char *(*multibyte_strstr)(char *s1, char *s2);
|
|
extern char *(*multibyte_strtok)(char *s1, char *s2);
|
|
extern char *(*_dos_to_unix)(char *str, BOOL overwrite);
|
|
extern char *(*_unix_to_dos)(char *str, BOOL overwrite);
|
|
extern BOOL (*is_multibyte_char)(char c);
|
|
|
|
#define strchr(s1, c) ((*multibyte_strchr)((s1), (c)))
|
|
#define strrchr(s1, c) ((*multibyte_strrchr)((s1), (c)))
|
|
#define strstr(s1, s2) ((*multibyte_strstr)((s1), (s2)))
|
|
#define strtok(s1, s2) ((*multibyte_strtok)((s1), (s2)))
|
|
#define dos_to_unix(x,y) ((*_dos_to_unix)((x), (y)))
|
|
#define unix_to_dos(x,y) ((*_unix_to_dos)((x), (y)))
|
|
#define skip_multibyte_char(c) ((*is_multibyte_char)((c)))
|
|
|
|
#endif /* _KANJI_C_ */
|
|
|
|
#define UNKNOWN_CODE (-1)
|
|
#define SJIS_CODE (0)
|
|
#define EUC_CODE (1)
|
|
#define JIS7_CODE (2)
|
|
#define JIS8_CODE (3)
|
|
#define JUNET_CODE (4)
|
|
#define HEX_CODE (5)
|
|
#define CAP_CODE (6)
|
|
#define DOSV_CODE SJIS_CODE
|
|
|
|
#endif /* _KANJI_H_ */
|