* builds/module.mk: Replaced `xxx #' with `xxx$(space).

* builds/os2/detekt.mk, builds/win32/detekt.mk: Moved comment to
avoid trailing spaces in variable.
* builds/freetype.mk: Use $(D) instead of $D to make statement more
readable.

* docs/docmaker.py: Formatting.

* src/psaux/psauxmod.c: Fixed a broken inclusion of component
header files (an FT_FLAT_COMPILE test was missing).
* src/cache/ftcmanag.c (FTC_Manager_Done): Fixed a bug that caused
an occasional crash when the function was called (due to a dangling
pointer).
* src/base/ftsystem.c (FT_Done_Memory): Fixed an obvious bug:
The ANSI "free()" function was called instead of "memory->free()".
* docs/docmaker.py: Added section filtering, multi-page generation
(index page generation is still missing though).
* builds/unix/install.mk, builds/unix/ft2unix.h: The file "ft2unix.h"
is now installed as <ft2build.h> for Unix systems.  Note that we
still use the "freetype2/freetype" installation path for now.

* many files: Now using <ft2build.h> as the default build and setup
configuration file in all public headers.  Internal source files
still need some changes though.
* builds/devel/ft2build.h, builds/devel/ftoption.h: Created a new
Win32 developer builds.
builds/win32/w32-dev.mk: Changed the developer build targets to
"devel-gcc" and "devel-bcc" in order to be able to develop with the
Borland C++ compiler.
This commit is contained in:
Werner Lemberg 2000-12-06 16:31:30 +00:00
parent 940d30640f
commit 33d023680f
11 changed files with 224 additions and 179 deletions

View File

@ -1,36 +1,46 @@
2000-12-06 Werner Lemberg <wl@gnu.org>
* builds/module.mk: Replaced `xxx #' with `xxx$(space).
* builds/os2/detekt.mk, builds/win32/detekt.mk: Moved comment to
avoid trailing spaces in variable.
* builds/freetype.mk: Use $(D) instead of $D to make statement more
readable.
* docs/docmaker.py: Formatting.
2000-12-05 David Turner <david.turner@freetype.org> 2000-12-05 David Turner <david.turner@freetype.org>
* src/psaux/psauxmod.c: fixed a broken inclusion of component * src/psaux/psauxmod.c: Fixed a broken inclusion of component
header files (a FT_FLAT_COMPILE test was missing) header files (an FT_FLAT_COMPILE test was missing).
* src/cache/ftcmanag.c (FTC_Manager_Done): fixed a bug that caused * src/cache/ftcmanag.c (FTC_Manager_Done): Fixed a bug that caused
an occasional crash when the function was called (due to a dangling an occasional crash when the function was called (due to a dangling
pointer) pointer).
* src/base/ftsystem.c (FT_Done_Memory): fixed an obvious bug, * src/base/ftsystem.c (FT_Done_Memory): Fixed an obvious bug:
the ANSI "free" function was called, instead of "memory->free()" The ANSI "free()" function was called instead of "memory->free()".
* docs/docmaker.py: added section filtering, multi-page generation * docs/docmaker.py: Added section filtering, multi-page generation
(index page generation is still missing though) (index page generation is still missing though).
2000-12-04 David Turner <david.turner@freetype.org> 2000-12-04 David Turner <david.turner@freetype.org>
* builds/unix/install.mk, builds/unix/ft2unix.h: the file "ft2unix.h" * builds/unix/install.mk, builds/unix/ft2unix.h: The file "ft2unix.h"
is now installed as <ft2build.h> for Unix systems. Note that we still is now installed as <ft2build.h> for Unix systems. Note that we
use the "freetype2/freetype" installation path for now.. still use the "freetype2/freetype" installation path for now.
* many files: now using <ft2build.h> as the default build and setup * many files: Now using <ft2build.h> as the default build and setup
configuration file in all public headers. Internal source files still configuration file in all public headers. Internal source files
need some changes though.. still need some changes though.
* builds/devel/ft2build.h, builds/devel/ftoption.h: created a new * builds/devel/ft2build.h, builds/devel/ftoption.h: Created a new
directory to hold all development options for both the Unix and directory to hold all development options for both the Unix and
Win32 developer builds.. Win32 developer builds.
* builds/win32/detect.mk, builds/win32/w32-bccd.mk, * builds/win32/detect.mk, builds/win32/w32-bccd.mk,
builds/win32/w32-dev.mk: changed the developer build targets to builds/win32/w32-dev.mk: Changed the developer build targets to
"devel-gcc" and "devel-bcc" in order to be able to develop with "devel-gcc" and "devel-bcc" in order to be able to develop with the
the Borland C++ compiler. Borland C++ compiler.
2000-12-01 David Turner <david.turner@freetype.org> 2000-12-01 David Turner <david.turner@freetype.org>

View File

