[arabic-table] Read Blocks.txt and shuffle code around

No functional change.
diff --git a/src/Makefile.am b/src/Makefile.am
index f670e27..5832f75 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -281,7 +281,7 @@
 	mv hb-ot-shape-complex-indic-table.cc.tmp $(srcdir)/hb-ot-shape-complex-indic-table.cc || \
 	($(RM) hb-ot-shape-complex-indic-table.cc.tmp; false)
 
-arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt
+arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
 	$(AM_V_GEN) $(builddir)/$^ > hb-ot-shape-complex-arabic-table.hh.tmp && \
 	mv hb-ot-shape-complex-arabic-table.hh.tmp $(srcdir)/hb-ot-shape-complex-arabic-table.hh || \
 	($(RM) hb-ot-shape-complex-arabic-table.hh.tmp; false)
diff --git a/src/gen-arabic-table.py b/src/gen-arabic-table.py
index da5a4fc..534f560 100755
--- a/src/gen-arabic-table.py
+++ b/src/gen-arabic-table.py
@@ -3,34 +3,48 @@
 import sys
 import os.path
 
-if len (sys.argv) != 3:
-	print >>sys.stderr, "usage: ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt"
+if len (sys.argv) != 4:
+	print >>sys.stderr, "usage: ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt"
 	sys.exit (1)
 
 files = [file (x) for x in sys.argv[1:]]
 
-headers = [[files[0].readline (), files[0].readline ()]]
+headers = [[files[0].readline (), files[0].readline ()], [files[2].readline (), files[2].readline ()]]
 headers.append (["UnicodeData.txt does not have a header."])
 while files[0].readline ().find ('##################') < 0:
 	pass
 
+blocks = {}
+def read_blocks(f):
+	global blocks
+	for line in f:
+
+		j = line.find ('#')
+		if j >= 0:
+			line = line[:j]
+
+		fields = [x.strip () for x in line.split (';')]
+		if len (fields) == 1:
+			continue
+
+		uu = fields[0].split ('..')
+		start = int (uu[0], 16)
+		if len (uu) == 1:
+			end = start
+		else:
+			end = int (uu[1], 16)
+
+		t = fields[1]
+
+		for u in range (start, end + 1):
+			blocks[u] = t
 
 def print_joining_table(f):
 
-	print
-	print "static const uint8_t joining_table[] ="
-	print "{"
-
-	min_u = 0x110000
-	max_u = 0
-	num = 0
-	last = -1
-	block = ''
+	values = {}
 	for line in f:
 
 		if line[0] == '#':
-			if line.find (" characters"):
-				block = line[2:].strip ()
 			continue
 
 		fields = [x.strip () for x in line.split (';')]
@@ -40,30 +54,29 @@
 		u = int (fields[0], 16)
 		if u == 0x200C or u == 0x200D:
 			continue
-		if u < last:
-			raise Exception ("Input data character not sorted", u)
-		min_u = min (min_u, u)
-		max_u = max (max_u, u)
-		num += 1
-
-		if block:
-			print "\n  /* %s */\n" % block
-			block = ''
-
-		if last != -1:
-			last += 1
-			while last < u:
-				print "  JOINING_TYPE_X, /* %04X */" % last
-				last += 1
-		else:
-			last = u
 
 		if fields[3] in ["ALAPH", "DALATH RISH"]:
 			value = "JOINING_GROUP_" + fields[3].replace(' ', '_')
 		else:
 			value = "JOINING_TYPE_" + fields[2]
-		print "  %s, /* %s */" % (value, '; '.join(fields))
+		values[u] = (value, fields)
 
+	keys = values.keys()
+	min_u = min(keys)
+	max_u = max(keys)
+	num = len(values)
+	print
+	print "static const uint8_t joining_table[] ="
+	print "{"
+	last_block = None
+	for u in range(min_u, max_u+1):
+		value,fields = values.get(u, ("JOINING_TYPE_X", ["%04X"%u]))
+		block = blocks.get(u, last_block)
+		if block != last_block:
+			print "\n  /* %s */\n" % block
+			last_block = block
+
+		print "  %s, /* %s */" % (value, '; '.join(fields))
 	print
 	print "};"
 	print
@@ -174,7 +187,7 @@
 print "/*"
 print " * The following table is generated by running:"
 print " *"
-print " *   ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt"
+print " *   ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt"
 print " *"
 print " * on files with these headers:"
 print " *"
@@ -187,6 +200,7 @@
 print "#define HB_OT_SHAPE_COMPLEX_ARABIC_TABLE_HH"
 print
 
+read_blocks (files[2])
 print_joining_table (files[0])
 print_shaping_table (files[1])
 
