/* 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 #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); } 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; }