D64-Disk-Image
view release on metacpan or search on metacpan
0.05 2018-12-01
- fix randomly occurring "panic: XSUB failed to extend arg stack" error by
properly using "EXTEND" macro to make room on the argument stack for the
return values before they are pushed onto the stack with the "PUSHs" macro
0.04 2018-11-29
- properly return an empty list from the following method calls: "read",
"status", "rawname_from_name", and "name_from_rawname" (remove an invalid
use of "XSRETURN_UNDEF" macro, which may only be used in a "CODE" block,
while "PPCODE" implicitly returns an empty list when nothing is pushed on
stack)
0.03 2018-11-24
- remove hard-coded file names in tests and replace them with a File::Temp's
"tmpnam" function call that returns the full name of a temporary file
- fix XS interface compilation warnings, e.g. "pointer targets in passing
argument 2 of 'Perl_newSVpv' differ in signedness"
0.02 2013-01-12
- Fixed "Segmentation fault" exception on OpenBSD and alikes, which was
di_sync(di);
# my ($numstatus, $status) = di_status($diskImage);
void
di_status(di)
DiskImage *di
PREINIT:
char *status;
int numstatus, statuslen;
PPCODE:
New(1, status, DISKDRIVE_STATUS_LENGTH + 1, char);
if (status) {
memset(status, '\0', DISKDRIVE_STATUS_LENGTH + 1);
numstatus = di_status(di, status);
statuslen = strlen(status);
EXTEND(SP, 2);
PUSHs(sv_2mortal(newSViv(numstatus)));
PUSHs(sv_2mortal(newSVpv(status, statuslen)));
}
Safefree(status);
RETVAL
# my ($title, $id) = di_title($diskImage);
void
di_title(di)
DiskImage *di
PREINIT:
unsigned char *title;
unsigned char *id;
PPCODE:
title = di_title(di);
id = title + 18;
EXTEND(SP, 2);
PUSHs(sv_2mortal(newSVpv((const char *)title, 16)));
PUSHs(sv_2mortal(newSVpv((const char *)id, 5)));
# my $track_blocks_free = di_track_blocks_free($diskImage, $track);
int
di_track_blocks_free(di, track)
ts.sector = (unsigned char)sector;
di_free_ts(di, ts);
# my $rawname = di_rawname_from_name($name);
void
di_rawname_from_name(name)
char *name
PREINIT:
unsigned char *rawname;
PPCODE:
New(1, rawname, DIRECTORY_FILENAME_LENGTH + 1, unsigned char);
if (rawname) {
di_rawname_from_name(rawname, name);
rawname[DIRECTORY_FILENAME_LENGTH] = '\0';
EXTEND(SP, 1);
PUSHs(sv_2mortal(newSVpv((const char *)rawname, DIRECTORY_FILENAME_LENGTH)));
}
Safefree(rawname);
# my $name = di_name_from_rawname($rawname);
void
di_name_from_rawname(rawname)
unsigned char *rawname
PREINIT:
int namelen;
char *name;
PPCODE:
New(1, name, DIRECTORY_FILENAME_LENGTH + 1, char);
if (name) {
namelen = di_name_from_rawname(name, rawname);
name[namelen] = '\0';
EXTEND(SP, 1);
PUSHs(sv_2mortal(newSVpv(name, namelen)));
}
Safefree(name);
# my $blocksfree = _di_blocksfree($diskImage);
# my ($counter, $buffer) = di_read($imageFile, $maxlength);
void
di_read(imgfile, len);
ImageFile *imgfile
int len
PREINIT:
unsigned char *buffer;
int counter;
PPCODE:
New(1, buffer, len + 1, unsigned char);
if (buffer) {
memset(buffer, '\0', len + 1);
counter = di_read(imgfile, buffer, len);
EXTEND(SP, 2);
PUSHs(sv_2mortal(newSViv(counter)));
PUSHs(sv_2mortal(newSVpv((const char *)buffer, counter)));
}
Safefree(buffer);
( run in 0.517 second using v1.01-cache-2.11-cpan-71847e10f99 )