60 lines
1.3 KiB
C
60 lines
1.3 KiB
C
#include <string.h>
|
|
#include "../include/mrc_ccontext.h"
|
|
#include "../include/mrc_parser_util.h"
|
|
|
|
MRC_API mrc_ccontext *
|
|
mrc_ccontext_new(mrb_state *mrb)
|
|
{
|
|
mrc_ccontext temp_c = {0};
|
|
temp_c.mrb = mrb;
|
|
mrc_ccontext *c = (mrc_ccontext *)mrc_calloc((&temp_c), 1, sizeof(mrc_ccontext));
|
|
c->p = (mrc_parser_state *)mrc_calloc((&temp_c), 1, sizeof(mrc_parser_state));
|
|
c->mrb = temp_c.mrb;
|
|
return c;
|
|
}
|
|
|
|
|
|
MRC_API void
|
|
mrc_ccontext_cleanup_local_variables(mrc_ccontext *cc)
|
|
{
|
|
cc->keep_lv = FALSE;
|
|
|
|
if (cc->options && cc->options->scopes) {
|
|
for (int i = 0; i < cc->options->scopes[0].locals_count; i++) {
|
|
mrc_free(cc, (void *)cc->options->scopes[0].locals[i].source);
|
|
}
|
|
mrc_free(cc, cc->options);
|
|
}
|
|
}
|
|
|
|
MRC_API const char *
|
|
mrc_ccontext_filename(mrc_ccontext *c, const char *s)
|
|
{
|
|
if (s) {
|
|
size_t len = strlen(s);
|
|
char *p = (char*)mrc_malloc(c, len + 1);
|
|
|
|
if (p == NULL) return NULL;
|
|
memcpy(p, s, len + 1);
|
|
if (c->filename) {
|
|
mrc_free(c, c->filename);
|
|
}
|
|
c->filename = p;
|
|
}
|
|
return c->filename;
|
|
}
|
|
|
|
MRC_API void
|
|
mrc_ccontext_free(mrc_ccontext *c)
|
|
{
|
|
if (c->filename_table) mrc_free(c, c->filename_table);
|
|
if (c->filename) mrc_free(c, c->filename);
|
|
pm_parser_free(c->p);
|
|
mrc_diagnostic_list_free(c);
|
|
if (c->p->lex_callback) {
|
|
mrc_free(c, c->p->lex_callback);
|
|
}
|
|
mrc_free(c, c->p);
|
|
mrc_free(c, c);
|
|
}
|