Codebase list unrtf / debian/latest src / main.c
debian/latest

Tree @debian/latest (Download .tar.gz)

main.c @debian/latest

d5eaff9
 
 
 
 
 
 
 
 
dff09ba
d5eaff9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dff09ba
d5eaff9
 
 
 
 
dff09ba
d5eaff9
 
 
 
 
dff09ba
d5eaff9
 
 
 
 
 
 
 
4329b02
 
d5eaff9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dff09ba
d5eaff9
dff09ba
d5eaff9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4329b02
d5eaff9
 
 
 
 
 
 
4329b02
d5eaff9
 
 
 
4329b02
d5eaff9
dff09ba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d5eaff9
 
 
 
 
 
 
 
 
 
dff09ba
d5eaff9
 
dff09ba
d5eaff9
dff09ba
d5eaff9
 
dff09ba
d5eaff9
 
 
dff09ba
d5eaff9
dff09ba
 
d5eaff9
dff09ba
 
d5eaff9
 
 
 
dff09ba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d5eaff9
 
 
 
 
4329b02
d5eaff9
dff09ba
d5eaff9
 
dff09ba
d5eaff9
dff09ba
d5eaff9
 
dff09ba
d5eaff9
dff09ba
 
 
 
 
 
d5eaff9
 
dff09ba
 
d5eaff9
 
 
 
dff09ba
 
 
 
 
 
 
 
d5eaff9
dff09ba
4329b02
dff09ba
4329b02
d5eaff9
dff09ba
 
 
 
d5eaff9
dff09ba
 
d5eaff9
dff09ba
 
 
d5eaff9
dff09ba
d5eaff9
 
 
 
 
 
dff09ba
4329b02
dff09ba
 
 
 
 
 
d5eaff9
dff09ba
d5eaff9
 
 
 
dff09ba
d5eaff9
dff09ba
 
d5eaff9
 
 
 
 
 
 
dff09ba
 
 
 
 
 
 
 
d5eaff9
 
 
dff09ba
d5eaff9
dff09ba
d5eaff9
 
 
dff09ba
 
d5eaff9
 
 
 
 
dff09ba
d5eaff9
dff09ba
d5eaff9
 
 
dff09ba
 
 
 
d5eaff9
 
 
 
 
 
 
 
 
dff09ba
 
d5eaff9
 
dff09ba
 
 
 
641be09
d5eaff9
 
 
 
 
 
dff09ba
 
 
d5eaff9
 
dff09ba
d5eaff9
 
dff09ba
 
 
 
d5eaff9
 
 
 
 
 
 
 
/*=============================================================================
   GNU UnRTF, a command-line program to convert RTF documents to other formats.
   Copyright (C) 2000, 2001, 2004 by Zachary Smith

   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 3 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

   The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au
=============================================================================*/


/*----------------------------------------------------------------------
 * Module name:    main.c
 * Author name:    Zachary Smith
 * Create date:    01 Sep 00
 * Purpose:        main() routine with file open/close.
 *----------------------------------------------------------------------
 * Changes:
 * 14 Oct 00, tuorfa@yahoo.com: added -nopict option
 * 15 Oct 00, tuorfa@yahoo.com: added verify_file_type()
 * 08 Apr 01, tuorfa@yahoo.com: more GNU-like switches implemented
 * 24 Jul 01, tuorfa@yahoo.com: removed verify_file_type()
 * 03 Aug 01, tuorfa@yahoo.com: added --inline switch
 * 08 Sep 01, tuorfa@yahoo.com: added use of UnRTF
 * 19 Sep 01, tuorfa@yahoo.com: addition of output personalities
 * 22 Sep 01, tuorfa@yahoo.com: added function-level comment blocks
 * 23 Sep 01, tuorfa@yahoo.com: added wpml switch
 * 08 Oct 03, daved@physiol.usyd.edu.au: added stdlib.h for linux
 * 07 Jan 04, tuorfa@yahoo.com: removed broken PS support
 * 25 Sep 04, st001906@hrz1.hrz.tu-darmstadt.de: added stdlib.h for djgpp
 * 29 Mar 05, daved@physiol.usyd.edu.au: changes requested by ZT Smith
 * 06 Jan 06, marcossamaral@terra.com.br: includes verbose mode
 * 16 Dec 07, daved@physiol.usyd.edu.au: updated to GPL v3
 * 17 Dec 07, daved@physiol.usyd.edu.au: support for --noremap from
 *		David Santinoli
 * 09 Nov 08, arkadiusz.firus@gmail.com: support for -t <tag_file>
 		and read stdin if no input file provided
 * 13 Dec 08, daved@physiol.usyd.edu.au: search path code
 * 17 Jan 10, daved@physiol.usyd.edu.au: change search path to directory
 *		containing output conf and font charmap files
 * 14 Dec 11, jf@dockes.org: cleaned up get_config
 * 14 Dec 11, daved@physiol.usyd.edu.au: cleaned up get_config added --quiet
 *--------------------------------------------------------------------*/

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#ifdef HAVE_STDIO_H
#include <stdio.h>
#endif

