summaryrefslogtreecommitdiff
path: root/graphics/sketch/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/sketch/main.c')
-rw-r--r--graphics/sketch/main.c131
1 files changed, 131 insertions, 0 deletions
diff --git a/graphics/sketch/main.c b/graphics/sketch/main.c
new file mode 100644
index 0000000000..a46fb6c227
--- /dev/null
+++ b/graphics/sketch/main.c
@@ -0,0 +1,131 @@
+/* main.c
+ Copyright (C) 2005,2006,2007 Eugene K. Ressler, Jr.
+
+This file is part of Sketch, a small, simple system for making
+3d drawings with LaTeX and the PSTricks or TikZ package.
+
+Sketch is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+Sketch is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Sketch; see the file COPYING.txt. If not, see
+http://www.gnu.org/copyleft */
+
+#include <stdio.h>
+#include "main.h"
+#include "cmdline.h"
+#include "parse.h"
+#include "emit.h"
+
+static CMD_LINE_OPT_ENV wrap_env[1];
+
+int
+main (int argc, char *argv[])
+{
+ OBJECT *scene, *hsr_scene;
+ int ret;
+ FILE *out_file;
+ SYMBOL_TABLE *sym_tab;
+
+ // create the outer symbol table
+ sym_tab = new_scope (NULL);
+
+ // make first pass through options to process those that are position-independent
+ // save the rest in the wrap environment for later processing
+ process_global_options (wrap_env, argc, argv, sym_tab);
+
+ // die if there were errors parsing options
+ if (trouble_p ())
+ report_errors ();
+
+ // if options show no interest in input
+ if (wrap_env->skip_input_p) {
+ if (wrap_env->n_files > 0)
+ warn (no_line, "input ignored");
+ return 0;
+ }
+
+ if (wrap_env->out_file_name)
+ {
+ out_file = fopen (wrap_env->out_file_name, "w");
+ if (!out_file)
+ err (no_line, "can't open '%s' for output", wrap_env->out_file_name);
+ }
+ else
+ {
+ out_file = stdout;
+ }
+
+ // die if there were errors preparing output stream
+ if (trouble_p ())
+ report_errors ();
+
+ // set up the global environment for the parser
+ init_global_env (global_env, wrap_env->pst_version);
+
+ // process first set of tag defs and set up first input file
+ ret = yywrap ();
+
+ // quits if there were file opening errors in wrap
+ if (ret == 0)
+ {
+ if (trouble_p ())
+ report_errors ();
+ }
+ else
+ {
+ set_lexer_file ("<stdin>", stdin);
+ }
+
+ if (parse (sym_tab) != 0 && !trouble_p ())
+ // emit an error to ensure report_errors halts
+ err (line, "parse error");
+
+ // quits if there is trouble
+ report_errors ();
+
+ // flatten the object hierarchy into a scene
+ scene = flat_scene (parsed_objects (), global_env);
+
+ // painter's algorithm for HSR / HLR
+ if (wrap_env->bsp_only_p)
+ {
+ hsr_scene = hsr_scene_with_bsp (scene);
+ }
+ else
+ {
+ hsr_scene = hsr_scene_with_depth_sort (scene);
+ }
+
+ // emit PStricks or TikZ
+ emit (out_file, hsr_scene, global_env, wrap_env->doc_template_file_name);
+
+ return 0;
+}
+
+int
+yywrap (void)
+{
+ char *file_name = advance_to_next_file_name (wrap_env);
+ if (file_name)
+ {
+ FILE *f = fopen (file_name, "r");
+ if (f)
+ {
+ set_lexer_file (file_name, f);
+ return 0;
+ }
+ else
+ {
+ err (no_line, "can't open file '%s' for input", file_name);
+ }
+ }
+ return 1;
+}