#include <stdio.h>

#include <exec/types.h>

#include "diskstruct.h"

#define ISDIR(x) ((x[0]==T_SHORT)&&(x[127]==ST_USER))
#define ISFILE(x)  ((x[0]==T_SHORT)&&(x[127]==ST_FILE))
#define ISDATA(x)  (x[0]==T_DATA)

UBYTE *ReadBlock( int );

void CopyFile( file )
struct FileHeader *file;
{
    int n, t;
    struct DataBlock *b;

    printf( "\t%s (%d/%d)\n", file->fh_name, file->fh_seq, file->fh_filesize );

    n = file->fh_first;

    t = 1;

    while( t && n ) {
        printf( "%d ", n );
        b = (struct DataBlock *)ReadBlock( n );
        if( b == NULL ) {
            printf( "\nI/O error (%d)\n", n );
            return;
        }
        t = (b->db_type == T_DATA);
        n = b->db_next;
        free( b );
    }
    printf( "\n" );
    if( t == 0 ) {
        printf( "Non data block in file\n" );
    }
}

void CopyDir( dir )
struct UserDir *dir;
{
    int k, n;
    ULONG *blk;

    printf( "\n-------------\nDirectory %s\n", dir->ud_name );

    for( k = 0; k < HSIZE; k++ ) {
        n = dir->ud_htable[k];
        while( n ) {
            blk = (ULONG*)ReadBlock( n );
            if( ISDIR(blk) ) {
                CopyDir( blk );
            } else if( ISFILE(blk) ) {
                CopyFile( blk );
            }
            n = blk[124];
            free( blk );
        }
    }

    printf( "\n------------\n" );

}

void DiskCopy()
{
    struct Root *root;

    root = (struct Root *)ReadBlock( 880 );

    CopyDir( root );

    free( root );
}

