/*
*   $Id: qdos.c 443 2006-05-30 04:37:13Z darren $
*
*   Copyright (c) 1999, Thierry Godefroy <godefroy@imaginet.fr>
*
*   This source code is released for free distribution under the terms of the
*   GNU General Public License.
*
*   This module contains functions to handle wildcard expansion and file name
*   conversion under QDOS.
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <qdos.h>
#include <string.h>
#include <errno.h>
#include "ctags.h"

/* Translate the filenames from UNIX to QDOS conventions on open calls */
int (*_Open) (const char *, int, ...) = qopen;

long _stack          = 24576;  /* Plenty of stack space */
long _memincr        = 10240;  /* Big increments to cut fragmentation */
char _prog_name []   = "ctags";
char _version []     = PROGRAM_VERSION;
char _copyright [32] = __DATE__;
char *_endmsg        = "\nPress a key to exit.";
int  custom_expand (char * param, char ***argvptr, int *argcptr);
int  (*_cmdwildcard) ()  = custom_expand;


struct WINDOWDEF _condetails = { 208, 1, 0, 7, 512, 256, 0, 0};
void (*_consetup) ()         = consetup_title;

/* custom cmdexpand: also expands directory names */

#define FILEBUF_INIT    1024  /* Initial allocation size for buffer */
#define FILEBUF_INCR    1024  /* Increment size for buffer */

int custom_expand (char * param, char ***argvptr, int *argcptr)
{
    int     count,sl;
    size_t  bufsize;
    char    *filenamebuf;
    char    *ptr,*safeptr;

    /*
     *  Check to see if we should do wild card expansion.
     *  We only perform wildcard expansion if the parameter
     *  was not a string and if it contains one of the
     *  wild card characters.
     *
     *  We also do not expand any option that starts with '-'
     *  as we then assume that it is a unix stylew option.
     */
    if ((*param == '-') ||  (strpbrk (param,"*?") == NULL) ) {
        return 0;
    }

    if ((filenamebuf = malloc (bufsize = FILEBUF_INIT)) == NULL) {
        return -1;
    }
TRYAGAIN:
    count = getfnl (param, filenamebuf, bufsize, QDR_ALL);
    if (count == -1  && errno == ENOMEM) {
        /*
         *  We have overflowed the buffer, so we try
         *  to get a bigger buffer and try again.
         */
        bufsize += FILEBUF_INCR;
        if ((filenamebuf = realloc (filenamebuf, bufsize)) == NULL) {
            return -1;
        } else {
            goto TRYAGAIN;
        }
    }
    /*
     *  If no files were found, then return unexpanded.
     */
    if (count == 0) {
        free (filenamebuf);
        return 0;
    }
    /*
     *  Files were found, so add these to the list instead
     *  of the original parameter typed by the user.
     */
    for ( ptr=filenamebuf ; count > 0 ; count -- ) {
        *argvptr = (char **) realloc (*argvptr, (size_t) (((*argcptr) + 2) * sizeof (char *)));
        safeptr= (char *) malloc ((size_t) (sl=strlen (ptr) + 1));
        if (safeptr == NULL || *argvptr == NULL) {
            return -1;
        }
        (void) memcpy (safeptr,ptr, (size_t) sl);
        (*argvptr) [*argcptr] = safeptr;
        *argcptr += 1;
        ptr += sl;
    }
    free (filenamebuf);
    return *argcptr;
}

/* vi:set tabstop=4 shiftwidth=4: */
