#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

#define FALSE 0
#define TRUE 1

int ParseFDFile( char *basename )
{
    FILE *fp;
    char buffer[256];
    long bias;
    char *Basis = "UNKNOWN";
    char fPrivate;
    char fname[80];

    sprintf( fname, "FD:%s_lib.fd", basename );

    if( ( fp = fopen( fname, "rt" ) ) == NULL )
    {
        printf("ERROR: cannot open %s\n", fname );
        return 10;
    }

    bias = 0; fPrivate = FALSE;

    printf("* Snoopy scriptfile for %s\n\n", fname );

    while( !feof( fp ) )
    {
        fgets( buffer, 256, fp );

        if( *buffer == '*' ) continue;

        if( *buffer == '#' && *(buffer+1) == '#' )
        {
            if( strnicmp( buffer+2, "bias", 4) == 0 )
            {
                bias = atol( buffer + 7 ); 
            }
            else if( strnicmp( buffer+2, "public", 6 ) == 0 )
            {
                fPrivate = FALSE;
            }
            else if( strnicmp( buffer+2, "private", 7 ) == 0 )
            {
                fPrivate = TRUE;
            }
            else if( strnicmp( buffer+2, "base", 4 ) == 0 )
            {
                char *cp;
                Basis = strdup( buffer+8 );
                cp = strchr( Basis, '\n' );
                if( cp ) *cp=0;
                printf("* define library base\nbase=%s,%s.library\n\n",Basis,basename );
            }
        }
        else
        {
            if( !fPrivate )
            {
                char *cp;
                char Regs[80];
                char *name;

                if( ( cp = strchr( buffer, '(' ) ) != NULL )
                {
                    *cp = 0;
                    name = strdup( buffer );
                }
                else continue;

                if( ( cp = strrchr( ++cp, (int)'(' ) ) != NULL )
                {
                    int done = FALSE;
                    int count = 0;
                    int nrofregs = 0;
                    
                    do
                    {
                        switch( *cp )
                        {
                        case ',':
                            *cp = '/';
                        case '/':
                            Regs[ count++ ] = 'L';
                            nrofregs++;
                        case 'A':
                        case 'a':
                        case 'D':
                        case 'd':
                        case '0':
                        case '1':
                        case '2':
                        case '3':
                        case '4':
                        case '5':
                        case '6':
                        case '7':
                            Regs[ count++ ] = toupper( *cp );
                            break;
                        case ')':
                            done = TRUE;
                            break;
                        }
                        cp++;
                    }
                    while( !done );
                    if( count != 0 )
                    {
                        nrofregs++;
                        Regs[ count++ ] = 'L';
                        Regs[ count++ ] = '/';
                    }
                    Regs[ count ] = 0;
                        
                    strcat( Regs, "RD0L" );
                    printf("watch=%s,-%ld,%s,%s( ", Basis, bias, Regs, name );
                    for( ; nrofregs; nrofregs--)
                        printf("$%%lx ");
                    printf(")=$%%lx\n");
                }
            }
            bias += 6;
        }
    }
    fclose( fp );
    return 0;
}

int main(int argc, char *argv[])
{
    return ParseFDFile( argv[1] );
}
