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

No functional change.
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])