+/*
+ * PaperJam -- Main program
+ *
+ * (c) 2018 Martin Mares <mj@ucw.cz>
+ */
+
#include <cassert>
#include <cstdarg>
#include <cstdlib>
#include <cstdio>
+#include <getopt.h>
#include "jam.h"
+/*** Options ***/
+
+const char *in_name;
+const char *out_name;
+bool recalc_bbox;
+int debug_level;
+int debug_indent;
+
+/*** Messages ***/
+
+void debug(const char *msg, ...)
+{
+ if (!debug_level)
+ return;
+ va_list args;
+ va_start(args, msg);
+ fprintf(stderr, "%*s", debug_indent, "");
+ vfprintf(stderr, msg, args);
+ fputc('\n', stderr);
+ va_end(args);
+}
+
+void warn(const char *msg, ...)
+{
+ va_list args;
+ va_start(args, msg);
+ fprintf(stderr, "Warning: ");
+ vfprintf(stderr, msg, args);
+ fputc('\n', stderr);
+ va_end(args);
+}
+
+void die(const char *msg, ...)
+{
+ va_list args;
+ va_start(args, msg);
+ vfprintf(stderr, msg, args);
+ fputc('\n', stderr);
+ va_end(args);
+ exit(1);
+}
+
+void err(const char *msg, ...)
+{
+ va_list args;
+ va_start(args, msg);
+ char buf[1024];
+ vsnprintf(buf, sizeof(buf), msg, args);
+ va_end(args);
+ throw paperjam_error(buf);
+}
+
+/*** Arguments ***/
+
+enum opt {
+ OPT_HELP = 256,
+ OPT_VERSION,
+};
+
+static const struct option long_opts[] = {
+ { "debug", 0, 0, 'd' },
+ { "help", 0, 0, OPT_HELP },
+ { "version", 0, 0, OPT_VERSION },
+ { "bbox", 0, 0, 'b' },
+ { 0, 0, 0, 0 }
+};
+
+static const char short_opts[] = "bd";
+
+static void usage()
+{
+ printf("Usage: paperjam [<options>] <commands> <in> <out>\n\
+\n\
+Options:\n\
+-b, --bbox Recalculate bounding boxes\n\
+-d, --debug Show debugging messages\n\
+\n\
+<command> = <name>(<args>, <named-arg>[=<value>], ...) [<pipeline>]\n\
+<pipeline> = { <stage>, <stage>, ... }\n\
+<stage> = <page> <page> ... [: <commands>]\n\
+\n\
+Commands:\n\
+");
+ parser_help();
+}
+
+static void show_version()
+{
+ printf("PaperJam " VERSION " -- a PDF processor\n");
+ printf("(c) " YEAR " Martin Mares, distributed under GNU GPL 2+\n");
+ printf("Built on " BUILD_DATE " from Git commit " BUILD_COMMIT "\n");
+}
+
int main(int argc, char **argv)
{
- if (argc != 4)
- {
- fprintf(stderr, "Usage: pdfjam <commands> <input> <output>\n");
- return 1;
- }
+ int c;
+ while ((c = getopt_long(argc, argv, short_opts, long_opts, NULL)) >= 0)
+ switch (c)
+ {
+ case 'b':
+ recalc_bbox = 1;
+ break;
+ case 'd':
+ debug_level++;
+ break;
+ case OPT_VERSION:
+ show_version();
+ return 0;
+ case OPT_HELP:
+ usage();
+ return 0;
+ default:
+ exit(1);
+ }
+
+ if (optind + 3 != argc)
+ die("Exactly three positional parameters should be given");
list<cmd *> cmds;
- parse(argv[1], &cmds);
+ parse(argv[optind], cmds);
+ in_name = argv[optind+1];
+ out_name = argv[optind+2];
+
+ try
+ {
+ process(cmds);
+ }
+ catch (exception& e)
+ {
+ die("%s", e.what());
+ }
return 0;
}