Skip to content

Commit

Permalink
Grab ctags implementation of sort.c/h
Browse files Browse the repository at this point in the history
I haven't studies the changes much but this file is responsible for sorting
tag files which isn't interesing for us.
  • Loading branch information
techee committed Oct 8, 2016
1 parent 88cbe38 commit f1dbf2c
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 42 deletions.
5 changes: 5 additions & 0 deletions ctags/main/options.h
Expand Up @@ -31,6 +31,11 @@
* DATA DECLARATIONS
*/

typedef enum sortType {
SO_UNSORTED,
SO_SORTED,
SO_FOLDSORTED
} sortType;

/* This stores the command line options.
*/
Expand Down
105 changes: 66 additions & 39 deletions ctags/main/sort.c
Expand Up @@ -12,39 +12,38 @@
*/
#include "general.h" /* must always come first */

#if defined (HAVE_IO_H)
# include <io.h>
#endif
#if defined (HAVE_STDLIB_H)
# include <stdlib.h> /* to declare malloc () */
#endif
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
#endif
#include <string.h>
#include <stdio.h>

#include "debug.h"
#include "entry.h"
#include "routines.h"
#include "options.h"
#include "read.h"
#include "routines.h"
#include "sort.h"

#ifdef TRAP_MEMORY_CALLS
# include "safe_malloc.h"
#endif

/*
* FUNCTION DEFINITIONS
*/

extern void catFile (const char *const name)
extern void catFile (MIO *mio)
{
FILE *const fp = fopen (name, "r");

if (fp != NULL)
if (mio != NULL)
{
int c;

while ((c = getc (fp)) != EOF)
mio_seek (mio, 0, SEEK_SET);
while ((c = mio_getc (mio)) != EOF)
putchar (c);
fflush (stdout);
fclose (fp);
}
}

Expand All @@ -56,9 +55,12 @@ extern void catFile (const char *const name)
# define PE_CONST const
#endif

extern void externalSortTags (const bool toStdout)
extern void externalSortTags (const bool toStdout, MIO *tagFile)
{
const char *const sortCommand = "sort -u -o";
const char *const sortNormalCommand = "sort -u";
const char *const sortFoldedCommand = "sort -u -f";
const char *sortCommand =
Option.sorted == SO_FOLDSORTED ? sortFoldedCommand : sortNormalCommand;
PE_CONST char *const sortOrder1 = "LC_COLLATE=C";
PE_CONST char *const sortOrder2 = "LC_ALL=C";
const size_t length = 4 + strlen (sortOrder1) + strlen (sortOrder2) +
Expand All @@ -70,29 +72,51 @@ extern void externalSortTags (const bool toStdout)
{
/* Ensure ASCII value sort order.
*/
#ifdef HAVE_SETENV
#if defined (HAVE_SETENV) || defined (HAVE_PUTENV)
# ifdef HAVE_SETENV
setenv ("LC_COLLATE", "C", 1);
setenv ("LC_ALL", "C", 1);
sprintf (cmd, "%s %s %s", sortCommand, tagFileName (), tagFileName ());
#else
# ifdef HAVE_PUTENV
# else
putenv (sortOrder1);
putenv (sortOrder2);
sprintf (cmd, "%s %s %s", sortCommand, tagFileName (), tagFileName ());
# else
sprintf (cmd, "%s %s %s %s %s", sortOrder1, sortOrder2, sortCommand,
tagFileName (), tagFileName ());
# endif
if (toStdout)
sprintf (cmd, "%s", sortCommand);
else
sprintf (cmd, "%s -o %s %s", sortCommand,
tagFileName (), tagFileName ());
#else
if (toStdout)
sprintf (cmd, "%s %s %s", sortOrder1, sortOrder2, sortCommand);
else
sprintf (cmd, "%s %s %s -o %s %s", sortOrder1, sortOrder2,
sortCommand, tagFileName (), tagFileName ());
#endif
verbose ("system (\"%s\")\n", cmd);
ret = system (cmd);
if (toStdout)
{
const int fdstdin = 0;
int fdsave;

fdsave = dup (fdstdin);
if (fdsave < 0)
error (FATAL | PERROR, "cannot save stdin fd");
if (dup2 (fileno (mio_file_get_fp (tagFile)), fdstdin) < 0)
error (FATAL | PERROR, "cannot redirect stdin");
if (lseek (fdstdin, 0, SEEK_SET) != 0)
error (FATAL | PERROR, "cannot rewind tag file");
ret = system (cmd);
if (dup2 (fdsave, fdstdin) < 0)
error (FATAL | PERROR, "cannot restore stdin fd");
close (fdsave);
}
else
ret = system (cmd);
free (cmd);

}
if (ret != 0)
error (FATAL | PERROR, "cannot sort tag file");
else if (toStdout)
catFile (tagFileName ());
}