#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif

#ifdef HAVE_STRING_H
#include <string.h>
#endif

#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif

#include "defs.h"
#include "error.h"
#include "word.h"
#include "convert.h"
#include "parse.h"
#include "hash.h"
#include "malloc.h"
#include "path.h"

#include "output.h"
#include "user.h"
#include "main.h"
#include "util.h"

int nopict_mode; /* TRUE => Do not write \pict's to files */
int dump_mode;   /* TRUE => Output a dump of the RTF word tree */
int debug_mode;  /* TRUE => Output debug comments within HTML */
int lineno;      /* Used for error reporting and final line count. */
int simple_mode; /* TRUE => Output HTML without SPAN/DIV tags -- This would
					probably be more useful if we could pull out <font> tags
					as well. */
int inline_mode; /* TRUE => Output HTML without HTML/BODY/HEAD -- This is
					buggy. I've seen it output pages of </font> tags. */
/* marcossamaral - 0.19.9 */
int verbose_mode;  /* TRUE => Output additional informations about unrtf */
int no_remap_mode; /* don't remap codepoints */
int quiet;	   /* TRUE => don't output header comments */


OutputPersonality *op = NULL;

/*========================================================================
 * Name:	get_config
 * Purpose:	Updates output acording to information found in file path.
 * Args:	Configuration file base name, OutputPersonality
 * Returns:	Updated OutputPersonality.
 *=======================================================================*/

OutputPersonality *
get_config(char *name, OutputPersonality *op)
{
	char *configfile = 0;
	if (!path_checked && check_dirs() == 0)
	{
		fprintf(stderr, "No config directories. Searched: %s\n", search_path);
		exit(1);
	}
	configfile = search_in_path(name, "conf");
	if (configfile == NULL)
	{
		fprintf(stderr, "failed to find %s.conf in search path dirs\n", name);
		exit(1);
	}
	op = user_init(op, configfile);
	free(configfile);
	return op;
}

/*========================================================================
 * Name:	main
 * Purpose:	Main control function.
 * Args:	Args.
 * Returns:	Exit code.
 *=======================================================================*/

