diff -r 000000000000 -r eb1f2e154e89 textinput/ptienginev2/group/KeymapBuilder2.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/ptienginev2/group/KeymapBuilder2.pl Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,1351 @@ +# +# Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0"" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: Builds a keymap code file from given keymapping data file. +# +($time_second, $time_minute, $time_hour, # time/date + $date_day, $date_month, $date_year, + $day_week, $day_year, $isdst) = localtime(time); + +if ($date_year < 70) {$date_year += 2000;} # add century + else {$date_year += 1900;} + +# +# Variables for qwerty data handling +# +$has_qwerty_data = 0; +$has_deadkey_data = 0; + +$custom_matrix_width = 0; +$custom_matrix_height = 0; + +# +# Qwerty keyboard type +# +$current_keyboard_data_block = ""; + +# +# Variants for numeric key mapping definition handling +# +$numkeyscount = 22; +@numkeynames = ("+","*","#","p","w","1","2","3","4","5","6","7","8","9","0",";",".",",","-","E","?","/"); + +@ scan_bind = (); + + +# +# Global variables. +# +$inputpath = shift(@ARGV); +$filename = shift(@ARGV); +$langname = shift(@ARGV); +$variant_name = shift(@ARGV); +$blocks_in_use = shift(@ARGV); +$inputfile = $inputpath . $filename; + +$langconstant = "ELang${langname}"; + +if ($langname eq "Galician") + { + $langconstant = "KLangGalician"; + } +if ($langname eq "Basque") + { + $langconstant = "KLangBasque"; + } + + +$output_dll = "PtiKeymappings_"; +$outputdir = "..\/languages\/"; +$mmpext = ".mmp"; +$dlluid = $langdll{$langname}; +$impluid = $langimpl{$langname}; +$mtindex = 0; +$print_not_latin_language = 0; + +$has_numeric_mode_data = 0; + +$for_zhuyin_tag_value = "0x2462"; +$for_pinyin_tag_value = "0x2460"; +$for_stroke_tag_value = "0x2461"; +$for_cangjie_tag_value = "0x2463"; +$get_all_marker_value = "0x2464"; + +$qwerty_num_keys = 48; + +############################################################# +# +# Subrountine for counting characters in data row +# +############################################################# +sub countchars { + ($instr)=@_; + @details=split /,/, $instr; + $numchars = $#details + 1; + } + +############################################################## +# +# Subroutine for converting qwerty key cordinates into +# EPtiKey constants. +# +############################################################## +sub convert_coordinates + { + $converted_coordinates = $scan_bind{$_[0]}; + } + +############################################################## +# +# Subroutine print_data_block for exporting a data block. +# Parameters: boardname constant +# number of rows in keyboard matrix +# number of collumns in keyboard matrix +# data block name +# +############################################################## +sub print_data_block + { + my $boardname = shift; + my $rows = shift; + my $cols = shift; + my $blockname = shift; + + print(OUTFILE "//\n"); + print(OUTFILE "// $boardname keymap data table\n"); + print(OUTFILE "//\n"); + print(OUTFILE "const TUint16 ${boardname}Data_table_${langname}[] =\n"); + print(OUTFILE " {\n"); + + $mtindex = 0; + + for ($i = 1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + &countchars($keys{$keyname}); + $bindnumchrs{$keyname} = $numchars; + $bindindex{$keyname} = $mtindex; + $mtindex = $mtindex + $bindnumchrs{$keyname}; + if ($numchars > 0) + { + print(OUTFILE " $keys{$keyname},\n"); + } + } + } + + for ($i=1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + &countchars($keys_u{$keyname}); + $bindnumchrs_u{$keyname} = $numchars; + $bindindex_u{$keyname} = $mtindex; + $mtindex = $mtindex + $bindnumchrs_u{$keyname}; + if ($numchars > 0) + { + print(OUTFILE " $keys_u{$keyname},\n"); + } + } + } + if ($has_chr_keys{$blockname} == 1) + { + for ($i = 1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + &countchars($keys_chr{$keyname}); + $chr_bindnumchrs{$keyname} = $numchars; + $chr_bindindex{$keyname} = $mtindex; + $mtindex = $mtindex + $chr_bindnumchrs{$keyname}; + if ($numchars > 0) + { + print(OUTFILE " $keys_chr{$keyname},\n"); + } + } + } + + for ($i = 1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + &countchars($keys_chr_u{$keyname}); + $chr_bindnumchrs_u{$keyname} = $numchars; + $chr_bindindex_u{$keyname} = $mtindex; + $mtindex = $mtindex + $chr_bindnumchrs_u{$keyname}; + if ($numchars > 0) + { + print(OUTFILE " $keys_chr_u{$keyname},\n"); + } + } + } + } + if ($has_fn_keys{$blockname} == 1) + { + for ($i = 1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + &countchars($keys_fn{$keyname}); + $fn_bindnumchrs{$keyname} = $numchars; + $fn_bindindex{$keyname} = $mtindex; + $mtindex = $mtindex + $fn_bindnumchrs{$keyname}; + if ($numchars > 0) + { + print(OUTFILE " $keys_fn{$keyname},\n"); + } + } + } + + for ($i = 1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + &countchars($keys_fn_u{$keyname}); + $fn_bindnumchrs_u{$keyname} = $numchars; + $fn_bindindex_u{$keyname} = $mtindex; + $mtindex = $mtindex + $fn_bindnumchrs_u{$keyname}; + if ($numchars > 0) + { + print(OUTFILE " $keys_fn_u{$keyname},\n"); + } + } + } + } + + print(OUTFILE " };\n"); + print(OUTFILE "\n"); + print(OUTFILE "const TInt K${boardname}DataSize_${langname} = $mtindex;\n"); + print(OUTFILE "\n"); + + my $keybindingsize = 0; + + print(OUTFILE "\n"); + print(OUTFILE "const TPtiKeyBinding ${boardname}KeyBindings_table_${langname}[] =\n"); + print(OUTFILE " {\n"); + + for ($i = 1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + $scanbindname = $scan_bind{$keyname}; + if (length($scanbindname) > 0) + { + print(OUTFILE " {$scanbindname, EPtiCaseLower, $bindindex{$keyname}, $bindnumchrs{$keyname}},\n"); + $keybindingsize++; + } + } + } + + for ($i = 1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + $scanbindname = $scan_bind{$keyname}; + if (length($scanbindname) > 0) + { + print(OUTFILE " {$scanbindname, EPtiCaseUpper, $bindindex_u{$keyname}, $bindnumchrs_u{$keyname}},\n"); + $keybindingsize++; + } + } + } + if ($has_chr_keys{$blockname} == 1) + { + for ($i = 1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + $scanbindname = $scan_bind{$keyname}; + if (length($scanbindname) > 0 && $chr_bindnumchrs{$keyname} > 0) + { + print(OUTFILE " {$scanbindname, EPtiCaseChrLower, $chr_bindindex{$keyname}, $chr_bindnumchrs{$keyname}},\n"); + $keybindingsize++; + } + } + } + + for ($i = 1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + $scanbindname = $scan_bind{$keyname}; + if (length($scanbindname) > 0 && $chr_bindnumchrs_u{$keyname} > 0) + { + print(OUTFILE " {$scanbindname, EPtiCaseChrUpper, $chr_bindindex_u{$keyname}, $chr_bindnumchrs_u{$keyname}},\n"); + $keybindingsize++; + } + } + } + } + if ($has_fn_keys{$blockname} == 1) + { + for ($i = 1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + $scanbindname = $scan_bind{$keyname}; + if (length($scanbindname) > 0 && $fn_bindnumchrs{$keyname} > 0) + { + print(OUTFILE " {$scanbindname, EPtiCaseFnLower, $fn_bindindex{$keyname}, $fn_bindnumchrs{$keyname}},\n"); + $keybindingsize++; + } + } + } + + for ($i = 1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + $scanbindname = $scan_bind{$keyname}; + if (length($scanbindname) > 0 && $fn_bindnumchrs_u{$keyname} > 0) + { + print(OUTFILE " {$scanbindname, EPtiCaseFnUpper, $fn_bindindex_u{$keyname}, $fn_bindnumchrs_u{$keyname}},\n"); + $keybindingsize++; + } + } + } + } + + print(OUTFILE " };\n"); + print(OUTFILE "\n"); + + print(OUTFILE "const TInt KMax${boardname}Index_${langname} = ${keybindingsize};\n"); + + print(OUTFILE "\n"); + + # + # Add data table for dead keys + # + if ($has_deadkeys{$blockname} == 1) + { + print(OUTFILE "\n"); + print(OUTFILE "//\n"); + print(OUTFILE "// Dead key data table for ${boardname}\n"); + print(OUTFILE "//\n"); + print(OUTFILE "const TUint16 ${boardname}DeadKeyData_table_${langname}[] =\n"); + print(OUTFILE " {\n"); + + $dead_key_table_rows = 0; + $dead_index = 0; + for ($i = 1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + &countchars($keys{$keyname}); + if ( $numchars > 0 ) + { + &countchars($deadkeys{$keyname}); + if ($numchars > 0) + { + print(OUTFILE " $dead_index, $deadkeys{$keyname},\n"); + $dead_key_table_rows++; + } + $dead_index++; + } + } + } + + for ($i = 1; $i <= $rows; $i++) + { + for ($j = 1; $j <= $cols; $j++) + { + $keyname = "$blockname $i $j"; + &countchars($keys{$keyname}); + if ( $numchars > 0 ) + { + $keyname = "$blockname $i $j"; + &countchars($deadkeys_u{$keyname}); + if ($numchars > 0) + { + print(OUTFILE " $dead_index, $deadkeys_u{$keyname},\n"); + $dead_key_table_rows++; + } + $dead_index++; + } + } + } + + print(OUTFILE " };\n"); + print(OUTFILE "\n"); + print(OUTFILE "const TInt K${boardname}DeadKeyTableRows_${langname} = $dead_key_table_rows;\n"); + print(OUTFILE "\n"); + } + + # + # Add data table for numeric mode keys + # + if ($has_numeric_data{$blockname} == 1) + { + print(OUTFILE "\n//\n"); + print(OUTFILE "// Numeric key data table for ${boardname}\n"); + print(OUTFILE "//\n"); + print(OUTFILE "const TPtiNumericKeyBinding ${boardname}NumericKeysData_table_${langname}[] =\n"); + print(OUTFILE " {\n"); + + $countnumericentries = 0; + for ($aaa = 0; $aaa < $numkeyscount; $aaa++) + { + $keystr = "$blockname $numkeynames[$aaa]"; + if (index ($numeric_mode_key{$keystr}, "(") >= 0) + { + print(OUTFILE " {"); + + $leftind = index($numeric_mode_key{$keystr}, "("); + $rightind = index($numeric_mode_key{$keystr}, ")"); + $keyname = substr($numeric_mode_key{$keystr}, $leftind + 1, $rightind - $leftind - 1); + + &convert_coordinates("$blockname $keyname"); + if (index($converted_coordinates, "EPti") >= 0) + { + print(OUTFILE "\'$numkeynames[$aaa]\',"); + print(OUTFILE "$converted_coordinates,"); + if (index($numeric_mode_key{$keystr}, "fn_upper") >= 0) + { + print(OUTFILE "EPtiCaseFnUpper"); + } + elsif (index($numeric_mode_key{$keystr}, "fn_lower") >= 0) + { + print(OUTFILE "EPtiCaseFnLower"); + } + elsif (index($numeric_mode_key{$keystr}, "upper") >= 0) + { + print(OUTFILE "EPtiCaseUpper"); + } + elsif (index($numeric_mode_key{$keystr}, "chr_lower") >= 0) + { + print(OUTFILE "EPtiCaseChrLower"); + } + elsif (index($numeric_mode_key{$keystr}, "chr_upper") >= 0) + { + print(OUTFILE "EPtiCaseChrUpper"); + } + else + { + print(OUTFILE "EPtiCaseLower"); + } + } + else + { + die ("ERROR: Invalid numeric key coordinates for $langname\n"); + } + + print(OUTFILE "},\n"); + $countnumericentries++; + } + } + + print(OUTFILE " };\n"); + print(OUTFILE "\nconst TInt KNum${boardname}NumericKeysEntries_${langname} = $countnumericentries;\n"); + } + + # + # Add data table for vietnamese vowel sequences + # + if (index($langname, "Vietnamese") >= 0 && ( $blockname eq "QWERTY STANDARD" || $blockname eq "QWERTY 4X10" || $blockname eq "QWERTY 3X11") ) + { + print(OUTFILE "\n"); + # Vietnamese vowel sequence data is currently statically defined here. + # Parser section for it can be implemented later if needed. + print(OUTFILE "const TVowelSequence ${boardname}VowelSeq_table_${langname}[] =\n"); + print(OUTFILE " {\n"); + + print(OUTFILE " {TPtiKey(0x0041), TPtiKey(0x01AF), {0x0103, 0x0102}},\n"); + print(OUTFILE " {TPtiKey(0x0041), TPtiKey(0x0041), {0x00e2, 0x00c2}},\n"); + print(OUTFILE " {TPtiKey(0x0045), TPtiKey(0x0045), {0x00ea, 0x00ca}},\n"); + print(OUTFILE " {TPtiKey(0x004F), TPtiKey(0x01AF), {0x01a1, 0x01a0}},\n"); + print(OUTFILE " {TPtiKey(0x004F), TPtiKey(0x004F), {0x00f4, 0x00d4}},\n"); + print(OUTFILE " {TPtiKey(0x0055), TPtiKey(0x01AF), {0x01b0, 0x01af}},\n"); + print(OUTFILE " {TPtiKey(0x0044), TPtiKey(0x0044), {0x0111, 0x0110}},\n"); + print(OUTFILE " {TPtiKey(0x01AF), TPtiKey(0x01AF), {0x0077, 0x0057}}\n"); + + print(OUTFILE " };\n"); + print(OUTFILE "\nconst TInt KNum${boardname}VowelSeqEntries_${langname} = 8;\n"); + } + } + +# +# print_data_block ends +# + + +############################################################## +# +# Parse file and fill tables. +# +############################################################## + +# Open cscan binding file if present +if ( ! open(SCANBINDINGFILE,"${inputpath}scan_binding.txt") ) +{ + #print("\nINFORMATION: No scan binding file found\n"); +} + +$line_number = 1; +@master_raw_data=; +foreach $line (@master_raw_data) +{ + if ((index($line, "#") >= 0)) + { + # Comment line, just skip + } + elsif (index($line, "[KEYBOARD BLOCK") >= 0) + { + # New qwerty keyboard data block is starting. + if (index($line, "QWERTY STANDARD]") >= 0) + { + $current_keyboard_data_block = "QWERTY STANDARD"; + } + elsif (index($line, "12-KEY]") >= 0) + { + $current_keyboard_data_block = "12-KEY"; + } + elsif (index($line, "QWERTY 4X10") >= 0) + { + $current_keyboard_data_block = "QWERTY 4X10"; + } + elsif (index($line, "QWERTY 3X11") >= 0) + { + $current_keyboard_data_block = "QWERTY 3X11"; + } + elsif (index($line, "QWERTY HALF") >= 0) + { + $current_keyboard_data_block = "QWERTY HALF"; + } + elsif (index($line, "QWERTY CUSTOM") >= 0) + { + $current_keyboard_data_block = "QWERTY CUSTOM"; + } + else + { + die "Syntax error: Unknown keyboard data block in file ${inputpath}scan_binding.txt line ${line_number}\n"; + } + } + else + { + if (index($line, "scan_binding") >= 0) + { + # Parse coordinates + $leftind = index($line, "("); + $rightind = index($line, ")"); + + if ($leftind < 0 || $rightind < 0 || $rightind <= $leftind) + { + die ("Syntax error in ${inputpath}scan_binding.txt line ${line_number}\n"); + } + + $keyname = substr($line, $leftind + 1, $rightind - $leftind - 1); + $full_key_name = "$current_keyboard_data_block $keyname"; + + $scan_bind{$full_key_name} = substr($line, $rightind + 1, length($line) - $rightind - 2); + } + } + $line_number = $line_number + 1; +} +close(SCANBINDINGFILE); + +if ( ! open(INFILE, "${inputfile}") ) + { + die "Could not open input file ${inputfile}"; + } + +$line_number = 1; + +# +# The main parser loop +# +@raw_data=; +foreach $line (@raw_data) + { + if ((index($line, "#") >= 0) && (index($line, "numeric_mode_key") < 0)) + { + # Comment line, just skip + } + elsif (index($line, "[KEYBOARD BLOCK") >= 0) + { + # New qwerty keyboard data block is starting. + if (index($line, "QWERTY STANDARD]") >= 0) + { + $current_keyboard_data_block = "QWERTY STANDARD"; + $has_data{"QWERTY STANDARD"} = 1; + $has_qwerty_data = 1; + } + elsif (index($line, "12-KEY]") >= 0) + { + $has_data{"12-KEY"} = 1; + $current_keyboard_data_block = "12-KEY"; + } + elsif (index($line, "QWERTY 4X10") >= 0) + { + $current_keyboard_data_block = "QWERTY 4X10"; + $has_data{"QWERTY 4X10"} = 1; + $has_qwerty_data = 1; + } + elsif (index($line, "QWERTY 3X11") >= 0) + { + $current_keyboard_data_block = "QWERTY 3X11"; + $has_data{"QWERTY 3X11"} = 1; + $has_qwerty_data = 1; + } + elsif (index($line, "QWERTY HALF") >= 0) + { + $current_keyboard_data_block = "QWERTY HALF"; + $has_data{"QWERTY HALF"} = 1; + $has_qwerty_data = 1; + } + elsif (index($line, "QWERTY CUSTOM") >= 0) + { + $current_keyboard_data_block = "QWERTY CUSTOM"; + $has_data{"QWERTY CUSTOM"} = 1; + $has_qwerty_data = 1; + } + else + { + die "Syntax error: Unknown keyboard data block in file ${inputfile} line ${line_number}\n"; + } + } + else + { + # + # Convert special tags. + # + while (index($line, "ForZhuyin") >= 0) + { + substr($line, index($line, "ForZhuyin"), 9) = $for_zhuyin_tag_value; + } + + while (index($line, "ForPinyin") >= 0) + { + substr($line, index($line, "ForPinyin"), 9) = $for_pinyin_tag_value; + } + + while (index($line, "ForStroke") >= 0) + { + substr($line, index($line, "ForStroke"), 9) = $for_stroke_tag_value; + } + + while (index($line, "ForCangjie") >= 0) + { + substr($line, index($line, "ForCangjie"), 10) = $for_cangjie_tag_value; + } + + while (index($line, "GetAllMarker") >= 0) + { + substr($line, index($line, "GetAllMarker"), 12) = $get_all_marker_value; + } + + # + # Convert hexdecimal formats to C-format. + # + while (index($line, "\\U") >= 0) + { + substr($line, index($line, "\\U"), 2) = "0x"; + } + + while (index($line, "U+") >= 0) + { + substr($line, index($line, "U+"), 2) = "0x"; + } + + # + # Parse possible language code + # + if (index($line, "language_code") >= 0) + { + $langconstant = substr($line, 13, length($line) - 14); + } + + # + # Parse key data. + # + if ((index($line, "key") >= 0) && (index($line, "numeric_mode") < 0) && (index($line, "dead_key_data") < 0) && (index($line, "deadkeydata") < 0)) + { + if ($current_keyboard_data_block eq "") + { + die "ERROR: No keyboard block was specified in file ${inputfile} line ${line_number}\n"; + } + + # Parse coordinates + $leftind = index($line, "("); + $rightind = index($line, ")"); + + if ($leftind < 0 || $rightind < 0 || $rightind <= $leftind) + { + die ("Syntax error in ${inputfile} line ${line_number}\n"); + } + + $keyname = substr($line, $leftind + 1, $rightind - $leftind - 1); + $full_key_name = "$current_keyboard_data_block $keyname"; + + if (index($line, "fn_upper") > 3) + { + if ($current_keyboard_data_block eq "12-KEY") + { + die "ERROR: Fn-keys not supported for given keyboard block in file ${inputfile} line ${line_number}\n"; + } + else + { + $has_fn_keys{$current_keyboard_data_block} = 1; + $keys_fn_u{$full_key_name} = substr($line, $rightind + 1, length($line) - $rightind - 2); + } + } + elsif (index($line, "fn_lower") > 3) + { + if ($current_keyboard_data_block eq "12-KEY") + { + die "ERROR: Fn-keys not supported for given keyboard block in file ${inputfile} line ${line_number}\n"; + } + else + { + $has_fn_keys{$current_keyboard_data_block} = 1; + $keys_fn{$full_key_name} = substr($line, $rightind + 1, length($line) - $rightind - 2); + } + } + elsif (index($line, "chr_lower") > 3) + { + if ($current_keyboard_data_block eq "12-KEY") + { + die "ERROR: chr-keys not supported for given keyboard block in file ${inputfile} line ${line_number}\n"; + } + else + { + $has_chr_keys{$current_keyboard_data_block} = 1; + $keys_chr{$full_key_name} = substr($line, $rightind + 1, length($line) - $rightind - 2); + } + } + elsif (index($line, "chr_upper") > 3) + { + if ($current_keyboard_data_block eq "12-KEY") + { + die "ERROR: chr-keys not supported for given keyboard block in file ${inputfile} line ${line_number}\n"; + } + else + { + $has_chr_keys{$current_keyboard_data_block} = 1; + $keys_chr_u{$full_key_name} = substr($line, $rightind + 1, length($line) - $rightind - 2); + } + } + elsif (index($line, "upper") > 3) + { + $keys_u{$full_key_name} = substr($line, $rightind + 1, length($line) - $rightind - 2); + } + else # has to be lower + { + $keys{$full_key_name} = substr($line, $rightind + 1, length($line) - $rightind - 2); + } + } + + if (index($line, "latin_like_language") >= 0) + { + $print_not_latin_language = 0; + if (index($line, " no") >= 0 or index($line, "=no") >= 0) + { + $print_not_latin_language = 1; + } + } + + if (index($line, "numeric_mode_key") >= 0) + { + $has_numeric_mode_data = 1; + $has_numeric_data{$current_keyboard_data_block} = 1; + $leftind = index($line, "("); + $rightind = index($line, ")"); + + if ($leftind < 0 || $rightind < 0 || $rightind <= $leftind) + { + die ("Syntax error in file ${inputfile} line ${line_number}\n"); + } + + $numeric_mode_key_name = substr($line, 17, 1); + $full_numeric_mode_key_name = "$current_keyboard_data_block $numeric_mode_key_name"; + $numeric_mode_key{$full_numeric_mode_key_name} = substr($line, 19); + } + + if (index($line, "dead_key_data") >= 0 || index($line, "deadkeydata") >= 0) + { + $has_deadkey_data = 1; + $has_deadkeys{$current_keyboard_data_block} = 1; + + $leftind = index($line, "("); + $rightind = index($line, ")"); + + if ($leftind < 0 || $rightind < 0 || $rightind <= $leftind) + { + die ("Syntax error in file ${inputfile} line ${line_number}\n"); + } + + $keyname = substr($line, $leftind + 1, $rightind - $leftind - 1); + $full_key_name = "$current_keyboard_data_block $keyname"; + + if (index($line, "upper") > 4) + { + $deadkeys_u{$full_key_name} = substr($line, $rightind + 1, length($line) - $rightind - 2); + } + else + { + $deadkeys{$full_key_name} = substr($line, $rightind + 1, length($line) - $rightind - 2); + } + } + + if (index($line, "matrix") >= 0) + { + if ($current_keyboard_data_block eq "QWERTY CUSTOM") + { + @parts = split(/ /, $line); + $custom_matrix_width = $parts[1]; + $custom_matrix_height = $parts[2]; + } + else + { + die "ERROR: Custom matrix supported only by custom block in file ${inputfile} line ${line_number}\n"; + } + } + + if (index($line, "scan_binding") >= 0) + { + # Parse coordinates + $leftind = index($line, "("); + $rightind = index($line, ")"); + + if ($leftind < 0 || $rightind < 0 || $rightind <= $leftind) + { + die ("Syntax error in ${inputfile} line ${line_number}\n"); + } + + $keyname = substr($line, $leftind + 1, $rightind - $leftind - 1); + $full_key_name = "$current_keyboard_data_block $keyname"; + + $scan_bind{$full_key_name} = substr($line, $rightind + 1, length($line) - $rightind - 2); + } + } + + $line_number = $line_number + 1; + } + +# All done, close the file and handle the results. +close(INFILE); + + +############################################################## +# +# Open output cpp-file +# +############################################################## + +if ( ! open(OUTFILE, ">>${outputdir}${output_dll}${variant_name}.cpp") ) + { + die "Could not open input file ${output_dll}${variant_name}.cpp\n"; + } + + +############################################################## +# +# Open output h-file +# +############################################################## + +if ( ! open(HEADER, ">>${outputdir}${output_dll}${variant_name}.h") ) + { + die "Could not open input file ${output_dll}${variant_name}.h\n"; + } + +############################################################## +# +# Allow config-file to cut off data blocks +# +############################################################## + +if (index($blocks_in_use, "12-KEY") < 0) + { + $has_data{"12-KEY"} = 0; + } +if (index($blocks_in_use, "STANDARD") < 0) + { + $has_data{"QWERTY STANDARD"} = 0; + $has_deadkeys{"QWERTY STANDARD"} = 0; + $has_numeric_data{"QWERTY STANDARD"} = 0; + } +if (index($blocks_in_use, "4X10") < 0) + { + $has_data{"QWERTY 4X10"} = 0; + $has_deadkeys{"QWERTY 4X10"} = 0; + $has_numeric_data{"QWERTY 4X10"} = 0; + } +if (index($blocks_in_use, "3X11") < 0) + { + $has_data{"QWERTY 3X11"} = 0; + $has_deadkeys{"QWERTY 3X11"} = 0; + $has_numeric_data{"QWERTY 3X11"} = 0; + } +if (index($blocks_in_use, "HALF") < 0) + { + $has_data{"QWERTY HALF"} = 0; + $has_deadkeys{"QWERTY HALF"} = 0; + $has_numeric_data{"QWERTY HALF"} = 0; + } +if (index($blocks_in_use, "CUSTOM") < 0) + { + $has_data{"QWERTY CUSTOM"} = 0; + $has_deadkeys{"QWERTY CUSTOM"} = 0; + $has_numeric_data{"QWERTY CUSTOM"} = 0; + } + +############################################################## +# +# Add data tables for multittapping keymap data. +# +############################################################## +if ($has_data{"12-KEY"} == 1) + { + &print_data_block("Multitap", 4, 3, "12-KEY"); + } + +############################################################## +# +# Add data tables for standard 4x12 qwerty mapping data. +# +############################################################## +if ($has_data{"QWERTY STANDARD"} == 1) + { + &print_data_block("StandardQwerty", 4, 12, "QWERTY STANDARD"); + } + +############################################################## +# +# Add data tables for 4x10 qwerty mapping data. +# +############################################################## +if ($has_data{"QWERTY 4X10"} == 1) + { + &print_data_block("MiniQwerty", 4, 10, "QWERTY 4X10"); + } + +############################################################## +# +# Add data tables for 3x11 qwerty mapping data. +# +############################################################## +if ($has_data{"QWERTY 3X11"} == 1) + { + &print_data_block("MiniQwerty3x11", 3, 11, "QWERTY 3X11"); + } + +############################################################## +# +# Add data table for half qwerty mapping data. +# +############################################################## +if ($has_data{"QWERTY HALF"} == 1) + { + &print_data_block("HalfQwerty", 4, 5, "QWERTY HALF"); + } + +############################################################## +# +# Add data table for custom qwerty mapping data. +# +############################################################## +if ($has_data{"QWERTY CUSTOM"} == 1 && $custom_matrix_width > 0) + { + &print_data_block("CustomQwerty", $custom_matrix_width, $custom_matrix_height, "QWERTY CUSTOM"); + } + +############################################################## +# +# Add class declaration to header file +# +############################################################## +print(HEADER "\n//\n"); +print(HEADER "// Class declaration for language $langname \n"); +print(HEADER "//\n"); +print(HEADER "class CPtiLangDataImpl${langname} : public CPtiKeyMapData\n"); +print(HEADER " {\n"); +print(HEADER " public:\n"); +print(HEADER " static CPtiLangDataImpl${langname}* NewL();\n"); +print(HEADER " TInt LanguageCode() const;\n"); +print(HEADER " const TUint16* KeyData(TPtiKeyboardType aKeyboardType, TInt& aDataSize) const;\n"); +print(HEADER " const TPtiKeyBinding* KeyBindingTable(TPtiKeyboardType aKeyboardType, TInt& aNumItems) const;\n"); +if ($has_deadkey_data == 1) + { +# There is dead key data, add a method for dead key data table. +print(HEADER " const TUint16* DeadKeyDataArray(TPtiKeyboardType aKeyboardType, TInt& aNumRowsInArray) const;\n"); + } + +if ($has_numeric_mode_data == 1) + { +# There is numeric data, add a method for numeric data table. +print(HEADER " const TPtiNumericKeyBinding* NumericModeKeysTable(TPtiKeyboardType aKeyboardType, TInt& aNumEntries) const;\n"); + } + +if (index($langname, "Vietnamese") >= 0) + { +print(HEADER " const TVowelSequence* VowelSequenceTable(TPtiKeyboardType aKeyboardType, TInt& aNumEntries) const;\n"); + } + +if ($print_not_latin_language == 1) { +print(HEADER " TBool SuitableForLatinOnlyMode() const;\n"); + } +print(HEADER " };\n"); +print(HEADER "\n"); + +################################################### +# +# Add function bodies +# +################################################### + +print(OUTFILE "//\n"); +print(OUTFILE "// Class implementation.\n"); +print(OUTFILE "//\n"); +print(OUTFILE "\n"); + +# +# Create body for NewL +# +print(OUTFILE "CPtiLangDataImpl${langname}* CPtiLangDataImpl${langname}::NewL()\n"); +print(OUTFILE " {\n"); +print(OUTFILE " return new (ELeave) CPtiLangDataImpl${langname}();\n"); +print(OUTFILE " }\n"); +print(OUTFILE "\n"); +print(OUTFILE "\n"); + +# +# Create body for CPtiLangDataImpl::LanguageCode() +# +print(OUTFILE "TInt CPtiLangDataImpl${langname}::LanguageCode() const\n"); +print(OUTFILE " {\n"); +print(OUTFILE " return ${langconstant};\n"); +print(OUTFILE " }\n"); +print(OUTFILE "\n"); +print(OUTFILE "\n"); + +# +# Create body for CPtiLangDataImpl::KeyData() +# +print(OUTFILE "const TUint16* CPtiLangDataImpl${langname}::KeyData(TPtiKeyboardType aKeyboardType, TInt& aDataSize) const\n"); +print(OUTFILE " {\n"); + +if ($has_data{"12-KEY"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboard12Key)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aDataSize = KMultitapDataSize_${langname};\n"); + print(OUTFILE " return MultitapData_table_${langname};\n"); + print(OUTFILE " }\n"); + } + +if ($has_data{"QWERTY STANDARD"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty4x12)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aDataSize = KStandardQwertyDataSize_${langname};\n"); + print(OUTFILE " return StandardQwertyData_table_${langname};\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + } + +if ($has_data{"QWERTY 4X10"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty4x10)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aDataSize = KMiniQwertyDataSize_${langname};\n"); + print(OUTFILE " return MiniQwertyData_table_${langname};\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + } + +if ($has_data{"QWERTY 3X11"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty3x11)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aDataSize = KMiniQwerty3x11DataSize_${langname};\n"); + print(OUTFILE " return MiniQwerty3x11Data_table_${langname};\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + } + +if ($has_data{"QWERTY HALF"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardHalfQwerty)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aDataSize = KHalfQwertyDataSize_${langname};\n"); + print(OUTFILE " return HalfQwertyData_table_${langname};\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + } + +if ($has_data{"QWERTY CUSTOM"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardCustomQwerty)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aDataSize = KCustomQwertyDataSize_${langname};\n"); + print(OUTFILE " return CustomQwertyData_table_${langname};\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + } + +print(OUTFILE " aDataSize = 0;\n"); +print(OUTFILE " return NULL;\n"); +print(OUTFILE " }\n"); + +# +# Create body for CPtiLangDataImpl::KeyBindingTable() +# +print(OUTFILE "\n"); +print(OUTFILE "\n"); +print(OUTFILE "const TPtiKeyBinding* CPtiLangDataImpl${langname}::KeyBindingTable(TPtiKeyboardType aKeyboardType, TInt& aNumItems) const\n"); +print(OUTFILE " {\n"); + +if ($has_data{"12-KEY"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboard12Key)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumItems = KMaxMultitapIndex_${langname};\n"); + print(OUTFILE " return MultitapKeyBindings_table_${langname};\n"); + print(OUTFILE " }\n"); + } + +if ($has_data{"QWERTY STANDARD"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty4x12)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumItems = KMaxStandardQwertyIndex_${langname};\n"); + print(OUTFILE " return StandardQwertyKeyBindings_table_${langname};\n"); + print(OUTFILE " }\n"); + } + +if ($has_data{"QWERTY 4X10"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty4x10)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumItems = KMaxMiniQwertyIndex_${langname};\n"); + print(OUTFILE " return MiniQwertyKeyBindings_table_${langname};\n"); + print(OUTFILE " }\n"); + } + +if ($has_data{"QWERTY 3X11"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty3x11)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumItems = KMaxMiniQwerty3x11Index_${langname};\n"); + print(OUTFILE " return MiniQwerty3x11KeyBindings_table_${langname};\n"); + print(OUTFILE " }\n"); + } + +if ($has_data{"QWERTY HALF"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardHalfQwerty)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumItems = KMaxHalfQwertyIndex_${langname};\n"); + print(OUTFILE " return HalfQwertyKeyBindings_table_${langname};\n"); + print(OUTFILE " }\n"); + } + +if ($has_data{"QWERTY CUSTOM"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardCustomQwerty)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumItems = KMaxCustomQwertyIndex_${langname};\n"); + print(OUTFILE " return CustomQwertyKeyBindings_table_${langname};\n"); + print(OUTFILE " }\n"); + } + +print(OUTFILE "\n"); +print(OUTFILE " aNumItems = 0;\n"); +print(OUTFILE " return NULL;\n"); +print(OUTFILE " }\n"); + + +if ($has_qwerty_data == 1) { +print(OUTFILE "\n"); +print(OUTFILE "\n"); + +# +# Add body for dead key data table method. +# +if ($has_deadkey_data == 1) + { + print(OUTFILE "const TUint16* CPtiLangDataImpl${langname}::DeadKeyDataArray(TPtiKeyboardType aKeyboardType, TInt& aNumRowsInArray) const\n"); + print(OUTFILE " {\n"); + + if ($has_deadkeys{"QWERTY STANDARD"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty4x12)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumRowsInArray = KStandardQwertyDeadKeyTableRows_${langname};\n"); + print(OUTFILE " return StandardQwertyDeadKeyData_table_${langname};\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + } + + if ($has_deadkeys{"QWERTY 4X10"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty4x10)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumRowsInArray = KMiniQwertyDeadKeyTableRows_${langname};\n"); + print(OUTFILE " return MiniQwertyDeadKeyData_table_${langname};\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + } + + if ($has_deadkeys{"QWERTY 3X11"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty3x11)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumRowsInArray = KMiniQwerty3x11DeadKeyTableRows_${langname};\n"); + print(OUTFILE " return MiniQwerty3x11DeadKeyData_table_${langname};\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + } + + if ($has_deadkeys{"QWERTY CUSTOM"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardCustomQwerty)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumRowsInArray = KCustomQwertyDeadKeyTableRows_${langname};\n"); + print(OUTFILE " return CustomQwertyDeadKeyData_table_${langname};\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + } + + print(OUTFILE " aNumRowsInArray = 0;\n"); + print(OUTFILE " return NULL;\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + print(OUTFILE "\n"); + } + +# +# Add body for numeric mode data table method. +# +if ($has_numeric_mode_data == 1) + { + print(OUTFILE "const TPtiNumericKeyBinding* CPtiLangDataImpl${langname}::NumericModeKeysTable(TPtiKeyboardType aKeyboardType, TInt& aNumEntries) const\n"); + print(OUTFILE " {\n"); + + if ($has_numeric_data{"QWERTY STANDARD"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty4x12)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumEntries = KNumStandardQwertyNumericKeysEntries_${langname};\n"); + print(OUTFILE " return StandardQwertyNumericKeysData_table_${langname};\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + } + + if ($has_numeric_data{"QWERTY 4X10"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty4x10)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumEntries = KNumMiniQwertyNumericKeysEntries_${langname};\n"); + print(OUTFILE " return MiniQwertyNumericKeysData_table_${langname};\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + } + + if ($has_numeric_data{"QWERTY 3X11"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty3x11)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumEntries = KNumMiniQwerty3x11NumericKeysEntries_${langname};\n"); + print(OUTFILE " return MiniQwerty3x11NumericKeysData_table_${langname};\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + } + + if ($has_numeric_data{"QWERTY CUSTOM"} == 1) + { + print(OUTFILE " if (aKeyboardType == EPtiKeyboardCustomQwerty)\n"); + print(OUTFILE " {\n"); + print(OUTFILE " aNumEntries = KNumCustomQwertyNumericKeysEntries_${langname};\n"); + print(OUTFILE " return CustomQwertyNumericKeysData_table_${langname};\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + } + + print(OUTFILE " aNumEntries = 0;\n"); + print(OUTFILE " return NULL;\n"); + print(OUTFILE " }\n"); + print(OUTFILE "\n"); + print(OUTFILE "\n"); + } + +# +# Add body for vowel sequence data table. +# +if (index($langname, "Vietnamese") >= 0) + { +print(OUTFILE "const TVowelSequence* CPtiLangDataImpl${langname}::VowelSequenceTable(TPtiKeyboardType aKeyboardType, TInt& aNumEntries) const\n"); +print(OUTFILE " {\n"); + +if ($has_data{"QWERTY STANDARD"} == 1) + { +print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty4x12)\n"); +print(OUTFILE " {\n"); +print(OUTFILE " aNumEntries = KNumStandardQwertyVowelSeqEntries_${langname};\n"); +print(OUTFILE " return StandardQwertyVowelSeq_table_${langname};\n"); +print(OUTFILE " }\n"); +print(OUTFILE "\n"); + } + +if ($has_data{"QWERTY 4X10"} == 1) + { +print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty4x10)\n"); +print(OUTFILE " {\n"); +print(OUTFILE " aNumEntries = KNumMiniQwertyVowelSeqEntries_${langname};\n"); +print(OUTFILE " return MiniQwertyVowelSeq_table_${langname};\n"); +print(OUTFILE " }\n"); +print(OUTFILE "\n"); + } + +if ($has_data{"QWERTY 3X11"} == 1) + { +print(OUTFILE " if (aKeyboardType == EPtiKeyboardQwerty3x11)\n"); +print(OUTFILE " {\n"); +print(OUTFILE " aNumEntries = KNumMiniQwerty3x11VowelSeqEntries_${langname};\n"); +print(OUTFILE " return MiniQwerty3x11VowelSeq_table_${langname};\n"); +print(OUTFILE " }\n"); +print(OUTFILE "\n"); + } +print(OUTFILE " aNumEntries = 0;\n"); +print(OUTFILE " return NULL;\n"); +print(OUTFILE " }\n"); +print(OUTFILE "\n"); +print(OUTFILE "\n"); + } + } + +if ($print_not_latin_language == 1) { +print(OUTFILE "\nTBool CPtiLangDataImpl${langname}::SuitableForLatinOnlyMode() const\n"); +print(OUTFILE " {\n"); +print(OUTFILE " return EFalse;\n"); +print(OUTFILE " }\n"); +print(OUTFILE "\n"); +print(OUTFILE "\n"); + } + +close(OUTFILE); + +# End of file \ No newline at end of file