static VALUE
rb_parser_m_parse_file (VALUE self, VALUE fname)
{
char *name = rb_string_value_cstr (&fname);
struct mparse *parser = RTYPEDDATA_DATA (self);
/* Previous memories are kept. It will be freed when parsed
will, not now. */
mparse_reset (parser);
int descriptor = mparse_open (parser, name);
if (descriptor == -1)
rb_raise (rb_eError, "failed to open");
mparse_readfd (parser, descriptor, name);
if (close (descriptor) == -1)
rb_raise (rb_eError, "failed to close");
struct roff_meta *meta = mparse_result (parser);
/* TODO: fetch validity of the input with mparse_updaterc */
VALUE klass;
switch (meta->macroset)
{
case MACROSET_NONE:
rb_raise (rb_eError, "unknown macroset");
case MACROSET_MDOC:
klass = rb_cMdocMeta;
break;
case MACROSET_MAN:
klass = rb_cManMeta;
break;
}
VALUE val = rb_data_typed_object_wrap (klass, meta, &rb_meta_type);
/* To prevent garbage collect parser and for man-to-man output. */
rb_iv_set (val, "@parser", self);
return val;
}