#else
Expand All @@ -103,7 +127,7 @@ extern void externalSortTags (const bool toStdout)
* so have lots of memory if you have large tag files.
*/

static void failedSort (MIO *const mio, const char* msg)
extern void failedSort (MIO *const mio, const char* msg)
{
const char* const cannotSort = "cannot sort tag file";
if (mio != NULL)
Expand All @@ -114,6 +138,14 @@ static void failedSort (MIO *const mio, const char* msg)
error (FATAL, "%s: %s", msg, cannotSort);
}

static int compareTagsFolded(const void *const one, const void *const two)
{
const char *const line1 = *(const char* const*) one;
const char *const line2 = *(const char* const*) two;

return struppercmp (line1, line2);
}

static int compareTags (const void *const one, const void *const two)
{
const char *const line1 = *(const char* const*) one;
Expand Down Expand Up @@ -148,32 +180,28 @@ static void writeSortedTags (
failedSort (mio, NULL);
}
if (toStdout)
fflush (mio_file_get_fp (mio));
mio_flush (mio);
mio_free (mio);
}

extern void internalSortTags (const bool toStdout)
extern void internalSortTags (const bool toStdout, MIO* mio, size_t numTags)
{
vString *vLine = vStringNew ();
MIO *mio = NULL;
const char *line;
size_t i;
int (*cmpFunc)(const void *, const void *);

/* Allocate a table of line pointers to be sorted.
*/
size_t numTags = TagFile.numTags.added + TagFile.numTags.prev;
const size_t tableSize = numTags * sizeof (char *);
char **const table = (char **) malloc (tableSize); /* line pointers */
DebugStatement ( size_t mallocSize = tableSize; ) /* cumulative total */
char **const table = (char **) malloc (tableSize); /* line pointers */
DebugStatement ( size_t mallocSize = tableSize; ) /* cumulative total */


cmpFunc = Option.sorted == SO_FOLDSORTED ? compareTagsFolded : compareTags;
if (table == NULL)
failedSort (mio, "out of memory");

/* Open the tag file and place its lines into allocated buffers.
*/
mio = mio_new_file (tagFileName (), "r");
if (mio == NULL)
failedSort (mio, NULL);
for (i = 0 ; i < numTags && ! mio_eof (mio) ; )
{
line = readLineRaw (vLine, mio);
Expand All @@ -198,12 +226,11 @@ extern void internalSortTags (const bool toStdout)
}
}
numTags = i;
mio_free (mio);
vStringDelete (vLine);

/* Sort the lines.
*/
qsort (table, numTags, sizeof (*table), compareTags);
qsort (table, numTags, sizeof (*table), cmpFunc);

writeSortedTags (table, numTags, toStdout);

Expand Down
15 changes: 12 additions & 3 deletions ctags/main/sort.h
Expand Up @@ -14,15 +14,24 @@
*/
#include "general.h" /* must always come first */

#include <stdio.h>

#include "mio.h"

/*
* FUNCTION PROTOTYPES
*/
extern void catFile (const char *const name);
extern void catFile (MIO *mio);

#ifdef EXTERNAL_SORT
extern void externalSortTags (const bool toStdout);
extern void externalSortTags (const bool toStdout, MIO *tagFile);
#else
extern void internalSortTags (const bool toStdout);
extern void internalSortTags (const bool toStdout,
MIO *mio,
size_t numTags);
#endif

/* mio is closed in this function. */
extern void failedSort (MIO *const mio, const char* msg);

#endif /* CTAGS_MAIN_SORT_H */

0 comments on commit f1dbf2c

Please sign in to comment.