📄 charset.c
字号:
//// $Id: charset.c,v 1.18 2000/11/17 12:28:04 ymwei Exp $// // charset.c: The charset operation set.// // Copyright (C) 2000, Wei Yongming.// Copyright (C) 2000, BluePoint Software.//// Current maintainer: Wei Yongming.///*** This library is free software; you can redistribute it and/or** modify it under the terms of the GNU Library General Public** License as published by the Free Software Foundation; either** version 2 of the License, or (at your option) any later version.**** This library 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** Library General Public License for more details.**** You should have received a copy of the GNU Library General Public** License along with this library; if not, write to the Free** Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,** MA 02111-1307, USA*/// Create date: 2000/06/13//// Modify records://// Who When Where For What Status//-----------------------------------------------------------------------------//// TODO://#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <assert.h>#include <pthread.h>#include "common.h"#include "minigui.h"#include "gdi.h"#include "charset.h"#ifndef lintstatic char fileid[] = "$Id: charset.c,v 1.18 2000/11/17 12:28:04 ymwei Exp $";#endif/***************************** Common Operations *****************************/static int sb_nr_chars_in_str (const unsigned char* mstr, int mstrlen){ return mstrlen;}static int sb_len_first_substr (const unsigned char* mstr, int mstrlen){ return mstrlen;}static int sb_pos_first_char (const unsigned char* mstr, int mstrlen){ return 0;}#if defined(_GB_SUPPORT) | defined(_BIG5_SUPPORT) | defined(_JIS_SUPPORT)static int db_nr_chars_in_str (const unsigned char* mstr, int mstrlen){ assert ((mstrlen % 2) == 0); return mstrlen >> 1;}static const unsigned char* db_get_next_word (const unsigned char* mstr, int mstrlen, WORDINFO* word_info){ assert ((mstrlen % 2) == 0); if (mstrlen == 0) return NULL; word_info->len = 2; word_info->delimiter = '\0'; word_info->nr_delimiters = 0; return mstr + 2;}#endifstatic unsigned short sb_conv_to_uc16 (const unsigned char* mchar, int len){ return (unsigned short) (*mchar);}/************************* ISO8859-1 Specific Operations **********************/static int iso8859_1_len_first_char (const unsigned char* mstr, int len){ if (len < 1) return 0; if (*mstr != '\0') return 1; return 0;}static int iso8859_1_char_offset (const unsigned char* mchar){ return (int)(*mchar);}static int iso8859_1_is_this_charset (const unsigned char* charset){ int i; char name [LEN_FONT_NAME + 1]; for (i = 0; i < LEN_FONT_NAME + 1; i++) { if (charset [i] == '\0') break; name [i] = toupper (charset [i]); } name [i] = '\0'; if (strstr (name, "ISO") && strstr (name, "8859") && strstr (name, "1")) return 0; return 1;}static const unsigned char* iso8859_1_get_next_word (const unsigned char* mstr, int mstrlen, WORDINFO* word_info){ int i; if (mstrlen == 0) return NULL; word_info->len = 0; word_info->delimiter = '\0'; word_info->nr_delimiters = 0; for (i = 0; i < mstrlen; i++) { switch (mstr [i]) { case ' ': case '\t': case '\n': case '\r': if (word_info->delimiter == '\0') { word_info->delimiter = mstr [i]; word_info->nr_delimiters ++; } else if (word_info->delimiter == mstr[i]) word_info->nr_delimiters ++; else return mstr + word_info->len + word_info->nr_delimiters; break; default: if (word_info->delimiter != '\0') break; word_info->len ++; } } return mstr + word_info->len + word_info->nr_delimiters;}static CHARSETOPS CharsetOps_iso8859_1 = { 256, 1, 1, FONT_CHARSET_ISO8859_1, {' '}, iso8859_1_len_first_char, iso8859_1_char_offset, sb_nr_chars_in_str, iso8859_1_is_this_charset, sb_len_first_substr, iso8859_1_get_next_word, sb_pos_first_char, sb_conv_to_uc16};#ifdef _GB_SUPPORT/************************* GB2312 Specific Operations ************************/static int gb2312_len_first_char (const unsigned char* mstr, int len){ unsigned char ch1; unsigned char ch2; if (len < 2) return 0; ch1 = mstr [0]; if (ch1 == '\0') return 0; ch2 = mstr [1]; if (ch1 >= 0xA1 && ch1 <= 0xFE && ch2 >= 0xA1 && ch2 <= 0xFE) return 2; return 0;}static int gb2312_char_offset (const unsigned char* mchar){ return ((mchar [0] - 0xA1) * 94 + mchar [1] - 0xA1);}static int gb2312_is_this_charset (const unsigned char* charset){ int i; char name [LEN_FONT_NAME + 1]; for (i = 0; i < LEN_FONT_NAME + 1; i++) { if (charset [i] == '\0') break; name [i] = toupper (charset [i]); } name [i] = '\0'; if (strstr (name, "GB") && strstr (name, "2312")) return 0; return 1;}static int gb2312_len_first_substr (const unsigned char* mstr, int mstrlen){ unsigned char ch1; unsigned char ch2; int i, left; int sub_len = 0; left = mstrlen; for (i = 0; i < mstrlen; i += 2) { if (left < 2) return sub_len; ch1 = mstr [i]; if (ch1 == '\0') return sub_len; ch2 = mstr [i + 1]; if (ch1 >= 0xA1 && ch1 <= 0xFE && ch2 >= 0xA1 && ch2 <= 0xFE) sub_len += 2; else return sub_len; left -= 2; } return sub_len;}static int gb2312_pos_first_char (const unsigned char* mstr, int mstrlen){ unsigned char ch1; unsigned char ch2; int i, left; i = 0; left = mstrlen; while (left) { if (left < 2) return -1; ch1 = mstr [i]; if (ch1 == '\0') return -1; ch2 = mstr [i + 1]; if (ch1 >= 0xA1 && ch1 <= 0xFE && ch2 >= 0xA1 && ch2 <= 0xFE) return i; i += 1; left -= 1; } return -1;}static unsigned short gb2312_conv_to_uc16 (const unsigned char* mchar, int len){ return gbunicode_map [gb2312_char_offset (mchar)];}static CHARSETOPS CharsetOps_gb2312 = { 8836, 2, 2, FONT_CHARSET_GB2312_1980_0, {'\xA1', '\xA1'}, gb2312_len_first_char, gb2312_char_offset, db_nr_chars_in_str, gb2312_is_this_charset, gb2312_len_first_substr, db_get_next_word, gb2312_pos_first_char, gb2312_conv_to_uc16};#endif /* _GB_SUPPORT */#ifdef _BIG5_SUPPORT/************************** BIG5 Specific Operations ************************/static int big5_len_first_char (const unsigned char* mstr, int len){ unsigned char ch1; unsigned char ch2; if (len < 2) return 0; ch1 = mstr [0]; if (ch1 == '\0') return 0; ch2 = mstr [1]; if (ch1 >= 0xA1 && ch1 <= 0xFE && ((ch2 >=0x40 && ch2 <= 0x7E) || (ch2 >= 0xA1 && ch2 <= 0xFE))) return 2; return 0;}static int big5_char_offset (const unsigned char* mchar){ if (mchar [1] & 0x80) return (mchar [0] - 0xA1) * 94 + mchar [1] - 0xA1; else return 94 * 94 + (mchar [0] - 0xa1) * 63 + (mchar [1] - 0x40);}static int big5_is_this_charset (const unsigned char* charset){ int i; char name [LEN_FONT_NAME + 1]; for (i = 0; i < LEN_FONT_NAME + 1; i++) { if (charset [i] == '\0') break; name [i] = toupper (charset [i]); } name [i] = '\0'; if (strstr (name, "BIG5")) return 0; return 1;}static int big5_len_first_substr (const unsigned char* mstr, int mstrlen){ unsigned char ch1; unsigned char ch2; int i, left; int sub_len = 0; left = mstrlen; for (i = 0; i < mstrlen; i += 2) { if (left < 2) return sub_len; ch1 = mstr [i]; if (ch1 == '\0') return sub_len; ch2 = mstr [i + 1]; if (ch1 >= 0xA1 && ch1 <= 0xFE && ((ch2 >=0x40 && ch2 <= 0x7E) || (ch2 >= 0xA1 && ch2 <= 0xFE))) sub_len += 2; else return sub_len; left -= 2; } return sub_len;}static int big5_pos_first_char (const unsigned char* mstr, int mstrlen){ unsigned char ch1; unsigned char ch2; int i, left; i = 0; left = mstrlen; while (left) { if (left < 2) return -1; ch1 = mstr [i]; if (ch1 == '\0') return -1; ch2 = mstr [i + 1]; if (ch1 >= 0xA1 && ch1 <= 0xFE && ((ch2 >=0x40 && ch2 <= 0x7E) || (ch2 >= 0xA1 && ch2 <= 0xFE))) return i; i += 1; left -= 1; } return -1;}static unsigned short big5_conv_to_uc16 (const unsigned char* mchar, int len){ /* FIXME */ return '?';}static CHARSETOPS CharsetOps_big5 = { 14758, 2, 2, FONT_CHARSET_BIG5, {'\xA1', '\x40'}, big5_len_first_char, big5_char_offset, db_nr_chars_in_str, big5_is_this_charset, big5_len_first_substr, db_get_next_word, big5_pos_first_char, big5_conv_to_uc16};#endif /* _BIG5_SUPPORT */#ifdef _JIS_SUPPORT/* TODO */#endifstatic CHARSETOPS* Charsets [] ={ &CharsetOps_iso8859_1,#ifdef _GB_SUPPORT &CharsetOps_gb2312,#endif#ifdef _BIG5_SUPPORT &CharsetOps_big5,#endif#ifdef _JIS_SUPPORT#endif};#define NR_CHARSETS (sizeof(Charsets)/sizeof(CHARSETOPS*))CHARSETOPS* GetCharsetOps (const char* charset_name){ int i; for (i = 0; i < NR_CHARSETS; i++) { if ((*Charsets [i]->is_this_charset) (charset_name) == 0) return Charsets [i]; } return NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -