#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <exec/types.h>
#include <dos/dos.h>
#include <dos/rdargs.h>
#include <clib/dos_protos.h>

#define TEMPLATE "FILES/A/M,INCPATH/K,INCSUFFIX/K,SKIPPREFIX/K,OUTPATH/K,OUTSUFFIX/K"
#define OPT_FILES           0
#define OPT_INCPATH         1
#define OPT_INCPREFIX       2
#define OPT_SKIPPREFIX      3
#define OPT_OUTPATH         4
#define OPT_OUTPREFIX       5
#define OPT_COUNT           6

LONG opts[OPT_COUNT];
char *ver="\0$VER: makeoffsets Snoopy Support Tool 1.0 (01.01.94)";
char *includePath = "include:";
char *includeSuffix = ".i";
char *skipPrefix = "_LVO";
char *outputPath = "";
char *outputSuffix = "";

extern struct Library *DOSBase;

void BuildOffsets( char *filename )
{
    char buffer[256];
    FILE *source,*target;

    sprintf( buffer, "%s%s%s", includePath, filename, includeSuffix );
    
    if( ( source = fopen( buffer, "r" ) ) != NULL )
    {
        sprintf( buffer, "%s%s%s", outputPath, filename, outputSuffix );
        
        if( ( target = fopen( buffer, "w" ) ) != NULL )
        {
            char *cp,*result,*code;
            
            printf("Creating SNOOPY Includefile \"%s\"....", buffer );

            while( !feof( source ) )
            {
                fgets( buffer, 256, source );
                result = NULL;
            
                // note: this code my look stupid, but kids, I can do it! 
                for( cp=buffer; *cp && !isspace( *cp ); cp++ );
                if( *cp )
                {       
                    for( *(cp++)=0; *cp && isspace( *cp ); cp++ );
                    if( *cp )
                    {
                        for( ++cp; *cp && !isspace( *cp ); cp++ );
                        if( *cp )
                        {
                            for( ++cp; *cp && isspace( *cp ); cp++ );
                            if( *cp && (*(cp++)=='-') )
                            {
                                for( result=cp; *cp && isdigit( *cp ); cp++ ); *cp=0;
                                if( !strncmp( buffer, skipPrefix, strlen(skipPrefix) ) )
                                    code = buffer+strlen(skipPrefix);
                                else
                                    code = buffer;

                                fprintf( target, "define=%s,-%s\n",code,result);
                            }
                        }
                    }
                }
            }
            printf( "Done!\n");
            fclose( target );
        }
        else printf( "ERROR, cannot open target \"%s\"\n", buffer );
        
        fclose( source );
    }
    else printf( "ERROR, cannot open source \"%s\"\n", buffer );
} // BuildOffsets()

int main( void )
{
    struct RDArgs *argsptr;

    if( ( argsptr = ReadArgs( TEMPLATE, opts, NULL ) ) != NULL )
    {
        char **sptr;

        if( opts[OPT_INCPATH]   ) includePath   = (char *)(opts[OPT_INCPATH  ]);
        if( opts[OPT_INCPREFIX] ) includeSuffix = (char *)(opts[OPT_INCPREFIX]);
        if( opts[OPT_SKIPPREFIX]) skipPrefix    = (char *)(opts[OPT_SKIPPREFIX]);
        if( opts[OPT_OUTPATH]   ) outputPath    = (char *)(opts[OPT_OUTPATH  ]);
        if( opts[OPT_OUTPREFIX] ) outputSuffix  = (char *)(opts[OPT_OUTPREFIX]);

        sptr = (char **)(opts[OPT_FILES]);
        while( *sptr ) BuildOffsets( *(sptr++) );
        
        FreeArgs( argsptr );
    }
    else
    {
        PrintFault( IoErr(), NULL );
        return RETURN_ERROR;
    }
    return RETURN_OK;
}
