Skip to content

Commit

Permalink
Add start and size arguments to incbinstr/inchexstr
Browse files Browse the repository at this point in the history
  • Loading branch information
MineRobber9000 committed Dec 28, 2023
1 parent 75db958 commit e74635a
Show file tree
Hide file tree
Showing 15 changed files with 78 additions and 9 deletions.
69 changes: 64 additions & 5 deletions src/asm/resolver/eval_fn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,8 @@ fn eval_builtin_incbinstr(
decls,
defs,
ctx,
query)
query,
"incbinstr")
}


Expand All @@ -230,7 +231,8 @@ fn eval_builtin_inchexstr(
decls,
defs,
ctx,
query)
query,
"inchexstr")
}


Expand All @@ -240,10 +242,11 @@ fn eval_builtin_incstr(
_decls: &asm::ItemDecls,
_defs: &asm::ItemDefs,
ctx: &asm::ResolverContext,
query: &mut expr::EvalFunctionQuery)
query: &mut expr::EvalFunctionQuery,
funcname: &str)
-> Result<expr::Value, ()>
{
query.ensure_arg_number(1)?;
query.ensure_min_max_arg_number(1, 3)?;

let relative_filename = query.args[0].value.expect_string(
query.report,
Expand Down Expand Up @@ -303,5 +306,61 @@ fn eval_builtin_incstr(
}
}

Ok(expr::Value::make_integer(bitvec.to_bigint()))
let mut bigint = bitvec.to_bigint();

let bigint_size = bigint.size.unwrap();

print!("{}", query.args.len());

if query.args.len() == 2 {
let start = query.args[1].value.expect_usize(query.report, query.args[1].span)?;

print!("start: {}; start_bits: {}, bigint_size: {}",start,start*bits_per_char,bigint_size);

if (start*bits_per_char) >= bigint_size {
query.report.error_span(
format!("{} starts after EOF ({} > {})",
funcname,
start,
bigint_size/bits_per_char),
query.args[1].span
);
return Err(());
}

bigint = bigint.slice(bigint_size-(start*bits_per_char),0);
} else if query.args.len() == 3 {
let start = query.args[1].value.expect_usize(query.report, query.args[1].span)?;

let size = query.args[2].value.expect_usize(query.report, query.args[2].span)?;

if (start*bits_per_char) >= bigint_size {
query.report.error_span(
format!("{} starts after EOF ({} > {})",
funcname,
start,
bigint_size/bits_per_char),
query.args[1].span
);
return Err(());
}

if ((start+size)*bits_per_char) >= bigint_size {
query.report.error_span(
format!("{} ends after EOF ({} + {} > {})",
funcname,
start,
size,
bigint_size/bits_per_char),
query.args[1].span
);
return Err(());
}

print!("start: {}, size: {}, slice: {}:{}",start,size,bigint_size-(start*bits_per_char),bigint_size-((start+size)*bits_per_char));

bigint = bigint.slice(bigint_size-(start*bits_per_char),bigint_size-((start+size)*bits_per_char));
}

Ok(expr::Value::make_integer(bigint))
}
1 change: 1 addition & 0 deletions tests/incbinstr/err_end_after_eof.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#d incbinstr("data1.txt",4,8) ; error: failed / error: ends after EOF
1 change: 1 addition & 0 deletions tests/incbinstr/err_start_after_eof.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#d incbinstr("data1.txt",8) ; error: failed / error: starts after EOF
2 changes: 1 addition & 1 deletion tests/incbinstr/err_too_few_args.asm
Original file line number Diff line number Diff line change
@@ -1 +1 @@
#d incbinstr() ; error: failed / error: expected 1 argument
#d incbinstr() ; error: failed / error: expected 1 to 3 arguments
2 changes: 1 addition & 1 deletion tests/incbinstr/err_too_many_args.asm
Original file line number Diff line number Diff line change
@@ -1 +1 @@
#d incbinstr("data1.txt", "data2.txt") ; error: failed / error: expected 1 argument
#d incbinstr("data1.txt",0,1,2) ; error: failed / error: expected 1 to 3 arguments
1 change: 1 addition & 0 deletions tests/incbinstr/err_wrong_usage.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#d incbinstr("data1.txt", "data2.txt") ; error: failed / error: expected integer
1 change: 1 addition & 0 deletions tests/incbinstr/ok_start.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#d incbinstr("data3.txt",4) ; =0xaf5a
1 change: 1 addition & 0 deletions tests/incbinstr/ok_start_size.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#d incbinstr("data3.txt",8,8) ; =0xf5
1 change: 1 addition & 0 deletions tests/inchexstr/err_end_after_eof.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#d inchexstr("data1.txt",2,4) ; error: failed / error: ends after EOF
1 change: 1 addition & 0 deletions tests/inchexstr/err_start_after_eof.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#d inchexstr("data1.txt",4) ; error: failed / error: starts after EOF
2 changes: 1 addition & 1 deletion tests/inchexstr/err_too_few_args.asm
Original file line number Diff line number Diff line change
@@ -1 +1 @@
#d inchexstr() ; error: failed / error: expected 1 argument
#d inchexstr() ; error: failed / error: expected 1 to 3 arguments
2 changes: 1 addition & 1 deletion tests/inchexstr/err_too_many_args.asm
Original file line number Diff line number Diff line change
@@ -1 +1 @@
#d inchexstr("data1.txt", "data2.txt") ; error: failed / error: expected 1 argument
#d inchexstr("data1.txt",0,1,2) ; error: failed / error: expected 1 to 3 arguments
1 change: 1 addition & 0 deletions tests/inchexstr/err_wrong_usage.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#d inchexstr("data1.txt", "data2.txt") ; error: failed / error: expected integer
1 change: 1 addition & 0 deletions tests/inchexstr/ok_start.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#d inchexstr("data3.txt",4) ; =0x5a5af5a5a0000
1 change: 1 addition & 0 deletions tests/inchexstr/ok_start_size.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#d inchexstr("data3.txt",8,2) ; =0xf5

0 comments on commit e74635a

Please sign in to comment.