#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);
}