The Discount distribution includes a few sample programs, which are woefully undocumented, but give a good idea of how to call the library.
They are:
This program is about as simple as you can get for rendering a markdown document. I’ve annotated it to try and describe it:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mkdio.h>
int
main(argc, argv)
char **argv;
{
I need a flag structure pointer (
mkd_flag_t*) and a document pointer (MMIOT*).flag_argandflag_errare used here to handle setting option flags
    mkd_flag_t *flags;
    char *flag_arg;
    char *flag_err;
    MMIOT *doc;
Before using a flag blob, it needs to be initialized.
mkd_flags()is the initializer (withmkd_free_flags()as the corresponding cleanup function.)
    if ( (flags = mkd_flags()) == NULL ) {
        fprintf(stderr, "out of memory initializing flag blob?\n");
        exit(1);
    }
Here I’ll process options using
mkd_set_flag_string()– this function munches the flag string I pass it, so if I want to preserve the original option string I need to copy it and pass the copy tomkd_set_flag_string().
    while ( (argc > 1) && (strncmp(argv[1], "-f", 2) == 0) ) {
        flag_arg = strdup(2+argv[1]);
        argc--;
        argv++;
You can see the options by calling
show_flags()show_flags()is not exposed in the API, so you’d need to define before calling it.
        if ( strcmp(argv[0], "-f?") == 0 ) {
            extern void show_flags(int, int, mkd_flag_t*);
            show_flags(1, 1, NULL);
            exit(0);
        }
Here’s where we parse a single option string;
mkd_set_flag_string()splits the option string apart at each comma (so-fhtml5,strictis identical to the two options-fhtml5 -fstrict) and returns NULL if everything is valid, or a pointer to the first unknown flag if not.
        if ( (flag_err = mkd_set_flag_string(flags, flag_arg)) != NULL ) {
            fprintf(stderr, "unknown argument %s\n", flag_err);
            exit(1);
        }
Since I used
strdup() to duplicate the flag option string, I need tofree()` it when I’m done using it.
        free(flag_arg);
    }
Standard unix here; if an input file is given on the command line, use
freopen()to associate it to stdin
    if ( (argc > 1) && (freopen(argv[1], "r", stdin) == NULL) ) {
        fprintf(stderr, "cannot open %s for input\n", argv[1]);
        exit(1);
    }
Here we read our input; if it is successful, it returns a
MMIOTpointer that we can use to further process the document.
    if ( (doc=mkd_in(stdin, flags)) == NULL ) {
        fprintf(stderr, "unable to load %s\n", (argc>1) ? argv[1] : "markdown source");
        exit(1);
    }
With the document in hand we call
mkd_compileto convert the markdown to HTML, thenmkd_generatehtml()to write it to standard output.
    if ( mkd_compile(doc, flags) )
        mkd_generatehtml(doc, stdout);
    else
        fprintf(stderr, "unable to compile %s\n", (argc>1) ? argv[1] : "markdown source");
And when we’re done we need to call
mkd_cleanup()to deallocate theMMIOTthat the document is stored in &mkd_free_flags()to deallocate our previously allocated flag blob.
    mkd_cleanup(doc);
    mkd_free_flags(flags);
And that’s it
    exit(0);
}