mirror of
https://github.com/sigmasternchen/macrofuck
synced 2025-03-15 15:18:56 +00:00
cleanup: Move offset calculation to macro
This commit is contained in:
parent
7fb2f387de
commit
0d4cc9f864
3 changed files with 67 additions and 65 deletions
|
@ -27,7 +27,7 @@ static void region_used(band_t* band, region_t* region) {
|
|||
}
|
||||
|
||||
static void reset_position(FILE* out, band_t* band, band_addr_t position) {
|
||||
move_to(position);
|
||||
move(position);
|
||||
reset();
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@ static void reset_region(FILE* out, band_t* band, region_t* region) {
|
|||
}
|
||||
|
||||
void codegen_add_char(FILE* out, band_t* band, size_t position, char c) {
|
||||
move_to(position);
|
||||
move(position);
|
||||
reset();
|
||||
add(c);
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ region_t* codegen_literal_expr(FILE* out, band_t* band, struct literal_expressio
|
|||
panic("number literal too big");
|
||||
}
|
||||
region = band_allocate_tmp(band, 1);
|
||||
move_to(region->start);
|
||||
move_to(region);
|
||||
reset(); add(expr.number);
|
||||
break;
|
||||
case CHAR_LITERAL:
|
||||
|
@ -105,7 +105,7 @@ region_t* codegen_expr(FILE* out, band_t* band, struct expression* expr) {
|
|||
|
||||
void codegen_print_statement(FILE* out, band_t* band, struct print_statement statement) {
|
||||
region_t* region = codegen_expr(out, band, statement.value);
|
||||
move_to(region->start);
|
||||
move_to(region);
|
||||
|
||||
output();
|
||||
for (size_t i = 1; i < region->size; i++) {
|
||||
|
@ -125,22 +125,22 @@ region_t* clone_region(FILE* out, band_t* band, region_t* original) {
|
|||
for (size_t i = 0; i < original->size; i++) {
|
||||
reset_position(out, band, clone->start + i);
|
||||
|
||||
move_to(original->start + i);
|
||||
move_offset(original, i);
|
||||
loop({
|
||||
dec();
|
||||
move_to(tmp->start);
|
||||
move_to(tmp);
|
||||
inc();
|
||||
move_to(clone->start + i);
|
||||
move_offset(clone, i);
|
||||
inc();
|
||||
move_to(original->start + i);
|
||||
move_offset(original, i);
|
||||
});
|
||||
|
||||
move_to(tmp->start);
|
||||
move_to(tmp);
|
||||
loop({
|
||||
dec();
|
||||
move_to(original->start + i);
|
||||
move_offset(original, i);
|
||||
inc();
|
||||
move_to(tmp->start);
|
||||
move_to(tmp);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -13,7 +13,9 @@
|
|||
#define output() fprintf(out, ".")
|
||||
#define input() fprintf(out, ",")
|
||||
|
||||
#define move_to(t) _move_to(out, band, t)
|
||||
#define move(t) _move_to(out, band, t)
|
||||
#define move_to(r) move(r->start)
|
||||
#define move_offset(r, o) move(r->start + o)
|
||||
|
||||
#define add(v) { for (int i = 0; i < v; i++) inc(); }
|
||||
#define sub(v) { for (int i = 0; i < v; i++) dec(); }
|
||||
|
|
|
@ -10,106 +10,106 @@ extern region_t* to_str(FILE* out, band_t* band, const char* _arg) {
|
|||
|
||||
region_t* str = band_allocate_tmp(band, 3);
|
||||
for (size_t i = 0; i < str->size; i++) {
|
||||
move_to(str->start + i); reset();
|
||||
move_offset(str, i); reset();
|
||||
}
|
||||
|
||||
region_t* copy = band_allocate_tmp(band, 1);
|
||||
move_to(copy->start); reset();
|
||||
move_to(copy); reset();
|
||||
|
||||
region_t* ten = band_allocate_tmp(band, 1);
|
||||
move_to(ten->start); reset(); add(10);
|
||||
move_to(ten); reset(); add(10);
|
||||
|
||||
region_t* tmp = band_allocate_tmp(band, 1);
|
||||
move_to(tmp->start); reset();
|
||||
move_to(tmp); reset();
|
||||
region_t* tmp2 = band_allocate_tmp(band, 1);
|
||||
move_to(tmp2->start); reset();
|
||||
move_to(tmp2); reset();
|
||||
region_t* tmp3 = band_allocate_tmp(band, 1);
|
||||
|
||||
move_to(arg->start);
|
||||
move_to(arg);
|
||||
loop({
|
||||
dec();
|
||||
move_to(tmp->start); inc();
|
||||
move_to(copy->start); inc();
|
||||
move_to(str->start + 2); inc();
|
||||
move_to(str->start + 1); reset();
|
||||
move_to(str->start + 0); reset();
|
||||
move_to(ten->start); dec();
|
||||
move_to(tmp); inc();
|
||||
move_to(copy); inc();
|
||||
move_offset(str, 2); inc();
|
||||
move_offset(str, 1); reset();
|
||||
move_offset(str, 0); reset();
|
||||
move_to(ten); dec();
|
||||
loop({
|
||||
dec();
|
||||
move_to(str->start + 0); inc();
|
||||
move_to(str->start + 1); inc();
|
||||
move_to(ten->start);
|
||||
move_offset(str, 0); inc();
|
||||
move_offset(str, 1); inc();
|
||||
move_to(ten);
|
||||
});
|
||||
move_to(str->start + 1);
|
||||
move_offset(str, 1);
|
||||
loop({
|
||||
move_to(tmp->start); reset();
|
||||
move_to(str->start + 1); reset();
|
||||
move_to(tmp); reset();
|
||||
move_offset(str, 1); reset();
|
||||
});
|
||||
move_to(str->start + 0);
|
||||
move_offset(str, 0);
|
||||
loop({
|
||||
dec();
|
||||
move_to(ten->start); inc();
|
||||
move_to(str->start + 0);
|
||||
move_to(ten); inc();
|
||||
move_offset(str, 0);
|
||||
});
|
||||
move_to(tmp->start);
|
||||
move_to(tmp);
|
||||
loop({
|
||||
move_to(tmp2->start); inc();
|
||||
move_to(str->start + 2); reset();
|
||||
move_to(ten->start); add(10);
|
||||
move_to(tmp->start); reset();
|
||||
move_to(tmp2); inc();
|
||||
move_offset(str, 2); reset();
|
||||
move_to(ten); add(10);
|
||||
move_to(tmp); reset();
|
||||
});
|
||||
|
||||
move_to(arg->start);
|
||||
move_to(arg);
|
||||
});
|
||||
|
||||
move_to(copy->start);
|
||||
move_to(copy);
|
||||
loop({
|
||||
dec();
|
||||
move_to(arg->start); inc();
|
||||
move_to(copy->start);
|
||||
move_to(arg); inc();
|
||||
move_to(copy);
|
||||
});
|
||||
|
||||
move_to(ten->start); reset(); add(10);
|
||||
move_to(ten); reset(); add(10);
|
||||
|
||||
move_to(tmp2->start);
|
||||
move_to(tmp2);
|
||||
loop({
|
||||
dec();
|
||||
move_to(tmp->start); reset(); inc();
|
||||
move_to(str->start + 1); inc();
|
||||
move_to(copy->start); reset();
|
||||
move_to(tmp3->start); reset();
|
||||
move_to(ten->start); dec();
|
||||
move_to(tmp); reset(); inc();
|
||||
move_offset(str, 1); inc();
|
||||
move_to(copy); reset();
|
||||
move_to(tmp3); reset();
|
||||
move_to(ten); dec();
|
||||
loop({
|
||||
dec();
|
||||
move_to(copy->start); inc();
|
||||
move_to(tmp3->start); inc();
|
||||
move_to(ten->start);
|
||||
move_to(copy); inc();
|
||||
move_to(tmp3); inc();
|
||||
move_to(ten);
|
||||
});
|
||||
move_to(tmp3->start);
|
||||
move_to(tmp3);
|
||||
loop({
|
||||
move_to(tmp->start); reset();
|
||||
move_to(tmp3->start); reset();
|
||||
move_to(tmp); reset();
|
||||
move_to(tmp3); reset();
|
||||
});
|
||||
move_to(copy->start);
|
||||
move_to(copy);
|
||||
loop({
|
||||
dec();
|
||||
move_to(ten->start); inc();
|
||||
move_to(copy->start);
|
||||
move_to(ten); inc();
|
||||
move_to(copy);
|
||||
});
|
||||
|
||||
move_to(tmp->start);
|
||||
move_to(tmp);
|
||||
loop({
|
||||
move_to(ten->start); add(10);
|
||||
move_to(str->start + 0); inc();
|
||||
move_to(str->start + 1); reset();
|
||||
move_to(tmp->start); reset();
|
||||
move_to(ten); add(10);
|
||||
move_offset(str, 0); inc();
|
||||
move_offset(str, 1); reset();
|
||||
move_to(tmp); reset();
|
||||
});
|
||||
|
||||
move_to(tmp2->start);
|
||||
move_to(tmp2);
|
||||
});
|
||||
|
||||
for (size_t i = 0; i < str->size; i++) {
|
||||
move_to(str->start + i); add('0');
|
||||
move_offset(str, i); add('0');
|
||||
}
|
||||
|
||||
band_region_free(band, tmp3);
|
||||
|
|
Loading…
Reference in a new issue