int
main(int argc, char **argv)
{
	FILE *f;
	Word *word;
	char *path = NULL;
	char *env_path_p = NULL;

	int i;
	nopict_mode = debug_mode = dump_mode = inline_mode = no_remap_mode = quiet = FALSE;
	/* initialize search path to compiled-in value */
	search_path = DEFAULT_UNRTF_SEARCH_PATH;

	if ((env_path_p = getenv("UNRTF_SEARCH_PATH")) != NULL)
	{
		if (verbose_mode)
		{
			fprintf(stderr, "got environment path: %s\n", env_path_p);
		}
		search_path = env_path_p;
	}

	/* Handle arguments */

	for (i = 1; i < argc; i++)
	{
		if (!strcmp("--dump", argv[i]))
		{
			dump_mode = TRUE;
		}
		else if (!strcmp("-d", argv[i]))
		{
			dump_mode = TRUE;
		}
		else if (!strcmp("--debug", argv[i]))
		{
			debug_mode = TRUE;
		}
		else if (!strcmp("--verbose", argv[i]))
		{
			verbose_mode = TRUE;
		}
		else if (!strcmp("--quiet", argv[i]))
		{
			quiet = TRUE;
		}
		else if (!strcmp("--simple", argv[i]))
		{
			simple_mode = TRUE;
		}
		else if (!strcmp("--noremap", argv[i]))
		{
			no_remap_mode = TRUE;
		}
		else if (!strcmp("-t", argv[i]))
		{
			if ((i + 1) < argc && *argv[i + 1] != '-')
			{
				i++;
				op = get_config(argv[i], op);
			}
		}
		else if (!strcmp("-P",  argv[i]))
		{
			if (i + 1 > argc)
			{
				fprintf(stderr, "-P needs a path argument\n");
				exit(1);
			}
			search_path = argv[++i];
		}
		else if (!strcmp("--inline", argv[i]))
		{
			inline_mode = TRUE;
		}
		else if (!strcmp("--help", argv[i]))
		{
			usage();
		}
		else if (!strcmp("--version", argv[i]))
		{
			fprintf(stderr, "%s\n", PACKAGE_VERSION);
			fprintf(stderr, "search path is: %s\n", search_path);
			exit(0);
		}
		else if (!strcmp("--nopict", argv[i]))
		{
			nopict_mode = TRUE;
		}
		else if (!strcmp("-n", argv[i]))
		{
			nopict_mode = TRUE;
		}
		else if (!strncmp("--", argv[i], 2))
		{
			op = get_config(&argv[i][2], op);
		}
		else
		{
			if (*argv[i] == '-')
			{
				usage();
			}

			if (path)
			{
				usage();
			}
			else
			{
				path = argv[i];
			}
		}
	}



	if (op == NULL)
	{
		op = get_config(DEFAULT_OUTPUT, op);
	}
	if (op == NULL) {
		fprintf(stderr, "Initialization error: no output format\n");
		exit(1);
	}
	if (!path_checked && check_dirs() == 0)
	{
		fprintf(stderr, "no config directories\n");
		exit(1);
	}



	/* Program information */
	if (verbose_mode || debug_mode)
	{
		fprintf(stderr, "This is UnRTF ");
		fprintf(stderr, "version %s\n", PACKAGE_VERSION);
		fprintf(stderr, "By Dave Davey, Marcos Serrou do Amaral and Arkadiusz Firus\n");
		fprintf(stderr, "Original Author: Zachary Smith\n");
		show_dirs();
	}

	if (debug_mode)
	{
		fprintf(stderr, "Debug mode.\n");
	}
	if (dump_mode)
	{
		fprintf(stderr, "Dump mode.\n");
	}

	/* Open file for reading. Append ".rtf" to file name if not supplied. */
	if (path == NULL)
	{
		f = stdin;
	}
	else
	{
		f = fopen(path, "r");
		if (!f)
		{
			char path2[200];
			strcpy(path2, path);
			strcat(path2, ".rtf");
			f = fopen(path2, "r");
			if (!f)
			{
				error_handler("Cannot open input file");
			}
		}
	}

	if (verbose_mode || debug_mode)
	{
		fprintf(stderr, "Processing %s...\n", path);
	}

	/* Keep track of lines processed. This is arbitrary to the user as
	 *   RTF ignores newlines. May be helpful in error tracking. */
	lineno = 0;

	/* All the work starts here. word_read() should keep reading words until
	 *   the end of the file. */
	word = word_read(f);

	if (dump_mode)
	{
		word_dump(word);
		printf("\n");
	}
	else
	{
		/* Should we also optimize word before dump? - AF */
		word = optimize_word(word, 1);
		word_print(word);
	}

	fclose(f);

	/* marcossamaral - 0.19.9 */
	if (verbose_mode || debug_mode)
	{
		unsigned long total = 0;
		total = hash_stats();
		fprintf(stderr, "Done.\n");
		fprintf(stderr, "%lu words were hashed.\n", total);
	}

	if (debug_mode)
	{
		fprintf(stderr, "Total memory allocated %ld bytes.\n",
		        total_malloced());
	}

	/* May as well */
	word_free(word);

	return 0;
}