]> mj.ucw.cz Git - paperjam.git/blob - paperjam.cc
Added example usage to --help
[paperjam.git] / paperjam.cc
1 /*
2  *      PaperJam -- Main program
3  *
4  *      (c) 2018--2022 Martin Mares <mj@ucw.cz>
5  */
6
7 #include <cassert>
8 #include <cstdarg>
9 #include <cstdlib>
10 #include <cstdio>
11 #include <getopt.h>
12
13 #include "jam.h"
14
15 /*** Options ***/
16
17 const char *in_name;
18 const char *out_name;
19 bool recalc_bbox;
20 bool no_auto_transforms;
21 int debug_level;
22 int debug_indent;
23
24 /*** Messages ***/
25
26 void debug(const char *msg, ...)
27 {
28   if (!debug_level)
29     return;
30   va_list args;
31   va_start(args, msg);
32   fprintf(stderr, "%*s", debug_indent, "");
33   vfprintf(stderr, msg, args);
34   fputc('\n', stderr);
35   va_end(args);
36 }
37
38 void warn(const char *msg, ...)
39 {
40   va_list args;
41   va_start(args, msg);
42   fprintf(stderr, "Warning: ");
43   vfprintf(stderr, msg, args);
44   fputc('\n', stderr);
45   va_end(args);
46 }
47
48 void die(const char *msg, ...)
49 {
50   va_list args;
51   va_start(args, msg);
52   vfprintf(stderr, msg, args);
53   fputc('\n', stderr);
54   va_end(args);
55   exit(1);
56 }
57
58 void err(const char *msg, ...)
59 {
60   va_list args;
61   va_start(args, msg);
62   char buf[1024];
63   vsnprintf(buf, sizeof(buf), msg, args);
64   va_end(args);
65   throw paperjam_error(buf);
66 }
67
68 /*** Arguments ***/
69
70 enum opt {
71   OPT_HELP = 256,
72   OPT_VERSION,
73   OPT_NO_AUTO,
74 };
75
76 static const struct option long_opts[] = {
77   { "debug",    0, 0, 'd' },
78   { "help",     0, 0, OPT_HELP },
79   { "version",  0, 0, OPT_VERSION },
80   { "bbox",     0, 0, 'b' },
81   { 0,          0, 0, 0 }
82 };
83
84 static const char short_opts[] = "bd";
85
86 static void usage()
87 {
88   printf("Usage: paperjam [<options>] <commands> <in> <out>\n\
89 \n\
90 Options:\n\
91 -b, --bbox              Recalculate bounding boxes\n\
92 -d, --debug             Show debugging messages\n\
93     --no-auto           Disable automatic rotation of pages\n\
94 \n\
95 <command> = <name>(<args>, <named-arg>[=<value>], ...) [<pipeline>]\n\
96 <pipeline> = { <stage>, <stage>, ... }\n\
97 <stage> = <page> <page> ... [: <commands>]\n\
98 \n\
99 Example:\n\
100 paperjam 'book nup(2, paper=a4)' input.pdf output.pdf\n\
101 \n\
102 Commands:\n\
103 ");
104   parser_help();
105 }
106
107 static void show_version()
108 {
109   printf("PaperJam " VERSION " -- a PDF processor\n");
110   printf("(c) " YEAR " Martin Mares, distributed under GNU GPL 2+\n");
111   printf("Built on " BUILD_DATE " from Git commit " BUILD_COMMIT "\n");
112 }
113
114 int main(int argc, char **argv)
115 {
116   int c;
117   while ((c = getopt_long(argc, argv, short_opts, long_opts, NULL)) >= 0)
118     switch (c)
119       {
120       case 'b':
121         recalc_bbox = 1;
122         break;
123       case 'd':
124         debug_level++;
125         break;
126       case OPT_VERSION:
127         show_version();
128         return 0;
129       case OPT_HELP:
130         usage();
131         return 0;
132       case OPT_NO_AUTO:
133         no_auto_transforms = true;
134         break;
135       default:
136         exit(1);
137       }
138
139   if (optind + 3 != argc)
140     die("Exactly three positional parameters should be given");
141
142   list<cmd *> cmds;
143   parse(argv[optind], cmds);
144   in_name = argv[optind+1];
145   out_name = argv[optind+2];
146
147   try
148     {
149       process(cmds);
150     }
151   catch (exception& e)
152     {
153       die("%s", e.what());
154     }
155
156   return 0;
157 }