D64-Disk-Image

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN


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

Image.xs  view on Meta::CPAN

        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);

Image.xs  view on Meta::CPAN

        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)

Image.xs  view on Meta::CPAN

        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);

Image.xs  view on Meta::CPAN


# 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 )