[geany/geany] ea72ec: Remove ctags.c and move its content to routines.c, main.c and options.c

Jiří Techet git-noreply at xxxxx
Sat Sep 10 07:26:21 UTC 2016


Branch:      refs/heads/master
Author:      Jiří Techet <techet at gmail.com>
Committer:   Jiří Techet <techet at gmail.com>
Date:        Tue, 02 Aug 2016 22:27:22 UTC
Commit:      ea72ecc00fc22f24eced3ffce7c7db67d5f02271
             https://github.com/geany/geany/commit/ea72ecc00fc22f24eced3ffce7c7db67d5f02271

Log Message:
-----------
Remove ctags.c and move its content to routines.c, main.c and options.c

This is mostly just moving code with just some minor modifications:
- removal of code of unsupported platforms (VAX, OS2, etc.)
- syncing includes/headers of affected files with uctags
- removal of some functions we don't need in Geany and whose movement
  would require additional changes (those will get added back when
  doing final sync with uctags)
- minor whitespace syncs


Modified Paths:
--------------
    ctags/Makefile.am
    ctags/main/args.c
    ctags/main/ctags.c
    ctags/main/entry.c
    ctags/main/general.h
    ctags/main/lregex.c
    ctags/main/main.c
    ctags/main/main.h
    ctags/main/nestlevel.c
    ctags/main/options.c
    ctags/main/options.h
    ctags/main/parse.c
    ctags/main/routines.c
    ctags/main/routines.h
    ctags/main/sort.c
    ctags/main/strlist.c
    ctags/main/vstring.c
    ctags/parsers/asm.c
    ctags/parsers/c.c
    ctags/parsers/fortran.c
    ctags/parsers/jscript.c
    ctags/parsers/json.c
    ctags/parsers/matlab.c
    ctags/parsers/pascal.c
    ctags/parsers/perl.c
    ctags/parsers/php.c
    ctags/parsers/sh.c
    ctags/parsers/sql.c

Modified: ctags/Makefile.am
3 lines changed, 2 insertions(+), 1 deletions(-)
===================================================================
@@ -55,7 +55,6 @@ parsers = \
 libctags_la_SOURCES = \
 	main/args.c \
 	main/args.h \
-	main/ctags.c \
 	main/ctags.h \
 	main/debug.h \
 	main/entry.c \
@@ -67,6 +66,7 @@ libctags_la_SOURCES = \
 	main/lcpp.c \
 	main/lcpp.h \
 	main/lregex.c \
+	main/main.c \
 	main/main.h \
 	main/mio.c \
 	main/mio.h \
@@ -79,6 +79,7 @@ libctags_la_SOURCES = \
 	main/parsers.h \
 	main/read.c \
 	main/read.h \
+	main/routines.c \
 	main/routines.h \
 	main/sort.c \
 	main/sort.h \


Modified: ctags/main/args.c
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -18,7 +18,7 @@
 #include <ctype.h>
 
 #include "args.h"
