From: Araki K. <j00...@ip...> - 2002-01-04 22:24:36
|
Hi, Subject: [Mlterm-dev-en] mlterm ISCII support patch (was: Re: mlterm ISCII support) From: Araki Ken <j00...@ip...> Message-ID: <200...@pd...> Date: Fri, 04 Jan 2002 16:37:20 +0900 > Then , I made an ISCII support patch for mlterm. > It is still a prototype implementation(unstable!) , but I can see , > edit in command line and copy&paste indian characters like iitm-term. > Please test and give me comments. > > http://www.geocities.co.jp/SiliconValley-Cupertino/6461/mlterm-2.2.0-pre20020102-pre20020104.patch.gz > http://www.geocities.co.jp/SiliconValley-Cupertino/6461/mlterm-2.2.0-pre20020104.tar.gz Attached patch is for bug fix of mlterm-2.2.0-pre20020104. 1. Roman lang ISCII (-C Roman) is not shown. fixed. 2. In some cases glyph rendering is corrupt. fixed. Regards. -- kiken j00...@ip... Index: src/ml_image_line.c =================================================================== RCS file: /home/ken/cvsroot/mlterm/src/ml_image_line.c,v retrieving revision 1.50 diff -u -r1.50 ml_image_line.c --- src/ml_image_line.c 2002/01/04 06:51:44 1.50 +++ src/ml_image_line.c 2002/01/04 22:05:58 @@ -1209,7 +1209,7 @@ ml_char_t * c ; ml_char_t * comb ; u_int comb_size ; - + if( prev_font_filled - font_filled > dst_pos) { font_filled = prev_font_filled - dst_pos ; @@ -1233,10 +1233,25 @@ comb_pos = 0 ; while( 1) { - ml_char_combine( &dst[dst_pos] , + if( ml_char_is_null( &dst[dst_pos])) + { + /* + * combining is forbidden if base character is null + */ + ml_char_copy( &dst[dst_pos] , c) ; + } + else if( ! ml_char_combine( &dst[dst_pos] , ml_char_bytes( c) , ml_char_size( c) , ml_char_font( c) , ml_char_font_decor( c) , - ml_char_fg_color( c) , ml_char_bg_color( c)) ; + ml_char_fg_color( c) , ml_char_bg_color( c))) + { + #ifdef DEBUG + kik_warn_printf( KIK_DEBUG_TAG + " combining failed.\n") ; + #endif + + break ; + } if( comb_pos >= comb_size) { @@ -1252,10 +1267,23 @@ if( dst_pos >= 0 && font_filled == prev_font_filled) { - ml_char_combine( &dst[dst_pos] , + if( ml_char_is_null( &dst[dst_pos])) + { + /* + * combining is forbidden if base character is null + */ + ml_char_copy( &dst[dst_pos] , ch) ; + } + else if( ! ml_char_combine( &dst[dst_pos] , ml_char_bytes( ch) , ml_char_size( ch) , ml_char_font( ch) , ml_char_font_decor( ch) , - ml_char_fg_color( ch) , ml_char_bg_color( ch)) ; + ml_char_fg_color( ch) , ml_char_bg_color( ch))) + { + #ifdef DEBUG + kik_warn_printf( KIK_DEBUG_TAG + " combining failed.\n") ; + #endif + } } else { @@ -1331,6 +1359,11 @@ int comb_pos ; ml_char_t * ch ; + if( ! ml_is_char_combining()) + { + return 0 ; + } + src_len = line->num_of_filled_chars ; if( ( src = ml_str_alloca( src_len)) == NULL) { @@ -1420,6 +1453,9 @@ return logical_char_index ; } +/* + * this should be called before ml_imgline_stop_visual_indian() + */ int ml_iscii_convert_logical_char_index_to_visual( ml_image_line_t * line , Index: src/ml_iscii.c =================================================================== RCS file: /home/ken/cvsroot/mlterm/src/ml_iscii.c,v retrieving revision 1.2 diff -u -r1.2 ml_iscii.c --- src/ml_iscii.c 2002/01/04 04:02:06 1.2 +++ src/ml_iscii.c 2002/01/04 21:10:34 @@ -20,7 +20,7 @@ #ifdef USE_IND -/* --- static functions --- */ +/* --- static variables --- */ static char font_name[256] ; static char font_name_prefix[256] ; @@ -32,17 +32,31 @@ static struct a2i_tabl a2i_map[A2IMAXLEN] ; static int a2i_map_size ; +/* used for iitkeyb */ static char prev_key[512] ; /* --- global functions --- */ int -ml_iscii_init( +ml_iscii_init(void) +{ + return 1 ; +} + +int +ml_iscii_final(void) +{ + return 1 ; +} + +int +ml_iscii_set_lang( char * default_lang ) { char * p ; + int counter ; if( ( glyph_map_size = indian_init( glyph_map , default_lang , font_name_prefix , ":")) == -1) { @@ -54,12 +68,17 @@ * font name is assumed not to be abbriviated. */ p = font_name_prefix ; - - while( ! isdigit( *p)) + + for( counter = 0 ; counter < 7 ; counter ++) { + if( ( p = strchr( p , '-')) == NULL) + { + return 0 ; + } + p ++ ; } - + *(p ++) = '\0' ; while( isdigit( *p)) @@ -76,12 +95,6 @@ return 1 ; } -int -ml_iscii_final(void) -{ - return 1 ; -} - char * ml_iscii_get_font_name( u_int font_size @@ -121,12 +134,16 @@ keymap = ISCIIKEY_NONE ; } } - else if( keymap == ISCIIKEY_IITKEYB) + else /* if( keymap == ISCIIKEY_IITKEYB) */ { if( ( a2i_map_size = readkeymap( a2i_map , "iitkeyb" , ":")) == -1) { keymap = ISCIIKEY_NONE ; } + else + { + memset( prev_key , 0 , sizeof( prev_key)) ; + } } } @@ -166,7 +183,7 @@ snprintf( iscii , ascii_len + 1 , "%s" , ins2iscii( a2i_map , dup , a2i_map_size)) ; } - else + else /* if( keymap == ISCIIKEY_IITKEYB) */ { iitk2iscii( a2i_map , dup , prev_key , a2i_map_size) ; snprintf( iscii , strlen( dup) + 1 , "%s" , dup) ; @@ -184,19 +201,26 @@ return ascii_len ; } + #else /* USE_IND */ int -ml_iscii_init( - char * default_lang - ) +ml_iscii_init(void) { return 0 ; } int ml_iscii_final(void) +{ + return 0 ; +} + +int +ml_iscii_set_lang( + char * default_lang + ) { return 0 ; } Index: src/ml_iscii.h =================================================================== RCS file: /home/ken/cvsroot/mlterm/src/ml_iscii.h,v retrieving revision 1.1 diff -u -r1.1 ml_iscii.h --- src/ml_iscii.h 2002/01/04 03:49:42 1.1 +++ src/ml_iscii.h 2002/01/04 22:08:53 @@ -9,6 +9,13 @@ #include <kiklib/kik_types.h> +/* + * !! Notice !! + * ISCII state is shared globally , so you cannot use multiple ISCII langs + * at the same time. + */ + + typedef enum ml_iscii_keymap { ISCIIKEY_NONE , @@ -18,9 +25,11 @@ } ml_iscii_keymap_t ; -int ml_iscii_init( char * default_lang) ; +int ml_iscii_init(void) ; int ml_iscii_final(void) ; + +int ml_iscii_set_lang( char * default_lang) ; char * ml_iscii_get_font_name( u_int font_size) ; Index: src/ml_shaping.c =================================================================== RCS file: /home/ken/cvsroot/mlterm/src/ml_shaping.c,v retrieving revision 1.7 diff -u -r1.7 ml_shaping.c --- src/ml_shaping.c 2002/01/04 06:51:44 1.7 +++ src/ml_shaping.c 2002/01/04 21:31:42 @@ -4,6 +4,7 @@ #include "ml_shaping.h" +#include <stdio.h> /* fprintf */ #include <string.h> /* strncpy */ #include <kiklib/kik_mem.h> /* alloca */ @@ -331,6 +332,24 @@ font_filled = ml_iscii_convert_to_font_index( font_buf , dst_len , iscii_buf) ; + #ifdef __DEBUG + { + int i ; + + for( i = 0 ; i < iscii_filled ; i ++) + { + fprintf( stderr , "%.2x " , iscii_buf[i]) ; + } + fprintf( stderr , "=>\n") ; + + for( i = 0 ; i < font_filled ; i ++) + { + fprintf( stderr , "%.2x " , font_buf[i]) ; + } + fprintf( stderr , "\n") ; + } + #endif + for( counter = 0 ; counter < font_filled ; counter ++) { ml_char_set_bytes( &dst_shaped[counter] , &font_buf[counter] , 1) ; Index: src/ml_term_manager.c =================================================================== RCS file: /home/ken/cvsroot/mlterm/src/ml_term_manager.c,v retrieving revision 1.76 diff -u -r1.76 ml_term_manager.c --- src/ml_term_manager.c 2002/01/04 03:49:42 1.76 +++ src/ml_term_manager.c 2002/01/04 20:53:47 @@ -1398,16 +1398,18 @@ ml_set_word_separators( value) ; } + ml_iscii_init() ; + if( ( value = kik_conf_get_value( conf , "iscii_type"))) { - if( ! ml_iscii_init( value)) + if( ! ml_iscii_set_lang( value)) { - ml_iscii_init( "Malayalam") ; + ml_iscii_set_lang( "Malayalam") ; } } else { - ml_iscii_init( "Malayalam") ; + ml_iscii_set_lang( "Malayalam") ; } term_man->cmd_path = NULL ; @@ -1489,6 +1491,7 @@ #endif ml_keymap_final( &term_man->keymap) ; ml_termcap_final( &term_man->termcap) ; + ml_iscii_final() ; ml_sig_child_final() ; ml_remove_sig_child_listener( term_man) ; |