fontservices/textbase/mglyph/mglyphtool.pl
author hgs
Mon, 12 Jul 2010 14:38:26 +0800
changeset 45 662fa7de7023
permissions -rw-r--r--
201024_05
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45
662fa7de7023 201024_05
hgs
parents:
diff changeset
     1
# Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
662fa7de7023 201024_05
hgs
parents:
diff changeset
     2
# All rights reserved.
662fa7de7023 201024_05
hgs
parents:
diff changeset
     3
# This component and the accompanying materials are made available
662fa7de7023 201024_05
hgs
parents:
diff changeset
     4
# under the terms of "Eclipse Public License v1.0"
662fa7de7023 201024_05
hgs
parents:
diff changeset
     5
# which accompanies this distribution, and is available
662fa7de7023 201024_05
hgs
parents:
diff changeset
     6
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
662fa7de7023 201024_05
hgs
parents:
diff changeset
     7
#
662fa7de7023 201024_05
hgs
parents:
diff changeset
     8
# Initial Contributors:
662fa7de7023 201024_05
hgs
parents:
diff changeset
     9
# Nokia Corporation - initial contribution.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    10
#
662fa7de7023 201024_05
hgs
parents:
diff changeset
    11
# Contributors:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    12
#
662fa7de7023 201024_05
hgs
parents:
diff changeset
    13
# Description:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    14
#
662fa7de7023 201024_05
hgs
parents:
diff changeset
    15
662fa7de7023 201024_05
hgs
parents:
diff changeset
    16
use strict;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    17
662fa7de7023 201024_05
hgs
parents:
diff changeset
    18
## Used as global variables, probably need to change and pass variables through as parameters.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    19
my %globalValues=();
662fa7de7023 201024_05
hgs
parents:
diff changeset
    20
##initialise filenames
662fa7de7023 201024_05
hgs
parents:
diff changeset
    21
$globalValues{'inputFile'} = 'mglyphs.txt';
662fa7de7023 201024_05
hgs
parents:
diff changeset
    22
$globalValues{'outputFileName'} = 'mglyphs.inl';
662fa7de7023 201024_05
hgs
parents:
diff changeset
    23
$globalValues{'htmlFileName'} = 'mglyphs.html';
662fa7de7023 201024_05
hgs
parents:
diff changeset
    24
$globalValues{'lgtablesize'} = 9; # Default tablesize value is 512
662fa7de7023 201024_05
hgs
parents:
diff changeset
    25
$globalValues{'tablesize'} = 1 << $globalValues{'lgtablesize'};
662fa7de7023 201024_05
hgs
parents:
diff changeset
    26
$globalValues{'storeashex'} = 0;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    27
$globalValues{'stepOffset'} = 72;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    28
$globalValues{'stepShift'} = 0;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    29
662fa7de7023 201024_05
hgs
parents:
diff changeset
    30
## die if the correct number of argumements have not been entered
662fa7de7023 201024_05
hgs
parents:
diff changeset
    31
