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