changequote(`«', `»')dnl define(«IFNBLANK», «ifelse(translit(««$1»», « »), «», «», «$2»)»)dnl define(«DECL_ARGLIST», «ifelse(«$#», «2», ««$1»», «dnl «$1», DECL_ARGLIST(shift(shift($@)))»)»)dnl ifelse(OUTPUT_MODE, «C», «dnl --------- C output define(«STRIP_TABS», «translit(««$1»», « »)»)dnl define(«CHOP_FIRST», «translit(patsubst(translit(««««$1»»»», « », « »), «^.... \(.*\)....$», «««\1»»»), « », « »)»)dnl define(«CHOP_LAST», «format(««%.*s»», regexp(translit(««$1»», « /», «/ »), «/*$»), «$1»)»)dnl define(«NORMALIZE», «CHOP_LAST(CHOP_FIRST(STRIP_TABS(«$1»)))»)dnl define(«COMMENT», «patsubst(patsubst(«««$1»»», «^\(.\)», « \1»), «^», «$2»)»)dnl define(«INDENT», «COMMENT(NORMALIZE(«$1»), « *»)»)dnl define(«INDENT_PARAM», «COMMENT(NORMALIZE(«$1»), « * »)»)dnl define(«INDENT_PARAM_DOC», «COMMENT(NORMALIZE(«$1»), « * »)»)dnl define(«INDENT_RETVAL_DOC», «COMMENT(NORMALIZE(«$1»), « * »)»)dnl define(«INDENT_MEMBER_DOC», «COMMENT(NORMALIZE(«$1»), « *»)»)dnl define(«INDENT_MEMBER», «patsubst(NORMALIZE(««$1»»), «^[ ]*», « »)»)dnl define(«DECL_ARG_TEXT», «ifelse(«$#», «1», «», « INDENT_PARAM(«$1»): INDENT_PARAM_DOC(«$2»)«»dnl DECL_ARG_TEXT(shift(shift($@)))»)»)dnl define(«PRINT_ARGS», «ifelse(«$2», «», «», «dnl * * Parameter(s):DECL_ARG_TEXT($@)» )»)dnl define(«DECLARE_FUNCTION», «dnl /* * «$1»(): «$2» IFNBLANK(«$3», «dnl * INDENT(«$3») »)dnl PRINT_ARGS($4)dnl IFNBLANK(«$5», «dnl * INDENT(«$5») »)dnl IFNBLANK(«$7», «dnl * * Return («$6»): INDENT_RETVAL_DOC(«$7») »)dnl IFNBLANK(«$8», «dnl * INDENT(«$8») »)dnl */ «$6» «$1»(DECL_ARGLIST($4));dnl »)dnl define(«STATEMENT», «dnl /* INDENT(«$2») IFNBLANK(«$3», «dnl * INDENT(«$3») »)dnl */ «$1»;»)dnl define(«COMPOUND_MEMBERS», «ifelse(«$#», «1», «», « /* INDENT_MEMBER_DOC(«$2») */ INDENT_MEMBER(«$1»); COMPOUND_MEMBERS(shift(shift($@)))»)»)dnl define(«DECLARE_COMPOUND», «dnl /* * «$2» IFNBLANK(«$3», «dnl * INDENT(«$3») »)dnl */ «$1» { COMPOUND_MEMBERS($4)dnl };dnl »)dnl define(«ENUM_MEMBERS», «ifelse(«$#», «1», «», « /* INDENT_MEMBER_DOC(«$2») */ INDENT_MEMBER(«$1»), ENUM_MEMBERS(shift(shift($@)))»)»)dnl define(«DECLARE_ENUM», «/* «$2» */ IFNBLANK(«$3», «dnl * patsubst(«$3», «^\s*», « * ») »)dnl enum «$1» { ENUM_MEMBERS($4)dnl };dnl »)dnl define(«VERBATIM_C», «NORMALIZE(«$1»)»)dnl », OUTPUT_MODE, «HTML», «dnl --------- HTML output define(«LINK_COUNT», 0)dnl define(«FIXUP_LT», «patsubst(«$1», «<», «<»)») define(«FIXUP_GT», «patsubst(«$1», «>», «>»)») define(«FIXUP_AMPERSAND», «patsubst(«$1», «&», «&»)») define(«HANDLE_EMPTY_LINES», «patsubst(«$1», «^\s*$», «

»)») define(«FIXUP_HTML», «FIXUP_AMPERSAND(FIXUP_LT(FIXUP_GT(««««$1»»»»)))») define(«FORMAT_LIST_HTML», «ifelse(«$#», «1», «», « IFNBLANK(«$2», «

  • «$1»: HANDLE_EMPTY_LINES(FIXUP_HTML(««$2»»))
  • FORMAT_LIST_HTML(shift(shift($@)))»)» )») define(«ANCHOR», « id="link_«»LINK_COUNT" ») define(«HREF», « define(«LINK_COUNT», incr(LINK_COUNT)) «$1» ») define(«DECLARE_FUNCTION», « divert HREF(«$1()») «$2» divert(«1»)

    «$6» «$1»(DECL_ARGLIST($4))

    FIXUP_HTML(«$2»)

    HANDLE_EMPTY_LINES(FIXUP_HTML(««$3»»))

    HANDLE_EMPTY_LINES(FIXUP_HTML(««$5»»))

    IFNBLANK(«$7», «Return («$6»): »)

    HANDLE_EMPTY_LINES(FIXUP_HTML(««$8»»))


    ») define(«STATEMENT», « divert HREF(«$1») «$2» divert(«1»)

    «$1»

    FIXUP_HTML(«$2»)

    HANDLE_EMPTY_LINES(FIXUP_HTML(««$3»»))


    ») define(«DECLARE_COMPOUND», « divert HREF(«$1») «$2» divert(«1»)

    «$1»

    FIXUP_HTML(«$2»)

    HANDLE_EMPTY_LINES(FIXUP_HTML(««$3»»))

    Members:
    ») define(«DECLARE_ENUM», « divert HREF(«enum $1») «$2» divert(«1»)

    enum «$1»

    FIXUP_HTML(«$2»)

    HANDLE_EMPTY_LINES(FIXUP_HTML(««$3»»))

    Enumeration Constants:
    ») define(«VERBATIM_C») divert(«1»)
    divert

    API Reference

    »)dnl ifdef(«EXAMPLES», « dnl $1: name, $2: one-line summary, $3: prolog, $4: parameters, dnl $5: parameter documentation, $6: return type, $7: return text, dnl $8: epilog DECLARE_FUNCTION( «simple_func», «This is the one-line summary.», «This is the prolog.», « «int param1», «documentation of first parameter», «char *param2», «documentation of second parameter» », «This is the parameter documentation section.», «int», «This is the documentation of the return value», «This is the epilog.» ) DECLARE_FUNCTION( «complex_func», «Example of a function which uses all features of gendoc», «Prolog: The three free text sections (prolog, arg-doc and epilog) may all consist of several paragraphs, and each may contain multiple lines. Paragraphs are separated by lines containing only whitespace. Formatting is kept intact, but lines are wrapped into C comments.», « «int par1», «The parameter list consists of any number of parameter/comment pairs. The parameters are plain C code like the "int par1" above. The list must be quoted, and both the declaration and its comment must also be quoted. Comments must not be empty.», «int par2», «For the parameter documentation the same rules as for the free text sections apply: Multiple paragraphs are possible, and each may spawn multiple lines.» », «The par-doc section. It is printed after the parameter list but before the return value (if any). It is supposed to describe the function or its parameters in more detail, possibly referring to one or more of the above parameters. This function returns non-void, so this paragraph is followed by the return value documentation.», «int», «Like the parameter/comment pairs, the return value consists of two parts: the return type and the documentation. This return documentation consists of two paragraphs.», «Finally, there is the (optional) epilog. It might contain references to related documentation, for example a "see also" section.» ) DECLARE_FUNCTION( «dwim», «Example of a function with no parameters and no return value.», «This is the description. It could consist of several paragraphs.», « «void», », «Par-doc: For functions with no parameters, the par-doc section is kind of pointless.», «void», «», «Epilog: For functions with no return value, the epilog directly follows the par-doc section.», ) DECLARE_FUNCTION( «minimal_documented_function», «This documentation conists of only the summary line.», «», « «void», », «», «void», «», «», ) dnl $1: name, $2: one-line summary, $3: description, $4: members DECLARE_COMPOUND( «struct foo», «summary: Illustrate the DECLARE_COMPOUND macro», «description: The macro works for both structs and unions. The structure of the documentation is simpler than for functions because instead of three free-text sections (prolog, par-doc, epilog), it has only one: the description. Of course the description may spawn multiple paragraphs, each of which which may consist of multiple lines. The member list is similar to the list of function parameters.», « «float member1», «The description of the members may also spawn multiple paragraphs, and each of them may spawn multiple lines. This description has two paragraphs.», «float member2», «The documentation might be pretty short, though» » ) dnl $1: name, $2: one-line summary, $3: description, $4: members DECLARE_ENUM( «example_enum», «Summary: Illustrate the DECLARE_ENUM macro», «Enumerations are similar to compounds in that they receive a one-line summary and an optional long description, The member list (paramter #4) is expected to be a list of identifier/comment pairs.», « «ENUM_ID1», «comment 1», «ENUM_ID2», «Comments can span multiple lines. Formatting is retained, but leading and trailing newlines are stripped and leading tabs are adjusted to make the C output look nice.» » ) dnl $1: name, $2: one-line summary, $3 description STATEMENT( «extern int bar», «Summary: Illustrate the STATMENT macro», «If the header file contains simple statements, they can be documented with a one-line summary and an optional multi-paragraph description. This is the second paragrapgh of the description.» ) STATEMENT( «struct opaque», «Summary: A statement without a description», ) »)dnl