#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

static int
not_here(char *s)
{
    croak("%s not implemented on this architecture", s);
    return -1;
}

#undef I_POLL
#include <Finder.h>
#include "common/util.c"

#define ClassName "MacOSX::File::Spec"

static SV *
new(char *class, char *path){
    OSErr   err;
    FSRef   ref;
    FSSpec  spec;
    FSSpec  *sp = &spec;
    SV      *self;

    if (strcmp(class, ClassName) != 0){ return NULL; };
    if (err = FSPathMakeRef(path, &ref, NULL)){ 
	seterr(err); return NULL;
    };
    if (err = FSGetCatalogInfo(&ref, kFSCatInfoNone,
			       NULL, NULL, 
			       &spec,  NULL)){
	seterr(err); return NULL;
    }
    self = newRV_noinc(newSVpv((char *)sp, sizeof(spec)));
    return sv_bless(self, gv_stashpv(ClassName, 1));

}

static SV *
vRefNum(SV *self){
    FSSpec *sp;
    if (self == NULL){ return NULL; }
    if (!SvROK(self)){ return NULL; }
    if (!sv_isa(self, ClassName)){ return NULL; };
    sp = (FSSpec *)SvPV_nolen(SvRV(self));
    return newSViv(sp->vRefNum);
}

static SV *
parID(SV *self){
    FSSpec *sp;
    if (self == NULL){ return NULL; }
    if (!SvROK(self)){ return NULL; }
    if (!sv_isa(self, ClassName)){ return NULL; };
    sp = (FSSpec *)SvPV_nolen(SvRV(self));
    return newSViv(sp->parID);
}

static SV *
name(SV *self){
    FSSpec *sp;
    if (self == NULL){ return NULL; }
    if (!SvROK(self)){ return NULL; }
    if (!sv_isa(self, ClassName)){ return NULL; };
    sp = (FSSpec *)SvPV_nolen(SvRV(self));
    return newSVpv((sp->name)+1, sp->name[0]);
}

char *
path(SV *self){
    FSSpec *sp;
    FSRef  ref;
    static char path[1024];
    if (self == NULL){ return NULL; }
    if (!SvROK(self)){ return NULL; }
    if (!sv_isa(self, ClassName)){ return NULL; };
    sp = (FSSpec *)SvPV_nolen(SvRV(self));
    FSpMakeFSRef(sp, &ref);
    FSRefMakePath(&ref, path, 1024);
    return path;
}


MODULE = MacOSX::File::Spec		PACKAGE = MacOSX::File::Spec	

PROTOTYPES: ENABLE

SV *
new(class, path)
    char *class;
    char *path;
    CODE:
        RETVAL = new(class, path);
    OUTPUT:
	RETVAL

SV *
vRefNum(self)
    SV *self;
    CODE:
        RETVAL = vRefNum(self);
    OUTPUT:
	RETVAL

SV *
parID(self)
    SV *self;
    CODE:
        RETVAL = parID(self);
    OUTPUT:
	RETVAL

SV *
name(self)
    SV *self;
    CODE:
        RETVAL = name(self);
    OUTPUT:
	RETVAL

char *
path(self)
    SV *self;
    CODE:
        RETVAL = path(self);
    OUTPUT:
	RETVAL

void
as_array(self)
    SV *self;
    PPCODE:
	if (SvROK(self) && sv_isa(self, ClassName)){
	    EXTEND(SP, 3);
	    PUSHs(sv_2mortal(vRefNum(self)));
	    PUSHs(sv_2mortal(parID(self)));
	    PUSHs(sv_2mortal(name(self)));
	}