diff options
author | 2016-04-27 18:59:40 +1000 | |
---|---|---|
committer | 2016-04-27 18:59:40 +1000 | |
commit | bcd8558b02cb54eab92df98f14bf07221d6d358b (patch) | |
tree | c29211cecf250a791c074dfc3e1fc9a2d9a1a593 /docs/release/scripts/build | |
parent | 0d70c1f8cdb9e66fd7bc5bcad128e394a2345607 (diff) |
0.173 Release Fileshbmame173
Diffstat (limited to 'docs/release/scripts/build')
-rw-r--r-- | docs/release/scripts/build/complay.py | 69 | ||||
-rw-r--r-- | docs/release/scripts/build/makedep.py | 71 | ||||
-rw-r--r-- | docs/release/scripts/build/makelist.py | 81 | ||||
-rw-r--r-- | docs/release/scripts/build/msgfmt.py | 155 |
4 files changed, 262 insertions, 114 deletions
diff --git a/docs/release/scripts/build/complay.py b/docs/release/scripts/build/complay.py new file mode 100644 index 00000000000..eea6da0c099 --- /dev/null +++ b/docs/release/scripts/build/complay.py @@ -0,0 +1,69 @@ +#!/usr/bin/python +## +## license:BSD-3-Clause +## copyright-holders:Aaron Giles, Andrew Gardner + +from __future__ import with_statement + +import sys +import os +import zlib + +if len(sys.argv) < 4: + print('Usage:') + print(' complay <source.lay> <output.h> <varname>') + print('') + sys.exit(0) + +srcfile = sys.argv[1] +dstfile = sys.argv[2] +varname = sys.argv[3] +type = 'UINT8' + +try: + myfile = open(srcfile, 'rb') +except IOError: + sys.stderr.write("Unable to open source file '%s'\n" % srcfile) + sys.exit(-1) + +byteCount = os.path.getsize(srcfile) +compsize = 0 +compressiontype = 1 + +try: + dst = open(dstfile,'w') + dst.write('const %s %s_data[] =\n{\n\t' % ( type, varname)) + offs = 0 + with open(srcfile, "rb") as src: + while True: + chunk = src.read(byteCount) + if chunk: + compchunk = bytearray(zlib.compress(chunk, 9)) + compsize = len(compchunk) + for b in compchunk: + dst.write('%d' % b) + offs += 1 + if offs != compsize: + dst.write(',') + else: + break + dst.write('\n\t') + + dst.write('\n};\n') + +except IOError: + sys.stderr.write("Unable to open output file '%s'\n" % dstfile) + sys.exit(-1) + +try: + dst.write('extern const internal_layout %s;\n' % ( varname )) + dst.write('const internal_layout %s = { \n\t' % ( varname )) + dst.write('%d,%d,%d,%s_data\n' % ( byteCount, compsize, compressiontype, varname )) + dst.write('\n};\n') + + + dst.close() +except IOError: + sys.stderr.write("Unable to open output file '%s'\n" % dstfile) + sys.exit(-1) + diff --git a/docs/release/scripts/build/makedep.py b/docs/release/scripts/build/makedep.py index a80582d0161..2ce47d42cd0 100644 --- a/docs/release/scripts/build/makedep.py +++ b/docs/release/scripts/build/makedep.py @@ -167,45 +167,10 @@ def parse_file(root, srcfile, folder): return 0 def parse_file_for_drivers(root, srcfile): - try: - fp = open(root + srcfile, 'r') - except IOError: - sys.stderr.write("Unable to open source file '%s'\n" % srcfile) - return 1 - in_comment = 0 - linenum = 0 - for line in fp.readlines(): - content = '' - linenum+=1 - srcptr = 0 - while srcptr < len(line): - c = line[srcptr] - srcptr+=1 - if ord(c)==13 or ord(c)==10: - if ord(c)==13 and ord(line[srcptr])==10: - srcptr+=1 - continue - if c==' ' or ord(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 - content += c - content = content.strip() - if len(content)>0: - if content.startswith('COMP') or content.startswith('CONS') or content.startswith('GAME') or content.startswith('SYST') or content.startswith('GAMEL'): - splitname = content.split(',', 3) - if len(splitname)>1: - drivers.append(splitname[1]) + srcfile = srcfile.replace('\\','/') + if srcfile.startswith('src/mame/drivers'): + splitname = srcfile.split('/', 4) + drivers.append(splitname[3]) return 0 def parse_lua_file(srcfile): @@ -245,32 +210,13 @@ for filename in deps_files_included: for filename in sys.argv[2].rsplit(',') : parse_file_for_drivers(root,filename) - # display output if sys.argv[3]=='drivers': - # add a reference to the ___empty driver - drivers.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(drivers): - print("GAME_EXTERN(%s);" % drv) + print(drv) print("") - # then output the array - print("const game_driver * const driver_list::s_drivers_sorted[%d] =" % len(drivers)) - print("{") - for drv in sorted(drivers): - print("\t&GAME_NAME(%s)," % drv) - print("};") - print("") - - # also output a global count - print("int driver_list::s_driver_count = %d;\n" % len(drivers)) - if sys.argv[3]=='target': for line in components: sys.stdout.write("%s\n" % line) @@ -291,12 +237,9 @@ if sys.argv[3]=='target': sys.stdout.write(' MAME_DIR .. "src/lib/netlist",\n') sys.stdout.write(' MAME_DIR .. "3rdparty",\n') sys.stdout.write(' GEN_DIR .. "mame/layout",\n') + sys.stdout.write(' ext_includedir("zlib"),\n') + sys.stdout.write(' ext_includedir("flac"),\n') sys.stdout.write(' }\n') - sys.stdout.write(' if _OPTIONS["with-bundled-zlib"] then\n') - sys.stdout.write(' includedirs {\n') - sys.stdout.write(' MAME_DIR .. "3rdparty/zlib",\n') - sys.stdout.write(' }\n') - sys.stdout.write(' end\n') sys.stdout.write('\n') sys.stdout.write(' files{\n') for line in deps_files_included: diff --git a/docs/release/scripts/build/makelist.py b/docs/release/scripts/build/makelist.py index 144dc636c8d..a9b450474e2 100644 --- a/docs/release/scripts/build/makelist.py +++ b/docs/release/scripts/build/makelist.py @@ -8,6 +8,9 @@ from __future__ import with_statement import sys drivlist = [] +sourcelist = [] +filter_addlist = [] +filter_removelist = [] def parse_file(srcfile): try: @@ -17,6 +20,7 @@ def parse_file(srcfile): return 1 in_comment = 0 linenum = 0 + curr_source = '' for line in fp.readlines(): drivname = '' linenum+=1 @@ -49,19 +53,81 @@ def parse_file(srcfile): 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: - drivlist.append(drivname) + 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: +if len(sys.argv) < 2 or len(sys.argv) > 3: print('Usage:') - print(' makelist <source.lst>') + 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) @@ -70,7 +136,12 @@ if len(drivlist)==0 : sys.stderr.write("No drivers found\n") sys.exit(1) -sys.stderr.write("%d drivers found\n" % len(drivlist)) +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") diff --git a/docs/release/scripts/build/msgfmt.py b/docs/release/scripts/build/msgfmt.py index f28c2fcf6c6..deb02ae32b2 100644 --- a/docs/release/scripts/build/msgfmt.py +++ b/docs/release/scripts/build/msgfmt.py @@ -1,6 +1,6 @@ -#!/usr/bin/env python2 -# -*- coding: iso-8859-1 -*- -# Written by Martin v. Löwis <loewis@informatik.hu-berlin.de> +#! /usr/bin/env python +# -*- coding: utf-8 -*- +# Written by Martin v. Löwis <loewis@informatik.hu-berlin.de> """Generate binary message catalog from textual translation description. @@ -25,49 +25,71 @@ Options: Display version information and exit. """ +from __future__ import print_function import os import sys -import ast import getopt import struct import array +import re +import codecs +from email.parser import HeaderParser -__version__ = "1.1" +__version__ = "1.2" MESSAGES = {} - + def usage(code, msg=''): - print >> sys.stderr, __doc__ + print(__doc__, file=sys.stderr) if msg: - print >> sys.stderr, msg + print(msg, file=sys.stderr) sys.exit(code) - + def add(id, str, fuzzy): "Add a non-fuzzy translation to the dictionary." global MESSAGES if not fuzzy and str: MESSAGES[id] = str +def dequote(s): + if (s[0] == s[-1]) and s.startswith(("'", '"')): + return s[1:-1] + return s + +# decode_escapes from http://stackoverflow.com/a/24519338 +ESCAPE_SEQUENCE_RE = re.compile(r''' + ( \\U........ # 8-digit hex escapes + | \\u.... # 4-digit hex escapes + | \\x.. # 2-digit hex escapes + | \\[0-7]{1,3} # Octal escapes + | \\N\{[^}]+\} # Unicode characters by name + | \\[\\'"abfnrtv] # Single-character escapes + )''', re.UNICODE | re.VERBOSE) + +def decode_escapes(s): + def decode_match(match): + return codecs.decode(match.group(0), 'unicode-escape') + + return ESCAPE_SEQUENCE_RE.sub(decode_match, s) + - def generate(): "Return the generated output." global MESSAGES - keys = MESSAGES.keys() # the keys are sorted in the .mo file - keys.sort() + keys = sorted(MESSAGES.keys()) offsets = [] - ids = strs = '' + ids = strs = b'' for id in keys: # For each string, we need size and file offset. Each string is NUL # terminated; the NUL does not count into the size. offsets.append((len(ids), len(id), len(strs), len(MESSAGES[id]))) - ids += id + '\0' - strs += MESSAGES[id] + '\0' + ids += id + b'\0' + strs += MESSAGES[id] + b'\0' output = '' # The header is 7 32-bit unsigned integers. We don't use hash tables, so # the keys start right after the index tables. @@ -84,7 +106,7 @@ def generate(): voffsets += [l2, o2+valuestart] offsets = koffsets + voffsets output = struct.pack("Iiiiiii", - 0x950412deL, # Magic + 0x950412de, # Magic 0, # Version len(keys), # # of entries 7*4, # start of key index @@ -96,7 +118,7 @@ def generate(): return output - + def make(filename, outfile): ID = 1 STR = 2 @@ -110,18 +132,27 @@ def make(filename, outfile): outfile = os.path.splitext(infile)[0] + '.mo' try: - lines = open(infile).readlines() - except IOError, msg: - print >> sys.stderr, msg + lines = open(infile, 'rb').readlines() + except IOError as msg: + print(msg, file=sys.stderr) sys.exit(1) section = None fuzzy = 0 + empty = 0 + header_attempted = False + + # Start off assuming Latin-1, so everything decodes without failure, + # until we know the exact encoding + encoding = 'latin-1' + + # Start off assuming Latin-1, so everything decodes without failure, + # until we know the exact encoding + encoding = 'latin-1' # Parse the catalog - lno = 0 - for l in lines: - lno += 1 + for lno, l in enumerate(lines): + l = l.decode(encoding) # If we get a comment line after a msgstr, this is a new entry if l[0] == '#' and section == STR: add(msgid, msgstr, fuzzy) @@ -137,49 +168,83 @@ def make(filename, outfile): if l.startswith('msgid') and not l.startswith('msgid_plural'): if section == STR: add(msgid, msgstr, fuzzy) + if not msgid: + # See whether there is an encoding declaration + p = HeaderParser() + charset = p.parsestr(msgstr.decode(encoding)).get_content_charset() + if charset: + encoding = charset section = ID l = l[5:] - msgid = msgstr = '' + msgid = msgstr = b'' is_plural = False + if l.strip() == '""': + # Check if next line is msgstr. If so, this is a multiline msgid. + if lines[lno+1].decode(encoding).startswith('msgstr'): + # If this is the first empty msgid and is followed by msgstr, this is the header, which may contain the encoding declaration. + # Otherwise this file is not valid + if empty > 1: + print("Found multiple empty msgids on line " + str(lno) + ", not valid!") + empty += 1 # This is a message with plural forms elif l.startswith('msgid_plural'): if section != ID: - print >> sys.stderr, 'msgid_plural not preceded by msgid on %s:%d' %\ - (infile, lno) + print('msgid_plural not preceded by msgid on %s:%d' % (infile, lno), + file=sys.stderr) sys.exit(1) l = l[12:] - msgid += '\0' # separator of singular and plural + msgid += b'\0' # separator of singular and plural is_plural = True # Now we are in a msgstr section elif l.startswith('msgstr'): section = STR if l.startswith('msgstr['): if not is_plural: - print >> sys.stderr, 'plural without msgid_plural on %s:%d' %\ - (infile, lno) + print('plural without msgid_plural on %s:%d' % (infile, lno), + file=sys.stderr) sys.exit(1) l = l.split(']', 1)[1] if msgstr: - msgstr += '\0' # Separator of the various plural forms + msgstr += b'\0' # Separator of the various plural forms else: + if (l[6:].strip() == '""') and (empty == 1) and (not header_attempted): + header = "" + # parse up until next empty line = end of header + hdrno = lno + while(hdrno < len(lines)-1): + # This is a roundabout way to strip non-ASCII unicode characters from the header. + # As we are only parsing out the encoding, we don't need any unicode chars in it. + l = lines[hdrno+1].decode('unicode_escape').encode('ascii','ignore').decode(encoding) + if l.strip(): + header += decode_escapes(dequote(l.strip())) + else: + break + hdrno += 1 + # See whether there is an encoding declaration + if(hdrno > lno): + p = HeaderParser() + charset = p.parsestr(str(header)).get_content_charset() + header_attempted = True + if charset: + encoding = charset if is_plural: - print >> sys.stderr, 'indexed msgstr required for plural on %s:%d' %\ - (infile, lno) + print('indexed msgstr required for plural on %s:%d' % (infile, lno), + file=sys.stderr) sys.exit(1) l = l[6:] # Skip empty lines l = l.strip() if not l: continue - l = ast.literal_eval(l) + l = decode_escapes(dequote(l)) # strip quotes and replace newlines if present if section == ID: - msgid += l + msgid += l.encode(encoding) elif section == STR: - msgstr += l + msgstr += l.encode(encoding) else: - print >> sys.stderr, 'Syntax error on %s:%d' % (infile, lno), \ - 'before:' - print >> sys.stderr, l + print('Syntax error on %s:%d' % (infile, lno), \ + 'before:', file=sys.stderr) + print(l, file=sys.stderr) sys.exit(1) # Add last entry if section == STR: @@ -190,16 +255,16 @@ def make(filename, outfile): try: open(outfile,"wb").write(output) - except IOError,msg: - print >> sys.stderr, msg + except IOError as msg: + print(msg, file=sys.stderr) + - def main(): try: opts, args = getopt.getopt(sys.argv[1:], 'hVo:', ['help', 'version', 'output-file=']) - except getopt.error, msg: + except getopt.error as msg: usage(1, msg) outfile = None @@ -208,14 +273,14 @@ def main(): if opt in ('-h', '--help'): usage(0) elif opt in ('-V', '--version'): - print >> sys.stderr, "msgfmt.py", __version__ + print("msgfmt.py", __version__) sys.exit(0) elif opt in ('-o', '--output-file'): outfile = arg # do it if not args: - print >> sys.stderr, 'No input file given' - print >> sys.stderr, "Try `msgfmt --help' for more information." + print('No input file given', file=sys.stderr) + print("Try `msgfmt --help' for more information.", file=sys.stderr) return for filename in args: |