Skip to content

C parser fails to parse valid file #218

Open
@Quintus

Description

@Quintus

Hi there,

RDoc’s C parser fails to parse the following C file (it is part of a library I’m currently working on):

#include "database.h"

/***************************************
 * Variables
 ***************************************/

VALUE rb_cAlpm_Database;

/***************************************
 * Methods
 ***************************************/

static VALUE initialize(VALUE self)
{
  rb_raise(rb_eNotImpError, "Can't create new databases with this library.");
  return self;
}

/**
 * call-seq:
 *   name() → a_string
 *
 * Returns the name of the package database.
 */
static VALUE name(VALUE self)
{
  alpm_db_t* p_db = NULL;
  Data_Get_Struct(self, alpm_db_t, p_db);

  return rb_str_new2(alpm_db_get_name(p_db));
}

/**
 * call-seq:
 *   get( name ) → a_package
 *
 * Find a Package by name in the database.
 *
 * === Parameters
 * [name]
 *   The name of the package. Must match exactly.
 *
 * === Return value
 * A Package instance representing the package.
 */
static VALUE get(VALUE self, VALUE name)
{
  alpm_db_t* p_db = NULL;
  alpm_pkg_t* p_pkg = NULL;
  Data_Get_Struct(self, alpm_db_t, p_db);

  p_pkg = alpm_db_get_pkg(p_db, StringValuePtr(name));

  if (p_pkg)
    return Data_Wrap_Struct(rb_cAlpm_Package, NULL, NULL, p_pkg);
  else
    return Qnil;
}

/***************************************
 * Binding
 ***************************************/


/**
 * A Database is the list of packages in a repository, where the notion
 * of the "repository" is an abstract one. It may be an actual remote
 * repository, or just represent the current system state. It does not
 * make any difference in treating instances of this class.
 *
 * The database listings are always kept local, so interacting with this
 * class is possible while being offline.
 */
void Init_database()
{
  rb_cAlpm_Database = rb_define_class_under(rb_cAlpm, "Database", rb_cObject);

  rb_define_singleton_method(rb_cAlpm_Database, "get", RUBY_METHOD_FUNC(get), 1);

  rb_define_method(rb_cAlpm_Database, "initialize", RUBY_METHOD_FUNC(initialize), 0);
  rb_define_method(rb_cAlpm_Database, "name", RUBY_METHOD_FUNC(name), 0);
}

RDoc does not crash on parsing, but it simply reports a class named unknown with no methods or description at all instead of the expected Alpm::Database class. rb_cAlpm is defined in another file main.c if this is important:

/* ... */
void Init_alpm()
{
  rb_cAlpm = rb_define_class("Alpm", rb_cObject);
  rb_define_alloc_func(rb_cAlpm, allocate);

  rb_define_method(rb_cAlpm, "initialize", RUBY_METHOD_FUNC(initialize), 2);

  /* ... */

  Init_database();
  /* ... */
}

However, the behaviour is observable even without that accompanying file, i.e. if given as the only file to RDoc for documentation, it still results in an unknown class as shown by the following run with --debug enabled:

Parsing sources...
100% [ 1/ 1]  foo.c                                                             

Generating Darkfish format into /tmp/doc...
Copying static files
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/rdoc.css .
mkdir -p js
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/js/search.js js/search.js
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/js/jquery.js js/jquery.js
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/js/darkfish.js js/darkfish.js
mkdir -p images
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/macFFBgHack.png images/macFFBgHack.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/wrench.png images/wrench.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/ruby.png images/ruby.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/bug.png images/bug.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/bullet_toggle_minus.png images/bullet_toggle_minus.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/tag_green.png images/tag_green.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/bullet_black.png images/bullet_black.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/wrench_orange.png images/wrench_orange.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/plugin.png images/plugin.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/brick_link.png images/brick_link.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/page_green.png images/page_green.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/page_white_text.png images/page_white_text.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/page_white_width.png images/page_white_width.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/bullet_toggle_plus.png images/bullet_toggle_plus.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/date.png images/date.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/delete.png images/delete.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/loadingAnimation.gif images/loadingAnimation.gif
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/find.png images/find.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/brick.png images/brick.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/zoom.png images/zoom.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/tag_blue.png images/tag_blue.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/arrow_up.png images/arrow_up.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/package.png images/package.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/add.png images/add.png
cp /opt/rubies/ruby-2.0.0-p0/lib/ruby/gems/2.0.0/gems/rdoc-4.0.1/lib/rdoc/generator/template/darkfish/images/transparent.png images/transparent.png
Rendering the index page...
Outputting to /tmp/doc/index.html
Generating class documentation in /tmp/doc
  working on unknown (unknown.html)
  rendering /tmp/doc/unknown.html
Outputting to /tmp/doc/unknown.html
Generating file documentation in /tmp/doc
  working on foo.c (/tmp/doc/foo_c.html)
Rendering the Table of Contents...
Outputting to /tmp/doc/table_of_contents.html
Generating JSON index
  writing search index to js/search_index.js
  generating class search index
    unknown
  generating method search index
  generating pages search index
mkdir -p /tmp/doc/js
install -c -m 0644 js/navigation.js /tmp/doc/js/navigation.js
install -c -m 0644 js/searcher.js /tmp/doc/js/searcher.js

Files:      1

Classes:    1 (1 undocumented)
Modules:    0 (0 undocumented)
Constants:  0 (0 undocumented)
Attributes: 0 (0 undocumented)
Methods:    0 (0 undocumented)

Total:      1 (1 undocumented)
  0.00% documented

Elapsed: 0.0s

RDoc version: 4.0.1
Ruby version: ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-linux]
OS: Arch Linux

Valete,
Marvin

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions