[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