Class: Mandoc::Parser
- Inherits:
-
Object
- Object
- Mandoc::Parser
- Defined in:
- lib/mandoc.rb,
ext/mandoc/rb_mandoc.c
Instance Method Summary collapse
-
#parse_file ⇒ Object
:call-seq: parse_file (filename) -> Meta.
Instance Method Details
#parse_file ⇒ Object
:call-seq:
parse_file (filename) -> Meta
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'ext/mandoc/rb_mandoc.c', line 70
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;
}
|