acme/src/section.c

80 lines
2.4 KiB
C

// ACME - a crossassembler for producing 6502/65c02/65816/65ce02 code.
// Copyright (C) 1998-2020 Marco Baye
// Have a look at "acme.c" for further info
//
// section stuff (move to symbol.h?)
#include "section.h"
#include "config.h"
#include "dynabuf.h"
#include "global.h"
#include "input.h"
#include "symbol.h"
#include "tree.h"
#define SCOPE_INCREMENT 2 // inc by 2 so locals are even and cheaps are odd
// fake section structure (for error msgs before any real section is in use)
static struct section initial_section = {
0, // local scope value
1, // cheap scope value
"during", // "type" => normally "zone Title" or
"init", // "title" => "macro test", now "during init"
FALSE, // no, title was not malloc'd
};
// variables
struct section *section_now = &initial_section; // current section
static struct section outer_section; // outermost section struct
static scope_t local_scope_max; // highest scope number yet
static scope_t cheap_scope_max; // highest scope number yet
// write given info into given structure and activate it
void section_new(struct section *section, const char *type, char *title, boolean allocated)
{
// new scope for locals
local_scope_max += SCOPE_INCREMENT;
section->local_scope = local_scope_max;
// keep scope for cheap locals
section->cheap_scope = section_now->cheap_scope;
// copy other data
section->type = type;
section->title = title;
section->allocated = allocated;
// activate new section
section_now = section;
//printf("[new section %d: %s, %s]\n", section->local_scope, section->type, section->title);
}
// change scope of cheap locals in given section
void section_new_cheap_scope(struct section *section)
{
// new scope for cheap locals
cheap_scope_max += SCOPE_INCREMENT;
section->cheap_scope = cheap_scope_max;
}
// Tidy up: If necessary, release section title.
// Warning - the state of the component "Allocd" may have
// changed in the meantime, so don't rely on a local variable.
void section_finalize(struct section *section)
{
if (section->allocated)
free(section->title);
}
// setup outermost section
void section_passinit(void)
{
//printf("[old maxima: locals=%d, cheap=%d]\n", local_scope_max, cheap_scope_max);
local_scope_max = 0; // will be incremented by 2 by next line
section_new(&outer_section, "Zone", s_untitled, FALSE);
cheap_scope_max = -1; // will be incremented by 2 by next line
section_new_cheap_scope(&outer_section);
}