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