@ -92,13 +92,13 @@ SRC := $(TOP)$(SEP)src
BASE_DIR := $(SRC)$(SEP)base BASE_DIR := $(SRC)$(SEP)base
# The build header file used to define all public header file names # The build header file used to define all public header file names
# as macro # as macro.
# #
ifndef FT_BUILD_H ifndef FT_BUILD_H
FT_BUILD_H := $(TOP)$(SEP)include$(SEP)ft2build.h FT_BUILD_H := $(TOP)$(SEP)include$(SEP)ft2build.h
FTBUILD_CMD := FTBUILD_CMD :=
else else
FTBUILD_CMD = $DFT_BUILD_H=$(FT_BUILD_H) FTBUILD_CMD = $(D)FT_BUILD_H=$(FT_BUILD_H)
endif endif
# A few short-cuts in order to avoid typing $(SEP) all the time for the # A few short-cuts in order to avoid typing $(SEP) all the time for the

View File

@ -51,7 +51,7 @@ make_module_list: clean_module_list
# removing. # removing.
# #
ifneq ($(findstring $(PLATFORM),dos win32 win16 os2),) ifneq ($(findstring $(PLATFORM),dos win32 win16 os2),)
OPEN_MODULE := @echo # OPEN_MODULE := @echo$(space)
CLOSE_MODULE := >> $(subst $(SEP),$(HOSTSEP),$(MODULE_LIST)) CLOSE_MODULE := >> $(subst $(SEP),$(HOSTSEP),$(MODULE_LIST))
else else
OPEN_MODULE := @echo " OPEN_MODULE := @echo "
@ -64,7 +64,7 @@ endif
OPEN_DRIVER := $(OPEN_MODULE)FT_USE_MODULE( OPEN_DRIVER := $(OPEN_MODULE)FT_USE_MODULE(
CLOSE_DRIVER := )$(CLOSE_MODULE) CLOSE_DRIVER := )$(CLOSE_MODULE)
ECHO_DRIVER := @echo "* module: # ECHO_DRIVER := @echo "* module:$(space)
ECHO_DRIVER_DESC := ( ECHO_DRIVER_DESC := (
ECHO_DRIVER_DONE := )" ECHO_DRIVER_DONE := )"

View File

@ -21,7 +21,8 @@ ifeq ($(PLATFORM),ansi)
COPY := copy COPY := copy
DELETE := del DELETE := del
CONFIG_FILE := os2-gcc.mk # gcc-emx by default # gcc-emx by default
CONFIG_FILE := os2-gcc.mk
SEP := / SEP := /
# additionally, we provide hooks for various other compilers # additionally, we provide hooks for various other compilers

View File

@ -46,7 +46,8 @@ ifeq ($(PLATFORM),ansi)
DELETE := del DELETE := del
COPY := copy COPY := copy
CONFIG_FILE := w32-gcc.mk # gcc Makefile by default # gcc Makefile by default
CONFIG_FILE := w32-gcc.mk
SEP := / SEP := /
ifeq ($(firstword $(CC)),cc) ifeq ($(firstword $(CC)),cc)
CC := gcc CC := gcc

View File

@ -97,7 +97,7 @@ current_section = None
# /* */ # /* */
# /**************************/ # /**************************/
# #
# Each block contains a list of markers, each one can be followed by # Each block contains a list of markers; each one can be followed by
# some arbitrary text or a list of fields. Here's an example: # some arbitrary text or a list of fields. Here's an example:
# #
# <Struct> # <Struct>
@ -111,18 +111,18 @@ current_section = None
# y :: vertical coordinate # y :: vertical coordinate
# #
# #
# This example defines three markers: 'Struct', 'Description' & 'Fields' # This example defines three markers: 'Struct', 'Description' & 'Fields'.
# The first two markers contain arbitrary text, while the last one contains # The first two markers contain arbitrary text, while the last one contains
# a list of field # a list of fields.
# #
# each field is simple of the format: WORD :: TEXT.... # Each field is simple of the format: WORD :: TEXT...
# #
# Note that typically, each comment block is followed by some source # Note that typically each comment block is followed by some source
# code declaration that may need to be kept in the reference.. # code declaration that may need to be kept in the reference.
# #
# Note that markers can alternatively be written as "@MARKER:" # Note that markers can alternatively be written as "@MARKER:"
# instead of "<MAKRER>". All marker identifiers are converted to # instead of "<MARKER>". All marker identifiers are converted to
# lower case during parsing, in order to simply sorting.. # lower case during parsing in order to simply sorting.
# #
# We associate with each block the following source lines that do not # We associate with each block the following source lines that do not
# begin with a comment. For example, the following: # begin with a comment. For example, the following:
@ -142,7 +142,7 @@ current_section = None
# #
# #
# will only keep the first two lines of sources with # will only keep the first two lines of sources with
# the "blabla" block # the "blabla" block.
# #
# However, the comment will be kept, with following source lines # However, the comment will be kept, with following source lines
# if it contains a starting '#' or '@' as in: # if it contains a starting '#' or '@' as in:
@ -155,16 +155,16 @@ current_section = None
############################################################################## #############################################################################
# #
# The DocCode class is used to store source code lines # The DocCode class is used to store source code lines
# #
# self.lines contains a set of source code lines that will # 'self.lines' contains a set of source code lines that will
# be dumped as HTML in a <PRE> tag. # be dumped as HTML in a <PRE> tag.
# #
# the object is filled line by line by the parser, it strips the # The object is filled line by line by the parser; it strips the
# leading "margin" space from each input line before storing it # leading "margin" space from each input line before storing it
# in self.lines # in 'self.lines'.
# #
class DocCode: class DocCode:
@ -172,8 +172,10 @@ class DocCode:
self.lines = [] self.lines = []
self.margin = margin self.margin = margin
def add( self, line ): def add( self, line ):
# remove margin whitespace # remove margin whitespace
#
if string.strip( line[: self.margin] ) == "": if string.strip( line[: self.margin] ) == "":
line = line[self.margin :] line = line[self.margin :]
self.lines.append( line ) self.lines.append( line )
@ -184,13 +186,16 @@ class DocCode:
print "--" + line print "--" + line
print "" print ""
def get_identifier( self ): def get_identifier( self ):
# this function should never be called # this function should never be called
return "UNKNOWN_CODE_IDENTIFIER!!" #
return "UNKNOWN_CODE_IDENTIFIER!"
def dump_html( self ): def dump_html( self ):
# clean the last empty lines # clean the last empty lines
#
l = len( self.lines ) - 1 l = len( self.lines ) - 1
while l > 0 and string.strip( self.lines[l - 1] ) == "": while l > 0 and string.strip( self.lines[l - 1] ) == "":
l = l - 1 l = l - 1
@ -201,48 +206,50 @@ class DocCode:
print code_footer print code_footer
############################################################################## #############################################################################
# #
# The DocParagraph is used to store text paragraphs # The DocParagraph is used to store text paragraphs.
# self.words is simply a list of words for the paragraph # 'self.words' is simply a list of words for the paragraph.
# #
# the paragraph is filled line by line by the parser.. # The paragraph is filled line by line by the parser.
# #
class DocParagraph: class DocParagraph:
def __init__( self ): def __init__( self ):
self.words = [] self.words = []
def add( self, line ): def add( self, line ):
# get rid of unwanted spaces in the paragraph # Get rid of unwanted spaces in the paragraph.
# #
# the following line is the same as # The following line is the same as
# #
# self.words.extend( string.split( line ) ) # self.words.extend( string.split( line ) )
# #
# but older Python versions don't have the `extend' attribute # but older Python versions don't have the `extend' attribute.
# #
last = len(self.words) last = len(self.words)
self.words[last:last] = string.split( line ) self.words[last:last] = string.split( line )
# this function is used to retrieve the first word of a given
# paragraph.. # This function is used to retrieve the first word of a given
# paragraph.
#
def get_identifier( self ): def get_identifier( self ):
if self.words: if self.words:
return self.words[0] return self.words[0]
# should never happen # should never happen
return "UNKNOWN_PARA_IDENTIFIER!!" #
return "UNKNOWN_PARA_IDENTIFIER!"
def dump( self ): def dump( self ):
max_width = 50 max_width = 50
cursor = 0 cursor = 0
line = "" line = ""
for word in self.words: for word in self.words:
if cursor + len( word ) + 1 > max_width: if cursor + len( word ) + 1 > max_width:
print line print line
cursor = 0 cursor = 0
@ -254,7 +261,7 @@ class DocParagraph:
if cursor > 0: if cursor > 0:
print line print line
#print "§" #for debugging only # print "§" # for debugging only
def dump_string( self ): def dump_string( self ):
@ -268,43 +275,43 @@ class DocParagraph:
def dump_html( self ): def dump_html( self ):
print para_header print para_header
self.dump() self.dump()
print para_footer print para_footer
########################################################################### #############################################################################
# #
# DocContent is used to store the content of a given marker. # DocContent is used to store the content of a given marker.
# #
# the "self.items" list contains (field,elements) record, where # The "self.items" list contains (field,elements) records, where
# "field" corresponds to a given structure fields or function # "field" corresponds to a given structure fields or function
# parameter (indicated by a "::"), or NULL for a normal section # parameter (indicated by a "::"), or NULL for a normal section
# of text/code # of text/code.
# #
# hence, the following example: # Hence, the following example:
# #
# <MyMarker> # <MyMarker>
# this is an example of what can be put in a content section, # This is an example of what can be put in a content section,
# #
# a second line of example text # A second line of example text.
# #
# x :: a simple test field, with some content # x :: A simple test field, with some contents.
# y :: even before, this field has some code content # y :: Even before, this field has some code contents.
# { # {
# y = x+2; # y = x+2;
# } # }
# #
# should be stored as # should be stored as
#
# [ ( None, [ DocParagraph, DocParagraph] ), # [ ( None, [ DocParagraph, DocParagraph] ),
# ( "x", [ DocParagraph ] ), # ( "x", [ DocParagraph ] ),
# ( "y", [ DocParagraph, DocCode ] ) ] # ( "y", [ DocParagraph, DocCode ] ) ]
# #
# in self.items # in 'self.items'.
# #
# the DocContent object is entirely built at creation time, you must # The DocContent object is entirely built at creation time; you must
# pass a list of input text lines lin the "lines_list" parameter.. # pass a list of input text lines in the "lines_list" parameter.
# #
# #
class DocContent: class DocContent:
@ -323,7 +330,6 @@ class DocContent:
field = None # the current field field = None # the current field
for aline in lines_list: for aline in lines_list:
if code_mode == 0: if code_mode == 0:
line = string.lstrip( aline ) line = string.lstrip( aline )
l = len( line ) l = len( line )
@ -331,8 +337,8 @@ class DocContent:
# if the line is empty, this is the end of the current # if the line is empty, this is the end of the current
# paragraph # paragraph
#
if l == 0 or line == '{': if l == 0 or line == '{':
if paragraph: if paragraph:
elements.append( paragraph ) elements.append( paragraph )
paragraph = None paragraph = None
@ -351,21 +357,24 @@ class DocContent:
# the token `::' # the token `::'
# #
if len( words ) >= 2 and words[1] == "::": if len( words ) >= 2 and words[1] == "::":
# start a new field - complete current paragraph if any # start a new field - complete current paragraph if any
#
if paragraph: if paragraph:
elements.append( paragraph ) elements.append( paragraph )
paragraph = None paragraph = None
# append previous "field" to self.items # append previous "field" to self.items
#
self.items.append( ( field, elements ) ) self.items.append( ( field, elements ) )
# start new field and elements list # start new field and elements list
#
field = words[0] field = words[0]
elements = [] elements = []
words = words[2 :] words = words[2 :]
# append remaining words to current paragraph # append remaining words to current paragraph
#
if len( words ) > 0: if len( words ) > 0:
line = string.join( words ) line = string.join( words )
if not paragraph: if not paragraph:
@ -373,14 +382,15 @@ class DocContent:
paragraph.add( line ) paragraph.add( line )
else: else:
# we're in code mode.. # we're in code mode...
#
line = aline line = aline
# the code block ends with a line that has a single '}' on it # the code block ends with a line that has a single '}' on
# that is located at the same column that the opening # it that is located at the same column that the opening
# accolade.. # accolade...
#
if line == " " * code_margin + '}': if line == " " * code_margin + '}':
if code: if code:
elements.append( code ) elements.append( code )
code = None code = None
@ -389,6 +399,7 @@ class DocContent:
code_margin = 0 code_margin = 0
# otherwise, add the line to the current paragraph # otherwise, add the line to the current paragraph
#
else: else:
if not code: if not code:
code = DocCode() code = DocCode()
@ -410,7 +421,8 @@ class DocContent:
return element.get_identifier() return element.get_identifier()
# should never happen # should never happen
return "UNKNOWN_CONTENT_IDENTIFIER!!" #
return "UNKNOWN_CONTENT_IDENTIFIER!"
def get_title( self ): def get_title( self ):
@ -420,7 +432,8 @@ class DocContent:
return element.dump_string() return element.dump_string()
# should never happen # should never happen
return "UNKNOWN_CONTENT_TITLE" #
return "UNKNOWN_CONTENT_TITLE!"
def dump( self ): def dump( self ):
@ -435,8 +448,8 @@ class DocContent:
if field: if field:
print "</field> " print "</field> "
def dump_html( self ):
def dump_html( self ):
n = len( self.items ) n = len( self.items )
in_table = 0 in_table = 0
@ -445,13 +458,13 @@ class DocContent:
field = item[0] field = item[0]
if not field: if not field:
if in_table: if in_table:
print "</td></tr></table>" print "</td></tr></table>"
in_table = 0 in_table = 0
for element in item[1]: for element in item[1]:
element.dump_html() element.dump_html()
else: else:
if not in_table: if not in_table:
print "<table cellpadding=4><tr valign=top><td>" print "<table cellpadding=4><tr valign=top><td>"
@ -474,15 +487,15 @@ class DocContent:
# The DocBlock class is used to store a given comment block. It contains # The DocBlock class is used to store a given comment block. It contains
# a list of markers, as well as a list of contents for each marker. # a list of markers, as well as a list of contents for each marker.
# #
# "self.items" is a list of ( marker, contents ) elements, where # "self.items" is a list of (marker, contents) elements, where
# 'marker' is a lowercase marker string, and 'contents' is a DocContent # 'marker' is a lowercase marker string, and 'contents' is a DocContent
# object # object.
# #
# "self.source" is simply a list of text lines taken from the # "self.source" is simply a list of text lines taken from the
# uncommented source itself.. # uncommented source itself.
# #
# finally, "self.identifier" is a simple identifier used to # Finally, "self.identifier" is a simple identifier used to
# uniquely identify the block # uniquely identify the block.
# #
class DocBlock: class DocBlock:
@ -529,19 +542,20 @@ class DocBlock:
self.source = source_line_list self.source = source_line_list
# now retrieve block name when possible # now retrieve block name when possible
#
if self.items: if self.items:
first = self.items[0] first = self.items[0]
self.name = first[1].get_identifier() self.name = first[1].get_identifier()
# this function is used to add a new element to self.items # This function adds a new element to 'self.items'.
# 'marker' is a marker string, or None # 'marker' is a marker string, or None.
# 'lines' is a list of text lines used to compute a list of # 'lines' is a list of text lines used to compute a list of
# DocContent objects # DocContent objects.
# #
def add( self, marker, lines ): def add( self, marker, lines ):
# remove the first and last empty lines from the content list # remove the first and last empty lines from the content list
#
l = len( lines ) l = len( lines )
if l > 0: if l > 0:
i = 0 i = 0
@ -552,10 +566,12 @@ class DocBlock:
lines = lines[i : l] lines = lines[i : l]
l = len( lines ) l = len( lines )
# add a new marker only if its marker and its content list aren't empty # add a new marker only if its marker and its content list
# aren't empty
#
if l > 0 and marker: if l > 0 and marker:
content = DocContent(lines) content = DocContent( lines )
self.items.append( ( string.lower(marker), content ) ) self.items.append( ( string.lower( marker ), content ) )
if not self.identifier: if not self.identifier:
self.identifier = content.get_identifier() self.identifier = content.get_identifier()
@ -567,27 +583,28 @@ class DocBlock:
return None return None
def dump( self ): def dump( self ):
for i in range( len( self.items ) ): for i in range( len( self.items ) ):
print "[" + self.items[i][0] + "]" print "[" + self.items[i][0] + "]"
content = self.items[i][1] content = self.items[i][1]
content.dump() content.dump()
def dump_html( self ):
types = [ 'type', 'struct', 'functype', 'function', 'constant', def dump_html( self ):
types = [ 'type', 'struct', 'functype', 'function', 'constant',
'enum', 'macro' ] 'enum', 'macro' ]
if not self.items: if not self.items:
return return
# start of a block # start of a block
#
print block_header print block_header
print "<h2>" + self.identifier + "</h2>" print "<h2>" + self.identifier + "</h2>"
# print source code # print source code
#
if not self.source: if not self.source:
return return
@ -601,8 +618,8 @@ class DocBlock:
print source_footer print source_footer
# dump each (marker,content) element # dump each (marker,content) element
#
for element in self.items: for element in self.items:
marker = element[0] marker = element[0]
content = element[1] content = element[1]
@ -611,7 +628,7 @@ class DocBlock:
content.dump_html() content.dump_html()
print "</ul>" print "</ul>"
elif not (marker in types): elif not ( marker in types ):
print "<h4>" + marker + "</h4>" print "<h4>" + marker + "</h4>"
print "<ul>" print "<ul>"
content.dump_html() content.dump_html()
@ -624,10 +641,9 @@ class DocBlock:
###################################################################################### ######################################################################################
# #
# The DocSection class is used to store a given documentation section.
# #
# The DocSection class is used to store a given documentation section # Each section is made of an identifier, an abstract and a description.
#
# Each section is made of an identifier, an abstract and a description
# #
# For example, look at: # For example, look at:
# #
@ -638,29 +654,31 @@ class DocBlock:
# #
# <Description> # <Description>
# FreeType defines several basic data types for all its # FreeType defines several basic data types for all its
# operations.... # operations...
# #
class DocSection: class DocSection:
def __init__( self, block ): def __init__( self, block ):
self.block = block self.block = block
self.name = string.lower(block.name) self.name = string.lower( block.name )
self.abstract = block.find_content("abstract") self.abstract = block.find_content( "abstract" )
self.description = block.find_content("description") self.description = block.find_content( "description" )
title_content = block.find_content("title") title_content = block.find_content( "title" )
if title_content: if title_content:
self.title = title_content.get_title() self.title = title_content.get_title()
else: else:
self.title = "UNKNOWN SECTION TITLE !!" self.titles = "UNKNOWN_SECTION_TITLE!"
self.elements = {} self.elements = {}
self.list = [] self.list = []
self.filename = self.name + ".html" self.filename = self.name + ".html"
#sys.stderr.write( "new section '"+self.name+"'" ) # sys.stderr.write( "new section '" + self.name + "'" )
def add_element( self, block ): def add_element( self, block ):
# check that we don't have a duplicate element in this # check that we don't have a duplicate element in this
# section.. # section
#
if self.elements.has_key( block.name ): if self.elements.has_key( block.name ):
sys.stderr.write( "ERROR - duplicate element definition for " + sys.stderr.write( "ERROR - duplicate element definition for " +
"'" + block.name + "' in section '" + "'" + block.name + "' in section '" +
@ -675,60 +693,65 @@ class DocSection:
"""make an HTML page from a given DocSection""" """make an HTML page from a given DocSection"""
# print HTML header # print HTML header
#
print html_header print html_header
# print title # print title
#
print section_title_header print section_title_header
print self.title print self.title
print section_title_footer print section_title_footer
# print description # print description
#
print block_header print block_header
self.description.dump_html() self.description.dump_html()
print block_footer print block_footer
# print elements # print elements
#
for element in self.list: for element in self.list:
element.dump_html() element.dump_html()
print html_footer print html_footer
class DocSectionList: class DocSectionList:
def __init__( self ): def __init__( self ):
self.sections = {} self.sections = {}
self.list = [] self.list = []
self.current_section = None self.current_section = None
def append_section( self, block ): def append_section( self, block ):
name = block.name name = block.name
abstract = block.find_content( "abstract" ) abstract = block.find_content( "abstract" )
if self.sections.has_key(name): if self.sections.has_key( name ):
# there is already a section with this name in our # There is already a section with this name in our
# list. We'll try to complete it. # list. We'll try to complete it.
#
section = self.sections[name] section = self.sections[name]
if section.abstract: if section.abstract:
# this section already has an abstract defined, # This section already has an abstract defined;
# simply check that the new section doesn't # simply check that the new section doesn't
# provide a new one. # provide a new one.
#
if abstract: if abstract:
stderr.write( "ERROR - duplicate section definition" + stderr.write( "ERROR - duplicate section definition" +
" for '" + name + "'" ) " for '" + name + "'" )
sys.quit() sys.quit()
else: else:
# the old section didn't contain an abstract, we're # The old section didn't contain an abstract; we're
# now going to replace it # now going to replace it.
#
section.abstract = abstract section.abstract = abstract
section.description = block.find_content( "description" ) section.description = block.find_content( "description" )
else: else:
# a new section # a new section
#
section = DocSection( block ) section = DocSection( block )
self.sections[name] = section self.sections[name] = section
self.list.append( section ) self.list.append( section )
@ -743,12 +766,13 @@ class DocSectionList:
self.append_section( block ) self.append_section( block )
elif self.current_section: elif self.current_section:
#sys.stderr.write( " new block" ) # sys.stderr.write( " new block" )
self.current_section.add_element( block ) self.current_section.add_element( block )
def dump_html_toc( self ): def dump_html_toc( self ):
# dump an html table of contents # dump an html table of contents
#
print html_header print html_header
print "<center><h1>Table of Contents</h1></center>" print "<center><h1>Table of Contents</h1></center>"
@ -756,7 +780,7 @@ class DocSectionList:
print "<center><table cellpadding=5>" print "<center><table cellpadding=5>"
for section in self.list: for section in self.list:
print "<tr valign=top><td>" print "<tr valign=top><td>"
print '<a href="'+section.filename+'">' print '<a href="' + section.filename + '">'
print section.title print section.title
print "</a></td><td>" print "</a></td><td>"
section.abstract.dump_html() section.abstract.dump_html()
@ -779,12 +803,11 @@ class DocSectionList:
# filter a given list of DocBlocks. Returns a new list # Filter a given list of DocBlocks. Returns a new list
# of DocBlock objects that only contains element whose # of DocBlock objects that only contains element whose
# "type" (i.e. first marker) is in the "types" parameter # "type" (i.e. first marker) is in the "types" parameter.
# #
def filter_blocks( block_list, types ): def filter_blocks( block_list, types ):
new_list = [] new_list = []
for block in block_list: for block in block_list:
if block.items: if block.items:
@ -796,8 +819,8 @@ def filter_blocks( block_list, types ):
return new_list return new_list
# perform a lexicographical comparison of two DocBlock # Perform a lexicographical comparison of two DocBlock
# objects. Returns -1, 0 or 1 # objects. Returns -1, 0 or 1.
# #
def block_lexicographical_compare( b1, b2 ): def block_lexicographical_compare( b1, b2 ):
if not b1.identifier: if not b1.identifier:
@ -805,8 +828,9 @@ def block_lexicographical_compare( b1, b2 ):
if not b2.identifier: if not b2.identifier:
return 1 return 1
id1 = string.lower(b1.identifier) id1 = string.lower( b1.identifier )
id2 = string.lower(b2.identifier) id2 = string.lower( b2.identifier )
if id1 < id2: if id1 < id2:
return -1 return -1
elif id1 == id2: elif id1 == id2:
@ -828,7 +852,6 @@ def block_make_list( source_block_list ):
# dump a list block as a single HTML page # dump a list block as a single HTML page
# #
def dump_html_1( block_list ): def dump_html_1( block_list ):
print html_header print html_header
for block in block_list: for block in block_list:
@ -846,7 +869,7 @@ def make_block_list():
block = [] block = []
format = 0 format = 0
# we use "format" to store the state of our parser: # We use "format" to store the state of our parser:
# #
# 0 - wait for beginning of comment # 0 - wait for beginning of comment
# 1 - parse comment format 1 # 1 - parse comment format 1
@ -855,18 +878,17 @@ def make_block_list():
# 4 - wait for beginning of source (or comment ??) # 4 - wait for beginning of source (or comment ??)
# 5 - process source # 5 - process source
# #
comment = [] comment = []
source = [] source = []
state = 0 state = 0
for line in fileinput.input(): for line in fileinput.input():
l = len( line ) l = len( line )
if l > 0 and line[l - 1] == '\012': if l > 0 and line[l - 1] == '\012':
line = line[0 : l - 1] line = line[0 : l - 1]
# stripped version of the line # stripped version of the line
#
line2 = string.strip( line ) line2 = string.strip( line )
l = len( line2 ) l = len( line2 )
@ -888,7 +910,6 @@ def make_block_list():
format = 0 format = 0
if format == 0: #### wait for beginning of comment #### if format == 0: #### wait for beginning of comment ####
if l > 3 and line2[0 : 3] == '/**': if l > 3 and line2[0 : 3] == '/**':
i = 3 i = 3
while i < l and line2[i] == '*': while i < l and line2[i] == '*':
@ -916,20 +937,23 @@ def make_block_list():
# #
elif format == 1: elif format == 1:
# if the line doesn't begin with a "*", something went # If the line doesn't begin with a "*", something went
# wrong, and we must exit, and forget the current block.. # wrong, and we must exit, and forget the current block.
#
if l == 0 or line2[0] != '*': if l == 0 or line2[0] != '*':
block = [] block = []
format = 0 format = 0
# otherwise, we test for an end of block, which is an # Otherwise, we test for an end of block, which is an
# arbitrary number of '*', followed by '/' # arbitrary number of '*', followed by '/'.
#
else: else:
i = 1 i = 1
while i < l and line2[i] == '*': while i < l and line2[i] == '*':
i = i + 1 i = i + 1
# test for the end of the block # test for the end of the block
#
if i < l and line2[i] == '/': if i < l and line2[i] == '/':
if block != []: if block != []:
format = 4 format = 4
@ -937,6 +961,7 @@ def make_block_list():
format = 0 format = 0
else: else:
# otherwise simply append line to current block # otherwise simply append line to current block
#
block.append( line2[i:] ) block.append( line2[i:] )
continue continue
@ -947,8 +972,9 @@ def make_block_list():
# #
elif format == 2: elif format == 2:
# if the line doesn't begin with '/*' and end with '*/', # If the line doesn't begin with '/*' and end with '*/',
# this is the end of the format 2 format # this is the end of the format 2 format.
#
if l < 4 or line2[: 2] != '/*' or line2[-2 :] != '*/': if l < 4 or line2[: 2] != '/*' or line2[-2 :] != '*/':
if block != []: if block != []:
format = 4 format = 4
@ -957,9 +983,11 @@ def make_block_list():
else: else:
# remove the start and end comment delimiters, then # remove the start and end comment delimiters, then
# right-strip the line # right-strip the line
#
line2 = string.rstrip( line2[2 : -2] ) line2 = string.rstrip( line2[2 : -2] )
# check for end of a format2 block, i.e. a run of '*' # check for end of a format2 block, i.e. a run of '*'
#
if string.count( line2, '*' ) == l - 4: if string.count( line2, '*' ) == l - 4:
if block != []: if block != []:
format = 4 format = 4
@ -967,28 +995,24 @@ def make_block_list():
format = 0 format = 0
else: else:
# otherwise, add the line to the current block # otherwise, add the line to the current block
#
block.append( line2 ) block.append( line2 )
continue continue
if format >= 4: #### source processing #### if format >= 4: #### source processing ####
if l > 0: if l > 0:
format = 5 format = 5
if format == 5: if format == 5:
source.append( line ) source.append( line )
if format >= 4: if format >= 4:
list.append( [block, source] ) list.append( [block, source] )
return list return list
# This function is only used for debugging # This function is only used for debugging
# #
def dump_block_list( list ): def dump_block_list( list ):
@ -1003,7 +1027,6 @@ def dump_block_list( list ):
print "---------the end-----------------------" print "---------the end-----------------------"
def main( argv ): def main( argv ):
"""main program loop""" """main program loop"""
sys.stderr.write( "extracting comment blocks from sources...\n" ) sys.stderr.write( "extracting comment blocks from sources...\n" )
@ -1017,14 +1040,14 @@ def main( argv ):
section_list.dump_html_toc() section_list.dump_html_toc()
section_list.dump_html_sections() section_list.dump_html_sections()
#list2 = filter_blocks( list, ['type','macro','enum','constant', 'functype'] ) # list2 = filter_blocks( list, ['type','macro','enum','constant', 'functype'] )
#list2 = list # list2 = list
#list2.sort( block_lexicographical_compare ) # list2.sort( block_lexicographical_compare )
#dump_html_1( list2 ) # dump_html_1( list2 )
#dump_doc_blocks( list ) # dump_doc_blocks( list )
#dump_block_lists( list ) # dump_block_lists( list )
#dump_html_1( list ) # dump_html_1( list )
# If called from the command line # If called from the command line

View File

@ -162,19 +162,19 @@
/* */ /* */
/*************************************************************************/ /*************************************************************************/
/* don't add spaces around arguments to FT_CONFIG_FILE! */ /* don't add spaces around arguments to FT2_CONFIG_FILE! */
/* configuration files */ /* configuration files */
#ifndef FT_CONFIG_CONFIG_H #ifndef FT_CONFIG_CONFIG_H
# define FT_CONFIG_CONFIG_H FT2_CONFIG_FILE(ftconfig.h) #define FT_CONFIG_CONFIG_H FT2_CONFIG_FILE(ftconfig.h)
#endif #endif
#ifndef FT_CONFIG_OPTIONS_H #ifndef FT_CONFIG_OPTIONS_H
# define FT_CONFIG_OPTIONS_H FT2_CONFIG_FILE(ftoption.h) #define FT_CONFIG_OPTIONS_H FT2_CONFIG_FILE(ftoption.h)
#endif #endif
#ifndef FT_CONFIG_MODULES_H #ifndef FT_CONFIG_MODULES_H
# define FT_CONFIG_MODULES_H FT2_CONFIG_FILE(ftmodule.h) #define FT_CONFIG_MODULES_H FT2_CONFIG_FILE(ftmodule.h)
#endif #endif
/* public headers */ /* public headers */

View File

@ -16,14 +16,13 @@
/* */ /* */
/* */ /* */
/* This file corresponds to the default "ft2build.h" file for */ /* This file corresponds to the default "ft2build.h" file for */
/* FreeType 2. It uses the "freetype" include root. */ /* FreeType 2. It uses the "freetype" include root. */
/* */ /* */
/* Note that specific platforms might use a different configurations. */ /* Note that specific platforms might use a different configurations. */
/* For example, on Unix, the "freetype2" include root is used, with */ /* For example, on Unix, the "freetype2" include root is used, with */
/* a specific "ft2build.h" used to take care of this. The latter */ /* a specific "ft2build.h" used to take care of this. The latter */
/* looks like the following: */ /* looks like the following: */
/* */ /* */
/* */
/* #ifndef __FT_BUILD_UNIX_H__ */ /* #ifndef __FT_BUILD_UNIX_H__ */
/* #define __FT_BUILD_UNIX_H__ */ /* #define __FT_BUILD_UNIX_H__ */
/* */ /* */
@ -32,7 +31,6 @@
/* */ /* */
/* #endif // __FT_BUILD_UNIX_H__ */ /* #endif // __FT_BUILD_UNIX_H__ */
/* */ /* */
/* */
/***************************************************************************/ /***************************************************************************/

View File

@ -17,13 +17,17 @@
#ifdef FT_FLAT_COMPILE #ifdef FT_FLAT_COMPILE
# include "psauxmod.h"
# include "psobjs.h" #include "psauxmod.h"
# include "t1decode.h" #include "psobjs.h"
#include "t1decode.h"
#else #else
# include <psaux/psauxmod.h>
# include <psaux/psobjs.h> #include <psaux/psauxmod.h>
# include <psaux/t1decode.h> #include <psaux/psobjs.h>
#include <psaux/t1decode.h>
#endif #endif

View File

@ -21,9 +21,13 @@
#include <freetype/internal/ftdebug.h> #include <freetype/internal/ftdebug.h>
#ifdef FT_FLAT_COMPILE #ifdef FT_FLAT_COMPILE
# include "psobjs.h"
#include "psobjs.h"
#else #else
# include <psaux/psobjs.h>
#include <psaux/psobjs.h>
#endif #endif

View File

@ -23,11 +23,15 @@
#ifdef FT_FLAT_COMPILE #ifdef FT_FLAT_COMPILE
# include "t1decode.h"
# include "psobjs.h" #include "t1decode.h"
#include "psobjs.h"
#else #else
# include <psaux/t1decode.h>
# include <psaux/psobjs.h> #include <psaux/t1decode.h>
#include <psaux/psobjs.h>
#endif #endif