-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathReader.xs
157 lines (116 loc) · 2.55 KB
/
Reader.xs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
MODULE = Archive::Raw PACKAGE = Archive::Raw::Reader
Reader
new (class)
SV *class
PREINIT:
archive_raw_reader *self;
CODE:
Newxz (self, 1, archive_raw_reader);
self->ar = archive_read_new();
if (self->ar == NULL)
croak ("archive_read_new() failed");
archive_read_support_format_all (self->ar);
archive_read_support_filter_all (self->ar);
RETVAL = self;
OUTPUT: RETVAL
void
open_filename (self, filename)
Reader self
const char *filename
PREINIT:
int rc;
CODE:
if (self->reading)
croak ("already open");
rc = archive_read_open_filename (self->ar, filename, 16384);
archive_check_error (rc, self->ar, archive_read_open_filename);
self->reading = 1;
Entry
next (self)
Reader self
PREINIT:
int rc;
archive_raw_entry *entry;
struct archive_entry *e;
CODE:
if (!self->reading)
croak ("not open");
rc = archive_read_next_header (self->ar, &e);
if (rc == ARCHIVE_EOF)
XSRETURN_UNDEF;
archive_check_error (rc, self->ar, archive_read_next_header);
Newxz (entry, 1, archive_raw_entry);
entry->e = archive_entry_clone (e);
entry->reader = self; // TODO: This should be reference counted
RETVAL = entry;
OUTPUT: RETVAL
int
has_encrypted_entries (self)
Reader self
CODE:
#if ARCHIVE_VERSION_NUMBER >= 3002000
RETVAL = archive_read_has_encrypted_entries (self->ar);
#else
croak ("this feature requires libarchive 3.2+");
#endif
OUTPUT: RETVAL
int
format_capabilities (self)
Reader self
CODE:
#if ARCHIVE_VERSION_NUMBER >= 3002000
RETVAL = archive_read_format_capabilities (self->ar);
#else
croak ("this feature requires libarchive 3.2+");
#endif
OUTPUT: RETVAL
void
add_passphrase (self, phrase)
Reader self
const char *phrase
PREINIT:
int rc;
CODE:
#if ARCHIVE_VERSION_NUMBER >= 3002000
rc = archive_read_add_passphrase (self->ar, phrase);
archive_check_error (rc, self->ar, archive_read_add_passphrase);
#else
croak ("this feature requires libarchive 3.2+");
#endif
int
file_count (self)
Reader self
CODE:
RETVAL = archive_file_count (self->ar);
OUTPUT: RETVAL
int
format (self)
Reader self
CODE:
RETVAL = archive_format (self->ar);
OUTPUT: RETVAL
const char *
format_name (self)
Reader self
CODE:
RETVAL = archive_format_name (self->ar);
OUTPUT: RETVAL
void
close (self)
Reader self
PPCODE:
if (self->reading)
{
archive_read_close (self->ar);
self->reading = 0;
XSRETURN_YES;
}
XSRETURN_NO;
void
DESTROY (self)
Reader self
CODE:
if (self->reading)
archive_read_close (self->ar);
archive_read_free (self->ar);
Safefree (self);