diff options
Diffstat (limited to 'graphics/sketch/main.c')
-rw-r--r-- | graphics/sketch/main.c | 131 |
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; +} |