-#include "main.h"
+#include "routines.h"
 
 /*
 *   FUNCTION DEFINITIONS


Modified: ctags/main/ctags.c
1397 lines changed, 0 insertions(+), 1397 deletions(-)
===================================================================
@@ -1,1397 +0,0 @@
-/*
-*
-*   Copyright (c) 1996-2001, Darren Hiebert
-*
-*   Author: Darren Hiebert <darren at hiebert.com>, <darren at hiwaay.net>
-*           http://darren.hiebert.com
-*
-*   This source code is released for free distribution under the terms of the
-*   GNU General Public License. It is provided on an as-is basis and no
-*   responsibility is accepted for its failure to perform as expected.
-*
-*   This is a reimplementation of the ctags (1) program. It is an attempt to
-*   provide a fully featured ctags program which is free of the limitations
-*   which most (all?) others are subject to.
-*
-*   This module contains top level start-up and portability functions.
-*/
-
-/*
-*   INCLUDE FILES
-*/
-#include "general.h"    /* must always come first */
-#include <glib.h>
-#include <glib/gstdio.h>
-
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>            /* to declare malloc (), realloc () */
-#endif
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-
-#include <stdio.h>              /* to declare SEEK_SET (hopefully) */
-# include <fcntl.h>             /* to declar O_RDWR, O_CREAT, O_EXCL */
-# include <unistd.h>            /* to declare mkstemp () */
-
-#ifdef AMIGA
-# include <dos/dosasl.h>        /* for struct AnchorPath */
-# include <clib/dos_protos.h>   /* function prototypes */
-# define ANCHOR_BUF_SIZE 512
-# define ANCHOR_SIZE (sizeof (struct AnchorPath) + ANCHOR_BUF_SIZE)
-# ifdef __SASC
-   extern struct DosLibrary *DOSBase;
-#  include <pragmas/dos_pragmas.h>
-# endif
-#endif
-
-#include <stdarg.h>
-
-
-
-/*  To declare "struct stat" and stat ().
- */
-#if defined (HAVE_SYS_TYPES_H)
-# include <sys/types.h>
-#else
-# if defined (HAVE_TYPES_H)
-#  include <types.h>
-# endif
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#else
-# ifdef HAVE_STAT_H
-#  include <stat.h>
-# endif
-#endif
-
-/*  To provide directory searching for recursion feature.
- */
-#ifdef HAVE_DIRENT_H
-# ifdef __BORLANDC__
-#  define boolean BORLAND_boolean
-# endif
-# include <dirent.h>
-# undef boolean
-#endif
-#ifdef HAVE_DIRECT_H
-# include <direct.h>    /* to _getcwd */
-#endif
-#ifdef HAVE_DOS_H
-# include <dos.h>       /* to declare FA_DIREC */
-#endif
-#ifdef HAVE_DIR_H
-# include <dir.h>       /* to declare findfirst () and findnext () */
-#endif
-#ifdef HAVE_IO_H
-# include <io.h>        /* to declare _finddata_t in MSVC++ 4.x */
-#endif
-
-/*  To provide timings features if available.
- */
-#ifdef HAVE_CLOCK
-# ifdef HAVE_TIME_H
-#  include <time.h>
-# endif
-#else
-# ifdef HAVE_TIMES
-#  ifdef HAVE_SYS_TIMES_H
-#   include <sys/times.h>
-#  endif
-# endif
-#endif
-
-#include "entry.h"
-#include "keyword.h"
-#include "main.h"
-#include "options.h"
-#include "parse.h"
-#include "read.h"
-#include "vstring.h"
-
-#ifdef TRAP_MEMORY_CALLS
-# include "safe_malloc.h"
-#endif
-
-/*
-*   MACROS
-*/
-
-/*
- *  Miscellaneous macros
- */
-#define selected(var,feature)   (((int)(var) & (int)(feature)) == (int)feature)
-#define plural(value)           (((unsigned long)(value) == 1L) ? "" : "s")
-
-/*
- *  Portability macros
- */
-#ifndef PATH_SEPARATOR
-# if defined (MSDOS_STYLE_PATH)
-#  define PATH_SEPARATOR '\\'
-# elif defined (QDOS)
-#  define PATH_SEPARATOR '_'
-# else
-#  define PATH_SEPARATOR '/'
-# endif
-#endif
-
-#if defined (MSDOS_STYLE_PATH) && defined (UNIX_PATH_SEPARATOR)
-# define OUTPUT_PATH_SEPARATOR  '/'
-#else
-# define OUTPUT_PATH_SEPARATOR  PATH_SEPARATOR
-#endif
-
-/*  File type tests.
- */
-#ifndef S_ISREG
-# if defined (S_IFREG) && ! defined (AMIGA)
-#  define S_ISREG(mode)     ((mode) & S_IFREG)
-# else
-#  define S_ISREG(mode)     TRUE        /* assume regular file */
-# endif
-#endif
-
-#ifndef S_ISLNK
-# ifdef S_IFLNK
-#  define S_ISLNK(mode)     (((mode) & S_IFMT) == S_IFLNK)
-# else
-#  define S_ISLNK(mode)     FALSE       /* assume no soft links */
-# endif
-#endif
-
-#ifndef S_ISDIR
-# ifdef S_IFDIR
-#  define S_ISDIR(mode)     (((mode) & S_IFMT) == S_IFDIR)
-# else
-#  define S_ISDIR(mode)     FALSE       /* assume no soft links */
-# endif
-#endif
-
-#ifndef S_IXUSR
-# define S_IXUSR 0
-#endif
-#ifndef S_IXGRP
-# define S_IXGRP 0
-#endif
-#ifndef S_IXOTH
-# define S_IXOTH 0
-#endif
-
-#ifndef S_IRUSR
-# define S_IRUSR 0400
-#endif
-#ifndef S_IWUSR
-# define S_IWUSR 0200
-#endif
-
-/*  Hack for ridiculous practice of Microsoft Visual C++.
- */
-#if defined (WIN32)
-# if defined (_MSC_VER)
-#  define stat    _stat
-#  define getcwd  _getcwd
-#  define PATH_MAX  _MAX_PATH
-# elif defined (__BORLANDC__)
-#  define PATH_MAX  MAXPATH
-# endif
-#endif
-
-#ifndef PATH_MAX
-# define PATH_MAX 256
-#endif
-
-/*
-*   DATA DEFINITIONS
-*/
-#if defined (MSDOS_STYLE_PATH)
-static const char PathDelimiters [] = ":/\\";
-#elif defined (VMS)
-static const char PathDelimiters [] = ":]>";
-#endif
-
-#ifndef TMPDIR
-# define TMPDIR "/tmp"
-#endif
-
-char *CurrentDirectory = NULL;
-#ifdef HAVE_MKSTEMP
-static const char *ExecutableProgram = NULL;
-#endif
-static const char *ExecutableName = "geany";
-static stringList* Excluded = NULL;
-
-static struct { long files, lines, bytes; } Totals = { 0, 0, 0 };
-
-#ifdef AMIGA
-# include "ctags.h"
-  static const char *VERsion = "$VER: "PROGRAM_NAME" "PROGRAM_VERSION" "
-# ifdef __SASC
-  __AMIGADATE__
-# else
-  __DATE__
-# endif
-  " "AUTHOR_NAME" $";
-#endif
-
-/*
-*   FUNCTION PROTOTYPES
-*/
-#ifdef NEED_PROTO_STAT
-extern int stat (const char *, struct stat *);
-#endif
-#ifdef NEED_PROTO_LSTAT
-extern int lstat (const char *, struct stat *);
-#endif
-
-#if 0
-static boolean createTagsForEntry (const char *const entryName);
-#endif
-
-/*
-*   FUNCTION DEFINITIONS
-*/
-
-extern const char *getExecutableName (void)
-{
-	return ExecutableName;
-}
-
-#if 0
-static void setCurrentDirectory (void)
-{
-#ifdef AMIGA
-	char* const cwd = eStrdup (".");
-#else
-	char* const cwd = getcwd (NULL, PATH_MAX);
-#endif
-	CurrentDirectory = xMalloc (strlen (cwd) + 2, char);
-	if (cwd [strlen (cwd) - (size_t) 1] == PATH_SEPARATOR)
-		strcpy (CurrentDirectory, cwd);
-	else
-		sprintf (CurrentDirectory, "%s%c", cwd, OUTPUT_PATH_SEPARATOR);
-	free (cwd);
-}
-#endif
-
-extern void error (const errorSelection selection,
-				   const char *const format, ...)
-{
-	va_list ap;
-
-	va_start (ap, format);
-	fprintf (errout, "%s: %s", getExecutableName (),
-			selected (selection, WARNING) ? "Warning: " : "");
-	vfprintf (errout, format, ap);
-	if (selected (selection, PERROR))
-		fprintf (errout, " : %s", g_strerror (errno));
-	fputs ("\n", errout);
-	va_end (ap);
-	if (selected (selection, FATAL))
-		exit (1);
-}
-
-#ifndef HAVE_STRICMP
-extern int stricmp (const char *s1, const char *s2)
-{
-	int result;
-	do
-	{
-		result = toupper ((int) *s1) - toupper ((int) *s2);
-	} while (result == 0  &&  *s1++ != '\0'  &&  *s2++ != '\0');
-	return result;
-}
-#endif
-
-#ifndef HAVE_STRNICMP
-extern int strnicmp (const char *s1, const char *s2, size_t n)
-{
-	int result;
-	do
-	{
-		result = toupper ((int) *s1) - toupper ((int) *s2);
-	} while (result == 0  &&  --n > 0  &&  *s1++ != '\0'  &&  *s2++ != '\0');
-	return result;
-}
-#endif
-
-#ifndef HAVE_STRSTR
-extern char* strstr (const char *str, const char *substr)
-{
-	const size_t length = strlen (substr);
-	const char *match = NULL;
-	const char *p;
-
-	for (p = str  ;  *p != '\0'  &&  match == NULL  ;  ++p)
-		if (strncmp (p, substr, length) == 0)
-			match = p;
-	return (char*) match;
-}
-#endif
-
-extern char* eStrdup (const char* str)
-{
-	char* result = xMalloc (strlen (str) + 1, char);
-	strcpy (result, str);
-	return result;
-}
-
-extern void *eMalloc (const size_t size)
-{
-	void *buffer = g_malloc (size);
-
-	if (buffer == NULL)
-		error (FATAL, "out of memory");
-
-	return buffer;
-}
-
-extern void *eCalloc (const size_t count, const size_t size)
-{
-	void *buffer = calloc (count, size);
-
-	if (buffer == NULL)
-		error (FATAL, "out of memory");
-
-	return buffer;
-}
-
-extern void *eRealloc (void *const ptr, const size_t size)
-{
-	void *buffer;
-	if (ptr == NULL)
-		buffer = eMalloc (size);
-	else
-	{
-		buffer = g_realloc (ptr, size);
-		if (buffer == NULL)
-			error (FATAL, "out of memory");
-	}
-	return buffer;
-}
-
-extern void eFree (void *const ptr)
-{
-	if (ptr != NULL)
-		free (ptr);
-}
-
-extern void toLowerString (char* str)
-{
-	while (*str != '\0')
-	{
-		*str = tolower ((int) *str);
-		++str;
-	}
-}
-
-extern void toUpperString (char* str)
-{
-	while (*str != '\0')
-	{
-		*str = toupper ((int) *str);
-		++str;
-	}
-}
-
-/*  Newly allocated string containing lower case conversion of a string.
- */
-extern char* newLowerString (const char* str)
-{
-	char* const result = xMalloc (strlen (str) + 1, char);
-	int i = 0;
-	do
-		result [i] = tolower ((int) str [i]);
-	while (str [i++] != '\0');
-	return result;
-}
-
-/*  Newly allocated string containing upper case conversion of a string.
- */
-extern char* newUpperString (const char* str)
-{
-	char* const result = xMalloc (strlen (str) + 1, char);
-	int i = 0;
-	do
-		result [i] = toupper ((int) str [i]);
-	while (str [i++] != '\0');
-	return result;
-}
-
-extern long unsigned int getFileSize (const char *const name)
-{
-	GStatBuf fileStatus;
-	unsigned long size = 0;
-
-	if (g_stat (name, &fileStatus) == 0)
-		size = fileStatus.st_size;
-
-	return size;
-}
-
-#if 0
-static boolean isSymbolicLink (const char *const name)
-{
-#if defined (MSDOS) || defined (WIN32) || defined (VMS) || defined (__EMX__) || defined (AMIGA)
-	return FALSE;
-#else
-	GStatBuf fileStatus;
-	boolean result = FALSE;
-
-	if (g_lstat (name, &fileStatus) == 0)
-		result = (boolean) (S_ISLNK (fileStatus.st_mode));
-
-	return result;
-#endif
-}
-
-static boolean isNormalFile (const char *const name)
-{
-	GStatBuf fileStatus;
-	boolean result = FALSE;
-
-	if (g_stat (name, &fileStatus) == 0)
-		result = (boolean) (S_ISREG (fileStatus.st_mode));
-
-	return result;
-}
-#endif
-
-extern boolean isExecutable (const char *const name)
-{
-	GStatBuf fileStatus;
-	boolean result = FALSE;
-
-	if (g_stat (name, &fileStatus) == 0)
-		result = (boolean) ((fileStatus.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)) != 0);
-
-	return result;
-}
-
-extern boolean isSameFile (const char *const name1, const char *const name2)
-{
-	boolean result = FALSE;
-#ifdef HAVE_STAT_ST_INO
-	GStatBuf stat1, stat2;
-
-	if (g_stat (name1, &stat1) == 0  &&  g_stat (name2, &stat2) == 0)
-		result = (boolean) (stat1.st_ino == stat2.st_ino);
-#endif
-	return result;
-}
-
-#ifdef HAVE_MKSTEMP
-
-static boolean isSetUID (const char *const name)
-{
-#if defined (VMS) || defined (MSDOS) || defined (WIN32) || defined (__EMX__) || defined (AMIGA)
-	return FALSE;
-#else
-	GStatBuf fileStatus;
-	boolean result = FALSE;
-
-	if (g_stat (name, &fileStatus) == 0)
-		result = (boolean) ((fileStatus.st_mode & S_ISUID) != 0);
-
-	return result;
-#endif
-}
-
-#endif
-
-#if 0
-static boolean isDirectory (const char *const name)
-{
-	boolean result = FALSE;
-#ifdef AMIGA
-	struct FileInfoBlock *const fib = xMalloc (1, struct FileInfoBlock);
-
-	if (fib != NULL)
-	{
-		const BPTR flock = Lock ((UBYTE *) name, (long) ACCESS_READ);
-
-		if (flock != (BPTR) NULL)
-		{
-			if (Examine (flock, fib))
-				result = ((fib->fib_DirEntryType >= 0) ? TRUE : FALSE);
-			UnLock (flock);
-		}
-		eFree (fib);
-	}
-#else
-	GStatBuf fileStatus;
-
-	if (g_stat (name, &fileStatus) == 0)
-		result = (boolean) S_ISDIR (fileStatus.st_mode);
-#endif
-	return result;
-}
-#endif
-
-extern boolean doesFileExist (const char *const fileName)
-{
-	GStatBuf fileStatus;
-
-	return (boolean) (g_stat (fileName, &fileStatus) == 0);
-}
-
-/*#ifndef HAVE_FGETPOS*/
-/*
-extern int fgetpos ( stream, pos )
-	FILE *const stream;
-	fpos_t *const pos;
-{
-	int result = 0;
-
-	*pos = ftell (stream);
-	if (*pos == -1L)
-		result = -1;
-
-	return result;
-}
-
-extern int fsetpos ( stream, pos )
-	FILE *const stream;
-	fpos_t *const pos;
-{
-	return fseek (stream, *pos, SEEK_SET);
-}
-*/
-/*#endif*/
-
-extern void addTotals (const unsigned int files,
-					   const long unsigned int lines,
-					   const long unsigned int bytes)
-{
-	Totals.files += files;
-	Totals.lines += lines;
-	Totals.bytes += bytes;
-}
-
-extern boolean isDestinationStdout (void)
-{
-	boolean toStdout = FALSE;
-
-	if (Option.xref  ||  Option.filter  ||
-		(Option.tagFileName != NULL  &&  (strcmp (Option.tagFileName, "-") == 0
-#if defined (VMS)
-	|| strcmp (Option.tagFileName, "sys$output") == 0
-#else
-	|| strcmp (Option.tagFileName, "/dev/stdout") == 0
-#endif
-		)))
-		toStdout = TRUE;
-	return toStdout;
-}
-
-extern FILE *tempFile (const char *const mode, char **const pName)
-{
-	char *name;
-	FILE *fp;
-	int fd;
-#ifdef HAVE_MKSTEMP
-	const char *const template = "tags.XXXXXX";
-	const char *tmpdir = NULL;
-	if (! isSetUID (ExecutableProgram))
-		tmpdir = getenv ("TMPDIR");
-	if (tmpdir == NULL)
-		tmpdir = TMPDIR;
-	name = xMalloc (strlen (tmpdir) + 1 + strlen (template) + 1, char);
-	sprintf (name, "%s%c%s", tmpdir, OUTPUT_PATH_SEPARATOR, template);
-	fd = mkstemp(name);
-#else
-	name = xMalloc (L_tmpnam, char);
-	if (tmpnam (name) != name)
-		error (FATAL | PERROR, "cannot assign temporary file name");
-	fd = open (name, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
-#endif
-	if (fd == -1)
-		error (FATAL | PERROR, "cannot open temporary file");
-	fp = fdopen (fd, mode);
-	if (fp == NULL)
-		error (FATAL | PERROR, "cannot open temporary file");
-	DebugStatement (
-		debugPrintf (DEBUG_STATUS, "opened temporary file %s\n", name); )
-	Assert (*pName == NULL);
-	*pName = name;
-	return fp;
-}
-
-/*
- *  Pathname manipulation (O/S dependent!!!)
- */
-
-extern const char *baseFilename (const char *const filePath)
-{
-#if defined (MSDOS_STYLE_PATH) || defined (VMS)
-	const char *tail = NULL;
-	unsigned int i;
-
-	/*  Find whichever of the path delimiters is last.
-	 */
-	for (i = 0  ;  i < strlen (PathDelimiters)  ;  ++i)
-	{
-		const char *sep = strrchr (filePath, PathDelimiters [i]);
-
-		if (sep > tail)
-			tail = sep;
-	}
-#else
-	const char *tail = strrchr (filePath, PATH_SEPARATOR);
-#endif
-	if (tail == NULL)
-		tail = filePath;
-	else
-		++tail;                 /* step past last delimiter */
-#ifdef VAXC
-	{
-		/* remove version number from filename */
-		char *p = strrchr ((char *) tail, ';');
-		if (p != NULL)
-			*p = '\0';
-	}
-#endif
-
-	return tail;
-}
-
-extern boolean isAbsolutePath (const char *const path)
-{
-	boolean result = FALSE;
-#if defined (MSDOS_STYLE_PATH)
-	if (strchr (PathDelimiters, path [0]) != NULL)
-		result = TRUE;
-	else if (isalpha (path [0])  &&  path [1] == ':')
-	{
-		if (strchr (PathDelimiters, path [2]) != NULL)
-			result = TRUE;
-		else
-			/*  We don't support non-absolute file names with a drive
-			 *  letter, like `d:NAME' (it's too much hassle).
-			 */
-			error (FATAL,
-				"%s: relative file names with drive letters not supported",
-				path);
-	}
-#elif defined (VMS)
-	result = (boolean) (strchr (path, ':') != NULL);
-#else
-	result = (boolean) (path [0] == PATH_SEPARATOR);
-#endif
-	return result;
-}
-
-/* Return a newly-allocated string whose contents concatenate those of
- * s1, s2, s3.
- * Routine adapted from Gnu etags.
- */
-static char* concat (const char *s1, const char *s2, const char *s3)
-{
-	int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
-	char *result = xMalloc (len1 + len2 + len3 + 1, char);
-
-	strcpy (result, s1);
-	strcpy (result + len1, s2);
-	strcpy (result + len1 + len2, s3);
-	result [len1 + len2 + len3] = '\0';
-
-	return result;
-}
-
-/* Return a newly allocated string containing the absolute file name of FILE
- * given CWD (which should end with a slash).
- * Routine adapted from Gnu etags.
- */
-static char* absoluteFilename (const char *file)
-{
-	char *slashp, *cp;
-	char *res = NULL;
-
-	if (isAbsolutePath (file))
-		res = eStrdup (file);
-	else
-		res = concat (CurrentDirectory, file, "");
-
-	/* Delete the "/dirname/.." and "/." substrings. */
-	slashp = strchr (res, '/');
-	while (slashp != NULL  &&  slashp [0] != '\0')
-	{
-		if (slashp[1] == '.')
-		{
-			if (slashp [2] == '.' && (slashp [3] == '/' || slashp [3] == '\0'))
-			{
-				cp = slashp;
-				do
-					cp--;
-				while (cp >= res  &&  ! isAbsolutePath (cp));
-				if (cp < res)
-					cp = slashp;/* the absolute name begins with "/.." */
-#ifdef MSDOS_STYLE_PATH
-				/* Under MSDOS and NT we get `d:/NAME' as absolute file name,
-				 * so the luser could say `d:/../NAME'. We silently treat this
-				 * as `d:/NAME'.
-				 */
-				else if (cp [0] != '/')
-					cp = slashp;
-#endif
-				memmove (cp, slashp + 3, strlen (slashp + 3) + 1);
-				slashp = cp;
-				continue;
-			}
-			else if (slashp [2] == '/'  ||  slashp [2] == '\0')
-			{
-				memmove (slashp, slashp + 2, strlen (slashp + 2) + 1);
-				continue;
-			}
-		}
-		slashp = strchr (slashp + 1, '/');
-	}
-
-	if (res [0] == '\0')
-		return eStrdup ("/");
-	else
-	{
-#ifdef MSDOS_STYLE_PATH
-		/* Canonicalize drive letter case.  */
-		if (res [1] == ':'  &&  islower (res [0]))
-			res [0] = toupper (res [0]);
-#endif
-
-		return res;
-	}
-}
-
-/* Return a newly allocated string containing the absolute file name of dir
- * where FILE resides given CWD (which should end with a slash).
- * Routine adapted from Gnu etags.
- */
-extern char* absoluteDirname (char *file)
-{
-	char *slashp, *res;
-	char save;
-#ifdef MSDOS_STYLE_PATH
-	char *p;
-	for (p = file  ;  *p != '\0'  ;  p++)
-		if (*p == '\\')
-			*p = '/';
-#endif
-	slashp = strrchr (file, '/');
-	if (slashp == NULL)
-		res = eStrdup (CurrentDirectory);
-	else
-	{
-		save = slashp [1];
-		slashp [1] = '\0';
-		res = absoluteFilename (file);
-		slashp [1] = save;
-	}
-	return res;
-}
-
-/* Return a newly allocated string containing the file name of FILE relative
- * to the absolute directory DIR (which should end with a slash).
- * Routine adapted from Gnu etags.
- */
-extern char* relativeFilename (const char *file, const char *dir)
-{
-	const char *fp, *dp;
-	char *absdir, *res;
-	int i;
-
-	/* Find the common root of file and dir (with a trailing slash). */
-	absdir = absoluteFilename (file);
-	fp = absdir;
-	dp = dir;
-	while (*fp++ == *dp++)
-		continue;
-	fp--;
-	dp--;                       /* back to the first differing char */
-	do
-	{                           /* look at the equal chars until '/' */
-		if (fp == absdir)
-			return absdir;      /* first char differs, give up */
-		fp--;
-		dp--;
-	} while (*fp != '/');
-
-	/* Build a sequence of "../" strings for the resulting relative file name.
-	 */
-	i = 0;
-	while ((dp = strchr (dp + 1, '/')) != NULL)
-		i += 1;
-	res = xMalloc (3 * i + strlen (fp + 1) + 1, char);
-	res [0] = '\0';
-	while (i-- > 0)
-		strcat (res, "../");
-
-	/* Add the file name relative to the common root of file and dir. */
-	strcat (res, fp + 1);
-	free (absdir);
-
-	return res;
-}
-
-extern vString *combinePathAndFile (const char *const path,
-									const char *const file)
-{
-	vString *const filePath = vStringNew ();
-#ifdef VMS
-	const char *const directoryId = strstr (file, ".DIR;1");
-
-	if (directoryId == NULL)
-	{
-		const char *const versionId = strchr (file, ';');
-
-		vStringCopyS (filePath, path);
-		if (versionId == NULL)
-			vStringCatS (filePath, file);
-		else
-			vStringNCatS (filePath, file, versionId - file);
-		vStringCopyToLower (filePath, filePath);
-	}
-	else
-	{
-		/*  File really is a directory; append it to the path.
-		 *  Gotcha: doesn't work with logical names.
-		 */
-		vStringNCopyS (filePath, path, strlen (path) - 1);
-		vStringPut (filePath, '.');
-		vStringNCatS (filePath, file, directoryId - file);
-		if (strchr (path, '[') != NULL)
-			vStringPut (filePath, ']');
-		else
-			vStringPut (filePath, '>');
-		vStringTerminate (filePath);
-	}
-#else
-	const int lastChar = path [strlen (path) - 1];
-# ifdef MSDOS_STYLE_PATH
-	boolean terminated = (boolean) (strchr (PathDelimiters, lastChar) != NULL);
-# else
-	boolean terminated = (boolean) (lastChar == PATH_SEPARATOR);
-# endif
-
-	vStringCopyS (filePath, path);
-	if (! terminated)
-	{
-		vStringPut (filePath, OUTPUT_PATH_SEPARATOR);
-		vStringTerminate (filePath);
-	}
-	vStringCatS (filePath, file);
-#endif
-
-	return filePath;
-}
-
-/*
- *      Create tags
- */
-
-extern void processExcludeOption (const char *const UNUSED option,
-								  const char *const parameter)
-{
-	if (parameter [0] == '\0')
-		freeList (&Excluded);
-	else if (parameter [0] == '@')
-	{
-		stringList* const new = stringListNewFromFile (parameter + 1);
-		if (Excluded == NULL)
-			Excluded = new;
-		else
-			stringListCombine (Excluded, new);
-	}
-	else
-	{
-		vString *const item = vStringNewInit (parameter);
-		if (Excluded == NULL)
-			Excluded = stringListNew ();
-		stringListAdd (Excluded, item);
-	}
-}
-
-#if 0
-static boolean excludedFile (const char* const name)
-{
-	const char* base = baseFilename (name);
-	boolean result = FALSE;
-	if (Excluded != NULL)
-	{
-		result = stringListFileMatched (Excluded, base);
-		if (! result  &&  name != base)
-			result = stringListFileMatched (Excluded, name);
-	}
-#ifdef AMIGA
-	/* not a good solution, but the only one which works often */
-	if (! result)
-		result = (boolean) (strcmp (name, TagFile.name) == 0);
-#endif
-	return result;
-}
-
-# if defined (MSDOS) || defined (WIN32)
-
-static boolean createTagsForMatchingEntries (char *const pattern)
-{
-	boolean resize = FALSE;
-	const size_t dirLength = baseFilename (pattern) - (char *) pattern;
-	vString *const filePath = vStringNew ();
-#if defined (HAVE_FINDFIRST)
-	struct ffblk fileInfo;
-	int result = findfirst (pattern, &fileInfo, FA_DIREC);
-
-	while (result == 0)
-	{
-		const char *const entryName = fileInfo.ff_name;
-
-		/*  We must not recurse into the directories "." or "..".
-		 */
-		if (strcmp (entryName, ".") != 0  &&  strcmp (entryName, "..") != 0)
-		{
-			vStringNCopyS (filePath, pattern, dirLength);
-			vStringCatS (filePath, entryName);
-			resize |= createTagsForEntry (vStringValue (filePath));
-		}
-		result = findnext (&fileInfo);
-	}
-#elif defined (HAVE__FINDFIRST)
-	struct _finddata_t fileInfo;
-	long hFile = _findfirst (pattern, &fileInfo);
-
-	if (hFile != -1L)
-	{
-		do
-		{
-			const char *const entryName = fileInfo.name;
-
-			/*  We must not recurse into the directories "." or "..".
-			 */
-			if (strcmp (entryName, ".") != 0  &&  strcmp (entryName, "..") != 0)
-			{
-				vStringNCopyS (filePath, pattern, dirLength);
-				vStringCatS (filePath, entryName);
-				resize |= createTagsForEntry (vStringValue (filePath));
-			}
-		} while (_findnext (hFile, &fileInfo) == 0);
-		_findclose (hFile);
-	}
-#endif
-
-	vStringDelete (filePath);
-	return resize;
-}
-
-#elif defined (AMIGA)
-
-static boolean createTagsForMatchingEntries (char *const pattern)
-{
-	boolean resize = FALSE;
-	struct AnchorPath *const anchor =
-						(struct AnchorPath *) eMalloc ((size_t) ANCHOR_SIZE);
-
-	if (anchor != NULL)
-	{
-		LONG result;
-
-		memset (anchor, 0, (size_t) ANCHOR_SIZE);
-		anchor->ap_Strlen = ANCHOR_BUF_SIZE; /* ap_Length no longer supported */
-
-		/*  Allow '.' for current directory.
-		 */
-#ifdef APF_DODOT
-		anchor->ap_Flags = APF_DODOT | APF_DOWILD;
-#else
-		anchor->ap_Flags = APF_DoDot | APF_DoWild;
-#endif
-
-		result = MatchFirst ((UBYTE *) pattern, anchor);
-		while (result == 0)
-		{
-			resize |= createTagsForEntry ((char *) anchor->ap_Buf);
-			result = MatchNext (anchor);
-		}
-		MatchEnd (anchor);
-		eFree (anchor);
-	}
-	return resize;
-}
-
-#endif
-
-static boolean isRecursiveLink (const char* const dirName)
-{
-	boolean result = FALSE;
-	char* const path = absoluteFilename (dirName);
-	while (path [strlen (path) - 1] == PATH_SEPARATOR)
-		path [strlen (path) - 1] = '\0';
-	while (! result  &&  strlen (path) > (size_t) 1)
-	{
-		char *const separator = strrchr (path, PATH_SEPARATOR);
-		if (separator == NULL)
-			break;
-		else if (separator == path)     /* backed up to root directory */
-			*(separator + 1) = '\0';
-		else
-			*separator = '\0';
-		result = isSameFile (path, dirName);
-	}
-	eFree (path);
-	return result;
-}
-
-static boolean recurseIntoDirectory (const char *const dirName)
-{
-	boolean resize = FALSE;
-	if (isRecursiveLink (dirName))
-		verbose ("ignoring \"%s\" (recursive link)\n", dirName);
-	else if (! Option.recurse)
-		verbose ("ignoring \"%s\" (directory)\n", dirName);
-	else
-	{
-#if defined (HAVE_OPENDIR)
-		DIR *const dir = opendir (dirName);
-		if (dir == NULL)
-			error (WARNING | PERROR, "cannot recurse into directory \"%s\"",
-				   dirName);
-		else
-		{
-			struct dirent *entry;
-			verbose ("RECURSING into directory \"%s\"\n", dirName);
-			while ((entry = readdir (dir)) != NULL)
-			{
-				if (strcmp (entry->d_name, ".") != 0  &&
-					strcmp (entry->d_name, "..") != 0)
-				{
-					vString *filePath;
-					if (strcmp (dirName, ".") == 0)
-						filePath = vStringNewInit (entry->d_name);
-					else
-						filePath = combinePathAndFile (dirName, entry->d_name);
-					resize |= createTagsForEntry (vStringValue (filePath));
-					vStringDelete (filePath);
-				}
-			}
-			closedir (dir);
-		}
-#elif defined (AMIGA) || defined (MSDOS) || defined (WIN32)
-		vString *const pattern = vStringNew ();
-		verbose ("RECURSING into directory \"%s\"\n", dirName);
-# ifdef AMIGA
-		if (*dirName != '\0'  &&  strcmp (dirName, ".") != 0)
-		{
-			vStringCopyS (pattern, dirName);
-			if (dirName [strlen (dirName) - 1] != '/')
-				vStringPut (pattern, '/');
-		}
-		vStringCatS (pattern, "#?");
-# else
-		vStringCopyS (pattern, dirName);
-		vStringPut (pattern, OUTPUT_PATH_SEPARATOR);
-		vStringCatS (pattern, "*.*");
-# endif
-		resize = createTagsForMatchingEntries (vStringValue (pattern));
-		vStringDelete (pattern);
-#endif  /* HAVE_OPENDIR */
-	}
-	return resize;
-}
-
-static boolean createTagsForEntry (const char *const entryName)
-{
-	boolean resize = FALSE;
-
-	Assert (entryName != NULL);
-	if (excludedFile (entryName))
-		verbose ("excluding \"%s\"\n", entryName);
-	else if (isSymbolicLink (entryName)  &&  ! Option.followLinks)
-		verbose ("ignoring \"%s\" (symbolic link)\n", entryName);
-	else if (! doesFileExist (entryName))
-		error (WARNING | PERROR, "cannot open source file \"%s\"", entryName);
-	else if (isDirectory (entryName))
-		resize = recurseIntoDirectory (entryName);
-	else if (! isNormalFile (entryName))
-		verbose ("ignoring \"%s\" (special file)\n", entryName);
-	else
-		resize = parseFile (entryName);
-
-	return resize;
-}
-
-static boolean createTagsForArgs (cookedArgs* const args)
-{
-	boolean resize = FALSE;
-
-	/*  Generate tags for each argument on the command line.
-	 */
-	while (! cArgOff (args))
-	{
-		const char *arg = cArgItem (args);
-
-#if defined (MSDOS) || defined (WIN32)
-		vString *const pattern = vStringNewInit (arg);
-		char *patternS = vStringValue (pattern);
-
-		/*  We must transform the "." and ".." forms into something that can
-		 *  be expanded by the MSDOS/Windows functions.
-		 */
-		if (Option.recurse  &&
-			(strcmp (patternS, ".") == 0  ||  strcmp (patternS, "..") == 0))
-		{
-			vStringPut (pattern, OUTPUT_PATH_SEPARATOR);
-			vStringCatS (pattern, "*.*");
-		}
-		resize |= createTagsForMatchingEntries (patternS);
-		vStringDelete (pattern);
-#else
-		resize |= createTagsForEntry (arg);
-#endif
-		cArgForth (args);
-		parseOptions (args);
-	}
-	return resize;
-}
-
-/*  Read from an opened file a list of file names for which to generate tags.
- */
-static boolean createTagsFromFileInput (FILE* const fp, const boolean filter)
-{
-	boolean resize = FALSE;
-	if (fp != NULL)
-	{
-		cookedArgs* args = cArgNewFromLineFile (fp);
-		parseOptions (args);
-		while (! cArgOff (args))
-		{
-			resize |= createTagsForEntry (cArgItem (args));
-			if (filter)
-			{
-				if (Option.filterTerminator != NULL)
-					fputs (Option.filterTerminator, stdout);
-				fflush (stdout);
-			}
-			cArgForth (args);
-			parseOptions (args);
-		}
-		cArgDelete (args);
-	}
-	return resize;
-}
-
-/*  Read from a named file a list of file names for which to generate tags.
- */
-static boolean createTagsFromListFile (const char* const fileName)
-{
-	boolean resize;
-	Assert (fileName != NULL);
-	if (strcmp (fileName, "-") == 0)
-		resize = createTagsFromFileInput (stdin, FALSE);
-	else
-	{
-		FILE* const fp = g_fopen (fileName, "r");
-		if (fp == NULL)
-			error (FATAL | PERROR, "cannot open list file \"%s\"", fileName);
-		resize = createTagsFromFileInput (fp, FALSE);
-		fclose (fp);
-	}
-	return resize;
-}
-
-#if defined (HAVE_CLOCK)
-# define CLOCK_AVAILABLE
-# ifndef CLOCKS_PER_SEC
-#  define CLOCKS_PER_SEC        1000000
-# endif
-#elif defined (HAVE_TIMES)
-# define CLOCK_AVAILABLE
-# define CLOCKS_PER_SEC 60
-static clock_t clock (void)
-{
-	struct tms buf;
-
-	times (&buf);
-	return (buf.tms_utime + buf.tms_stime);
-}
-#else
-# define clock()  (clock_t)0
-#endif
-
-static void printTotals (const clock_t *const timeStamps)
-{
-	const unsigned long totalTags = TagFile.numTags.added +
-									TagFile.numTags.prev;
-
-	fprintf (errout, "%ld file%s, %ld line%s (%ld kB) scanned",
-			Totals.files, plural (Totals.files),
-			Totals.lines, plural (Totals.lines),
-			Totals.bytes/1024L);
-#ifdef CLOCK_AVAILABLE
-	{
-		const double interval = ((double) (timeStamps [1] - timeStamps [0])) /
-								CLOCKS_PER_SEC;
-
-		fprintf (errout, " in %.01f seconds", interval);
-		if (interval != (double) 0.0)
-			fprintf (errout, " (%lu kB/s)",
-					(unsigned long) (Totals.bytes / interval) / 1024L);
-	}
-#endif
-	fputc ('\n', errout);
-
-	fprintf (errout, "%lu tag%s added to tag file",
-			TagFile.numTags.added, plural (TagFile.numTags.added));
-	if (Option.append)
-		fprintf (errout, " (now %lu tags)", totalTags);
-	fputc ('\n', errout);
-
-	if (totalTags > 0  &&  Option.sorted)
-	{
-		fprintf (errout, "%lu tag%s sorted", totalTags, plural (totalTags));
-#ifdef CLOCK_AVAILABLE
-		fprintf (errout, " in %.02f seconds",
-				((double) (timeStamps [2] - timeStamps [1])) / CLOCKS_PER_SEC);
-#endif
-		fputc ('\n', errout);
-	}
-
-#ifdef TM_DEBUG
-	fprintf (errout, "longest tag line = %lu\n",
-			(unsigned long) TagFile.max.line);
-#endif
-}
-
-static void makeTags (cookedArgs* args)
-{
-	clock_t timeStamps [3];
-	boolean resize = FALSE;
-	boolean files = (boolean)(! cArgOff (args) || Option.fileList != NULL
-							  || Option.filter);
-
-	if (! files  &&  ! Option.recurse)
-		error (FATAL, "No files specified. Try \"%s --help\".",
-			   getExecutableName ());
-
-#define timeStamp(n) timeStamps[(n)]=(Option.printTotals ? clock():(clock_t)0)
-	if (! Option.filter)
-		openTagFile ();
-
-	timeStamp (0);
-
-	if (! cArgOff (args))
-	{
-		verbose ("Reading command line arguments\n");
-		resize = createTagsForArgs (args);
-	}
-	if (Option.fileList != NULL)
-	{
-		verbose ("Reading list file\n");
-		resize = (boolean) (createTagsFromListFile (Option.fileList) || resize);
-	}
-	if (Option.filter)
-	{
-		verbose ("Reading filter input\n");
-		resize = (boolean) (createTagsFromFileInput (stdin, TRUE) || resize);
-	}
-	if (! files  &&  Option.recurse)
-		resize = recurseIntoDirectory (".");
-
-	timeStamp (1);
-
-	if (! Option.filter)
-		closeTagFile (resize);
-
-	timeStamp (2);
-
-	if (Option.printTotals)
-		printTotals (timeStamps);
-#undef timeStamp
-}
-
-/*
- *      Start up code
- */
-
-static void setExecutableName (const char *const path)
-{
-	ExecutableProgram = path;
-	ExecutableName = baseFilename (path);
-#ifdef VAXC
-{
-	/* remove filetype from executable name */
-	char *p = strrchr (ExecutableName, '.');
-	if (p != NULL)
-		*p = '\0';
-}
-#endif
-}
-
-extern int ctags_main (int UNUSED argc, char **argv)
-{
-	cookedArgs *args;
-#ifdef VMS
-	extern int getredirection (int *ac, char ***av);
-
-	/* do wildcard expansion and I/O redirection */
-	getredirection (&argc, &argv);
-#endif
-
-#ifdef AMIGA
-	/* This program doesn't work when started from the Workbench */
-	if (argc == 0)
-		exit (1);
-#endif
-
-#ifdef __EMX__
-	_wildcard (&argc, &argv);   /* expand wildcards in argument list */
-#endif
-
-#if defined (macintosh) && BUILD_MPW_TOOL == 0
-	argc = ccommand (&argv);
-#endif
-
-	setCurrentDirectory ();
-	setExecutableName (*argv++);
-#ifdef HAVE_REGEX
-	checkRegex ();
-#endif
-
-	/* always excluded by default */
-	processExcludeOption (NULL, "EIFGEN");
-	processExcludeOption (NULL, "SCCS");
-
-	args = cArgNewFromArgv (argv);
-	previewFirstOption (args);
-	testEtagsInvocation ();
-	initializeParsing ();
-	initOptions ();
-	readOptionConfiguration ();
-	verbose ("Reading initial options from command line\n");
-	parseOptions (args);
-	checkOptions ();
-	makeTags (args);
-
-	/*  Clean up.
-	 */
-	eFree (CurrentDirectory);
-	freeList (&Excluded);
-	cArgDelete (args);
-	freeKeywordTable ();
-	freeSourceFileResources ();
-	freeTagFileResources ();
-	freeOptionResources ();
-	freeParserResources ();
-#ifdef HAVE_REGEX
-	freeRegexResources ();
-#endif
-
-	exit (0);
-	return 0;
-}
-#endif
-
-/* wrap g_warning so we don't include glib.h for all parsers, to keep compat with CTags */
-void utils_warn(const char *msg)
-{
-	g_warning("%s", msg);
-}
-
-/* vi:set tabstop=4 shiftwidth=4: */


Modified: ctags/main/entry.c
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -44,6 +44,7 @@
 #include "read.h"
 #include "sort.h"
 #include "strlist.h"
+#include "routines.h"
 
 /*
 *   MACROS


Modified: ctags/main/general.h
111 lines changed, 5 insertions(+), 106 deletions(-)
===================================================================
@@ -42,7 +42,7 @@
 /*  MS-DOS doesn't allow manipulation of standard error, so we send it to
  *  stdout instead.
  */
-#if defined (MSDOS) || defined (WIN32)
+#if defined (WIN32)
 # define errout stdout
 #else
 # define errout stderr
@@ -53,7 +53,7 @@
 # define MSDOS_STYLE_PATH
 #endif
 
-#if defined (MSDOS) || defined (WIN32)
+#if defined (WIN32)
 # define CASE_INSENSITIVE_FILENAMES
 # define MSDOS_STYLE_PATH
 # define HAVE_DOS_H 1
@@ -71,11 +71,7 @@
 # define HAVE_STRSTR 1
 # define HAVE_STRERROR 1
 # define HAVE_FINDNEXT 1
-# ifdef __BORLANDC__
-#  define HAVE_DIR_H 1
-#  define HAVE_DIRENT_H 1
-#  define HAVE_FINDFIRST 1
-# elif defined (_MSC_VER)
+# ifdef _MSC_VER
 #   define HAVE__FINDFIRST 1
 #   define HAVE_DIRECT_H 1
 # elif defined (__MINGW32__)
@@ -95,102 +91,10 @@ char *lrealpath(const char *filename);
 int fnmatch(const char *pattern, const char *string, int flags);
 #endif
 
-#ifdef DJGPP
-# define CASE_INSENSITIVE_FILENAMES
-# define MSDOS_STYLE_PATH
-# define HAVE_DIR_H 1
-# define HAVE_SYS_STAT_H 1
-# define HAVE_SYS_TYPES_H 1
-# define HAVE_UNISTD_H 1
-# define HAVE_FGETPOS 1
-# define HAVE_FINDFIRST 1
-# define HAVE_TRUNCATE 1
-#endif
-
-#ifdef OS2
-# define UNIX_PATH_SEPARATOR 1
-# define CASE_INSENSITIVE_FILENAMES
-# define HAVE_DIRENT_H 1
-# define HAVE_FCNTL_H 1
-# define HAVE_IO_H 1
-# define HAVE_STDLIB_H 1
-# define HAVE_SYS_STAT_H 1
-# define HAVE_SYS_TYPES_H 1
-# define HAVE_TIME_H 1
-# define HAVE_UNISTD_H 1
-# define HAVE_CLOCK 1
-# define HAVE_CHSIZE 1
-# define HAVE_FGETPOS 1
-# define HAVE_FTRUNCATE 1
-# define HAVE_OPENDIR 1
-# define HAVE_REGCOMP 1
-# define HAVE_REMOVE 1
-# define HAVE_STRERROR 1
-# define HAVE_STRICMP 1
-# define HAVE_STRNICMP 1
-# define HAVE_STRSTR 1
-# define HAVE_TRUNCATE 1
-#endif
-
-#ifdef AMIGA
-# define HAVE_STDLIB_H 1
-# define HAVE_SYS_STAT_H 1
-# define HAVE_SYS_TYPES_H 1
-# define HAVE_TIME_H 1
-# define HAVE_CLOCK 1
-# define HAVE_FGETPOS 1
-# define HAVE_STRERROR 1
-# define HAVE_STRICMP 1
-# define HAVE_STRNICMP 1
-#endif
-
 #if defined (__MWERKS__) && defined (__MACINTOSH__)
 # define HAVE_STAT_H 1
 #endif
 
-#ifdef QDOS
-# define HAVE_DIRENT_H 1
-# define HAVE_STDLIB_H 1
-# define HAVE_SYS_STAT_H 1
-# define HAVE_SYS_TIMES_H 1
-# define HAVE_SYS_TYPES_H 1
-# define HAVE_TIME_H 1
-# define HAVE_UNISTD_H 1
-# define STDC_HEADERS 1
-# define HAVE_CLOCK 1
-# define HAVE_FGETPOS 1
-# define HAVE_FTRUNCATE 1
-# define HAVE_OPENDIR 1
-# define HAVE_PUTENV 1
-# define HAVE_REMOVE 1
-# define HAVE_STRERROR 1
-# define HAVE_STRSTR 1
-# define HAVE_TIMES 1
-# define HAVE_TRUNCATE 1
-# define NON_CONST_PUTENV_PROTOTYPE 1
-#endif
-
-#if defined (__vms) && ! defined (VMS)
-# define VMS
-#endif
-#ifdef VMS
-# define CASE_INSENSITIVE_FILENAMES 1
-# define HAVE_STDLIB_H 1
-# define HAVE_TIME_H 1
-# ifdef VAXC
-#  define HAVE_STAT_H 1
-#  define HAVE_TYPES_H 1
-# else
-#  define HAVE_FCNTL_H 1
-#  define HAVE_SYS_STAT_H 1
-#  define HAVE_SYS_TYPES_H 1
-# endif
-# define HAVE_CLOCK 1
-# define HAVE_FGETPOS 1
-# define HAVE_STRERROR 1
-# define HAVE_STRSTR 1
-# define HAVE_UNISTD_H 1
-#endif
 
 #ifdef __FreeBSD__
 #include <sys/types.h>
@@ -214,17 +118,12 @@ void utils_warn(const char *msg);
 
 #undef FALSE
 #undef TRUE
-#ifdef VAXC
-typedef enum { FALSE, TRUE } booleanType;
-typedef int boolean;
-#else
-# ifdef __cplusplus
+#ifdef __cplusplus
 typedef bool boolean;
 #define FALSE false
 #define TRUE true
-# else
+#else
 typedef enum { FALSE, TRUE } boolean;
-# endif
 #endif
 
 #if ! defined (HAVE_FGETPOS) && ! defined (fpos_t)


Modified: ctags/main/lregex.c
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -28,11 +28,11 @@
 #endif
 
 #include "mio.h"
-#include "main.h"
 #include "entry.h"
 #include "parse.h"
 #include "read.h"
 #include "kind.h"
+#include "routines.h"
 
 #ifdef HAVE_REGEX
 


Modified: ctags/main/main.c
277 lines changed, 277 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,277 @@
+/*
+*   Copyright (c) 1996-2003, Darren Hiebert
+*
+*   Author: Darren Hiebert <dhiebert at users.sourceforge.net>
+*           http://ctags.sourceforge.net
+*
+*   This source code is released for free distribution under the terms of the
+*   GNU General Public License version 2 or (at your option) any later version.
+*   It is provided on an as-is basis and no responsibility is accepted for its
+*   failure to perform as expected.
+*
+*   This is a reimplementation of the ctags (1) program. It is an attempt to
+*   provide a fully featured ctags program which is free of the limitations
+*   which most (all?) others are subject to.
+*
+*   This module contains the start-up code and routines to determine the list
+*   of files to parsed for tags.
+*/
+
+/*
+*   INCLUDE FILES
+*/
+#include "general.h"  /* must always come first */
+
+#include <glib.h>
+
+/*  To provide timings features if available.
+ */
+#ifdef HAVE_CLOCK
+# ifdef HAVE_TIME_H
+#  include <time.h>
+# endif
+#else
+# ifdef HAVE_TIMES
+#  ifdef HAVE_SYS_TIMES_H
+#   include <sys/times.h>
+#  endif
+# endif
+#endif
+
+/*  To provide directory searching for recursion feature.
+ */
+
+#ifdef HAVE_DIRENT_H
+# ifdef HAVE_SYS_TYPES_H
+#  include <sys/types.h>  /* required by dirent.h */
+# endif
+# include <dirent.h>  /* to declare opendir() */
+# undef boolean
+#endif
+#ifdef HAVE_DIRECT_H
+# include <direct.h>  /* to _getcwd() */
+#endif
+#ifdef HAVE_DIR_H
+# include <dir.h>  /* to declare findfirst() and findnext */
+#endif
+#ifdef HAVE_IO_H
+# include <io.h>  /* to declare _findfirst() */
+#endif
+
+#include <string.h>
+
+#include "debug.h"
+#include "entry.h"
+#include "keyword.h"
+#include "main.h"
+#include "options.h"
+#include "read.h"
+#include "routines.h"
+
+/*
+*   MACROS
+*/
+#define plural(value)           (((unsigned long)(value) == 1L) ? "" : "s")
+
+/*
+*   DATA DEFINITIONS
+*/
+static struct { long files, lines, bytes; } Totals = { 0, 0, 0 };
+
+/*
+*   FUNCTION DEFINITIONS
+*/
+
+extern void addTotals (
+		const unsigned int files, const long unsigned int lines,
+		const long unsigned int bytes)
+{
+	Totals.files += files;
+	Totals.lines += lines;
+	Totals.bytes += bytes;
+}
+
+extern boolean isDestinationStdout (void)
+{
+	boolean toStdout = FALSE;
+
+	if (Option.xref  ||  Option.filter  ||
+		(Option.tagFileName != NULL  &&  (strcmp (Option.tagFileName, "-") == 0
+						  || strcmp (Option.tagFileName, "/dev/stdout") == 0
+		)))
+		toStdout = TRUE;
+	return toStdout;
+}
+
+
+# if defined (WIN32)
+
+static boolean createTagsForMatchingEntries (char *const pattern)
+{
+	boolean resize = FALSE;
+	const size_t dirLength = baseFilename (pattern) - (char *) pattern;
+	vString *const filePath = vStringNew ();
+#if defined (HAVE_FINDFIRST)
+	struct ffblk fileInfo;
+	int result = findfirst (pattern, &fileInfo, FA_DIREC);
+	while (result == 0)
+	{
+		const char *const entryName = fileInfo.ff_name;
+
+		/*  We must not recurse into the directories "." or "..".
+		 */
+		if (strcmp (entryName, ".") != 0  &&  strcmp (entryName, "..") != 0)
+		{
+			vStringNCopyS (filePath, pattern, dirLength);
+			vStringCatS (filePath, entryName);
+			resize |= createTagsForEntry (vStringValue (filePath));
+		}
+		result = findnext (&fileInfo);
+	}
+#elif defined (HAVE__FINDFIRST)
+	struct _finddata_t fileInfo;
+	long hFile = _findfirst (pattern, &fileInfo);
+
+	if (hFile != -1L)
+	{
+		do
+		{
+			const char *const entryName = fileInfo.name;
+
+			/*  We must not recurse into the directories "." or "..".
+			 */
+			if (strcmp (entryName, ".") != 0  &&  strcmp (entryName, "..") != 0)
+			{
+				vStringNCopyS (filePath, pattern, dirLength);
+				vStringCatS (filePath, entryName);
+				resize |= createTagsForEntry (vStringValue (filePath));
+			}
+		} while (_findnext (hFile, &fileInfo) == 0);
+		_findclose (hFile);
+	}
+#endif
+
+	vStringDelete (filePath);
+	return resize;
+}
+
+#endif
+
+
+static boolean recurseIntoDirectory (const char *const dirName)
+{
+	boolean resize = FALSE;
+	if (isRecursiveLink (dirName))
+		verbose ("ignoring \"%s\" (recursive link)\n", dirName);
+	else if (! Option.recurse)
+		verbose ("ignoring \"%s\" (directory)\n", dirName);
+	else
+	{
+#if defined (HAVE_OPENDIR)
+		DIR *const dir = opendir (dirName);
+		if (dir == NULL)
+			error (WARNING | PERROR, "cannot recurse into directory \"%s\"",
+				   dirName);
+		else
+		{
+			struct dirent *entry;
+			verbose ("RECURSING into directory \"%s\"\n", dirName);
+			while ((entry = readdir (dir)) != NULL)
+			{
+				if (strcmp (entry->d_name, ".") != 0  &&
+					strcmp (entry->d_name, "..") != 0)
+				{
+					vString *filePath;
+					if (strcmp (dirName, ".") == 0)
+						filePath = vStringNewInit (entry->d_name);
+					else
+						filePath = combinePathAndFile (dirName, entry->d_name);
+					resize |= createTagsForEntry (vStringValue (filePath));
+					vStringDelete (filePath);
+				}
+			}
+			closedir (dir);
+		}
+#elif defined (WIN32)
+		vString *const pattern = vStringNew ();
+		verbose ("RECURSING into directory \"%s\"\n", dirName);
+		vStringCopyS (pattern, dirName);
+		vStringPut (pattern, OUTPUT_PATH_SEPARATOR);
+		vStringCatS (pattern, "*.*");
+		resize = createTagsForMatchingEntries (vStringValue (pattern));
+		vStringDelete (pattern);
+#endif  /* HAVE_OPENDIR */
+	}
+	return resize;
+}
+
+#if defined (HAVE_CLOCK)
+# define CLOCK_AVAILABLE
+# ifndef CLOCKS_PER_SEC
+#  define CLOCKS_PER_SEC		1000000
+# endif
+#elif defined (HAVE_TIMES)
+# define CLOCK_AVAILABLE
+# define CLOCKS_PER_SEC	60
+static clock_t clock (void)
+{
+	struct tms buf;
+
+	times (&buf);
+	return (buf.tms_utime + buf.tms_stime);
+}
+#else
+# define clock()  (clock_t)0
+#endif
+
+static void printTotals (const clock_t *const timeStamps)
+{
+	const unsigned long totalTags = TagFile.numTags.added +
+									TagFile.numTags.prev;
+
+	fprintf (errout, "%ld file%s, %ld line%s (%ld kB) scanned",
+			Totals.files, plural (Totals.files),
+			Totals.lines, plural (Totals.lines),
+			Totals.bytes/1024L);
+#ifdef CLOCK_AVAILABLE
+	{
+		const double interval = ((double) (timeStamps [1] - timeStamps [0])) /
+								CLOCKS_PER_SEC;
+
+		fprintf (errout, " in %.01f seconds", interval);
+		if (interval != (double) 0.0)
+			fprintf (errout, " (%lu kB/s)",
+					(unsigned long) (Totals.bytes / interval) / 1024L);
+	}
+#endif
+	fputc ('\n', errout);
+
+	fprintf (errout, "%lu tag%s added to tag file",
+			TagFile.numTags.added, plural (TagFile.numTags.added));
+	if (Option.append)
+		fprintf (errout, " (now %lu tags)", totalTags);
+	fputc ('\n', errout);
+
+	if (totalTags > 0  &&  Option.sorted)
+	{
+		fprintf (errout, "%lu tag%s sorted", totalTags, plural (totalTags));
+#ifdef CLOCK_AVAILABLE
+		fprintf (errout, " in %.02f seconds",
+				((double) (timeStamps [2] - timeStamps [1])) / CLOCKS_PER_SEC);
+#endif
+		fputc ('\n', errout);
+	}
+
+#ifdef TM_DEBUG
+	fprintf (errout, "longest tag line = %lu\n",
+			(unsigned long) TagFile.max.line);
+#endif
+}
+
+/* wrap g_warning so we don't include glib.h for all parsers, to keep compat with CTags */
+void utils_warn(const char *msg)
+{
+	g_warning("%s", msg);
+}
+
+/* vi:set tabstop=4 shiftwidth=4: */


Modified: ctags/main/main.h
66 lines changed, 6 insertions(+), 60 deletions(-)
===================================================================
@@ -1,82 +1,28 @@
 /*
-*
-*   Copyright (c) 1998-2001, Darren Hiebert
+*   Copyright (c) 1998-2002, Darren Hiebert
 *
 *   This source code is released for free distribution under the terms of the
-*   GNU General Public License.
+*   GNU General Public License version 2 or (at your option) any later version.
 *
 *   External interface to main.c
 */
-#ifndef _MAIN_H
-#define _MAIN_H
+#ifndef CTAGS_MAIN_MAIN_H
+#define CTAGS_MAIN_MAIN_H
 
 /*
 *   INCLUDE FILES
 */
-#include "general.h"	/* must always come first */
+#include "general.h"  /* must always come first */
 
 #include <stdio.h>
 
-#include "vstring.h"
-
-/*
-*   MACROS
-*/
-#define xMalloc(n,Type)    (Type *)eMalloc((size_t)(n) * sizeof (Type))
-#define xCalloc(n,Type)    (Type *)eCalloc((size_t)(n), sizeof (Type))
-#define xRealloc(p,n,Type) (Type *)eRealloc((p), (n) * sizeof (Type))
-
-/*
-*   DATA DECLARATIONS
-*/
-typedef int errorSelection;
-enum eErrorTypes { FATAL = 1, WARNING = 2, PERROR = 4 };
-extern char *CurrentDirectory;
-
 /*
 *   FUNCTION PROTOTYPES
 */
-#ifdef NEED_PROTO_MALLOC
-extern void *malloc (size_t);
-extern void *realloc (void *ptr, size_t);
-#endif
-
-extern void error (const errorSelection selection, const char *const format, ...) PRINTF (2, 3);
-extern FILE *tempFile (const char *const mode, char **const pName);
-extern char* eStrdup (const char* str);
-extern void *eMalloc (const size_t size);
-extern void *eCalloc (const size_t count, const size_t size);
-extern void *eRealloc (void *const ptr, const size_t size);
-extern void eFree (void *const ptr);
-extern void toLowerString (char* str);
-extern void toUpperString (char* str);
-extern char* newLowerString (const char* str);
-extern char* newUpperString (const char* str);
-extern long unsigned int getFileSize (const char *const name);
-extern boolean isExecutable (const char *const name);
-extern boolean isSameFile (const char *const name1, const char *const name2);
-extern boolean doesFileExist (const char *const fileName);
-extern char* absoluteDirname (char *file);
-extern char* relativeFilename (const char *file, const char *dir);
 extern void addTotals (const unsigned int files, const long unsigned int lines, const long unsigned int bytes);
-extern const char *baseFilename (const char *const filePath);
-extern boolean isAbsolutePath (const char *const path);
-extern vString *combinePathAndFile (const char *const path, const char *const file);
 extern boolean isDestinationStdout (void);
-extern const char *getExecutableName (void);
-extern void processExcludeOption (const char *const option, const char *const parameter);
 extern int main (int argc, char **argv);
 
-#ifndef HAVE_STRICMP
-extern int stricmp (const char *s1, const char *s2);
-#endif
-#ifndef HAVE_STRNICMP
-extern int strnicmp (const char *s1, const char *s2, size_t n);
-#endif
-#ifndef HAVE_STRSTR
-extern char* strstr (const char *str, const char *substr);
-#endif
-
-#endif	/* _MAIN_H */
+#endif  /* CTAGS_MAIN_MAIN_H */
 
 /* vi:set tabstop=4 shiftwidth=4: */


Modified: ctags/main/nestlevel.c
2 lines changed, 2 insertions(+), 0 deletions(-)
===================================================================
@@ -14,6 +14,8 @@
 #include "general.h"  /* must always come first */
 
 #include "main.h"
+#include "debug.h"
+#include "routines.h"
 #include "nestlevel.h"
 
 /*


Modified: ctags/main/options.c
59 lines changed, 39 insertions(+), 20 deletions(-)
===================================================================
@@ -19,7 +19,7 @@
 #include <ctype.h>      /* to declare isspace () */
 
 #include "ctags.h"
-#include "main.h"
+#include "routines.h"
 #define OPTION_WRITE
 #include "options.h"
 #include "parse.h"
@@ -42,7 +42,7 @@
 # define DEFAULT_FILE_FORMAT    2
 #endif
 
-#if defined (MSDOS) || defined (WIN32) || defined (OS2) || defined (AMIGA) || defined (HAVE_OPENDIR)
+#if defined (WIN32) || defined (HAVE_OPENDIR)
 # define RECURSE_SUPPORTED
 #endif
 
@@ -54,6 +54,8 @@
 *   DATA DEFINITIONS
 */
 
+static stringList* Excluded = NULL;
+
 optionValues Option = {
 	{
 		FALSE,          /* --extra=f */
@@ -124,24 +126,6 @@ extern void setDefaultTagFileName (void)
 	Option.tagFileName = eStrdup (CTAGS_FILE);
 }
 
-/*
- *  File extension and language mapping
- */
-extern const char *fileExtension (const char *const fileName)
-{
-	const char *extension;
-	const char *pDelimiter = NULL;
-
-	pDelimiter = strrchr (fileName, '.');
-
-	if (pDelimiter == NULL)
-		extension = "";
-	else
-		extension = pDelimiter + 1;     /* skip to first char of extension */
-
-	return extension;
-}
-
 /*  Determines whether the specified file name is considered to be a header
  *  file for the purposes of determining whether enclosed tags are global or
  *  static.
@@ -225,6 +209,41 @@ void addIgnoreListFromFile (const char *const fileName)
 		stringListCombine (Option.ignore, tokens);
 }
 
+extern void processExcludeOption (const char *const UNUSED option,
+								  const char *const parameter)
+{
+	if (parameter [0] == '\0')
+		freeList (&Excluded);
+	else if (parameter [0] == '@')
+	{
+		stringList* const new = stringListNewFromFile (parameter + 1);
+		if (Excluded == NULL)
+			Excluded = new;
+		else
+			stringListCombine (Excluded, new);
+	}
+	else
+	{
+		vString *const item = vStringNewInit (parameter);
+		if (Excluded == NULL)
+			Excluded = stringListNew ();
+		stringListAdd (Excluded, item);
+	}
+}
+
+extern boolean isExcludedFile (const char* const name)
+{
+	const char* base = baseFilename (name);
+	boolean result = FALSE;
+	if (Excluded != NULL)
+	{
+		result = stringListFileMatched (Excluded, base);
+		if (! result  &&  name != base)
+			result = stringListFileMatched (Excluded, name);
+	}
+	return result;
+}
+
 
 
 /*


Modified: ctags/main/options.h
4 lines changed, 2 insertions(+), 2 deletions(-)
===================================================================
@@ -9,7 +9,7 @@
 #ifndef CTAGS_MAIN_OPTIONS_H
 #define CTAGS_MAIN_OPTIONS_H
 
-#if defined(OPTION_WRITE) || defined(VAXC)
+#if defined(OPTION_WRITE)
 # define CONST_OPTION
 #else
 # define CONST_OPTION const
@@ -97,8 +97,8 @@ extern void verbose (const char *const format, ...) PRINTF (1, 2);
 extern void freeList (stringList** const pString);
 extern void setDefaultTagFileName (void);
 
-extern const char *fileExtension (const char *const fileName);
 extern boolean isIncludeFile (const char *const fileName);
+extern boolean isExcludedFile (const char* const name);
 extern boolean isIgnoreToken (const char *const name, boolean *const pIgnoreParens, const char **const replacement);
 extern void readOptionConfiguration (void);
 extern void initOptions (void);


Modified: ctags/main/parse.c
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -26,6 +26,7 @@
 #include "parsers.h"
 #include "read.h"
 #include "vstring.h"
+#include "routines.h"
 
 /*
 *   DATA DEFINITIONS


Modified: ctags/main/routines.c
788 lines changed, 788 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,788 @@
+/*
+*   Copyright (c) 2002-2003, Darren Hiebert
+*
+*   This source code is released for free distribution under the terms of the
+*   GNU General Public License version 2 or (at your option) any later version.
+*
+*   This module contains a lose assortment of shared functions.
+*/
+
+/*
+*   INCLUDE FILES
+*/
+#include "general.h"  /* must always come first */
+
+#include <glib.h>
+#include <glib/gstdio.h>
+
+#include <errno.h>
+
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>  /* to declare malloc (), realloc () */
+#endif
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>  /* to declare tempnam(), and SEEK_SET (hopefully) */
+
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>  /* to declare O_RDWR, O_CREAT, O_EXCL */
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>  /* to declare mkstemp () */
+#endif
+
+#ifdef HAVE_LIMITS_H
+# include <limits.h>  /* to declare MB_LEN_MAX */
+#endif
+#ifndef MB_LEN_MAX
+# define MB_LEN_MAX 6
+#endif
+
+/*  To declare "struct stat" and stat ().
+ */
+#if defined (HAVE_SYS_TYPES_H)
+# include <sys/types.h>
+#else
+# if defined (HAVE_TYPES_H)
+#  include <types.h>
+# endif
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#else
+# ifdef HAVE_STAT_H
+#  include <stat.h>
+# endif
+#endif
+
+#ifdef HAVE_DIRECT_H
+# include <direct.h>  /* to _getcwd */
+#endif
+#ifdef HAVE_DIR_H
+# include <dir.h>  /* to declare findfirst() and findnext() */
+#endif
+#ifdef HAVE_IO_H
+# include <io.h>  /* to declare open() */
+#endif
+#include "debug.h"
+#include "routines.h"
+#ifdef HAVE_ICONV
+# include "mbcs.h"
+#endif
+#ifdef HAVE_ERRNO_H
+# include <errno.h>
+#endif
+
+#include "options.h"
+
+/*
+*   MACROS
+*/
+#ifndef TMPDIR
+# define TMPDIR "/tmp"
+#endif
+
+/*  File type tests.
+ */
+#ifndef S_ISREG
+# if defined (S_IFREG)
+#  define S_ISREG(mode)		((mode) & S_IFREG)
+# endif
+#endif
+
+#ifndef S_ISLNK
+# ifdef S_IFLNK
+#  define S_ISLNK(mode)		(((mode) & S_IFMT) == S_IFLNK)
+# else
+#  define S_ISLNK(mode)		FALSE  /* assume no soft links */
+# endif
+#endif
+
+#ifndef S_ISDIR
+# ifdef S_IFDIR
+#  define S_ISDIR(mode)		(((mode) & S_IFMT) == S_IFDIR)
+# else
+#  define S_ISDIR(mode)		FALSE  /* assume no soft links */
+# endif
+#endif
+
+#ifndef S_IFMT
+# define S_IFMT 0
+#endif
+
+#ifndef S_IXUSR
+# define S_IXUSR 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+
+#ifndef S_IRUSR
+# define S_IRUSR 0400
+#endif
+#ifndef S_IWUSR
+# define S_IWUSR 0200
+#endif
+
+#ifndef S_ISUID
+# define S_ISUID 0
+#endif
+
+#ifndef S_ISGID
+# define S_ISGID 0
+#endif
+
+/*  Hack for ridiculous practice of Microsoft Visual C++.
+ */
+#if defined (WIN32)
+# if defined (_MSC_VER)
+#  define stat    _stat
+#  define getcwd  _getcwd
+#  define PATH_MAX  _MAX_PATH
+# endif
+#endif
+
+#ifndef PATH_MAX
+# define PATH_MAX 256
+#endif
+
+#define selected(var,feature)   (((int)(var) & (int)(feature)) == (int)feature)
+
+/*
+ *  Miscellaneous macros
+ */
+
+
+/*
+*   DATA DEFINITIONS
+*/
+#if defined (MSDOS_STYLE_PATH)
+static const char PathDelimiters [] = ":/\\";
+#endif
+
+char *CurrentDirectory;
+
+#ifdef HAVE_MKSTEMP
+static const char *ExecutableProgram = NULL;
+#endif
+
+static const char *ExecutableName = "geany";
+
+/*
+*   FUNCTION PROTOTYPES
+*/
+#ifdef NEED_PROTO_STAT
+extern int stat (const char *, struct stat *);
+#endif
+#ifdef NEED_PROTO_LSTAT
+extern int lstat (const char *, struct stat *);
+#endif
+
+#if 0
+static boolean createTagsForEntry (const char *const entryName);
+#endif
+
+
+/*
+*   FUNCTION DEFINITIONS
+*/
+
+
+extern void setExecutableName (const char *const path)
+{
+	ExecutableProgram = path;
+	ExecutableName = baseFilename (path);
+}
+
+extern const char *getExecutableName (void)
+{
+	return ExecutableName;
+}
+
+
+extern void *eMalloc (const size_t size)
+{
+	void *buffer = g_malloc (size);
+
+	if (buffer == NULL)
+		error (FATAL, "out of memory");
+
+	return buffer;
+}
+
+extern void *eCalloc (const size_t count, const size_t size)
+{
+	void *buffer = calloc (count, size);
+
+	if (buffer == NULL)
+		error (FATAL, "out of memory");
+
+	return buffer;
+}
+
+extern void *eRealloc (void *const ptr, const size_t size)
+{
+	void *buffer;
+	if (ptr == NULL)
+		buffer = eMalloc (size);
+	else
+	{
+		buffer = g_realloc (ptr, size);
+		if (buffer == NULL)
+			error (FATAL, "out of memory");
+	}
+	return buffer;
+}
+
+extern void eFree (void *const ptr)
+{
+	if (ptr != NULL)
+		free (ptr);
+}
+
+#ifndef HAVE_STRSTR
+extern char* strstr (const char *str, const char *substr)
+{
+	const size_t length = strlen (substr);
+	const char *match = NULL;
+	const char *p;
+
+	for (p = str  ;  *p != '\0'  &&  match == NULL  ;  ++p)
+		if (strncmp (p, substr, length) == 0)
+			match = p;
+	return (char*) match;
+}
+#endif
+
+extern char* eStrdup (const char* str)
+{
+	char* result = xMalloc (strlen (str) + 1, char);
+	strcpy (result, str);
+	return result;
+}
+
+extern void toLowerString (char* str)
+{
+	while (*str != '\0')
+	{
+		*str = tolower ((int) *str);
+		++str;
+	}
+}
+
+extern void toUpperString (char* str)
+{
+	while (*str != '\0')
+	{
+		*str = toupper ((int) *str);
+		++str;
+	}
+}
+
+/*  Newly allocated string containing lower case conversion of a string.
+ */
+extern char* newLowerString (const char* str)
+{
+	char* const result = xMalloc (strlen (str) + 1, char);
+	int i = 0;
+	do
+		result [i] = tolower ((int) str [i]);
+	while (str [i++] != '\0');
+	return result;
+}
+
+/*  Newly allocated string containing upper case conversion of a string.
+ */
+extern char* newUpperString (const char* str)
+{
+	char* const result = xMalloc (strlen (str) + 1, char);
+	int i = 0;
+	do
+		result [i] = toupper ((int) str [i]);
+	while (str [i++] != '\0');
+	return result;
+}
+
+
+#if 0
+static void setCurrentDirectory (void)
+{
+	char* const cwd = getcwd (NULL, PATH_MAX);
+	CurrentDirectory = xMalloc (strlen (cwd) + 2, char);
+	if (cwd [strlen (cwd) - (size_t) 1] == PATH_SEPARATOR)
+		strcpy (CurrentDirectory, cwd);
+	else
+		sprintf (CurrentDirectory, "%s%c", cwd, OUTPUT_PATH_SEPARATOR);
+	free (cwd);
+}
+#endif
+
+
+extern boolean doesFileExist (const char *const fileName)
+{
+	GStatBuf fileStatus;
+
+	return (boolean) (g_stat (fileName, &fileStatus) == 0);
+}
+
+extern boolean isRecursiveLink (const char* const dirName)
+{
+	boolean result = FALSE;
+	char* const path = absoluteFilename (dirName);
+	while (path [strlen (path) - 1] == PATH_SEPARATOR)
+		path [strlen (path) - 1] = '\0';
+	while (! result  &&  strlen (path) > (size_t) 1)
+	{
+		char *const separator = strrchr (path, PATH_SEPARATOR);
+		if (separator == NULL)
+			break;
+		else if (separator == path)     /* backed up to root directory */
+			*(separator + 1) = '\0';
+		else
+			*separator = '\0';
+		result = isSameFile (path, dirName);
+	}
+	eFree (path);
+	return result;
+}
+
+extern boolean isSameFile (const char *const name1, const char *const name2)
+{
+	boolean result = FALSE;
+#ifdef HAVE_STAT_ST_INO
+	GStatBuf stat1, stat2;
+
+	if (g_stat (name1, &stat1) == 0  &&  g_stat (name2, &stat2) == 0)
+		result = (boolean) (stat1.st_ino == stat2.st_ino);
+#endif
+	return result;
+}
+
+/*
+ *  Pathname manipulation (O/S dependent!!!)
+ */
+
+extern const char *baseFilename (const char *const filePath)
+{
+#if defined (MSDOS_STYLE_PATH)
+	const char *tail = NULL;
+	unsigned int i;
+
+	/*  Find whichever of the path delimiters is last.
+	 */
+	for (i = 0  ;  i < strlen (PathDelimiters)  ;  ++i)
+	{
+		const char *sep = strrchr (filePath, PathDelimiters [i]);
+
+		if (sep > tail)
+			tail = sep;
+	}
+#else
+	const char *tail = strrchr (filePath, PATH_SEPARATOR);
+#endif
+	if (tail == NULL)
+		tail = filePath;
+	else
+		++tail;                 /* step past last delimiter */
+
+	return tail;
+}
+
+/*
+ *  File extension and language mapping
+ */
+extern const char *fileExtension (const char *const fileName)
+{
+	const char *extension;
+	const char *pDelimiter = NULL;
+
+	pDelimiter = strrchr (fileName, '.');
+
+	if (pDelimiter == NULL)
+		extension = "";
+	else
+		extension = pDelimiter + 1;     /* skip to first char of extension */
+
+	return extension;
+}
+
+extern boolean isAbsolutePath (const char *const path)
+{
+	boolean result = FALSE;
+#if defined (MSDOS_STYLE_PATH)
+	if (strchr (PathDelimiters, path [0]) != NULL)
+		result = TRUE;
+	else if (isalpha (path [0])  &&  path [1] == ':')
+	{
+		if (strchr (PathDelimiters, path [2]) != NULL)
+			result = TRUE;
+		else
+			/*  We don't support non-absolute file names with a drive
+			 *  letter, like `d:NAME' (it's too much hassle).
+			 */
+			error (FATAL,
+				"%s: relative file names with drive letters not supported",
+				path);
+	}
+#else
+	result = (boolean) (path [0] == PATH_SEPARATOR);
+#endif
+	return result;
+}
+
+extern vString *combinePathAndFile (const char *const path,
+									const char *const file)
+{
+	vString *const filePath = vStringNew ();
+	const int lastChar = path [strlen (path) - 1];
+# ifdef MSDOS_STYLE_PATH
+	boolean terminated = (boolean) (strchr (PathDelimiters, lastChar) != NULL);
+# else
+	boolean terminated = (boolean) (lastChar == PATH_SEPARATOR);
+# endif
+
+	vStringCopyS (filePath, path);
+	if (! terminated)
+	{
+		vStringPut (filePath, OUTPUT_PATH_SEPARATOR);
+		vStringTerminate (filePath);
+	}
+	vStringCatS (filePath, file);
+
+	return filePath;
+}
+
+/* Return a newly-allocated string whose contents concatenate those of
+ * s1, s2, s3.
+ * Routine adapted from Gnu etags.
+ */
+static char* concat (const char *s1, const char *s2, const char *s3)
+{
+  int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
+  char *result = xMalloc (len1 + len2 + len3 + 1, char);
+
+  strcpy (result, s1);
+  strcpy (result + len1, s2);
+  strcpy (result + len1 + len2, s3);
+  result [len1 + len2 + len3] = '\0';
+
+  return result;
+}
+
+/* Return a newly allocated string containing the absolute file name of FILE
+ * given CWD (which should end with a slash).
+ * Routine adapted from Gnu etags.
+ */
+extern char* absoluteFilename (const char *file)
+{
+	char *slashp, *cp;
+	char *res = NULL;
+
+	if (isAbsolutePath (file))
+		res = eStrdup (file);
+	else
+		res = concat (CurrentDirectory, file, "");
+
+	/* Delete the "/dirname/.." and "/." substrings. */
+	slashp = strchr (res, '/');
+	while (slashp != NULL  &&  slashp [0] != '\0')
+	{
+		if (slashp[1] == '.')
+		{
+			if (slashp [2] == '.' && (slashp [3] == '/' || slashp [3] == '\0'))
+			{
+				cp = slashp;
+				do
+					cp--;
+				while (cp >= res  &&  ! isAbsolutePath (cp));
+				if (cp < res)
+					cp = slashp;/* the absolute name begins with "/.." */
+#ifdef MSDOS_STYLE_PATH
+				/* Under MSDOS and NT we get `d:/NAME' as absolute file name,
+				 * so the luser could say `d:/../NAME'. We silently treat this
+				 * as `d:/NAME'.
+				 */
+				else if (cp [0] != '/')
+					cp = slashp;
+#endif
+				memmove (cp, slashp + 3, strlen (slashp + 3) + 1);
+				slashp = cp;
+				continue;
+			}
+			else if (slashp [2] == '/'  ||  slashp [2] == '\0')
+			{
+				memmove (slashp, slashp + 2, strlen (slashp + 2) + 1);
+				continue;
+			}
+		}
+		slashp = strchr (slashp + 1, '/');
+	}
+
+	if (res [0] == '\0')
+		return eStrdup ("/");
+	else
+	{
+#ifdef MSDOS_STYLE_PATH
+		/* Canonicalize drive letter case.  */
+		if (res [1] == ':'  &&  islower (res [0]))
+			res [0] = toupper (res [0]);
+#endif
+
+		return res;
+	}
+}
+
+/* Return a newly allocated string containing the absolute file name of dir
+ * where FILE resides given CWD (which should end with a slash).
+ * Routine adapted from Gnu etags.
+ */
+extern char* absoluteDirname (char *file)
+{
+	char *slashp, *res;
+	char save;
+#ifdef MSDOS_STYLE_PATH
+	char *p;
+	for (p = file  ;  *p != '\0'  ;  p++)
+		if (*p == '\\')
+			*p = '/';
+#endif
+	slashp = strrchr (file, '/');
+	if (slashp == NULL)
+		res = eStrdup (CurrentDirectory);
+	else
+	{
+		save = slashp [1];
+		slashp [1] = '\0';
+		res = absoluteFilename (file);
+		slashp [1] = save;
+	}
+	return res;
+}
+
+/* Return a newly allocated string containing the file name of FILE relative
+ * to the absolute directory DIR (which should end with a slash).
+ * Routine adapted from Gnu etags.
+ */
+extern char* relativeFilename (const char *file, const char *dir)
+{
+	const char *fp, *dp;
+	char *absdir, *res;
+	int i;
+
+	/* Find the common root of file and dir (with a trailing slash). */
+	absdir = absoluteFilename (file);
+	fp = absdir;
+	dp = dir;
+	while (*fp++ == *dp++)
+		continue;
+	fp--;
+	dp--;                       /* back to the first differing char */
+	do
+	{                           /* look at the equal chars until '/' */
+		if (fp == absdir)
+			return absdir;      /* first char differs, give up */
+		fp--;
+		dp--;
+	} while (*fp != '/');
+
+	/* Build a sequence of "../" strings for the resulting relative file name.
+	 */
+	i = 0;
+	while ((dp = strchr (dp + 1, '/')) != NULL)
+		i += 1;
+	res = xMalloc (3 * i + strlen (fp + 1) + 1, char);
+	res [0] = '\0';
+	while (i-- > 0)
+		strcat (res, "../");
+
+	/* Add the file name relative to the common root of file and dir. */
+	strcat (res, fp + 1);
+	free (absdir);
+
+	return res;
+}
+
+extern long unsigned int getFileSize (const char *const name)
+{
+	GStatBuf fileStatus;
+	unsigned long size = 0;
+
+	if (g_stat (name, &fileStatus) == 0)
+		size = fileStatus.st_size;
+
+	return size;
+}
+
+#if 0
+static boolean isSymbolicLink (const char *const name)
+{
+#if defined (WIN32)
+	return FALSE;
+#else
+	GStatBuf fileStatus;
+	boolean result = FALSE;
+
+	if (g_lstat (name, &fileStatus) == 0)
+		result = (boolean) (S_ISLNK (fileStatus.st_mode));
+
+	return result;
+#endif
+}
+
+static boolean isNormalFile (const char *const name)
+{
+	GStatBuf fileStatus;
+	boolean result = FALSE;
+
+	if (g_stat (name, &fileStatus) == 0)
+		result = (boolean) (S_ISREG (fileStatus.st_mode));
+
+	return result;
+}
+#endif
+
+extern boolean isExecutable (const char *const name)
+{
+	GStatBuf fileStatus;
+	boolean result = FALSE;
+
+	if (g_stat (name, &fileStatus) == 0)
+		result = (boolean) ((fileStatus.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)) != 0);
+
+	return result;
+}
+
+#ifdef HAVE_MKSTEMP
+
+static boolean isSetUID (const char *const name)
+{
+#if defined (WIN32)
+	return FALSE;
+#else
+	GStatBuf fileStatus;
+	boolean result = FALSE;
+
+	if (g_stat (name, &fileStatus) == 0)
+		result = (boolean) ((fileStatus.st_mode & S_ISUID) != 0);
+
+	return result;
+#endif
+}
+
+#endif
+
+#if 0
+static boolean isDirectory (const char *const name)
+{
+	boolean result = FALSE;
+	GStatBuf fileStatus;
+
+	if (g_stat (name, &fileStatus) == 0)
+		result = (boolean) S_ISDIR (fileStatus.st_mode);
+	return result;
+}
+#endif
+
+/*#ifndef HAVE_FGETPOS*/
+/*
+extern int fgetpos ( stream, pos )
+	FILE *const stream;
+	fpos_t *const pos;
+{
+	int result = 0;
+
+	*pos = ftell (stream);
+	if (*pos == -1L)
+		result = -1;
+
+	return result;
+}
+
+extern int fsetpos ( stream, pos )
+	FILE *const stream;
+	fpos_t *const pos;
+{
+	return fseek (stream, *pos, SEEK_SET);
+}
+*/
+/*#endif*/
+
+extern FILE *tempFile (const char *const mode, char **const pName)
+{
+	char *name;
+	FILE *fp;
+	int fd;
+#ifdef HAVE_MKSTEMP
+	const char *const template = "tags.XXXXXX";
+	const char *tmpdir = NULL;
+	if (! isSetUID (ExecutableProgram))
+		tmpdir = getenv ("TMPDIR");
+	if (tmpdir == NULL)
+		tmpdir = TMPDIR;
+	name = xMalloc (strlen (tmpdir) + 1 + strlen (template) + 1, char);
+	sprintf (name, "%s%c%s", tmpdir, OUTPUT_PATH_SEPARATOR, template);
+	fd = mkstemp(name);
+#else
+	name = xMalloc (L_tmpnam, char);
+	if (tmpnam (name) != name)
+		error (FATAL | PERROR, "cannot assign temporary file name");
+	fd = open (name, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+#endif
+	if (fd == -1)
+		error (FATAL | PERROR, "cannot open temporary file");
+	fp = fdopen (fd, mode);
+	if (fp == NULL)
+		error (FATAL | PERROR, "cannot open temporary file");
+	DebugStatement (
+		debugPrintf (DEBUG_STATUS, "opened temporary file %s\n", name); )
+	Assert (*pName == NULL);
+	*pName = name;
+	return fp;
+}
+
+extern void error (const errorSelection selection,
+				   const char *const format, ...)
+{
+	va_list ap;
+
+	va_start (ap, format);
+	fprintf (errout, "%s: %s", getExecutableName (),
+			selected (selection, WARNING) ? "Warning: " : "");
+	vfprintf (errout, format, ap);
+	if (selected (selection, PERROR))
+		fprintf (errout, " : %s", g_strerror (errno));
+	fputs ("\n", errout);
+	va_end (ap);
+	if (selected (selection, FATAL))
+		exit (1);
+}
+
+#ifndef HAVE_STRICMP
+extern int stricmp (const char *s1, const char *s2)
+{
+	int result;
+	do
+	{
+		result = toupper ((int) *s1) - toupper ((int) *s2);
+	} while (result == 0  &&  *s1++ != '\0'  &&  *s2++ != '\0');
+	return result;
+}
+#endif
+
+#ifndef HAVE_STRNICMP
+extern int strnicmp (const char *s1, const char *s2, size_t n)
+{
+	int result;
+	do
+	{
+		result = toupper ((int) *s1) - toupper ((int) *s2);
+	} while (result == 0  &&  --n > 0  &&  *s1++ != '\0'  &&  *s2++ != '\0');
+	return result;
+}
+#endif
+
+
+/* vi:set tabstop=4 shiftwidth=4: */


Modified: ctags/main/routines.h
82 lines changed, 81 insertions(+), 1 deletions(-)
===================================================================
@@ -16,16 +16,96 @@
 
 #include <stdio.h>
 
-#include "mio.h"
+#include "vstring.h"
 
 /*
 *   MACROS
 */
+#define xMalloc(n,Type)    (Type *)eMalloc((size_t)(n) * sizeof (Type))
+#define xCalloc(n,Type)    (Type *)eCalloc((size_t)(n), sizeof (Type))
+#define xRealloc(p,n,Type) (Type *)eRealloc((p), (n) * sizeof (Type))
+
 #define ARRAY_SIZE(X)      (sizeof (X) / sizeof (X[0]))
 
 #define STRINGIFY(X) STRINGIFY_(X)
 #define STRINGIFY_(X) #X
 
+/*
+ *  Portability macros
+ */
+#ifndef PATH_SEPARATOR
+# if defined (MSDOS_STYLE_PATH)
+#  define PATH_SEPARATOR '\\'
+# else
+#  define PATH_SEPARATOR '/'
+# endif
+#endif
+
+#if defined (MSDOS_STYLE_PATH) && defined (UNIX_PATH_SEPARATOR)
+# define OUTPUT_PATH_SEPARATOR	'/'
+#else
+# define OUTPUT_PATH_SEPARATOR	PATH_SEPARATOR
+#endif
+
+/*
+*   DATA DECLARATIONS
+*/
+#if defined (MSDOS_STYLE_PATH)
+extern const char *const PathDelimiters;
+#endif
+extern char *CurrentDirectory;
+typedef int errorSelection;
+enum eErrorTypes { FATAL = 1, WARNING = 2, PERROR = 4 };
+
+
+/*
+*   FUNCTION PROTOTYPES
+*/
+extern void setExecutableName (const char *const path);
+extern const char *getExecutableName (void);
+extern void error (const errorSelection selection, const char *const format, ...) PRINTF (2, 3);
+
+/* Memory allocation functions */
+#ifdef NEED_PROTO_MALLOC
+extern void *malloc (size_t);
+extern void *realloc (void *ptr, size_t);
+#endif
+extern void *eMalloc (const size_t size);
+extern void *eCalloc (const size_t count, const size_t size);
+extern void *eRealloc (void *const ptr, const size_t size);
+extern void eFree (void *const ptr);
+extern void toLowerString (char* str);
+extern void toUpperString (char* str);
+extern char* newLowerString (const char* str);
+extern char* newUpperString (const char* str);
+
+/* File system functions */
+extern boolean doesFileExist (const char *const fileName);
+extern boolean isRecursiveLink (const char* const dirName);
+extern boolean isSameFile (const char *const name1, const char *const name2);
+extern const char *baseFilename (const char *const filePath);
+extern boolean isAbsolutePath (const char *const path);
+extern vString *combinePathAndFile (const char *const path, const char *const file);
+extern char* absoluteFilename (const char *file);
+extern char* absoluteDirname (char *file);
+extern char* relativeFilename (const char *file, const char *dir);
+extern FILE *tempFile (const char *const mode, char **const pName);
+extern void processExcludeOption (const char *const option, const char *const parameter);
+extern const char *fileExtension (const char *const fileName);
+extern char* eStrdup (const char* str);
+extern long unsigned int getFileSize (const char *const name);
+extern boolean isExecutable (const char *const name);
+
+#ifndef HAVE_STRICMP
+extern int stricmp (const char *s1, const char *s2);
+#endif
+#ifndef HAVE_STRNICMP
+extern int strnicmp (const char *s1, const char *s2, size_t n);
+#endif
+#ifndef HAVE_STRSTR
+extern char* strstr (const char *str, const char *substr);
+#endif
+
 #endif  /* CTAGS_MAIN_ROUTINES_H */
 
 /* vi:set tabstop=4 shiftwidth=4: */


Modified: ctags/main/sort.c
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -22,7 +22,7 @@
 #include <glib/gstdio.h>
 
 #include "entry.h"
-#include "main.h"
+#include "routines.h"
 #include "options.h"
 #include "read.h"
 #include "sort.h"


Modified: ctags/main/strlist.c
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -18,7 +18,7 @@
 #endif
 #include <glib/gstdio.h>
 
-#include "main.h"
+#include "routines.h"
 #include "read.h"
 #include "strlist.h"
 


Modified: ctags/main/vstring.c
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -17,7 +17,7 @@
 #include <string.h>
 #include <ctype.h>
 
-#include "main.h"
+#include "routines.h"
 #include "vstring.h"
 
 /*


Modified: ctags/parsers/asm.c
1 lines changed, 0 insertions(+), 1 deletions(-)
===================================================================
@@ -20,7 +20,6 @@
 #include "parse.h"
 #include "read.h"
 #include "routines.h"
-#include "main.h"
 #include "vstring.h"
 
 /*


Modified: ctags/parsers/c.c
1 lines changed, 0 insertions(+), 1 deletions(-)
===================================================================
@@ -21,7 +21,6 @@
 #include "entry.h"
 #include "lcpp.h"
 #include "keyword.h"
-#include "main.h"
 #include "options.h"
 #include "parse.h"
 #include "read.h"


Modified: ctags/parsers/fortran.c
1 lines changed, 0 insertions(+), 1 deletions(-)
===================================================================
@@ -22,7 +22,6 @@
 #include "mio.h"
 #include "entry.h"
 #include "keyword.h"
-#include "main.h"
 #include "options.h"
 #include "parse.h"
 #include "read.h"


Modified: ctags/parsers/jscript.c
1 lines changed, 0 insertions(+), 1 deletions(-)
===================================================================
@@ -30,7 +30,6 @@
 #include "keyword.h"
 #include "parse.h"
 #include "read.h"
-#include "main.h"
 #include "routines.h"
 #include "vstring.h"
 


Modified: ctags/parsers/json.c
1 lines changed, 0 insertions(+), 1 deletions(-)
===================================================================
@@ -18,7 +18,6 @@
 
 #include <string.h>
 #include "debug.h"
-#include "main.h"
 #include "entry.h"
 #include "keyword.h"
 #include "parse.h"


Modified: ctags/parsers/matlab.c
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -18,9 +18,9 @@
 #include <string.h>
 
 #include "parse.h"
+#include "routines.h"
 #include "read.h"
 #include "vstring.h"
-#include "routines.h"
 
 /*
 *   DATA DEFINITIONS


Modified: ctags/parsers/pascal.c
1 lines changed, 0 insertions(+), 1 deletions(-)
===================================================================
@@ -18,7 +18,6 @@
 #include "entry.h"
 #include "parse.h"
 #include "read.h"
-#include "main.h"
 #include "routines.h"
 #include "vstring.h"
 


Modified: ctags/parsers/perl.c
1 lines changed, 0 insertions(+), 1 deletions(-)
===================================================================
@@ -19,7 +19,6 @@
 #include "entry.h"
 #include "options.h"
 #include "read.h"
-#include "main.h"
 #include "routines.h"
 #include "vstring.h"
 #include "xtag.h"


Modified: ctags/parsers/php.c
1 lines changed, 0 insertions(+), 1 deletions(-)
===================================================================
@@ -12,7 +12,6 @@
 *   INCLUDE FILES
 */
 #include "general.h"  /* must always come first */
-#include "main.h"
 #include "parse.h"
 #include "read.h"
 #include "vstring.h"


Modified: ctags/parsers/sh.c
1 lines changed, 0 insertions(+), 1 deletions(-)
===================================================================
@@ -17,7 +17,6 @@
 
 #include "parse.h"
 #include "read.h"
-#include "main.h"
 #include "routines.h"
 #include "vstring.h"
 #include "xtag.h"


Modified: ctags/parsers/sql.c
1 lines changed, 0 insertions(+), 1 deletions(-)
===================================================================
@@ -23,7 +23,6 @@
 #include "entry.h"
 #include "keyword.h"
 #include "parse.h"
-#include "main.h"
 #include "read.h"
 #include "routines.h"
 #include "vstring.h"



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list