&extractFlags(\@ARGV, \%globalValues);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    32
&printDebug("Remainder:$globalValues{'tablesize'}\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
    33
&printDebug("StoreAsHex:$globalValues{'storeashex'}\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
    34
662fa7de7023 201024_05
hgs
parents:
diff changeset
    35
if ($globalValues{"information"})
662fa7de7023 201024_05
hgs
parents:
diff changeset
    36
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    37
	&dieShowingUsage();
662fa7de7023 201024_05
hgs
parents:
diff changeset
    38
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    39
662fa7de7023 201024_05
hgs
parents:
diff changeset
    40
&printDebug("Creating HashTable....\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
    41
my %hashTable = &createHashTable($globalValues{'inputFile'});
662fa7de7023 201024_05
hgs
parents:
diff changeset
    42
if (!defined(%hashTable))
662fa7de7023 201024_05
hgs
parents:
diff changeset
    43
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    44
	die("ERROR: Hash table was not created\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
    45
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    46
if ($globalValues{"outputtohtml"})
662fa7de7023 201024_05
hgs
parents:
diff changeset
    47
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    48
	my $htmlFileName = $globalValues{'htmlFileName'};
662fa7de7023 201024_05
hgs
parents:
diff changeset
    49
	&printDebug("Creating HTML output to file: $htmlFileName\n");	
662fa7de7023 201024_05
hgs
parents:
diff changeset
    50
	&createHTMLOfMappings($htmlFileName, %hashTable);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    51
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    52
my $outputFileName = $globalValues{'outputFileName'};
662fa7de7023 201024_05
hgs
parents:
diff changeset
    53
&printDebug("Writing Hash table to file: $outputFileName\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
    54
&writeHashTableToFile($outputFileName, %hashTable);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    55
&printDebug("$outputFileName created.");
662fa7de7023 201024_05
hgs
parents:
diff changeset
    56
662fa7de7023 201024_05
hgs
parents:
diff changeset
    57
##################### end of main section 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    58
sub extractFlags
662fa7de7023 201024_05
hgs
parents:
diff changeset
    59
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    60
	my $aArgumentArray=shift;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    61
	my $aArguments=shift;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    62
	my $expectedArg = 'lgtablesize';
662fa7de7023 201024_05
hgs
parents:
diff changeset
    63
	my $expectedExtension;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    64
	foreach my $argument (@$aArgumentArray)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    65
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    66
		if ($argument =~ m!^[-/]([a-zA-Z].*)$!)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    67
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    68
			my $switch = $1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    69
			$expectedArg = 'lgtablesize';
662fa7de7023 201024_05
hgs
parents:
diff changeset
    70
			$expectedExtension = undef;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    71
			if ($switch=~/^(x|hexoutput)$/i)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    72
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    73
				$$aArguments{'storeashex'}=1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    74
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    75
			elsif ($switch=~/^(\?|help)$/i)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    76
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    77
				$$aArguments{'information'}=1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    78
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    79
			elsif ($switch=~/^(v|verbose)$/i)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    80
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    81
				$$aArguments{'verbose'}=1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    82
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    83
			elsif ($switch=~/^(h|outputtohtml)$/i)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    84
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    85
				$$aArguments{'outputtohtml'}=1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    86
				$expectedArg = 'htmlFileName';
662fa7de7023 201024_05
hgs
parents:
diff changeset
    87
				$expectedExtension = '.html';
662fa7de7023 201024_05
hgs
parents:
diff changeset
    88
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    89
			elsif ($switch=~/^(i|input)$/i)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    90
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    91
				$expectedArg = 'inputFile';
662fa7de7023 201024_05
hgs
parents:
diff changeset
    92
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    93
			elsif ($switch=~/^(o|output)$/i)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    94
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    95
				$expectedArg = 'outputFileName';
662fa7de7023 201024_05
hgs
parents:
diff changeset
    96
				$expectedExtension = '.inl';
662fa7de7023 201024_05
hgs
parents:
diff changeset
    97
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    98
			elsif ($switch=~/^(offset)$/i)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    99
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   100
				$expectedArg = 'stepOffset';
662fa7de7023 201024_05
hgs
parents:
diff changeset
   101
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   102
			elsif ($switch=~/^(shift)$/i)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   103
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   104
				$expectedArg = 'stepShift';
662fa7de7023 201024_05
hgs
parents:
diff changeset
   105
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   106
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   107
		else
662fa7de7023 201024_05
hgs
parents:
diff changeset
   108
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   109
			if (defined $expectedExtension && $argument !~ m!\.[^/\\]*$!)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   110
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   111
				$argument .= $expectedExtension;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   112
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   113
			$$aArguments{$expectedArg} = $argument;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   114
			$expectedArg = 'lgtablesize';
662fa7de7023 201024_05
hgs
parents:
diff changeset
   115
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   116
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   117
	$globalValues{'tablesize'} = 1 << $globalValues{'lgtablesize'};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   118
	$globalValues{'stepOffset'} &= 0xFFFFFE;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   119
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   120
#####################
662fa7de7023 201024_05
hgs
parents:
diff changeset
   121
sub dieShowingUsage
662fa7de7023 201024_05
hgs
parents:
diff changeset
   122
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   123
	print <<USAGE_EOF;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   124
662fa7de7023 201024_05
hgs
parents:
diff changeset
   125
Usage:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   126
662fa7de7023 201024_05
hgs
parents:
diff changeset
   127
perl -w mglyphtool.pl [-?] [<lg-table-size>] [-x] [-i <input-file-name>]
662fa7de7023 201024_05
hgs
parents:
diff changeset
   128
		[-o <output-file-name>] [-h [<output-html-file-name]]
662fa7de7023 201024_05
hgs
parents:
diff changeset
   129
		[-offset <value-for-offset>] [-shift <value-for-shift>]
662fa7de7023 201024_05
hgs
parents:
diff changeset
   130
662fa7de7023 201024_05
hgs
parents:
diff changeset
   131
<lg-table-size> the default log(base 2) table size is 9. This gives a table
662fa7de7023 201024_05
hgs
parents:
diff changeset
   132
size of 512 entries (2 to the power 9). So 7 gives a size of 128, 8 gives
662fa7de7023 201024_05
hgs
parents:
diff changeset
   133
256, 9 gives 512, 10 gives 1024 and so on.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   134
662fa7de7023 201024_05
hgs
parents:
diff changeset
   135
options: -x -o -i -h
662fa7de7023 201024_05
hgs
parents:
diff changeset
   136
662fa7de7023 201024_05
hgs
parents:
diff changeset
   137
	-? Shows help
662fa7de7023 201024_05
hgs
parents:
diff changeset
   138
662fa7de7023 201024_05
hgs
parents:
diff changeset
   139
	The -x flag stores values into the .inl file in hex format: 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   140
		hex(OriginalKeyCodeMirrorGlyphCode), 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   141
	By default the values are stored in string hex format i.e 0x220C2209
662fa7de7023 201024_05
hgs
parents:
diff changeset
   142
662fa7de7023 201024_05
hgs
parents:
diff changeset
   143
	The -h flag generates a html file displaying hash table information.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   144
	This may be followed by the filename to be output.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   145
	Default is 'mglyphs.html'
662fa7de7023 201024_05
hgs
parents:
diff changeset
   146
662fa7de7023 201024_05
hgs
parents:
diff changeset
   147
	The -i file specifies input file name. Default is 'mglyphs.txt'.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   148
662fa7de7023 201024_05
hgs
parents:
diff changeset
   149
	The -o file specifies output file name. Default is 'mglyphs.inl'.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   150
662fa7de7023 201024_05
hgs
parents:
diff changeset
   151
	-shift and -offset alter the "step" hash algorithm.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   152
	
662fa7de7023 201024_05
hgs
parents:
diff changeset
   153
USAGE_EOF
662fa7de7023 201024_05
hgs
parents:
diff changeset
   154
	exit 0;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   155
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   156
######### 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   157
#
662fa7de7023 201024_05
hgs
parents:
diff changeset
   158
# Writes a hash table to file.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   159
# Current format:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   160
# 	Hex mode: 		"hex number created"
662fa7de7023 201024_05
hgs
parents:
diff changeset
   161
#	Hex string mode:	"Original keyMapped key"
662fa7de7023 201024_05
hgs
parents:
diff changeset
   162
#####################
662fa7de7023 201024_05
hgs
parents:
diff changeset
   163
sub writeHashTableToFile
662fa7de7023 201024_05
hgs
parents:
diff changeset
   164
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   165
	&printDebug("Writing to .inl file");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   166
	my ($aOutputFileName, %aHashTable) = @_;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   167
	open(OUTPUT_FILE, '> ' . $aOutputFileName) or die('Error: could not open $aOutputFileName to write to\n');
662fa7de7023 201024_05
hgs
parents:
diff changeset
   168
	## Print comments at top of .inl file
662fa7de7023 201024_05
hgs
parents:
diff changeset
   169
	printf(OUTPUT_FILE "\/\/ mGlyphs.inl\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   170
	printf(OUTPUT_FILE "\/\/\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   171
	printf(OUTPUT_FILE "\/\/ Generated by mglyphtool.pl from '$globalValues{'inputFile'}'\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   172
	printf(OUTPUT_FILE "\/\/\n\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   173
	## Declare array and fill in values
662fa7de7023 201024_05
hgs
parents:
diff changeset
   174
	printf(OUTPUT_FILE "const unsigned long mGlyphArray[] = {\n\t");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   175
	for (my $counter = 0; $counter < $globalValues{'tablesize'}; $counter++)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   176
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   177
		my $storeValue = "00000000";
662fa7de7023 201024_05
hgs
parents:
diff changeset
   178
		if (defined($aHashTable{$counter}))
662fa7de7023 201024_05
hgs
parents:
diff changeset
   179
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   180
			$storeValue = $aHashTable{$counter};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   181
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   182
		$storeValue = ($globalValues{'storeashex'}) ? hex($storeValue) : "0x$storeValue";
662fa7de7023 201024_05
hgs
parents:
diff changeset
   183
		print OUTPUT_FILE $storeValue;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   184
		if (($counter+1) < $globalValues{'tablesize'})
662fa7de7023 201024_05
hgs
parents:
diff changeset
   185
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   186
			print OUTPUT_FILE (($counter + 1) % 8 == 0? ",\n\t" : ', ');
662fa7de7023 201024_05
hgs
parents:
diff changeset
   187
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   188
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   189
	print(OUTPUT_FILE "};\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   190
	print(OUTPUT_FILE "\nconst int KLgMirrorTableSize=$globalValues{'lgtablesize'};\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   191
	print(OUTPUT_FILE "const int KMirrorTableSize=$globalValues{'tablesize'};\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   192
	# Inline functions
662fa7de7023 201024_05
hgs
parents:
diff changeset
   193
	# Get a Hash value from a given key	
662fa7de7023 201024_05
hgs
parents:
diff changeset
   194
	print(OUTPUT_FILE "\n// Returns the first index to probe for character aKey.\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   195
	print(OUTPUT_FILE "inline long MirrorStart(long aKey)\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   196
	print(OUTPUT_FILE "\t{ return aKey \& (KMirrorTableSize-1); }\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   197
	print(OUTPUT_FILE "\n// Returns the offset for further probes for character aKey.\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   198
	print(OUTPUT_FILE "inline long MirrorStep(long aKey)\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   199
	my $stepShift = $globalValues{'stepShift'};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   200
	print(OUTPUT_FILE "\t{ return (");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   201
	if ($stepShift == 0)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   202
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   203
		print(OUTPUT_FILE "aKey");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   204
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   205
	elsif (0 < $stepShift)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   206
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   207
		print(OUTPUT_FILE "(aKey >> $stepShift)");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   208
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   209
	else
662fa7de7023 201024_05
hgs
parents:
diff changeset
   210
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   211
		$stepShift = -$stepShift;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   212
		print(OUTPUT_FILE "(aKey << $stepShift)");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   213
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   214
	print(OUTPUT_FILE " | 1) + $globalValues{'stepOffset'}; }\n\n");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   215
662fa7de7023 201024_05
hgs
parents:
diff changeset
   216
	close(OUTPUT_FILE);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   217
	}	
662fa7de7023 201024_05
hgs
parents:
diff changeset
   218
##################### listing of hash indexes values for original and mirrored glyphs
662fa7de7023 201024_05
hgs
parents:
diff changeset
   219
sub createHTMLOfMappings
662fa7de7023 201024_05
hgs
parents:
diff changeset
   220
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   221
	my ($aOutputFileName, %aHashTable )= @_;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   222
	open(OUTPUT_FILE, '> ' . $aOutputFileName) or die('Error: could not open $aOutputFileName to create HTML output');
662fa7de7023 201024_05
hgs
parents:
diff changeset
   223
	printf(OUTPUT_FILE "<HTML><HEAD><TITLE>MirrorGlyph Hash Output<\/TITLE><\/HEAD><BODY>");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   224
## print hash table details
662fa7de7023 201024_05
hgs
parents:
diff changeset
   225
	printf(OUTPUT_FILE "<P>Values in hash Table - <B>(Hash Function: Key mod $globalValues{'tablesize'})<\/B><\/P><TABLE border=1>");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   226
	printf(OUTPUT_FILE "<TR><TD><B>---<\/B><\/TD><TD BGCOLOR=\#8888FF><B>Character code:<\/B><\/TD><TD><B>Hash Index:<\/B><\/TD><TD BGCOLOR=\#8888FF><B>Mirror Glyph Value:<\/B><\/TD><TD><b>Search Jump Count<\/b>");	
662fa7de7023 201024_05
hgs
parents:
diff changeset
   227
	my %keySet;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   228
	foreach my $value (values %aHashTable)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   229
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   230
		$keySet{&getLower(hex $value)} = 1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   231
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   232
	foreach my $key (32..127)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   233
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   234
		$keySet{$key} = 1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   235
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   236
	my @keys = sort {$a <=> $b} (keys %keySet);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   237
	foreach my $key (@keys)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   238
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   239
		my $counter = 0;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   240
		my $HKey = &findHashTableIndex($key, \$counter, \%aHashTable);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   241
		my $stored = $aHashTable{$HKey};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   242
		my $storedValue = 'no change';
662fa7de7023 201024_05
hgs
parents:
diff changeset
   243
		my $storedKey = $key;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   244
		if (defined $stored)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   245
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   246
			$storedValue = sprintf('%02x', &getLower(hex $stored));
662fa7de7023 201024_05
hgs
parents:
diff changeset
   247
			$storedKey = &getUpper(hex $stored);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   248
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   249
		if ($storedKey)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   250
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   251
			die('incorrect key found in hash table') unless ($storedKey == $key);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   252
			printf(OUTPUT_FILE "<TR><TD>---<\/TD><TD BGCOLOR=\#8888FF><B>%02x<\/B><\/TD><TD>%02x<\/TD><TD BGCOLOR=\#8888FF><B>%s<\/B><\/TD><TD>%d<\/TD><\/TR>", $key, $HKey, $storedValue, $counter);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   253
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   254
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   255
	printf(OUTPUT_FILE "<\/TABLE>");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   256
	printf(OUTPUT_FILE "<\/BODY><\/HTML>");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   257
	close(OUTPUT_FILE);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   258
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   259
#####################
662fa7de7023 201024_05
hgs
parents:
diff changeset
   260
# Hash Table functions	
662fa7de7023 201024_05
hgs
parents:
diff changeset
   261
##################### 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   262
662fa7de7023 201024_05
hgs
parents:
diff changeset
   263
#####################
662fa7de7023 201024_05
hgs
parents:
diff changeset
   264
#Returns a new Hash Table 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   265
#####################
662fa7de7023 201024_05
hgs
parents:
diff changeset
   266
sub createHashTable
662fa7de7023 201024_05
hgs
parents:
diff changeset
   267
	{	
662fa7de7023 201024_05
hgs
parents:
diff changeset
   268
	my $aInputFileName = shift;	
662fa7de7023 201024_05
hgs
parents:
diff changeset
   269
	my $lineNumber = 1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   270
	my %newHashTable = ();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   271
	open(INPUT_FILE, '< ' . $aInputFileName) or die('ERROR: Could not open $aInputFileName to read from');
662fa7de7023 201024_05
hgs
parents:
diff changeset
   272
	while (my $line=<INPUT_FILE>)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   273
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   274
		if ($line=~/^(.*);\s(.*\w)\s\W.*$/) ## Grab Original glyph value and mirrored glyph value
662fa7de7023 201024_05
hgs
parents:
diff changeset
   275
			{		
662fa7de7023 201024_05
hgs
parents:
diff changeset
   276
			&updateHashTable($1, $2, \%newHashTable);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   277
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   278
		$lineNumber++;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   279
		}		
662fa7de7023 201024_05
hgs
parents:
diff changeset
   280
	close(INPUT_FILE);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   281
	return %newHashTable;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   282
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   283
##################### 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   284
#
662fa7de7023 201024_05
hgs
parents:
diff changeset
   285
# Retrieves a HashKey which is not currently being used in a given HashTable
662fa7de7023 201024_05
hgs
parents:
diff changeset
   286
#
662fa7de7023 201024_05
hgs
parents:
diff changeset
   287
#####################
662fa7de7023 201024_05
hgs
parents:
diff changeset
   288
sub findHashTableIndex
662fa7de7023 201024_05
hgs
parents:
diff changeset
   289
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   290
	my ($aHashKey, $aCounter, $aHashTable) = @_;	
662fa7de7023 201024_05
hgs
parents:
diff changeset
   291
	my $current = &hashFunction($aHashKey);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   292
	my $step = &hashStepFunction($aHashKey);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   293
	my $tableSize = $globalValues{'tablesize'};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   294
	while (defined($$aHashTable{$current}) && &getUpper(hex($$aHashTable{$current})) != $aHashKey)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   295
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   296
		++$$aCounter;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   297
		$current += $step;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   298
		$current &= $tableSize - 1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   299
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   300
	if (2 < $$aCounter)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   301
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   302
		printf STDERR ("WARNING: Jumped $$aCounter times, inefficient hash for %02x ($current, $step)\n", $aHashKey);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   303
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   304
	return $current;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   305
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   306
662fa7de7023 201024_05
hgs
parents:
diff changeset
   307
#####################
662fa7de7023 201024_05
hgs
parents:
diff changeset
   308
sub updateHashTable
662fa7de7023 201024_05
hgs
parents:
diff changeset
   309
{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   310
	my ($aKey, $aValueToStore, $aHashTable) = @_;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   311
	my $counter = 0;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   312
	my $key = hex($aKey);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   313
	my $hashKey = &findHashTableIndex($key, \$counter, $aHashTable);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   314
	$$aHashTable{$hashKey} = "$aKey$aValueToStore";
662fa7de7023 201024_05
hgs
parents:
diff changeset
   315
	return $hashKey;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   316
}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   317
##################### 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   318
# Returns a hash key for a given key
662fa7de7023 201024_05
hgs
parents:
diff changeset
   319
# Currently using a simple hash function 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   320
#####################
662fa7de7023 201024_05
hgs
parents:
diff changeset
   321
sub hashFunction
662fa7de7023 201024_05
hgs
parents:
diff changeset
   322
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   323
	my $aKey = shift;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   324
	return $aKey & ($globalValues{'tablesize'}-1);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   325
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   326
662fa7de7023 201024_05
hgs
parents:
diff changeset
   327
# Returns second hash value: used for the step size
662fa7de7023 201024_05
hgs
parents:
diff changeset
   328
sub hashStepFunction
662fa7de7023 201024_05
hgs
parents:
diff changeset
   329
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   330
	my $aKey = shift;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   331
	my $stepShift = $globalValues{'stepShift'};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   332
	if ($stepShift < 0)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   333
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   334
		$aKey <<= -$stepShift;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   335
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   336
	elsif (0 < $stepShift)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   337
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   338
		$aKey >>= $stepShift;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   339
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   340
	return ($aKey | 1) + $globalValues{'stepOffset'};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   341
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   342
	
662fa7de7023 201024_05
hgs
parents:
diff changeset
   343
#####################
662fa7de7023 201024_05
hgs
parents:
diff changeset
   344
# Utility functions 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   345
#####################
662fa7de7023 201024_05
hgs
parents:
diff changeset
   346
sub getLower
662fa7de7023 201024_05
hgs
parents:
diff changeset
   347
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   348
	my $aValue = shift;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   349
	return $aValue & hex("0000FFFF");
662fa7de7023 201024_05
hgs
parents:
diff changeset
   350
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   351
sub getUpper
662fa7de7023 201024_05
hgs
parents:
diff changeset
   352
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   353
	my $aValue = shift;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   354
	return ($aValue & hex("FFFF0000")) >> 16;				
662fa7de7023 201024_05
hgs
parents:
diff changeset
   355
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   356
sub printDebug
662fa7de7023 201024_05
hgs
parents:
diff changeset
   357
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   358
	my $string = shift;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   359
	if ($globalValues{'verbose'})
662fa7de7023 201024_05
hgs
parents:
diff changeset
   360
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   361
		print $string;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   362
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   363
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   364