File indexing completed on 2024-05-05 11:56:30

0001 /*
0002  * makepage: Use mkd_xhtmlpage() to convert markdown input to a
0003  *           fully-formed xhtml page.
0004  */
0005 #include <stdio.h>
0006 #include <stdlib.h>
0007 #include <string.h>
0008 #include <mkdio.h>
0009 #include "config.h"
0010 #include "pgm_options.h"
0011 #include "gethopt.h"
0012 
0013 #ifndef HAVE_BASENAME
0014 char*
0015 basename(char *p)
0016 {
0017     char *ret = strrchr(p, '/');
0018 
0019     return ret ? (1+ret) : p;
0020 }
0021 #endif
0022 
0023 char *pgm = "makepage";
0024 
0025 struct h_opt opts[] = {
0026     { 0, "version", 'V', 0,           "show version info" },
0027     { 0, 0,         'F', "bitmap",    "set/show hex flags" },
0028     { 0, "flags",   'f', "{+-}flags", "set/show named flags" },
0029 } ;
0030 #define NROPTS (sizeof opts / sizeof opts[0])
0031 
0032 int
0033 main(argc, argv)
0034 int argc;
0035 char **argv;
0036 {
0037     MMIOT *doc;
0038     char *q;
0039     int version = 0;
0040     int ret;
0041     mkd_flag_t flags = 0;
0042     struct h_opt *opt;
0043     struct h_context blob;
0044 
0045     if ( (q = getenv("MARKDOWN_FLAGS")) )
0046     flags = strtol(q, 0, 0);
0047 
0048     hoptset(&blob, argc, argv);
0049     hopterr(&blob, 1);
0050 
0051     while ( opt = gethopt(&blob, opts, NROPTS) ) {
0052     if ( opt == HOPTERR ) {
0053         hoptusage(pgm, opts, NROPTS, "[file]");
0054         exit(1);
0055     }
0056     switch ( opt->optchar ) {
0057     case 'V':   version++;
0058             break;
0059     case 'F':   if ( strcmp(hoptarg(&blob), "?") == 0 ) {
0060             show_flags(0,0);
0061             exit(0);
0062             }
0063             else
0064             flags = strtol(hoptarg(&blob), 0, 0);
0065             break;
0066     case 'f':   if ( strcmp(hoptarg(&blob), "?") == 0 ) {
0067             show_flags(1,version);
0068             exit(0);
0069             }
0070             else if ( q = set_flag(&flags, hoptarg(&blob)) )
0071             fprintf(stderr, "unknown option <%s>\n", q);
0072             break;
0073     }
0074     }
0075     
0076     argc -= hoptind(&blob);
0077     argv += hoptind(&blob);
0078     
0079     if ( version ) {
0080     printf("%s: discount %s", pgm, markdown_version);
0081     if ( version > 1 )
0082         mkd_flags_are(stdout, flags, 0);
0083     putchar('\n');
0084     exit(0);
0085     }    
0086     
0087     if ( (argc > 0) && !freopen(argv[0], "r", stdin) ) {
0088     perror(argv[0]);
0089     exit(1);
0090     }
0091 
0092     if ( (doc = mkd_in(stdin, flags)) == 0 ) {
0093     perror( (argc > 1) ? argv[1] : "stdin" );
0094     exit(1);
0095     }
0096 
0097     ret = mkd_xhtmlpage(doc, flags, stdout);
0098 
0099     mkd_cleanup(doc);
0100 
0101     return (ret == EOF);
0102 }