diff --git a/src/hb-ot-shape-complex-arabic-table.hh b/src/hb-ot-shape-complex-arabic-table.hh
index 730a275..3375266 100644
--- a/src/hb-ot-shape-complex-arabic-table.hh
+++ b/src/hb-ot-shape-complex-arabic-table.hh
@@ -2,12 +2,14 @@
 /*
  * The following table is generated by running:
  *
- *   ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt
+ *   ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
  *
  * on files with these headers:
  *
  * # ArabicShaping-6.2.0.txt
  * # Date: 2012-05-15, 21:05:00 GMT [KW]
+ * # Blocks-6.2.0.txt
+ * # Date: 2012-05-14, 22:42:00 GMT [KW, LI]
  * UnicodeData.txt does not have a header.
  */
 
@@ -18,7 +20,7 @@
 static const uint8_t joining_table[] =
 {
 
-  /* Arabic Characters */
+  /* Arabic */
 
   JOINING_TYPE_U, /* 0600; ARABIC NUMBER SIGN; U; No_Joining_Group */
   JOINING_TYPE_U, /* 0601; ARABIC SIGN SANAH; U; No_Joining_Group */
@@ -277,7 +279,7 @@
   JOINING_TYPE_X, /* 06FE */
   JOINING_TYPE_D, /* 06FF; KNOTTED HEH WITH INVERTED V ABOVE; D; KNOTTED HEH */
 
-  /* Syriac Characters */
+  /* Syriac */
 
   JOINING_TYPE_X, /* 0700 */
   JOINING_TYPE_X, /* 0701 */
@@ -360,7 +362,7 @@
   JOINING_TYPE_D, /* 074E; SOGDIAN KHAPH; D; KHAPH */
   JOINING_TYPE_D, /* 074F; SOGDIAN FE; D; FE */
 
-  /* Arabic Supplement Characters */
+  /* Arabic Supplement */
 
   JOINING_TYPE_D, /* 0750; DOTLESS BEH WITH HORIZONTAL 3 DOTS BELOW; D; BEH */
   JOINING_TYPE_D, /* 0751; BEH WITH 3 DOTS ABOVE; D; BEH */
@@ -411,7 +413,7 @@
   JOINING_TYPE_D, /* 077E; SEEN WITH INVERTED V ABOVE; D; SEEN */
   JOINING_TYPE_D, /* 077F; KAF WITH 2 DOTS ABOVE; D; KAF */
 
-  /* N'Ko Characters */
+  /* Thaana */
 
   JOINING_TYPE_X, /* 0780 */
   JOINING_TYPE_X, /* 0781 */
@@ -477,6 +479,9 @@
   JOINING_TYPE_X, /* 07BD */
   JOINING_TYPE_X, /* 07BE */
   JOINING_TYPE_X, /* 07BF */
+
+  /* NKo */
+
   JOINING_TYPE_X, /* 07C0 */
   JOINING_TYPE_X, /* 07C1 */
   JOINING_TYPE_X, /* 07C2 */
@@ -536,14 +541,14 @@
   JOINING_TYPE_X, /* 07F8 */
   JOINING_TYPE_X, /* 07F9 */
   JOINING_TYPE_C, /* 07FA; NKO LAJANYALAN; C; No_Joining_Group */
-
-  /* Mandaic Characters */
-
   JOINING_TYPE_X, /* 07FB */
   JOINING_TYPE_X, /* 07FC */
   JOINING_TYPE_X, /* 07FD */
   JOINING_TYPE_X, /* 07FE */
   JOINING_TYPE_X, /* 07FF */
+
+  /* Samaritan */
+
   JOINING_TYPE_X, /* 0800 */
   JOINING_TYPE_X, /* 0801 */
   JOINING_TYPE_X, /* 0802 */
@@ -608,6 +613,9 @@
   JOINING_TYPE_X, /* 083D */
   JOINING_TYPE_X, /* 083E */
   JOINING_TYPE_X, /* 083F */
+
+  /* Mandaic */
+
   JOINING_TYPE_R, /* 0840; MANDAIC HALQA; R; No_Joining_Group */
   JOINING_TYPE_D, /* 0841; MANDAIC AB; D; No_Joining_Group */
   JOINING_TYPE_D, /* 0842; MANDAIC AG; D; No_Joining_Group */
@@ -633,9 +641,6 @@
   JOINING_TYPE_U, /* 0856; MANDAIC DUSHENNA; U; No_Joining_Group */
   JOINING_TYPE_U, /* 0857; MANDAIC KAD; U; No_Joining_Group */
   JOINING_TYPE_U, /* 0858; MANDAIC AIN; U; No_Joining_Group */
-
-  /* Arabic Extended-A Characters */
-
   JOINING_TYPE_X, /* 0859 */
   JOINING_TYPE_X, /* 085A */
   JOINING_TYPE_X, /* 085B */
@@ -707,6 +712,9 @@
   JOINING_TYPE_X, /* 089D */
   JOINING_TYPE_X, /* 089E */
   JOINING_TYPE_X, /* 089F */
+
+  /* Arabic Extended-A */
+
   JOINING_TYPE_D, /* 08A0; DOTLESS BEH WITH V BELOW; D; BEH */
   JOINING_TYPE_X, /* 08A1 */
   JOINING_TYPE_D, /* 08A2; HAH WITH DOT BELOW AND 2 DOTS ABOVE; D; HAH */