improved docmaker slightly (better indexing, support for "<order>" marker
in section blocks, see "fttypes.h")
diff --git a/ChangeLog b/ChangeLog
index 6df5fa0..145fda3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2001-02-01  David Turner  <david.turner@freetype.org>
+
+	* docs/docmaker.py: improved the index sorting routine to place capital
+	letters before small ones. added the "<order>" marker to section blocks
+	in order to give the order of blocks
+
 2001-01-24  Tom Kacvinsky  <tjk@ams.org>
 
 	* src/cff/t1load.c (parse_font_matrix): Added heuristic to get
diff --git a/docs/docmaker.py b/docs/docmaker.py
index ac1c2d7..f02bdc0 100644
--- a/docs/docmaker.py
+++ b/docs/docmaker.py
@@ -42,8 +42,8 @@
 para_header = "<p>"
 para_footer = "</p>"
 
-block_header = "<center><hr width=75%><table width=75%><tr><td>"
-block_footer = "</td></tr></table></center>"
+block_header = "<center><table width=75%><tr><td>"
+block_footer = "</td></tr></table><hr width=75%></center>"
 
 description_header = "<center><table width=87%><tr><td>"
 description_footer = "</td></tr></table></center><br>"
@@ -59,6 +59,41 @@
 current_section = None
 
 
+# this function is used to sort the index. it's a simple lexicographical
+# sort, except that it places capital letters before small ones
+#
+def index_sort( s1, s2 ):
+
+    if not s1:
+        return -1
+
+    if not s2:
+        return 1
+
+    l1 = len(s1)
+    l2 = len(s2)
+    m1 = string.lower(s1)
+    m2 = string.lower(s2)
+
+    for i in range(l1):
+        if i >= l2 or m1[i] > m2[i]:
+            return 1
+        
+        if m1[i] < m2[i]:
+            return -1
+
+        if s1[i] < s2[i]:
+            return -1
+
+        if s1[i] > s2[i]:
+            return 1
+    
+    if l2 > l1:
+        return -1
+    
+    return 0    
+
+
 # The FreeType 2 reference is extracted from the source files. These contain
 # various comment blocks that follow one of the following formats:
 #
@@ -239,6 +274,10 @@
         return "UNKNOWN_PARA_IDENTIFIER!"
 
 
+    def get_words( self ):
+        return self.words[:]
+
+
     def dump( self, identifiers = None ):
         max_width = 50
         cursor    = 0
@@ -882,6 +921,50 @@
             else:
                 section.title = "UNKNOWN_SECTION_TITLE!"
 
+        # sort section elements according to the <order> marker when
+        # available
+        for section in self.sections.values():
+            order = section.block.find_content( "order" )
+            if order:
+                #sys.stderr.write( "<order> found at "+section.block.location()+'\n' )
+                order_list = []
+                for item in order.items:
+                    for element in item[1]:
+                        words = None
+                        try:
+                            words = element.get_words()
+                        except:
+                            sys.stderr.write( "WARNING:" +
+                                              section.block.location() +
+                                              ": invalid content in <order> marker\n" )
+                        if words:
+                            for word in words:
+                                block = self.identifiers.get( word )
+                                if block:
+                                    if block.section == section:
+                                        order_list.append( word )
+                                    else:
+                                        sys.stderr.write( "WARNING:" +
+                                                          section.block.location() +
+                                                          ": invalid reference to '"+word+"' defined in other section\n" )
+                                else:
+                                    sys.stderr.write( "WARNING:" +
+                                                      section.block.location() +
+                                                      ": invalid reference to '"+word+"'\n" )
+                                
+                # now sort the list of blocks according to the order list
+                #
+                new_list = []
+                old_list = section.list
+                for id in order_list:
+                    new_list.append( section.elements[id] )
+
+                for block in old_list:
+                    if not block.name in order_list:
+                        new_list.append( block )
+
+                section.list = new_list
+        
         # compute section filenames
         #
         for section in self.sections.values():
@@ -893,7 +976,7 @@
         # compute the sorted list of identifiers for the index
         #
         self.index = self.identifiers.keys()
-        self.index.sort()
+        self.index.sort( index_sort )
 
 
     def dump_html_toc( self ):
@@ -972,6 +1055,8 @@
         sys.stdout = old_stdout
 
 
+
+
 # Filter a given list of DocBlocks. Returns a new list
 # of DocBlock objects that only contains element whose
 # "type" (i.e. first marker) is in the "types" parameter.
@@ -1046,7 +1131,7 @@
     """parse a file and extract comments blocks from it"""
 
     file_list = []
-    sys.stderr.write( repr( sys.argv[1:] ) + '\n' )
+    #sys.stderr.write( repr( sys.argv[1:] ) + '\n' )
 
     for pathname in sys.argv[1:]:
         if string.find( pathname, '*' ) >= 0:
diff --git a/include/freetype/fttypes.h b/include/freetype/fttypes.h
index a31c00f..9dbf338 100644
--- a/include/freetype/fttypes.h
+++ b/include/freetype/fttypes.h
@@ -45,6 +45,23 @@
   /*    This section contains the basic data types defined by FreeType 2,  */
   /*    ranging from simple scalar types to font specific ones.            */
   /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_Byte FT_Char FT_Int FT_UInt FT_Short FT_UShort FT_Long          */
+  /*    FT_ULong FT_Fixed FT_Pointer FT_Vector FT_Matrix FT_BBox           */
+  /*                                                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /*                                                                       */
   /*************************************************************************/