summaryrefslogtreecommitdiffstats
path: root/docs/release/scripts/build/makelist.py
diff options
context:
space:
mode:
Diffstat (limited to 'docs/release/scripts/build/makelist.py')
0 files changed, 0 insertions, 0 deletions
='#n51'>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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
#!/usr/bin/python
##
## license:BSD-3-Clause
## copyright-holders:Aaron Giles, Andrew Gardner

from __future__ import with_statement

import sys

drivlist = []
sourcelist = []
filter_addlist = []
filter_removelist = []

def parse_file(srcfile):
    try:
        fp = open(srcfile, 'rt')
    except IOError:
        sys.stderr.write("Unable to open source file '%s'\n" % srcfile)
        return 1
    in_comment = 0
    linenum = 0
    curr_source = ''
    for line in fp.readlines():
        drivname = ''
        linenum+=1
        srcptr = 0
        while srcptr < len(line):
            c = line[srcptr]
            srcptr+=1
            if c==13 or c==10:
                if c==13 and line[srcptr]==10:
                    srcptr+=1
                continue
            if c==' ' or c==9:
                continue
            if in_comment==1 and c=='*' and line[srcptr]=='/' :
                srcptr+=1
                in_comment = 0
                continue
            if in_comment:
                continue
            if c=='/' and line[srcptr]=='*' :
                srcptr+=1
                in_comment = 1
                continue
            if c=='/' and line[srcptr]=='/' :
                break
            drivname += c
        drivname = drivname.strip()
        if len(drivname)>0:
            if drivname[0]=='#':
               sys.stderr.write("Importing drivers from '%s'\n" % drivname[1:])
               parse_file(drivname[1:])
               continue
            if drivname[0]=='@':
               curr_source= drivname[8:]
               continue
            if not all(((c >='a' and c<='z') or (c>='0' and c<='9') or c=='_') for c in drivname):
               sys.stderr.write("%s:%d - Invalid character in driver \"%s\"\n" % (srcfile,  linenum,  drivname))
               return 1
            else:
               if (curr_source == '') or (len(sourcelist)==0) or (curr_source in sourcelist):
                   drivlist.append(drivname)
    return 0

def parse_filter_file(srcfile):
    try:
        fp = open(srcfile, 'rt')
    except IOError:
        sys.stderr.write("Unable to open filter file '%s'\n" % srcfile)
        return 1
    in_comment = 0
    linenum = 0
    for line in fp.readlines():
        sourcename = ''
        linenum+=1
        srcptr = 0
        while srcptr < len(line):
            c = line[srcptr]
            srcptr+=1
            if c==13 or c==10:
                if c==13 and line[srcptr]==10:
                    srcptr+=1
                continue
            if c==' ' or c==9:
                continue
            if in_comment==1 and c=='*' and line[srcptr]=='/' :
                srcptr+=1
                in_comment = 0
                continue
            if in_comment:
                continue
            if c=='/' and line[srcptr]=='*' :
                srcptr+=1
                in_comment = 1
                continue
            if c=='/' and line[srcptr]=='/' :
                break
            sourcename += c
        sourcename = sourcename.strip()
        if len(sourcename)>0:
            if sourcename[0]=='#':
               sys.stderr.write("Importing drivers from '%s'\n" % sourcename[1:])
               parse_filter_file(sourcename[1:])
               continue
            if sourcename[0]=='+':
               filter_addlist.append(sourcename[1:])
               continue
            if sourcename[0]=='-':
               filter_removelist.append(sourcename[1:])
               continue
            if not all(((c >='a' and c<='z') or (c>='0' and c<='9') or c=='_' or c=='.' or c=='-') for c in sourcename):
               sys.stderr.write("%s:%d - Invalid character in driver \"%s\"\n" % (srcfile,  linenum,  sourcename))
               return 1
            else:               
               sourcelist.append(sourcename)
    return 0


if len(sys.argv) < 2 or len(sys.argv) > 3:
    print('Usage:')
    print('  makelist <source.lst> [<filter.flt>]')
    sys.exit(0)

if len(sys.argv) == 3:
    if parse_filter_file(sys.argv[2]) :
        sys.exit(1)
    sys.stderr.write("%d source file(s) found\n" % len(sourcelist))

if parse_file(sys.argv[1]) :
    sys.exit(1)

# output a count
if len(drivlist)==0 :
    sys.stderr.write("No drivers found\n")
    sys.exit(1)

for x in filter_addlist:
    drivlist.append(x)

drivlist = [x for x in drivlist if (x not in filter_removelist)]

sys.stderr.write("%d driver(s) found\n" % len(drivlist))

# add a reference to the ___empty driver
drivlist.append("___empty")

# start with a header
print('#include "emu.h"\n')
print('#include "drivenum.h"\n')

#output the list of externs first
for drv in sorted(drivlist):
    print("GAME_EXTERN(%s);" % drv)
print("")

# then output the array
print("const game_driver * const driver_list::s_drivers_sorted[%d] =" % len(drivlist))
print("{")
for drv in sorted(drivlist):
    print("\t&GAME_NAME(%s)," % drv)
print("};")
print("")

# also output a global count
print("std::size_t const driver_list::s_driver_count = %d;\n" % len(drivlist))