1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
# This script generates the opcode.xml file
# by Andres Cabrera June 2006-2010
# Licensed under the GPL licence version 3 or later
# modification for empty arg in command and links on opcodes by Francois Pinot February 2007
from __future__ import print_function
from xml.dom import minidom
import os, glob
# categories holds the list of valid categories for opcodes
from categories import categories
XO = False
opcodelist = []
outfilename = 'opcodes.xml'
quickref = open(outfilename,'w')
quickref.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- "
"Don't modify this file. It is generated automatically by opcodeparser.py\n"
"This file is distributed under the GNU Free Documentation Licence-->")
quickref.write("<opcodes>\n")
entries = []
for i in categories:
entries.append([])
manualfilename = 'manual.xml'
manual = open(manualfilename, 'r')
text = manual.read()
manual.close()
files = glob.glob('opcodes/*.xml')
files.extend(list(glob.glob('opcodes/*/*.xml')))
files.extend(list(glob.glob('vectorial/*.xml')))
files.extend(list(glob.glob('utility/*.xml')))
files.sort()
if files.index('opcodes/topXO.xml') >= 0:
files.remove('opcodes/topXO.xml')
headerText = text[0:text.find('<book id="index"')]
special_entries = {
'adds.xml': '<synopsis>a <opcodename>+</opcodename> b (no rate restriction)</synopsis>\n',
'dollar.xml': '<synopsis><opcodename>$NAME</opcodename></synopsis>\n<para/>',
'divides.xml': '<synopsis>a <opcodename>/</opcodename> b (no rate restriction)</synopsis>\n',
'modulus.xml': '<synopsis>a <opcodename>%</opcodename> b (no rate restriction)</synopsis>\n',
'multiplies.xml': '<synopsis>a <opcodename>*</opcodename> b (no rate restriction)</synopsis>\n',
'opbitor.xml': '<synopsis>a <opcodename>'+'|</opcodename> b (bitwise OR)</synopsis>\n',
'opor.xml': '<synopsis>a <opcodename>'+'||</opcodename> b (logical OR; not audio-rate)</synopsis>\n',
'raises.xml': '<synopsis>a <opcodename>^</opcodename> b (b not audio-rate)</synopsis>\n',
'substracts.xml': '<synopsis>a <opcodename>-</opcodename> b (no rate restriction)</synopsis>\n',
'ifdef.xml': ('<synopsis><opcodename>#ifdef</opcodename> NAME</synopsis><synopsis> ....</synopsis>\n'
'<synopsis><opcodename>#else</opcodename></synopsis><synopsis> ....</synopsis>\n'
'<synopsis><opcodename>#end</opcodename></synopsis>\n'),
'define.xml': ('<synopsis><opcodename>#define</opcodename> NAME # replacement text #</synopsis>\n'
'<synopsis><opcodename>#define</opcodename> NAME(a' b' c') # replacement text #</synopsis>\n'),
'include.xml': '<synopsis><opcodename>#include</opcodename> "filename"</synopsis>\n',
'undef.xml': '<synopsis><opcodename>#undef</opcodename> NAME</synopsis>\n',
'0dbfs.xml': '<synopsis><opcodename>0dbfs</opcodename> = iarg</synopsis>\n'
}
for i,filename in enumerate(files):
source = open(filename, 'r')
# Necessary to define entities>
entryText = source.read().replace("\xef\xbb\xbf","")
newfile = headerText + '<book id="index" lang="en">' + entryText + '</book>'
newfile = newfile.replace("\r", "")
source.close()
xmldoc = minidom.parseString(newfile)
xmldocId = xmldoc.documentElement.getAttribute('id')
# Some files need special treatment (adds, dollar, divides, modulus, multiplies,
# opbitor, opor, raises, subtracts, assign, ifdef, ifndef, define, include, undef)
# There must be a better way to avoid loosing the entities when parsing the XML
# file. Anyone???
folder, base = os.path.split(filename)
entry = special_entries.get(base)
if entry is None:
synopsis = xmldoc.getElementsByTagName('synopsis')
entry = ''
if synopsis:
# There can be more than 1 synopsis per file
for num in range(len(synopsis)):
tmp = synopsis[num].toxml()
if XO:
opcodename = tmp[tmp.find('<command>') + 9:tmp.find('</command>')]
else:
opcodename = ""
tmp = tmp.replace('<command>', '<opcodename>')
entry += tmp.replace('</command>', '</opcodename>')
# print "Entry ------ ", entry
info = xmldoc.getElementsByTagName('refentryinfo')
if info and entry:
category = info[0].toxml()
category = category[21:-23]
else:
print("no refentryinfo tag for file " + filename)
category = "Miscellaneous"
if entry:
print(filename + " sent to Miscellaneous")
desc = xmldoc.getElementsByTagName('refpurpose')
description = ""
if desc and entry:
description = desc[0].firstChild.toxml().strip()
# print(filename, category)
else:
print("no refpurpose tag for file " + filename)
# print(category)
match = False
for j, thiscategory in enumerate(categories):
if category == thiscategory:
entries[j].append([entry, description])
match = True
if not match:
print(filename + "---- WARNING! No Category Match!")
for i, category in enumerate(categories):
if not category:
print(f"No entries for category: {category} ...Skipping")
continue
quickref.write("<category name=\"" + categories[i] + "\">\n")
count = 0
for entry in entries[i]:
entrydef, description = entry
if not entrydef:
continue
# newentry = entry.pop(0)
# entry = entry.replace("$", "$")
# entry = entry.replace(" ", " ")
quickref.write("<opcode>")
if description:
quickref.write("<desc>")
quickref.write(description)
quickref.write("</desc>")
quickref.write(entrydef)
quickref.write("</opcode>\n")
count += 1
quickref.write("</category>\n")
print(str(count) + " entries in category: " + categories[i])
quickref.write('</opcodes>\n')
quickref.close()
print(entries)
|