1// Copyright (c) 2014 David J. Shultz <dshultz@cpan.org> 2// This software is covered by the GPL. 3 4#include "EXTERN.h" 5#include "perl.h" 6#include "XSUB.h" 7 8#include "lib/discid.h" 9#include <stdio.h> 10#include <stdlib.h> 11 12static int 13not_here(char *s) 14{ 15 croak("%s not implemented on this architecture", s); 16 return -1; 17} 18 19static double 20constant(char *name, int len, int arg) 21{ 22 errno = EINVAL; 23 return 0; 24} 25 26MODULE = Net::FreeDB PACKAGE = Net::FreeDB 27 28PROTOTYPES: ENABLE 29 30double 31constant(sv,arg) 32 PREINIT: 33 STRLEN len; 34 INPUT: 35 SV * sv 36 char * s = SvPV(sv, len); 37 int arg 38 CODE: 39 RETVAL = constant(s,len,arg); 40 OUTPUT: 41 RETVAL 42 43char* 44xs_discid(char* dev) 45 INIT: 46 char id[30]; 47 struct discdata data; 48 CODE: 49 data = get_disc_id(dev); 50 POST_CALL: 51 if (data.num_of_trks == -1) { 52 RETVAL = ""; 53 } else { 54 sprintf(id, "%08x", (unsigned int)data.discid); 55 RETVAL = id; 56 } 57 OUTPUT: 58 RETVAL 59 60SV* 61xs_discinfo(char* dev) 62 INIT: 63 int i; 64 char id[30]; 65 struct discdata data; 66 HV* hash = newHV(); 67 AV* tracks = newAV(); 68 PPCODE: 69 data = get_disc_id(dev); 70 71 for (i = 0; i < (data.num_of_trks); i++) { 72 av_push(tracks, newSVnv(data.track_offsets[i])); 73 } 74 75 sprintf(id, "%08x", (unsigned int)data.discid); 76 hv_store(hash, "ID", 2, newSVpv(id, 0), 0); 77 hv_store(hash, "NUM_TRKS", 8, newSVnv(data.num_of_trks), 0); 78 hv_store(hash, "TRACKS", 6, newRV_inc((SV*)tracks), 0); 79 hv_store(hash, "SECONDS", 7, newSVnv(data.seconds), 0); 80 81 XPUSHs(newRV((SV*)hash)); 82 83