From 98a54c576eec4feda606156ae591854311d9cd0e Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Sat, 14 Jun 2014 19:34:36 +0200 Subject: Added build support for Python3+ and Python2.6+ --- configure | 20 +++- doc/install.doc | 1 + doc/translator.py | 135 +++++++++++----------- src/configgen.py | 328 +++++++++++++++++++++++++++--------------------------- src/lang_cfg.py | 6 +- src/languages.py | 12 +- src/portable_c.c | 6 + 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:
  • GNU bison version 2.5 (Linux) and 2.3 (MacOSX)
  • GNU make version 3.81
  • Perl version 5.12 +
  • Python verion 2.7 and 3.4
  • TeX Live 2009 (or later) 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'doxygen/doc/' + self.translatorReportFileName - ahref += u'' + ahref = 'doxygen/doc/' + self.translatorReportFileName + ahref += '' tplDic['translatorReportLink'] = ahref tplDic['numLangStr'] = str(self.numLang) # Define templates for HTML table parts of the documentation. - htmlTableTpl = u'''\ + htmlTableTpl = '''\ \\htmlonly @@ -1866,9 +1867,9 @@ class TrManager: \\endhtmlonly ''' htmlTableTpl = dedent(htmlTableTpl) - htmlTrTpl = u'\n %s\n ' - htmlTdTpl = u'\n ' - htmlTdStatusColorTpl = u'\n ' + htmlTrTpl = '\n %s\n ' + htmlTdTpl = '\n ' + htmlTdStatusColorTpl = '\n ' # 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' ' + mm = 'see the %s language' % lang + ee = ' ' 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''\ - + name + u'' + if name.startswith('--'): + name = ''\ + + name + '' lm.append(name) - mm = u'
    '.join(lm) + mm = '
    '.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\[.*?\])') + rexMark = re.compile(r'(?P\[.*?\])') le = [] for maintainer in self.__maintainersDic[obj.classId]: address = maintainer[1] m = rexMark.search(address) if m is not None: - address = u''\ - + m.group(u'mark') + u'' + address = ''\ + + m.group('mark') + '' le.append(address) - ee = u'
    '.join(le) + ee = '
    '.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 += "
    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 "
    " - print "" - print "
    \\c %s
    " % (name) + print(" \\anchor cfg_%s" % (name.lower())) + print("
    ") + print("") + print("
    \\c %s
    " % (name)) else: - print " \\anchor cfg_%s" % (name.lower()) - print "
    \\c %s
    " % (name) - print " \\addindex %s" % (name) - print doc + print(" \\anchor cfg_%s" % (name.lower())) + print("
    \\c %s
    " % (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: %s." % (defval) - print "" + print("") + print("") + print("The default value is: %s." % (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", "", minval, "", "maximum value", "", maxval, "", - "default value", "", defval, "") - print "" + "default value", "", defval, "")) + 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: %s." % ( - "YES" if (defval == "1") else "NO") - print "" + print("The default value is: %s." % ( + "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: %s." % ( - defval) + print("") + print("The default directory is: %s." % ( + defval)) elif format == 'file': abspath = node.getAttribute('abspath') if defval != '': - print "" + print("") if abspath != '1': - print "The default file is: %s." % ( - defval) + print("The default file is: %s." % ( + defval)) else: - print "%s: %s%s%s." % ( + print("%s: %s%s%s." % ( "The default file (with absolute path) is", - "",defval,"") + "",defval,"")) 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: %s." % ( - defval) + print("The default image is: %s." % ( + defval)) else: - print "%s: %s%s%s." % ( + print("%s: %s%s%s." % ( "The default image (with absolute path) is", - "",defval,"") + "",defval,"")) 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: %s." % ( - defval) - print "" + print("") + print("The default value is: %s." % ( + 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 "
    " @@ -511,7 +510,7 @@ def parseGroupsDoc(node): if n.nodeType == Node.ELEMENT_NODE: first = parseOptionDoc(n, first) if (not first): - print "
    " + print("
    ") 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("""\ -""" +""") # # 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("""\ - """ % (l1, l, l, l, f[1], l) + """ % (l1, l, l, l, f[1], l)) -print """\ +print("""\ -""" +""") 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 // These functions are implemented in a C file, because there are different -- cgit v0.12
    %s%s
    %s%s