Allow '-' as a filename to mean standard input or output.

As part of this change, all assembler chat is being pushed to
standard error, where it probably should have been in the first place.
Scripts and batchfiles that relied on capturing the output of Ophis
will need to capture stderr now instead.
This commit is contained in:
Michael C. Martin 2012-05-28 19:19:08 -07:00
parent f8bc917601
commit 741390e955
5 changed files with 53 additions and 36 deletions

View File

@ -7,6 +7,8 @@
# You may use, modify, and distribute this file under the MIT
# license: See README for details.
import sys
count = 0
currentpoint = "<Top Level>"
@ -15,10 +17,10 @@ def log(err):
the global error count."""
global count
count = count+1
print currentpoint+": "+err
print>>sys.stderr, currentpoint+": "+err
def report():
"Print out the number of errors."
if count == 0: print "No errors"
elif count == 1: print "1 error"
else: print str(count)+" errors"
if count == 0: print>>sys.stderr, "No errors"
elif count == 1: print>>sys.stderr, "1 error"
else: print>>sys.stderr, str(count)+" errors"

View File

@ -6,6 +6,7 @@ import Ophis.Errors as Err
import Ophis.Opcodes as Ops
import Ophis.IR as IR
import Ophis.CmdLine as Cmd
import sys
import os
# Copyright 2002-2012 Michael C. Martin and additional contributors.
@ -309,11 +310,18 @@ def parse_line(ppt, lexemelist):
def parse_file(ppt, filename):
"Loads an Ophis source file, and returns an IR list."
Err.currentpoint = ppt
if Cmd.verbose > 0: print "Loading "+filename
if Cmd.verbose > 0:
if filename != '-':
print>>sys.stderr, "Loading "+filename
else:
print>>sys.stderr, "Loading from standard input"
try:
f = file(filename)
linelist = f.readlines()
f.close()
if filename != '-':
f = file(filename)
linelist = f.readlines()
f.close()
else:
linelist = sys.stdin.readlines()
pptlist = ["%s:%d" % (filename, i+1) for i in range(len(linelist))]
lexlist = map(lex, pptlist, linelist)
IRlist = map(parse_line, pptlist, lexlist)

View File

@ -61,6 +61,6 @@ def dump():
global macros
for mac in macros:
body = macros[mac]
print "Macro: "+mac
for node in body: print node
print ""
print>>sys.stderr, "Macro: "+mac
for node in body: print>>sys.stderr, node
print>>sys.stderr, ""

View File

@ -20,13 +20,13 @@ import Ophis.Opcodes
def usage():
"Prints a usage message and quits."
print "Usage:"
print "\tOphis [options] infile outfile"
print ""
print "Options:"
print "\t-6510 Allow 6510 undocumented opcodes"
print "\t-65c02 Enable 65c02 extensions"
print "\t-v n Set verbosity to n (0-4, 1=default)"
print>>sys.stderr, "Usage:"
print>>sys.stderr, "\tOphis [options] infile outfile"
print>>sys.stderr, ""
print>>sys.stderr, "Options:"
print>>sys.stderr, "\t-6510 Allow 6510 undocumented opcodes"
print>>sys.stderr, "\t-65c02 Enable 65c02 extensions"
print>>sys.stderr, "\t-v n Set verbosity to n (0-4, 1=default)"
sys.exit(1)
def run_all(infile, outfile):
@ -55,10 +55,16 @@ def run_all(infile, outfile):
if Err.count == 0:
try:
output = file(outfile, 'wb')
if outfile == '-':
output = sys.stdout
else:
output = file(outfile, 'wb')
output.write("".join(map(chr, a.output)))
output.flush()
if outfile != '-':
output.close()
except IOError:
print "Could not write to "+outfile
print>>sys.stderr, "Could not write to "+outfile
else:
Err.report()
@ -77,9 +83,9 @@ def run_ophis():
Ophis.CmdLine.verbose = int(x)
reading_arg = 0
except ValueError:
print "FATAL: Non-integer passed as argument to -v"
print>>sys.stderr, "FATAL: Non-integer passed as argument to -v"
usage()
elif x[0] == '-':
elif x[0] == '-' and x != '-':
if x == '-v':
reading_arg = 1
elif x == '-6510':
@ -87,22 +93,22 @@ def run_ophis():
elif x == '-65c02':
chip_extension = Ophis.Opcodes.c02extensions
else:
print "FATAL: Unknown option "+x
print>>sys.stderr, "FATAL: Unknown option "+x
usage()
elif infile == None:
infile = x
elif outfile == None:
outfile = x
else:
print "FATAL: Too many files specified"
print>>sys.stderr, "FATAL: Too many files specified"
usage()
if infile is None:
print "FATAL: No files specified"
print>>sys.stderr, "FATAL: No files specified"
usage()
if outfile is None:
print "FATAL: No output file specified"
print>>sys.stderr, "FATAL: No output file specified"
usage()
Ophis.Frontend.pragma_modules.append(Ophis.CorePragmas)

View File

@ -11,6 +11,7 @@
# You may use, modify, and distribute this file under the MIT
# license: See README for details.
import sys
import Ophis.Errors as Err
import Ophis.IR as IR
import Ophis.Opcodes as Ops
@ -53,18 +54,18 @@ class Pass:
"""Prepares the environment and runs this pass, possibly
printing debugging information."""
if Err.count == 0:
if Cmd.verbose > 1: print "Running: "+self.name
if Cmd.verbose > 1: print>>sys.stderr, "Running: "+self.name
env.reset()
self.prePass()
node.accept(self, env)
self.postPass()
env.reset()
if Cmd.verbose > 3:
print "Current labels:"
print env
print>>sys.stderr, "Current labels:"
print>>sys.stderr, env
if Cmd.verbose > 2:
print "Current IR:"
print node
print>>sys.stderr, "Current IR:"
print>>sys.stderr, node
class FixPoint:
"""A specialized class that is not a pass but can be run like one.
@ -82,7 +83,7 @@ class FixPoint:
p.go(node, env)
if Err.count != 0: break
if self.fixpoint(): break
if Cmd.verbose > 1: print "Fixpoint failed, looping back"
if Cmd.verbose > 1: print>>sys.stderr, "Fixpoint failed, looping back"
else:
Err.log("Can't make %s converge! Maybe there's a recursive dependency somewhere?" % self.name)
@ -96,7 +97,7 @@ class DefineMacros(Pass):
if self.inDef:
Err.log("Unmatched .macro")
elif Cmd.verbose > 2:
print "Macro definitions:"
print>>sys.stderr, "Macro definitions:"
Macro.dump()
def visitMacroBegin(self, node, env):
if self.inDef:
@ -392,7 +393,7 @@ class ExtendBranches(PCTracker):
node.data = ('jmp', expr)
node.nodetype = "Absolute"
if Cmd.verbose > 0:
print str(node.ppt) + ": WARNING: bra out of range, replacing with jmp"
print>>sys.stderr, str(node.ppt) + ": WARNING: bra out of range, replacing with jmp"
else:
# Otherwise, we replace it with a 'macro' of sorts by hand:
# $branch LOC -> $reversed_branch ^+5; JMP LOC
@ -403,7 +404,7 @@ class ExtendBranches(PCTracker):
node.nodetype='SEQUENCE'
node.data = expansion
if Cmd.verbose > 0:
print str(node.ppt) + ": WARNING: "+opcode+" out of range, replacing with "+ExtendBranches.reversed[opcode] +"/jmp combo"
print>>sys.stderr, str(node.ppt) + ": WARNING: "+opcode+" out of range, replacing with "+ExtendBranches.reversed[opcode] +"/jmp combo"
self.expanded += 1
node.accept(self, env)
else:
@ -435,7 +436,7 @@ class Assembler(Pass):
def postPass(self):
if Cmd.verbose > 0 and Err.count == 0:
print "Assembly complete: %s bytes output (%s code, %s data, %s filler)" \
print>>sys.stderr, "Assembly complete: %s bytes output (%s code, %s data, %s filler)" \
% (len(self.output), self.code, self.data, self.filler)
def outputbyte(self, expr, env):