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