/*
 * Copyright 1989 Software Research Associates, Inc., Tokyo, Japan
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose and without fee is hereby granted, provided
 * that the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of Software Research Associates not be used
 * in advertising or publicity pertaining to distribution of the software
 * without specific, written prior permission.  Software Research Associates
 * makes no representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied warranty.
 *
 * SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
 * IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL,
 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 *
 * Author: Erik M. van der Poel
 *         Software Research Associates, Inc., Tokyo, Japan
 *         erik@sra.co.jp
 */

#include "xdvi-config.h"
#include "sfDir.h"

#if !defined(MOTIF) /* entire file */

#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Xos.h>
#include <X11/Xaw/Text.h>
#include <X11/Xaw/AsciiText.h>
#undef wchar_t

#include <stdio.h>

#ifdef SEL_FILE_IGNORE_CASE
#include <ctype.h>
#endif /* def SEL_FILE_IGNORE_CASE */


#ifdef SEL_FILE_IGNORE_CASE
int
SFcompareEntries(const void *vp, const void *vq)
{
    SFEntry *p = vp;
    SFEntry *q = vq;
    char *r, *s;
    char c1, c2;

    r = p->real;
    s = q->real;

    c1 = *r++;
    if (islower(c1)) {
	c1 = toupper(c1);
    }
    c2 = *s++;
    if (islower(c2)) {
	c2 = toupper(c2);
    }

    while (c1 == c2) {
	if (!c1) {
	    return strcmp(p->real, q->real);
	}
	c1 = *r++;
	if (islower(c1)) {
	    c1 = toupper(c1);
	}
	c2 = *s++;
	if (islower(c2)) {
	    c2 = toupper(c2);
	}
    }

    return c1 - c2;
}
#else /* def SEL_FILE_IGNORE_CASE */
int
SFcompareEntries(const void *vp, const void *vq)
{
    const SFEntry *p = vp;
    const SFEntry *q = vq;
    return strcmp(p->real, q->real);
}
#endif /* def SEL_FILE_IGNORE_CASE */

int
SFgetDir(SFDir *dir)
{
    SFEntry *result = NULL;
    int alloc = 0;
    int i;
    DIR *dirp;
    struct dirent *dp;
    char *str;
    int len;
    int maxChars;
    struct stat statBuf;

    maxChars = strlen(dir->dir) - 1;

    dir->entries = NULL;
    dir->nEntries = 0;
    dir->nChars = 0;

    result = NULL;
    i = 0;

    dirp = opendir(".");
    if (!dirp) {
	return 1;
    }

    (void)stat(".", &statBuf);
    dir->mtime = statBuf.st_mtime;

    (void)readdir(dirp);	/* throw away "." */

#ifndef S_IFLNK
    (void)readdir(dirp);	/* throw away ".." */
#endif /* ndef S_IFLNK */

    while ((dp = readdir(dirp))) {
	if (i >= alloc) {
	    alloc = 2 * (alloc + 1);
	    result = (SFEntry *) XtRealloc((char *)result,
					   (unsigned)(alloc * sizeof(SFEntry)));
	}
	result[i].statDone = 0;
	str = dp->d_name;
	len = strlen(str);
	result[i].real = XtMalloc((unsigned)(len + 2));
	(void)strcat(strcpy(result[i].real, str), " ");
	if (len > maxChars) {
	    maxChars = len;
	}
	result[i].shown = result[i].real;
	i++;
    }

#if defined(SVR4) || defined(SYSV) || defined(USG)
    qsort((char *)result, (unsigned)i, sizeof(SFEntry), SFcompareEntries);
#else /* defined(SVR4) || defined(SYSV) || defined(USG) */
    qsort((char *)result, i, sizeof(SFEntry), SFcompareEntries);
#endif /* defined(SVR4) || defined(SYSV) || defined(USG) */

    dir->entries = result;
    dir->nEntries = i;
    dir->nChars = maxChars + 1;

    closedir(dirp);

    return 0;
}

#else
/* silence `empty compilation unit' warnings */
static void bar(void); static void foo() { bar(); } static void bar(void) { foo(); }
#endif /* !defined(MOTIF) */
