/*      wild32.c
 *
 * Win32 wildcard expanding functions
 * 
 * Petteri Kangaslampi 1997, Public Domain
*/

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdlib.h>

typedef struct _Argument
{
    struct _Argument *next;
    char *name;
} Argument;


static Argument *args, *sortStart, *lastArg;
static int numArguments;


static void AddArgument(char *arg)
{
    Argument *b, *c;
    Argument *a = (Argument*) malloc(sizeof(Argument));

    numArguments++;
    
    a->name = (char*) malloc(strlen(arg) + 1);
    strcpy(a->name, arg);
    if ( args == NULL )
    {
        args = a;
        a->next = NULL;
        sortStart = args;
        lastArg = args;
    }
    else
    {
        if ( sortStart == NULL )
        {
            c = lastArg; b = NULL;
            sortStart = c;
        }
        else
        {
            c = sortStart;
            b = sortStart->next;

            while ( (b != NULL) && (strcmp(b->name, a->name) <= 0) )
            {
                c = b;
                b = b->next;
            }
        }
            
        if ( c == NULL )
            args = a;
        else
            c->next = a;
        a->next = b;
        
        if ( b == NULL )
            lastArg = a;
    }
}


void wildExpand(int *argc, char ***argv)
{
    int numorg = *argc;
    char **org = *argv;
    char *arg;
    int n;
    WIN32_FIND_DATA findData;
    HANDLE findHandle;
    char **newArgs;
    Argument *a, *ar;
    char dirName[MAX_PATH];
    char fullName[MAX_PATH];
    char *e;

    args = NULL;
    numArguments = 0;
    n = 0;

    while ( numorg )
    {
        arg = org[n];

        sortStart = NULL;
        
        if ( (strlen(arg) == 0) || (arg[0] == '-') || (n == 0) )
        {
            AddArgument(arg);
        }
        else
        {
            if ( (findHandle = FindFirstFile(arg, &findData))
                 == INVALID_HANDLE_VALUE )
            {
                AddArgument(arg);
            }
            else
            {
                e = strrchr(arg, '\\');
                if ( e == NULL )
                    e = strrchr(arg, ':');
                if ( e != NULL )
                {
                    strncpy(dirName, arg, ((unsigned) (e-arg)) + 1);
                    dirName[((unsigned) (e-arg)) + 1] = 0;
                }
                else
                    dirName[0] = 0;
                    
                do
                {
                    strcpy(fullName, dirName);
                    strcat(fullName, findData.cFileName);
                    AddArgument(fullName);
                } while ( FindNextFile(findHandle, &findData) );
                FindClose(findHandle);
            }
        }
        numorg--;
        n++;
    }

    newArgs = malloc(sizeof(char*) * numArguments);

    a = args;
    for ( n = 0; n < numArguments; n++ )
    {
        newArgs[n] = a->name;
        ar = a->next;
        free(a);
        a = ar;
    }

    *argv = newArgs;
    *argc = numArguments;
}

