check for file with %asmbinary, %asminclude

This commit is contained in:
Irmen de Jong 2019-04-17 00:55:42 +02:00
parent a81b82495c
commit 0ee43294c4
3 changed files with 17 additions and 20 deletions

View File

@ -7,6 +7,7 @@ import prog8.compiler.target.c64.FLOAT_MAX_POSITIVE
import prog8.functions.BuiltinFunctions import prog8.functions.BuiltinFunctions
import prog8.optimizing.same import prog8.optimizing.same
import prog8.parser.ParsingFailedError import prog8.parser.ParsingFailedError
import java.io.File
/** /**
* General checks on the Ast * General checks on the Ast
@ -632,6 +633,7 @@ private class AstChecker(private val namespace: INameScope,
if(directive.parent !is INameScope || directive.parent is Module) err("this directive may only occur in a block") if(directive.parent !is INameScope || directive.parent is Module) err("this directive may only occur in a block")
if(directive.args.size!=2 || directive.args[0].str==null || directive.args[1].str==null) if(directive.args.size!=2 || directive.args[0].str==null || directive.args[1].str==null)
err("invalid asminclude directive, expected arguments: \"filename\", \"scopelabel\"") err("invalid asminclude directive, expected arguments: \"filename\", \"scopelabel\"")
checkFileExists(directive, directive.args[0].str!!)
} }
"%asmbinary" -> { "%asmbinary" -> {
if(directive.parent !is INameScope || directive.parent is Module) err("this directive may only occur in a block") if(directive.parent !is INameScope || directive.parent is Module) err("this directive may only occur in a block")
@ -641,6 +643,7 @@ private class AstChecker(private val namespace: INameScope,
if(directive.args.size>=2 && directive.args[1].int==null) err(errormsg) if(directive.args.size>=2 && directive.args[1].int==null) err(errormsg)
if(directive.args.size==3 && directive.args[2].int==null) err(errormsg) if(directive.args.size==3 && directive.args[2].int==null) err(errormsg)
if(directive.args.size>3) err(errormsg) if(directive.args.size>3) err(errormsg)
checkFileExists(directive, directive.args[0].str!!)
} }
"%option" -> { "%option" -> {
if(directive.parent !is Block && directive.parent !is Module) err("this directive may only occur in a block or at module level") if(directive.parent !is Block && directive.parent !is Module) err("this directive may only occur in a block or at module level")
@ -654,6 +657,14 @@ private class AstChecker(private val namespace: INameScope,
return super.process(directive) return super.process(directive)
} }
private fun checkFileExists(directive: Directive, filename: String) {
var definingModule = directive.parent
while (definingModule !is Module)
definingModule = definingModule.parent
if (!(filename.startsWith("library:") || definingModule.importedFrom.resolveSibling(filename).toFile().isFile || File(filename).isFile))
checkResult.add(NameError("included file not found: $filename", directive.position))
}
override fun process(literalValue: LiteralValue): LiteralValue { override fun process(literalValue: LiteralValue): LiteralValue {
if(!compilerOptions.floats && literalValue.type==DataType.FLOAT) { if(!compilerOptions.floats && literalValue.type==DataType.FLOAT) {
checkResult.add(SyntaxError("floating point used, but that is not enabled via options", literalValue.position)) checkResult.add(SyntaxError("floating point used, but that is not enabled via options", literalValue.position))

View File

@ -123,6 +123,8 @@ Directives
This directive can only be used inside a block. This directive can only be used inside a block.
The assembler will include the file as binary bytes at this point, prog8 will not process this at all. The assembler will include the file as binary bytes at this point, prog8 will not process this at all.
The optional offset and length can be used to select a particular piece of the file. The optional offset and length can be used to select a particular piece of the file.
The compiler first looks for the file relative to the same directory as the module containing this statement is in,
if the file can't be found there it is searched relative to the current directory.
.. data:: %asminclude "<filename>", "scopelabel" .. data:: %asminclude "<filename>", "scopelabel"
@ -133,6 +135,8 @@ Directives
The scopelabel argument will be used as a prefix to access the labels from the included source code, The scopelabel argument will be used as a prefix to access the labels from the included source code,
otherwise you would risk symbol redefinitions or duplications. otherwise you would risk symbol redefinitions or duplications.
If you know what you are doing you can leave it as an empty string to not have a scope prefix. If you know what you are doing you can leave it as an empty string to not have a scope prefix.
The compiler first looks for the file relative to the same directory as the module containing this statement is in,
if the file can't be found there it is searched relative to the current directory.
.. data:: %breakpoint .. data:: %breakpoint

View File

@ -4,25 +4,7 @@
sub start() { sub start() {
ubyte[81] array2 = 20 to 100 %asminclude "primes.p8", "derp"
word[] array3 = 3000 to 3100 %asmbinary "primes.p8", 10, 20
c64scr.print_uw(len(array2))
c64.CHROUT('\n')
c64scr.print_uw(len(array3))
c64.CHROUT('\n')
c64.CHROUT('\n')
c64scr.print_ub(array2[0])
c64.CHROUT(',')
c64scr.print_ub(array2[1])
c64.CHROUT(',')
c64scr.print_ub(array2[2])
c64.CHROUT('\n')
c64scr.print_w(array3[0])
c64.CHROUT(',')
c64scr.print_w(array3[1])
c64.CHROUT(',')
c64scr.print_w(array3[2])
c64.CHROUT('\n')
} }
} }