# 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("\n") quickref.write('''\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[len(files):]=glob.glob('opcodes/*/*.xml') files[len(files):]=glob.glob('vectorial/*.xml') files[len(files):]=glob.glob('utility/*.xml') files.sort() if files.index('opcodes/topXO.xml') >= 0: files.remove('opcodes/topXO.xml') headerText = text[0:text.find(' entryText = source.read().replace("\xef\xbb\xbf","") newfile = headerText + '' + entryText + '' newfile = newfile.replace("\r", "") source.close() #print text 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??? if (filename == 'opcodes' + os.sep + 'adds.xml'): entry = 'a + b (no rate restriction)\n' elif (filename == 'opcodes' + os.sep + 'dollar.xml'): entry = '$NAME\n' elif (filename == 'opcodes' + os.sep + 'divides.xml'): entry = 'a / b (no rate restriction)\n' elif (filename == 'opcodes' + os.sep + 'modulus.xml'): entry = 'a % b (no rate restriction)\n' elif (filename == 'opcodes' + os.sep + 'multiplies.xml'): entry = 'a * b (no rate restriction)\n' elif (filename == 'opcodes' + os.sep + 'opbitor.xml'): entry = 'a '+'| b (bitwise OR)\n' elif (filename == 'opcodes' + os.sep + 'opor.xml'): entry = 'a '+'|| b (logical OR; not audio-rate)\n' elif (filename == 'opcodes' + os.sep + 'raises.xml'): entry = 'a ^ b (b not audio-rate)\n' elif (filename == 'opcodes' + os.sep + 'subtracts.xml'): entry = 'a - b (no rate restriction)\n' # elif (filename == 'opcodes' + os.sep + 'assign.xml'): # entry = ''' '+'−a (no rate restriction) # '+'+a (no rate restriction)\n''' elif (filename == 'opcodes' + os.sep + 'ifdef.xml'): entry = '#ifdef NAME ....' + \ '#else ....' + \ '#end\n' elif (filename == 'opcodes' + os.sep + 'ifndef.xml'): entry='#ifndef NAME ....' + \ '#else ....' + \ '#end\n' elif (filename == 'opcodes' + os.sep + 'define.xml'): entry='#define NAME # replacement text #\n' + \ '#define NAME(a' b' c') # replacement text #\n' elif (filename == 'opcodes' + os.sep + 'include.xml'): entry='#include "filename"\n' elif (filename == 'opcodes' + os.sep + 'undef.xml'): entry='#undef NAME\n' elif (filename == 'opcodes' + os.sep + '0dbfs.xml'): entry = '0dbfs = iarg\n' else: synopsis = xmldoc.getElementsByTagName('synopsis') if (len(synopsis) != 0): # 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('') + 9:tmp.find('')] else: opcodename = "" tmp = tmp.replace('', '') entry += tmp.replace('', '') #if entry != '': #entry += '' else: #print "no synopsis tag for file: " + file entry = '' #print "Entry ------ ", entry info = xmldoc.getElementsByTagName('refentryinfo') if (len(info)!=0 and entry != ''): category = info[0].toxml() category = category[21:-23] #print filename, category else: print("no refentryinfo tag for file " + filename) category = "Miscellaneous" if (entry!=''): print(filename + " sent to Miscellaneous") desc = xmldoc.getElementsByTagName('refpurpose') description = "" if (len(desc)!=0 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 match == False: print(filename + "---- WARNING! No Category Match!") for i in range(len(categories)): if (len(entries[i])==0): print("No entries for category: "+categories[i]+"...Skipping") continue #quickref.write("\n") quickref.write("\n") count = 0 for j in range(len(entries[i])): newentry = entries[i].pop(0) #entry = entry.replace("$", "$") #entry = entry.replace(" ", " ") quickref.write("" + description) # + '\n') quickref.write(newentry[1] + "") # + '\n') quickref.write(newentry[0] + "\n") # + '\n') count += 1 #quickref.write("\n") quickref.write("\n") print(str(count) + " entries in category: " + categories[i]) quickref.write('\n') quickref.close() print(entries)