1 /*
2  * makepage: Use mkd_xhtmlpage() to convert markdown input to a
3  *           fully-formed xhtml page.
4  */
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <mkdio.h>
9 #include "config.h"
10 #include "pgm_options.h"
11 #include "gethopt.h"
12 
13 #ifndef HAVE_BASENAME
14 char*
basename(char * p)15 basename(char *p)
16 {
17     char *ret = strrchr(p, '/');
18 
19     return ret ? (1+ret) : p;
20 }
21 #endif
22 
23 char *pgm = "makepage";
24 
25 struct h_opt opts[] = {
26     { 0, "version", 'V', 0,           "show version info" },
27     { 0, 0,         'F', "bitmap",    "set/show hex flags" },
28     { 0, "flags",   'f', "{+-}flags", "set/show named flags" },
29 } ;
30 #define NROPTS (sizeof opts / sizeof opts[0])
31 
32 int
main(argc,argv)33 main(argc, argv)
34 int argc;
35 char **argv;
36 {
37     MMIOT *doc;
38     char *q;
39     int version = 0;
40     int ret;
41     mkd_flag_t flags = 0;
42     struct h_opt *opt;
43     struct h_context blob;
44 
45     if ( (q = getenv("MARKDOWN_FLAGS")) )
46 	flags = strtol(q, 0, 0);
47 
48     hoptset(&blob, argc, argv);
49     hopterr(&blob, 1);
50 
51     while ( opt = gethopt(&blob, opts, NROPTS) ) {
52 	if ( opt == HOPTERR ) {
53 	    hoptusage(pgm, opts, NROPTS, "[file]");
54 	    exit(1);
55 	}
56 	switch ( opt->optchar ) {
57 	case 'V':   version++;
58 		    break;
59 	case 'F':   if ( strcmp(hoptarg(&blob), "?") == 0 ) {
60 			show_flags(0,0);
61 			exit(0);
62 		    }
63 		    else
64 			flags = strtol(hoptarg(&blob), 0, 0);
65 		    break;
66 	case 'f':   if ( strcmp(hoptarg(&blob), "?") == 0 ) {
67 			show_flags(1,version);
68 			exit(0);
69 		    }
70 		    else if ( q = set_flag(&flags, hoptarg(&blob)) )
71 			fprintf(stderr, "unknown option <%s>\n", q);
72 		    break;
73 	}
74     }
75 
76     argc -= hoptind(&blob);
77     argv += hoptind(&blob);
78 
79     if ( version ) {
80 	printf("%s: discount %s", pgm, markdown_version);
81 	if ( version > 1 )
82 	    mkd_flags_are(stdout, flags, 0);
83 	putchar('\n');
84 	exit(0);
85     }
86 
87     if ( (argc > 0) && !freopen(argv[0], "r", stdin) ) {
88 	perror(argv[0]);
89 	exit(1);
90     }
91 
92     if ( (doc = mkd_in(stdin, flags)) == 0 ) {
93 	perror( (argc > 1) ? argv[1] : "stdin" );
94 	exit(1);
95     }
96 
97     ret = mkd_xhtmlpage(doc, flags, stdout);
98 
99     mkd_cleanup(doc);
100 
101     return (ret == EOF);
102 }
103