8e001a6
--- ttmkfdir-3.0.9.orig/encoding.l	2003-01-08 14:25:25.000000000 +0900
8e001a6
+++ ttmkfdir-3.0.9/encoding.l	2005-08-03 19:24:22.000000000 +0900
8e001a6
@@ -21,6 +21,19 @@
8e001a6
 
8e001a6
 static Encoding       *cur_enc; 
8e001a6
 static NumericMapping *cur_map;
8e001a6
+static int is_created_map = 0;
8e001a6
+
8e001a6
+static void
8e001a6
+create_mapping(void)
8e001a6
+{
8e001a6
+    cur_map = new NumericMapping (cur_enc->size,
8e001a6
+				  TT_PLATFORM_MICROSOFT,
8e001a6
+				  TT_MS_ID_UNICODE_CS);
8e001a6
+    
8e001a6
+    cur_enc->enc_size = 0;
8e001a6
+    cur_enc->start_code = 0xffff;
8e001a6
+    is_created_map = 1;
8e001a6
+}
8e001a6
 
8e001a6
 %}
8e001a6
 
8e001a6
@@ -67,12 +80,6 @@
8e001a6
 }
8e001a6
 
8e001a6
 <INSIDE_ENC_BLOCK>STARTMAPPING{WHITESPACES}unicode {
8e001a6
-    cur_map = new NumericMapping (cur_enc->size,
8e001a6
-				  TT_PLATFORM_MICROSOFT,
8e001a6
-				  TT_MS_ID_UNICODE_CS);
8e001a6
-    
8e001a6
-    cur_enc->enc_size = 0;
8e001a6
-    cur_enc->start_code = 0xffff;
8e001a6
     BEGIN(INSIDE_MAP_BLOCK);
8e001a6
 }
8e001a6
 
8e001a6
@@ -107,6 +114,12 @@
8e001a6
 	i2 = i1;
8e001a6
     }
8e001a6
     
8e001a6
+    /* avoid a crash issue */
8e001a6
+    if (cur_enc->size < i2)
8e001a6
+	cur_enc->size = i2;
8e001a6
+    if (!is_created_map)
8e001a6
+	create_mapping();
8e001a6
+
8e001a6
     /* now mark all the unassigned codes */
8e001a6
     for (long i = i1; i <= i2; i++) {
8e001a6
 	(*cur_map)[i] = -1;
8e001a6
@@ -114,10 +127,14 @@
8e001a6
 }
8e001a6
 
8e001a6
 <INSIDE_MAP_BLOCK>{NUMBER}({WHITESPACES}{NUMBER}){0,2} {
8e001a6
-    int numbers[3], i = 0, start_range, end_range, target, res;
8e001a6
+    unsigned int start_range;
8e001a6
+    int numbers[3], i = 0, end_range, target, res;
8e001a6
     char *startptr;
8e001a6
     char *endptr = yytext;
8e001a6
 
8e001a6
+    if (!is_created_map)
8e001a6
+	create_mapping();
8e001a6
+
8e001a6
     for (i = 0;;i++) {
8e001a6
 	startptr = endptr;
8e001a6
 	res = std::strtol (startptr, &endptr, 0);
8e001a6
@@ -150,9 +167,14 @@
8e001a6
 
8e001a6
 
8e001a6
 <INSIDE_MAP_BLOCK>ENDMAPPING {
8e001a6
+    /* it may not happens but to be safe */
8e001a6
+    if (!is_created_map)
8e001a6
+	create_mapping();
8e001a6
+
8e001a6
     cur_enc->AddMapping (cur_map);
8e001a6
     dest.insert (std::make_pair(cur_map->cmapkey(), cur_enc));;
8e001a6
     BEGIN(INSIDE_ENC_BLOCK);
8e001a6
+    is_created_map = 0;
8e001a6
 }
8e001a6
 
8e001a6
 <INSIDE_UNKNOWN_MAP>ENDMAPPING {