summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDimitri van Heesch <dimitri@stack.nl>2014-06-14 17:34:36 (GMT)
committerDimitri van Heesch <dimitri@stack.nl>2014-06-15 13:11:44 (GMT)
commit98a54c576eec4feda606156ae591854311d9cd0e (patch)
treeb84864b6b256b00ce2c8bc138e1f1e0b45a5f14c
parent3333536dfd3066f10183cbeb5a80faef232982fa (diff)
downloadDoxygen-98a54c576eec4feda606156ae591854311d9cd0e.zip
Doxygen-98a54c576eec4feda606156ae591854311d9cd0e.tar.gz
Doxygen-98a54c576eec4feda606156ae591854311d9cd0e.tar.bz2
Added build support for Python3+ and Python2.6+
-rwxr-xr-xconfigure20
-rw-r--r--doc/install.doc1
-rw-r--r--doc/translator.py135
-rwxr-xr-xsrc/configgen.py328
-rw-r--r--src/lang_cfg.py6
-rwxr-xr-xsrc/languages.py12
-rw-r--r--src/portable_c.c6
7 files changed, 262 insertions, 246 deletions
diff --git a/configure b/configure
index 0648c49..993fcdd 100755
--- a/configure
+++ b/configure
@@ -594,9 +594,10 @@ fi
# - check for python ----------------------------------------------------------
+python_version=0
printf " Checking for python... "
if test "$f_python" = NO; then
- python_names="python2 python"
+ python_names="python3 python2 python"
python_dirs="$bin_dirs /usr/bin /usr/local/bin /bin /sbin"
python_prog=NO
python_found=NO
@@ -604,26 +605,33 @@ if test "$f_python" = NO; then
for j in $python_dirs; do
if test -x "$j/$i"; then
python_found=YES
- if test `$j/$i -c "import sys; print sys.version_info[0]"` = 2; then
- python_prog="$j/$i"
+ if test `$j/$i -c "import sys; print(sys.version_info[0])"` = 3; then
+ python_prog="$j/$i";
+ python_version=`$j/$i -c "import platform; print(platform.python_version())"`;
break 2
+ elif test `$j/$i -c "import sys; print(sys.version_info[0])"` = 2; then
+ if test `$j/$i -c "import sys; print(sys.version_info[1])"` -ge 6; then
+ python_prog="$j/$i";
+ python_version=`$j/$i -c "import platform; print(platform.python_version())"`;
+ break 2
+ fi
fi
fi
done
done
- f_python="$python_prog"
+ f_python="$python_prog"
fi
if test "$f_python" = NO; then
if test "$python_found" = YES; then
- echo "version should be python 2."
+ echo "version should be python 2.6 or higher."
else
echo "not found!";
fi
echo
exit 2
fi
-echo "using $f_python";
+echo "using $f_python (version $python_version)";
# - check for perl ------------------------------------------------------------
diff --git a/doc/install.doc b/doc/install.doc
index 1219b7c..0620c94 100644
--- a/doc/install.doc
+++ b/doc/install.doc
@@ -556,6 +556,7 @@ open-source tools:
<li>GNU bison version 2.5 (Linux) and 2.3 (MacOSX)
<li>GNU make version 3.81
<li>Perl version 5.12
+<li>Python verion 2.7 and 3.4
<li>TeX Live 2009 (or later)
</ul>
diff --git a/doc/translator.py b/doc/translator.py
index 2e2a200..1f5fe6f 100644
--- a/doc/translator.py
+++ b/doc/translator.py
@@ -66,7 +66,7 @@
of translators introduced.
"""
-from __future__ import generators
+
import codecs
import os
import re
@@ -276,7 +276,7 @@ class Transl:
# If it is an unknown item, it can still be recognized
# here. Keywords and separators are the example.
if tokenId == 'unknown':
- if tokenDic.has_key(tokenStr):
+ if tokenStr in tokenDic:
tokenId = tokenDic[tokenStr]
elif tokenStr.isdigit():
tokenId = 'num'
@@ -329,7 +329,7 @@ class Transl:
tokenStr = c
tokenLineNo = lineNo
status = 8
- elif tokenDic.has_key(c): # known one-char token
+ elif c in tokenDic: # known one-char token
tokenId = tokenDic[c]
tokenStr = c
tokenLineNo = lineNo
@@ -424,7 +424,7 @@ class Transl:
if c.isspace():
pos += 1
status = 0 # tokenId may be determined later
- elif tokenDic.has_key(c): # separator, don't move pos
+ elif c in tokenDic: # separator, don't move pos
status = 0
else:
tokenStr += c # collect
@@ -457,7 +457,7 @@ class Transl:
# Always assume that the previous tokens were processed. Get
# the next one.
- tokenId, tokenStr, tokenLineNo = tokenIterator.next()
+ tokenId, tokenStr, tokenLineNo = next(tokenIterator)
# Process the token and never return back.
if status == 0: # waiting for the 'class' keyword.
@@ -588,7 +588,7 @@ class Transl:
while status != 777:
# Get the next token.
- tokenId, tokenStr, tokenLineNo = tokenIterator.next()
+ tokenId, tokenStr, tokenLineNo = next(tokenIterator)
if status == 0: # waiting for 'public:'
if tokenId == 'public':
@@ -616,7 +616,7 @@ class Transl:
prototype += ' ' + tokenStr
uniPrototype = tokenStr # start collecting the unified prototype
status = 4
- elif tokenId == 'tilde':
+ elif tokenId == 'tilde':
status = 4
else:
self.__unexpectedToken(status, tokenId, tokenLineNo)
@@ -670,7 +670,7 @@ class Transl:
elif status == 9: # after semicolon, produce the dic item
if tokenId == 'semic':
- assert(not resultDic.has_key(uniPrototype))
+ assert(uniPrototype not in resultDic)
resultDic[uniPrototype] = prototype
status = 2
else:
@@ -752,7 +752,7 @@ class Transl:
# Eat the rest of the source to cause closing the file.
while tokenId != 'eof':
- tokenId, tokenStr, tokenLineNo = tokenIterator.next()
+ tokenId, tokenStr, tokenLineNo = next(tokenIterator)
# Return the resulting dictionary with 'uniPrototype -> prototype'.
return resultDic
@@ -800,7 +800,7 @@ class Transl:
while status != 777:
# Get the next token.
- tokenId, tokenStr, tokenLineNo = tokenIterator.next()
+ tokenId, tokenStr, tokenLineNo = next(tokenIterator)
if status == 0: # waiting for 'public:'
if tokenId == 'public':
@@ -912,7 +912,7 @@ class Transl:
sys.stderr.write(msg)
assert False
- assert(not self.prototypeDic.has_key(uniPrototype))
+ assert(uniPrototype not in self.prototypeDic)
# Insert new dictionary item.
self.prototypeDic[uniPrototype] = prototype
status = 2 # body consumed
@@ -1056,12 +1056,12 @@ class Transl:
# For the required methods, update the dictionary of methods
# implemented by the adapter.
for protoUni in self.prototypeDic:
- if reqDic.has_key(protoUni):
+ if protoUni in reqDic:
# This required method will be marked as implemented
# by this adapter class. This implementation assumes
# that newer adapters do not reimplement any required
# methods already implemented by older adapters.
- assert(not adaptDic.has_key(protoUni))
+ assert(protoUni not in adaptDic)
adaptDic[protoUni] = (version, self.classId)
# Clear the dictionary object and the information related
@@ -1094,7 +1094,7 @@ class Transl:
# Eat the rest of the source to cause closing the file.
while True:
try:
- t = tokenIterator.next()
+ t = next(tokenIterator)
except StopIteration:
break
@@ -1106,7 +1106,7 @@ class Transl:
# Build the list of obsolete methods.
self.obsoleteMethods = []
for p in myDic:
- if not reqDic.has_key(p):
+ if p not in reqDic:
self.obsoleteMethods.append(p)
# Build the list of missing methods and the list of implemented
@@ -1114,7 +1114,7 @@ class Transl:
self.missingMethods = []
self.implementedMethods = []
for p in reqDic:
- if myDic.has_key(p):
+ if p in myDic:
self.implementedMethods.append(p)
else:
self.missingMethods.append(p)
@@ -1133,7 +1133,7 @@ class Transl:
adaptMinVersion = '9.9.99'
adaptMinClass = 'TranslatorAdapter_9_9_99'
for uniProto in self.missingMethods:
- if adaptDic.has_key(uniProto):
+ if uniProto in adaptDic:
version, cls = adaptDic[uniProto]
if version < adaptMinVersion:
adaptMinVersion = version
@@ -1342,9 +1342,9 @@ class TrManager:
sys.exit(1)
else:
lst = os.listdir(self.src_path)
- lst = filter(lambda x: x[:11] == 'translator_'
+ lst = [x for x in lst if x[:11] == 'translator_'
and x[-2:] == '.h'
- and x != 'translator_adapter.h', lst)
+ and x != 'translator_adapter.h']
# Build the object for the translator_xx.h files, and process the
# content of the file. Then insert the object to the dictionary
@@ -1366,7 +1366,7 @@ class TrManager:
# Build the auxiliary list with strings compound of the status,
# readable form of the language, and classId.
statLst = []
- for obj in self.__translDic.values():
+ for obj in list(self.__translDic.values()):
assert(obj.classId != 'Translator')
s = obj.status + '|' + obj.langReadable + '|' + obj.classId
statLst.append(s)
@@ -1384,9 +1384,10 @@ class TrManager:
# Build the list of tuples that contain (langReadable, obj).
# Sort it by readable name.
self.langLst = []
- for obj in self.__translDic.values():
+ for obj in list(self.__translDic.values()):
self.langLst.append((obj.langReadable, obj))
- self.langLst.sort(lambda a, b: cmp(a[0], b[0]))
+ #self.langLst.sort(lambda a, b: cmp(a[0], b[0]))
+ self.langLst.sort(key=lambda a: a[0])
# Create the list with readable language names. If the language has
# also the English-based version, modify the item by appending
@@ -1400,7 +1401,7 @@ class TrManager:
# of the English-based object. If the object exists, modify the
# name for the readable list of supported languages.
classIdEn = obj.classId + 'En'
- if self.__translDic.has_key(classIdEn):
+ if classIdEn in self.__translDic:
name += ' (+En)'
# Append the result name of the language, possibly with note.
@@ -1424,7 +1425,7 @@ class TrManager:
for name, obj in self.langLst:
if obj.status == 'En':
classId = obj.classId[:-2]
- if self.__translDic.has_key(classId):
+ if classId in self.__translDic:
self.numLang -= 1 # the couple will be counted as one
# Extract the version of Doxygen.
@@ -1433,7 +1434,7 @@ class TrManager:
f.close()
# Update the last modification time.
- for tr in self.__translDic.values():
+ for tr in list(self.__translDic.values()):
tim = tr.getmtime()
if tim > self.lastModificationTime:
self.lastModificationTime = tim
@@ -1472,7 +1473,7 @@ class TrManager:
probably used should be checked first and the resulting reduced
dictionary should be used for checking the next files (speed up).
"""
- lst_in = dic.keys() # identifiers to be searched for
+ lst_in = list(dic.keys()) # identifiers to be searched for
# Read content of the file as one string.
assert os.path.isfile(fname)
@@ -1497,7 +1498,7 @@ class TrManager:
# Build the dictionary of the required method prototypes with
# method identifiers used as keys.
trdic = {}
- for prototype in self.requiredMethodsDic.keys():
+ for prototype in list(self.requiredMethodsDic.keys()):
ri = prototype.split('(')[0]
identifier = ri.split()[1].strip()
trdic[identifier] = prototype
@@ -1665,12 +1666,12 @@ class TrManager:
# adapters.
if not self.script_argLst:
to_remove = {}
- for version, adaptClassId in self.adaptMethodsDic.values():
+ for version, adaptClassId in list(self.adaptMethodsDic.values()):
if version < adaptMinVersion:
to_remove[adaptClassId] = True
if to_remove:
- lst = to_remove.keys()
+ lst = list(to_remove.keys())
lst.sort()
plural = len(lst) > 1
note = 'Note: The adapter class'
@@ -1716,7 +1717,7 @@ class TrManager:
f.write('\n' + '=' * 70 + '\n')
f.write(fill(s) + '\n\n')
- keys = dic.keys()
+ keys = list(dic.keys())
keys.sort()
for key in keys:
f.write(' ' + dic[key] + '\n')
@@ -1726,7 +1727,7 @@ class TrManager:
f.write('\n' + '=' * 70)
f.write('\nDetails for translators (classes sorted alphabetically):\n')
- cls = self.__translDic.keys()
+ cls = list(self.__translDic.keys())
cls.sort()
for c in cls:
@@ -1764,28 +1765,28 @@ class TrManager:
lineReady = line != '' # when eof, then line == ''
line = line.strip() # eof should also behave as separator
- if line != u'' and line[0] == u'%': # skip the comment line
+ if line != '' and line[0] == '%': # skip the comment line
continue
if not inside: # if outside of the record
- if line != u'': # should be language identifier
+ if line != '': # should be language identifier
classId = line
maintainersLst = []
inside = True
# Otherwise skip empty line that do not act as separator.
else: # if inside the record
- if line == u'': # separator found
+ if line == '': # separator found
inside = False
else:
# If it is the first maintainer, create the empty list.
- if not self.__maintainersDic.has_key(classId):
+ if classId not in self.__maintainersDic:
self.__maintainersDic[classId] = []
# Split the information about the maintainer and append
# the tuple. The address may be prefixed '[unreachable]'
# or whatever '[xxx]'. This will be processed later.
- lst = line.split(u':', 1)
+ lst = line.split(':', 1)
assert(len(lst) == 2)
t = (lst[0].strip(), lst[1].strip())
self.__maintainersDic[classId].append(t)
@@ -1821,7 +1822,7 @@ class TrManager:
doctpl = f.read()
f.close()
- pos = doctpl.find(u'/***')
+ pos = doctpl.find('/***')
assert pos != -1
doctpl = doctpl[pos:]
@@ -1829,21 +1830,21 @@ class TrManager:
# document template.
tplDic = {}
- s = u'Do not edit this file. It was generated by the %s script.\n * Instead edit %s and %s' % (self.script_name, self.languageTplFileName, self.maintainersFileName)
+ s = 'Do not edit this file. It was generated by the %s script.\n * Instead edit %s and %s' % (self.script_name, self.languageTplFileName, self.maintainersFileName)
tplDic['editnote'] = s
tplDic['doxVersion'] = self.doxVersion
tplDic['supportedLangReadableStr'] = self.supportedLangReadableStr
tplDic['translatorReportFileName'] = self.translatorReportFileName
- ahref = u'<a href="../doc/' + self.translatorReportFileName
- ahref += u'"\n><code>doxygen/doc/' + self.translatorReportFileName
- ahref += u'</code></a>'
+ ahref = '<a href="../doc/' + self.translatorReportFileName
+ ahref += '"\n><code>doxygen/doc/' + self.translatorReportFileName
+ ahref += '</code></a>'
tplDic['translatorReportLink'] = ahref
tplDic['numLangStr'] = str(self.numLang)
# Define templates for HTML table parts of the documentation.
- htmlTableTpl = u'''\
+ htmlTableTpl = '''\
\\htmlonly
<table align="center" cellspacing="0" cellpadding="0" border="0">
<tr bgcolor="#000000">
@@ -1866,9 +1867,9 @@ class TrManager:
\\endhtmlonly
'''
htmlTableTpl = dedent(htmlTableTpl)
- htmlTrTpl = u'\n <tr bgcolor="#ffffff">%s\n </tr>'
- htmlTdTpl = u'\n <td>%s</td>'
- htmlTdStatusColorTpl = u'\n <td bgcolor="%s">%s</td>'
+ htmlTrTpl = '\n <tr bgcolor="#ffffff">%s\n </tr>'
+ htmlTdTpl = '\n <td>%s</td>'
+ htmlTdStatusColorTpl = '\n <td bgcolor="%s">%s</td>'
# Loop through transl objects in the order of sorted readable names
# and add generate the content of the HTML table.
@@ -1896,8 +1897,8 @@ class TrManager:
classId = obj.classId[:-2]
if classId in self.__translDic:
lang = self.__translDic[classId].langReadable
- mm = u'see the %s language' % lang
- ee = u'&nbsp;'
+ mm = 'see the %s language' % lang
+ ee = '&nbsp;'
if not mm and obj.classId in self.__maintainersDic:
# Build a string of names separated by the HTML break element.
@@ -1905,25 +1906,25 @@ class TrManager:
lm = []
for maintainer in self.__maintainersDic[obj.classId]:
name = maintainer[0]
- if name.startswith(u'--'):
- name = u'<span style="color: red; background-color: yellow">'\
- + name + u'</span>'
+ if name.startswith('--'):
+ name = '<span style="color: red; background-color: yellow">'\
+ + name + '</span>'
lm.append(name)
- mm = u'<br/>'.join(lm)
+ mm = '<br/>'.join(lm)
# The marked adresses (they start with the mark '[unreachable]',
# '[resigned]', whatever '[xxx]') will not be displayed at all.
# Only the mark will be used instead.
- rexMark = re.compile(ur'(?P<mark>\[.*?\])')
+ rexMark = re.compile(r'(?P<mark>\[.*?\])')
le = []
for maintainer in self.__maintainersDic[obj.classId]:
address = maintainer[1]
m = rexMark.search(address)
if m is not None:
- address = u'<span style="color: brown">'\
- + m.group(u'mark') + u'</span>'
+ address = '<span style="color: brown">'\
+ + m.group('mark') + '</span>'
le.append(address)
- ee = u'<br/>'.join(le)
+ ee = '<br/>'.join(le)
# Append the maintainer and e-mail elements.
lst.append(htmlTdTpl % mm)
@@ -1940,7 +1941,7 @@ class TrManager:
htmlTable = htmlTableTpl % (''.join(trlst))
# Define templates for LaTeX table parts of the documentation.
- latexTableTpl = ur'''
+ latexTableTpl = r'''
\latexonly
\footnotesize
\begin{longtable}{|l|l|l|l|}
@@ -1954,7 +1955,7 @@ class TrManager:
\endlatexonly
'''
latexTableTpl = dedent(latexTableTpl)
- latexLineTpl = u'\n' + r' %s & %s & {\tt\tiny %s} & %s \\'
+ latexLineTpl = '\n' + r' %s & %s & {\tt\tiny %s} & %s \\'
# Loop through transl objects in the order of sorted readable names
# and add generate the content of the LaTeX table.
@@ -1965,7 +1966,7 @@ class TrManager:
# in the table is placed explicitly above the first
# maintainer. Prepare the arguments for the LaTeX row template.
maintainers = []
- if self.__maintainersDic.has_key(obj.classId):
+ if obj.classId in self.__maintainersDic:
maintainers = self.__maintainersDic[obj.classId]
lang = obj.langReadable
@@ -1976,8 +1977,8 @@ class TrManager:
classId = obj.classId[:-2]
if classId in self.__translDic:
langNE = self.__translDic[classId].langReadable
- maintainer = u'see the %s language' % langNE
- email = u'~'
+ maintainer = 'see the %s language' % langNE
+ email = '~'
if not maintainer and (obj.classId in self.__maintainersDic):
lm = [ m[0] for m in self.__maintainersDic[obj.classId] ]
@@ -1989,27 +1990,27 @@ class TrManager:
# Use the template to produce the line of the table and insert
# the hline plus the constructed line into the table content.
# The underscore character must be escaped.
- trlst.append(u'\n \\hline')
+ trlst.append('\n \\hline')
s = latexLineTpl % (lang, maintainer, email, status)
- s = s.replace(u'_', u'\\_')
+ s = s.replace('_', '\\_')
trlst.append(s)
# List the other maintainers for the language. Do not set
# lang and status for them.
- lang = u'~'
- status = u'~'
+ lang = '~'
+ status = '~'
for m in maintainers[1:]:
maintainer = m[0]
email = m[1]
s = latexLineTpl % (lang, maintainer, email, status)
- s = s.replace(u'_', u'\\_')
+ s = s.replace('_', '\\_')
trlst.append(s)
# Join the table lines and insert into the template.
- latexTable = latexTableTpl % (u''.join(trlst))
+ latexTable = latexTableTpl % (''.join(trlst))
# Put the HTML and LaTeX parts together and define the dic item.
- tplDic['informationTable'] = htmlTable + u'\n' + latexTable
+ tplDic['informationTable'] = htmlTable + '\n' + latexTable
# Insert the symbols into the document template and write it down.
f = codecs.open(fDocName, 'w', 'utf-8')
diff --git a/src/configgen.py b/src/configgen.py
index 8ec0caa..04ffc8c 100755
--- a/src/configgen.py
+++ b/src/configgen.py
@@ -18,7 +18,6 @@ import re
import textwrap
from xml.dom import minidom, Node
-
def transformDocs(doc):
# join lines, unless it is an empty line
# remove doxygen layout constructs
@@ -112,7 +111,7 @@ def addValues(var, node):
if (n.nodeName == "value"):
if n.nodeType == Node.ELEMENT_NODE:
name = n.getAttribute('name')
- print " %s->addValue(\"%s\");" % (var, name)
+ print(" %s->addValue(\"%s\");" % (var, name))
def parseHeader(node,objName):
@@ -123,15 +122,15 @@ def parseHeader(node,objName):
if (n.getAttribute('doxyfile') != "0"):
doc += parseDocs(n)
docC = transformDocs(doc)
- print " %s->setHeader(" % (objName)
+ print(" %s->setHeader(" % (objName))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"" % (line)
- print " );"
+ print(" \"%s\"" % (line))
+ print(" );")
def prepCDocs(node):
@@ -201,7 +200,7 @@ def prepCDocs(node):
else:
if abspath == '1':
doc += "<br/>The file has to be specified with full path."
- elif file =='image':
+ elif format =='image':
abspath = node.getAttribute('abspath')
if defval != '':
if abspath != '1':
@@ -238,8 +237,8 @@ def parseOption(node):
setting = node.getAttribute('setting')
docC = prepCDocs(node);
if len(setting) > 0:
- print "#if %s" % (setting)
- print " //----"
+ print("#if %s" % (setting))
+ print(" //----")
if type == 'bool':
if len(adefval) > 0:
enabled = adefval
@@ -247,108 +246,108 @@ def parseOption(node):
enabled = "TRUE"
else:
enabled = "FALSE"
- print " cb = cfg->addBool("
- print " \"%s\"," % (name)
+ print(" cb = cfg->addBool(")
+ print(" \"%s\"," % (name))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"," % (line)
- print " %s" % (enabled)
- print " );"
+ print(" \"%s\"," % (line))
+ print(" %s" % (enabled))
+ print(" );")
if depends != '':
- print " cb->addDependency(\"%s\");" % (depends)
+ print(" cb->addDependency(\"%s\");" % (depends))
elif type == 'string':
- print " cs = cfg->addString("
- print " \"%s\"," % (name)
+ print(" cs = cfg->addString(")
+ print(" \"%s\"," % (name))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"" % (line)
- print " );"
+ print(" \"%s\"" % (line))
+ print(" );")
if defval != '':
- print " cs->setDefaultValue(\"%s\");" % (defval)
+ print(" cs->setDefaultValue(\"%s\");" % (defval))
if format == 'file':
- print " cs->setWidgetType(ConfigString::File);"
+ print(" cs->setWidgetType(ConfigString::File);")
elif format == 'image':
- print " cs->setWidgetType(ConfigString::Image);"
+ print(" cs->setWidgetType(ConfigString::Image);")
elif format == 'dir':
- print " cs->setWidgetType(ConfigString::Dir);"
+ print(" cs->setWidgetType(ConfigString::Dir);")
if depends != '':
- print " cs->addDependency(\"%s\");" % (depends)
+ print(" cs->addDependency(\"%s\");" % (depends))
elif type == 'enum':
- print " ce = cfg->addEnum("
- print " \"%s\"," % (name)
+ print(" ce = cfg->addEnum(")
+ print(" \"%s\"," % (name))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"," % (line)
- print " \"%s\"" % (defval)
- print " );"
+ print(" \"%s\"," % (line))
+ print(" \"%s\"" % (defval))
+ print(" );")
addValues("ce", node)
if depends != '':
- print " ce->addDependency(\"%s\");" % (depends)
+ print(" ce->addDependency(\"%s\");" % (depends))
elif type == 'int':
minval = node.getAttribute('minval')
maxval = node.getAttribute('maxval')
- print " ci = cfg->addInt("
- print " \"%s\"," % (name)
+ print(" ci = cfg->addInt(")
+ print(" \"%s\"," % (name))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"," % (line)
- print " %s,%s,%s" % (minval, maxval, defval)
- print " );"
+ print(" \"%s\"," % (line))
+ print(" %s,%s,%s" % (minval, maxval, defval))
+ print(" );")
if depends != '':
- print " ci->addDependency(\"%s\");" % (depends)
+ print(" ci->addDependency(\"%s\");" % (depends))
elif type == 'list':
- print " cl = cfg->addList("
- print " \"%s\"," % (name)
+ print(" cl = cfg->addList(")
+ print(" \"%s\"," % (name))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"" % (line)
- print " );"
+ print(" \"%s\"" % (line))
+ print(" );")
addValues("cl", node)
if depends != '':
- print " cl->addDependency(\"%s\");" % (depends)
+ print(" cl->addDependency(\"%s\");" % (depends))
if format == 'file':
- print " cl->setWidgetType(ConfigList::File);"
+ print(" cl->setWidgetType(ConfigList::File);")
elif format == 'dir':
- print " cl->setWidgetType(ConfigList::Dir);"
+ print(" cl->setWidgetType(ConfigList::Dir);")
elif format == 'filedir':
- print " cl->setWidgetType(ConfigList::FileAndDir);"
+ print(" cl->setWidgetType(ConfigList::FileAndDir);")
elif type == 'obsolete':
- print " cfg->addObsolete(\"%s\");" % (name)
+ print(" cfg->addObsolete(\"%s\");" % (name))
if len(setting) > 0:
- print "#else"
- print " cfg->addDisabled(\"%s\");" % (name)
- print "#endif"
+ print("#else")
+ print(" cfg->addDisabled(\"%s\");" % (name))
+ print("#endif")
def parseGroups(node):
name = node.getAttribute('name')
doc = node.getAttribute('docs')
- print "%s%s" % (" //-----------------------------------------",
- "----------------------------------")
- print " cfg->addInfo(\"%s\",\"%s\");" % (name, doc)
- print "%s%s" % (" //-----------------------------------------",
- "----------------------------------")
- print
+ print("%s%s" % (" //-----------------------------------------",
+ "----------------------------------"))
+ print(" cfg->addInfo(\"%s\",\"%s\");" % (name, doc))
+ print("%s%s" % (" //-----------------------------------------",
+ "----------------------------------"))
+ print("")
for n in node.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
parseOption(n)
@@ -360,16 +359,16 @@ def parseGroupCDocs(node):
name = n.getAttribute('id')
docC = prepCDocs(n);
if type != 'obsolete':
- print " doc->add("
- print " \"%s\"," % (name)
+ print(" doc->add(")
+ print(" \"%s\"," % (name))
rng = len(docC)
for i in range(rng):
line = docC[i]
if i != rng - 1: # since we go from 0 to rng-1
- print " \"%s\\n\"" % (line)
+ print(" \"%s\\n\"" % (line))
else:
- print " \"%s\"" % (line)
- print " );"
+ print(" \"%s\"" % (line))
+ print(" );")
def parseOptionDoc(node, first):
# Handling part for documentation
@@ -388,52 +387,52 @@ def parseOptionDoc(node, first):
if n.nodeType == Node.ELEMENT_NODE:
doc += parseDocs(n)
if (first):
- print " \\anchor cfg_%s" % (name.lower())
- print "<dl>"
- print ""
- print "<dt>\\c %s <dd>" % (name)
+ print(" \\anchor cfg_%s" % (name.lower()))
+ print("<dl>")
+ print("")
+ print("<dt>\\c %s <dd>" % (name))
else:
- print " \\anchor cfg_%s" % (name.lower())
- print "<dt>\\c %s <dd>" % (name)
- print " \\addindex %s" % (name)
- print doc
+ print(" \\anchor cfg_%s" % (name.lower()))
+ print("<dt>\\c %s <dd>" % (name))
+ print(" \\addindex %s" % (name))
+ print(doc)
if (type == 'enum'):
values = collectValues(node)
- print ""
- print "Possible values are: "
+ print("")
+ print("Possible values are: ")
rng = len(values)
for i in range(rng):
val = values[i]
if i == rng - 2:
- print "%s and " % (val)
+ print("%s and " % (val))
elif i == rng - 1:
- print "%s." % (val)
+ print("%s." % (val))
else:
- print "%s, " % (val)
+ print("%s, " % (val))
if (defval != ""):
- print ""
- print ""
- print "The default value is: <code>%s</code>." % (defval)
- print ""
+ print("")
+ print("")
+ print("The default value is: <code>%s</code>." % (defval))
+ print("")
elif (type == 'int'):
minval = node.getAttribute('minval')
maxval = node.getAttribute('maxval')
- print ""
- print ""
- print "%s: %s%s%s, %s: %s%s%s, %s: %s%s%s." % (
+ print("")
+ print("")
+ print("%s: %s%s%s, %s: %s%s%s, %s: %s%s%s." % (
" Minimum value", "<code>", minval, "</code>",
"maximum value", "<code>", maxval, "</code>",
- "default value", "<code>", defval, "</code>")
- print ""
+ "default value", "<code>", defval, "</code>"))
+ print("")
elif (type == 'bool'):
- print ""
- print ""
+ print("")
+ print("")
if (node.hasAttribute('altdefval')):
- print "The default value is: system dependent."
+ print("The default value is: system dependent.")
else:
- print "The default value is: <code>%s</code>." % (
- "YES" if (defval == "1") else "NO")
- print ""
+ print("The default value is: <code>%s</code>." % (
+ "YES" if (defval == "1") else "NO"))
+ print("")
elif (type == 'list'):
if format == 'string':
values = collectValues(node)
@@ -441,67 +440,67 @@ def parseOptionDoc(node, first):
for i in range(rng):
val = values[i]
if i == rng - 2:
- print "%s and " % (val)
+ print("%s and " % (val))
elif i == rng - 1:
- print "%s." % (val)
+ print("%s." % (val))
else:
- print "%s, " % (val)
- print ""
+ print("%s, " % (val))
+ print("")
elif (type == 'string'):
if format == 'dir':
if defval != '':
- print ""
- print "The default directory is: <code>%s</code>." % (
- defval)
+ print("")
+ print("The default directory is: <code>%s</code>." % (
+ defval))
elif format == 'file':
abspath = node.getAttribute('abspath')
if defval != '':
- print ""
+ print("")
if abspath != '1':
- print "The default file is: <code>%s</code>." % (
- defval)
+ print("The default file is: <code>%s</code>." % (
+ defval))
else:
- print "%s: %s%s%s." % (
+ print("%s: %s%s%s." % (
"The default file (with absolute path) is",
- "<code>",defval,"</code>")
+ "<code>",defval,"</code>"))
else:
if abspath == '1':
- print ""
- print "The file has to be specified with full path."
- elif file =='image':
+ print("")
+ print("The file has to be specified with full path.")
+ elif format =='image':
abspath = node.getAttribute('abspath')
if defval != '':
- print ""
+ print("")
if abspath != '1':
- print "The default image is: <code>%s</code>." % (
- defval)
+ print("The default image is: <code>%s</code>." % (
+ defval))
else:
- print "%s: %s%s%s." % (
+ print("%s: %s%s%s." % (
"The default image (with absolute path) is",
- "<code>",defval,"</code>")
+ "<code>",defval,"</code>"))
else:
if abspath == '1':
- print ""
- print "The image has to be specified with full path."
+ print("")
+ print("The image has to be specified with full path.")
else: # format == 'string':
if defval != '':
- print ""
- print "The default value is: <code>%s</code>." % (
- defval)
- print ""
+ print("")
+ print("The default value is: <code>%s</code>." % (
+ defval))
+ print("")
# depends handling
if (node.hasAttribute('depends')):
depends = node.getAttribute('depends')
- print ""
- print "%s \\ref cfg_%s \"%s\" is set to \\c YES." % (
- "This tag requires that the tag", depends.lower(), depends.upper())
+ print("")
+ print("%s \\ref cfg_%s \"%s\" is set to \\c YES." % (
+ "This tag requires that the tag", depends.lower(), depends.upper()))
return False
def parseGroupsDoc(node):
name = node.getAttribute('name')
doc = node.getAttribute('docs')
- print "\section config_%s %s" % (name.lower(), doc)
+ print("\section config_%s %s" % (name.lower(), doc))
# Start of list has been moved to the first option for better
# anchor placement
# print "<dl>"
@@ -511,7 +510,7 @@ def parseGroupsDoc(node):
if n.nodeType == Node.ELEMENT_NODE:
first = parseOptionDoc(n, first)
if (not first):
- print "</dl>"
+ print("</dl>")
def parseGroupsList(node, commandsList):
@@ -542,7 +541,7 @@ def parseHeaderDoc(node):
if (n.nodeName == "docs"):
if (n.getAttribute('documentation') != "0"):
doc += parseDocs(n)
- print doc
+ print(doc)
def parseFooterDoc(node):
@@ -552,7 +551,7 @@ def parseFooterDoc(node):
if (n.nodeName == "docs"):
if (n.getAttribute('documentation') != "0"):
doc += parseDocs(n)
- print doc
+ print(doc)
def main():
@@ -561,16 +560,17 @@ def main():
try:
doc = xml.dom.minidom.parse(sys.argv[2])
except Exception as inst:
- print >> sys.stderr
- print >> sys.stderr, inst
- print >> sys.stderr
+ sys.stdout = sys.stderr
+ print("")
+ print(inst)
+ print("")
sys.exit(1)
elem = doc.documentElement
if (sys.argv[1] == "-doc"):
- print "/* WARNING: This file is generated!"
- print " * Do not edit this file, but edit config.xml instead and run"
- print " * python configgen.py -doc config.xml to regenerate this file!"
- print " */"
+ print("/* WARNING: This file is generated!")
+ print(" * Do not edit this file, but edit config.xml instead and run")
+ print(" * python configgen.py -doc config.xml to regenerate this file!")
+ print(" */")
# process header
for n in elem.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
@@ -582,10 +582,10 @@ def main():
if n.nodeType == Node.ELEMENT_NODE:
if (n.nodeName == "group"):
commandsList = parseGroupsList(n, commandsList)
- print "\\secreflist"
+ print("\\secreflist")
for x in sorted(commandsList):
- print "\\refitem cfg_%s %s" % (x.lower(), x)
- print "\\endsecreflist"
+ print("\\refitem cfg_%s %s" % (x.lower(), x))
+ print("\\endsecreflist")
# process groups and options
for n in elem.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
@@ -597,24 +597,24 @@ def main():
if (n.nodeName == "footer"):
parseFooterDoc(n)
elif (sys.argv[1] == "-cpp"):
- print "/* WARNING: This file is generated!"
- print " * Do not edit this file, but edit config.xml instead and run"
- print " * python configgen.py -cpp config.xml to regenerate this file!"
- print " */"
- print ""
- print "#include \"configoptions.h\""
- print "#include \"config.h\""
- print "#include \"portable.h\""
- print "#include \"settings.h\""
- print ""
- print "void addConfigOptions(Config *cfg)"
- print "{"
- print " ConfigString *cs;"
- print " ConfigEnum *ce;"
- print " ConfigList *cl;"
- print " ConfigInt *ci;"
- print " ConfigBool *cb;"
- print ""
+ print("/* WARNING: This file is generated!")
+ print(" * Do not edit this file, but edit config.xml instead and run")
+ print(" * python configgen.py -cpp config.xml to regenerate this file!")
+ print(" */")
+ print("")
+ print("#include \"configoptions.h\"")
+ print("#include \"config.h\"")
+ print("#include \"portable.h\"")
+ print("#include \"settings.h\"")
+ print("")
+ print("void addConfigOptions(Config *cfg)")
+ print("{")
+ print(" ConfigString *cs;")
+ print(" ConfigEnum *ce;")
+ print(" ConfigList *cl;")
+ print(" ConfigInt *ci;")
+ print(" ConfigBool *cb;")
+ print("")
# process header
for n in elem.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
@@ -624,17 +624,17 @@ def main():
if n.nodeType == Node.ELEMENT_NODE:
if (n.nodeName == "group"):
parseGroups(n)
- print "}"
+ print("}")
elif (sys.argv[1] == "-wiz"):
- print "/* WARNING: This file is generated!"
- print " * Do not edit this file, but edit config.xml instead and run"
- print " * python configgen.py -wiz config.xml to regenerate this file!"
- print " */"
- print "#include \"configdoc.h\""
- print "#include \"docintf.h\""
- print ""
- print "void addConfigDocs(DocIntf *doc)"
- print "{"
+ print("/* WARNING: This file is generated!")
+ print(" * Do not edit this file, but edit config.xml instead and run")
+ print(" * python configgen.py -wiz config.xml to regenerate this file!")
+ print(" */")
+ print("#include \"configdoc.h\"")
+ print("#include \"docintf.h\"")
+ print("")
+ print("void addConfigDocs(DocIntf *doc)")
+ print("{")
for n in elem.childNodes:
if n.nodeType == Node.ELEMENT_NODE:
if (n.nodeName == "header"):
@@ -643,7 +643,7 @@ def main():
if n.nodeType == Node.ELEMENT_NODE:
if (n.nodeName == "group"):
parseGroupCDocs(n)
- print "}"
+ print("}")
if __name__ == '__main__':
main()
diff --git a/src/lang_cfg.py b/src/lang_cfg.py
index 329610f..efed05f 100644
--- a/src/lang_cfg.py
+++ b/src/lang_cfg.py
@@ -2,7 +2,7 @@ import sys
if (len(sys.argv) > 1):
if (sys.argv[1] == "ENONLY"):
- print "#define ENGLISH_ONLY"
+ print("#define ENGLISH_ONLY")
else:
- for x in xrange(1, len(sys.argv)):
- print "#define LANG_%s"%(sys.argv[x])
+ for x in range(1, len(sys.argv)):
+ print("#define LANG_%s"%(sys.argv[x]))
diff --git a/src/languages.py b/src/languages.py
index 7ce382a..2b02b3e 100755
--- a/src/languages.py
+++ b/src/languages.py
@@ -15,7 +15,7 @@ for f in files:
# generating file is lang_cfg.py
# the rules file has to output lang_cfg.h
#
-print """\
+print("""\
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="languages"
@@ -52,7 +52,7 @@ print """\
/>
</Values>
</EnumProperty>
-"""
+""")
#
# generate loop, English is mandatory (so cannot be chosen)
#
@@ -76,7 +76,7 @@ for f in new_list:
l1 = l.replace("-","")
# capatalize first letter
l = l.title()
- print """\
+ print("""\
<EnumProperty
Name="%s"
DisplayName="Use %s"
@@ -96,11 +96,11 @@ for f in new_list:
/>
</Values>
</EnumProperty>
- """ % (l1, l, l, l, f[1], l)
+ """ % (l1, l, l, l, f[1], l))
-print """\
+print("""\
</Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>
-"""
+""")
diff --git a/src/portable_c.c b/src/portable_c.c
index 05bb4bd..fb83b45 100644
--- a/src/portable_c.c
+++ b/src/portable_c.c
@@ -1,3 +1,9 @@
+#if defined(__APPLE__) || defined(macintosh)
+// define this before including iconv.h to avoid a mapping of
+// iconv_open and friends to libicon_open (done by mac ports),
+// while the symbols without 'lib' are linked from /usr/lib/libiconv
+#define LIBICONV_PLUG
+#endif
#include <iconv.h>
// These functions are implemented in a C file, because there are different