/* -*- c-*- */
/*
GlossTeX, a tool for the automatic preparation of glossaries.
Copyright (C) 1997 Volkan Yavuz
This program 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 2
of the License, or (at your option) any later version.
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Volkan Yavuz,
[email protected]
*/
/* $Id: main.c,v 1.31 1997/12/13 16:06:57 volkan Exp $ */
#include "glosstex.h"
#include "database.h"
#include "error.h"
#include "labels.h"
#include "list.h"
#include "version.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
enum e_loglevel loglevel = PROGRESS;
s_list labels; /* list of all labels found */
s_list databases; /* list of all databases */
char *progname = 0; /* name this prog was called with */
char *inname = 0; /* name of root input (.aux) file */
char *outname = 0; /* name of output file */
char *logname = 0; /* name of logfile */
FILE *outfile;
FILE *logfile;
unsigned int count_label_parsing = 0; /* parsing failed */
unsigned int count_label_defined = 0; /* label already defined */
unsigned int count_label_override = 0; /* label overridden */
unsigned int count_label_success = 0; /* success */
unsigned int count_label_unresolved = 0; /* unresolved labels */
unsigned int count_gdf_parsing; /* parsing failed */
unsigned int count_gdf_defined; /* term already defined */
unsigned int count_gdf_success; /* success */
char usage[] = "Usage: %s aux gdf0 [gdf1 ...] [-v[0-5]]\n";
static void parse_commandline (int argc, char **argv);
static void open_files (void);
static char *check_extension (const char *string, const char *ext);
static char *build_filename (const char *string, const char *ext);
int
main (int argc, char *argv[])
{
labels.root = labels.top = 0;
databases.root = databases.top = 0;
assert (argv[0] != 0);
progname = (char *) malloc (strlen (argv[0]) + 1);
assert (progname != 0);
strcpy (progname, argv[0]);
printf ("%s\n", version);
parse_commandline (argc, argv);
open_files ();
if (read_labels (inname) != 0) {
if (unlink(outname) != 0) {
error ("output-file %s", outname);
exit (EXIT_FAILURE);
}
if (unlink(logname) != 0) {
error ("logfile %s", outname);
exit (EXIT_FAILURE);
}
exit (EXIT_FAILURE);
}
printlog (PROGRESS, STDOUT,
"\n(parse errors:%d, overrides: %d, success:%d)\n\n",
count_label_parsing, count_label_override, count_label_success);
read_databases ();
printlog (PROGRESS, STDOUT,
"\n(parse errors:%d, terms already defined: %d, success:%d)\n",
count_gdf_parsing, count_gdf_defined, count_gdf_success);
if ((count_label_unresolved = show_unresolved_labels (labels, logfile)) != 0)
printlog (PROGRESS, STDOUT, "\n(unresolved labels: %d)",
count_label_unresolved, logname);
printlog (PROGRESS, STDOUT,
"\nWrote output-file %s, log-file %s\n", outname, logname);
return 0;
}
static void
parse_commandline (int argc, char **argv)
{
int index;
if (argc < 3) {
fprintf (stderr, usage, progname);
exit (EXIT_FAILURE);
}
inname = check_extension (argv[1], ".aux");
for (index = 2; index < argc; index++) {
if (strncmp (argv[index], "-v0", 3) == 0)
loglevel = ERROR;
else if (strncmp (argv[index], "-v1", 3) == 0)
loglevel = WARNING;
else if (strncmp (argv[index], "-v2", 3) == 0)
loglevel = PROGRESS;
else if (strncmp (argv[index], "-v3", 3) == 0)
loglevel = INFORMATION;
else if (strncmp (argv[index], "-v4", 3) == 0)
loglevel = VERBOSE;
else if (strncmp (argv[index], "-v5", 3) == 0)
loglevel = DEBUG;
else if (strncmp (argv[index], "-v", 2) == 0)
loglevel = VERBOSE;
else
(void) list_add (&databases, check_extension (argv[index], ".gdf"));
}
}
static void
open_files (void)
{
if (outname == 0)
outname = build_filename (inname, ".gxs");
if ((outfile = fopen (outname, "w")) == NULL) {
error ("output-file %s", outname);
exit (EXIT_FAILURE);
}
if (logname == 0)
logname = build_filename (inname, ".gxg");
if ((logfile = fopen (logname, "w")) == NULL) {
error ("log-file %s", logname);
exit (EXIT_FAILURE);
}
}
static char *
check_extension (const char *string, const char *ext)
{
char *new = 0;
if (strchr (string, '.') == 0) {
new = (char *) malloc (strlen (string) + strlen (ext) + 1);
assert (new != 0);
strcpy (new, string);
strcat (new, ext);
} else {
new = (char *) malloc (strlen (string) + 1);
assert (new != 0);
strcpy (new, string);
}
return new;
}
static char *
build_filename (const char *string, const char *ext)
{
char *filename = 0;
size_t len;
len = strcspn (string, ".");
assert (len != 0);
filename = (char *) malloc (len + strlen (ext) + 1);
assert (filename != 0);
strncpy (filename, string, len);
filename[len] = '\0'; /* mark end of string */
strcat (filename, ext);
return filename;
}