toD: Convert ptr to D's Array and improve code clearness

This commit is contained in:
Ernesto Castellotti 2019-08-27 00:13:41 +02:00
parent 62f3e85393
commit 28d6ee7d8f
4 changed files with 53 additions and 48 deletions

View File

@ -31,7 +31,7 @@ extern(C) int main(int argc, char[]* argv) {
usb_extreme_headers headers; usb_extreme_headers headers;
if (oueReadHeaders(headers, data, size) <= 0) { if (oueReadHeaders(headers, data[0..size]) <= 0) {
return 1; return 1;
} }

View File

@ -83,10 +83,16 @@ enum SCECdvdMediaType
SCECdDVDV, SCECdDVDV,
SCECdIllegalMediaoffset, SCECdIllegalMediaoffset,
} }
extern (C) int isOue(const(void)* headers, size_t headerslen); extern (D) int isOue(const(void)[] headers);
extern (D) UsbExtremeVersion getVersion(uint8_t usbExtremeVersion); extern (D) UsbExtremeVersion getVersion(uint8_t usbExtremeVersion);
extern (D) int oueNumHeaders(ref int num_headers, const(void)* headers, size_t headerslen); extern (D) int oueNumHeaders(ref int num_headers, const(void)[] headers);
extern (D) int ouePointHeaders(ref const(usb_extreme_base)* headers, const(void)* raw_headers, size_t headerslen); extern (D) int ouePointHeaders(ref const(usb_extreme_base)* headers, const(void)[] raw_headers);
extern (D) int oueHeadersVersion(ref UsbExtremeVersion oueVersion, const(void)* headers, size_t headerslen); extern (D) int oueHeadersVersion(ref UsbExtremeVersion oueVersion, const(void)[] headers);
extern (D) int oueReadHeaders(ref usb_extreme_headers headers, const(void)* raw_headers, size_t headerslen); extern (D) int oueReadHeaders(ref usb_extreme_headers headers, const(void)[] raw_headers);
extern (D) int oueRead(usb_extreme_filestat[] filestat, const(usb_extreme_headers) headers); extern (D) int oueRead(usb_extreme_filestat[] filestat, const(usb_extreme_headers) headers);
private R[] castArray(R, T)(T[] array)
{
auto ptr = array.ptr;
auto castPtr = cast(R*)ptr;
return castPtr[0..array.length / R.sizeof];
}

View File

@ -3,7 +3,7 @@ import std.stdint;
import usbextreme; import usbextreme;
extern(C) int is_oue(const(void)* headers, size_t headerslen) { extern(C) int is_oue(const(void)* headers, size_t headerslen) {
return isOue(headers, headerslen); return isOue(headers[0..headerslen]);
} }
extern(C) UsbExtremeVersion get_version(uint8_t usbExtremeVersion) { extern(C) UsbExtremeVersion get_version(uint8_t usbExtremeVersion) {
@ -11,19 +11,19 @@ extern(C) UsbExtremeVersion get_version(uint8_t usbExtremeVersion) {
} }
extern(C) int oue_num_headers(int *num_headers, const(void) *headers, size_t headerslen) { extern(C) int oue_num_headers(int *num_headers, const(void) *headers, size_t headerslen) {
return oueNumHeaders(*num_headers, headers, headerslen); return oueNumHeaders(*num_headers, headers[0..headerslen]);
} }
extern(C) int oue_point_headers(const(usb_extreme_base)** headers, const(void)* raw_headers, size_t headerslen) { extern(C) int oue_point_headers(const(usb_extreme_base)** headers, const(void)* raw_headers, size_t headerslen) {
return ouePointHeaders(*headers, raw_headers, headerslen); return ouePointHeaders(*headers, raw_headers[0..headerslen]);
} }
extern(C) int oue_version(UsbExtremeVersion* oueVersion, const(void) *headers, size_t headerslen) { extern(C) int oue_version(UsbExtremeVersion* oueVersion, const(void) *headers, size_t headerslen) {
return oueHeadersVersion(*oueVersion, headers, headerslen); return oueHeadersVersion(*oueVersion, headers[0..headerslen]);
} }
extern(C) int oue_read_headers(usb_extreme_headers* headers, const(void)* raw_headers, size_t headerslen) { extern(C) int oue_read_headers(usb_extreme_headers* headers, const(void)* raw_headers, size_t headerslen) {
return oueReadHeaders(*headers, raw_headers, headerslen); return oueReadHeaders(*headers, raw_headers[0..headerslen]);
} }
extern(C) int oue_read(usb_extreme_filestat* filestat, const(usb_extreme_headers) headers, int filestats_nlen) { extern(C) int oue_read(usb_extreme_filestat* filestat, const(usb_extreme_headers) headers, int filestats_nlen) {

View File

@ -80,13 +80,10 @@ enum SCECdvdMediaType {
SCECdIllegalMediaoffset SCECdIllegalMediaoffset
} }
extern(C) int isOue(const(void)* headers, size_t headerslen) { extern(D) int isOue(const(void)[] headers) {
const headers_oeu = cast(const usb_extreme_base*) headers; auto headers_oeu = castArray!(const usb_extreme_base)(headers);
auto headers_nlen = headerslen / USBEXTREME_HEADER_SIZE;
for (auto i = 0; i < headers_nlen; i++) { foreach (header; headers_oeu) {
auto header = headers_oeu[i];
if (header.magic != USBEXTREME_MAGIC) { if (header.magic != USBEXTREME_MAGIC) {
return 0; return 0;
} }
@ -111,10 +108,10 @@ extern(D) UsbExtremeVersion getVersion(uint8_t usbExtremeVersion) {
} }
} }
extern(D) int oueNumHeaders(ref int num_headers, const(void) *headers, size_t headerslen) { extern(D) int oueNumHeaders(ref int num_headers, const(void)[] headers) {
auto headers_nlen = cast(int) (headerslen / USBEXTREME_HEADER_SIZE); auto headers_nlen = cast(int) (castArray!(usb_extreme_base)(headers).length);
if (!isOue(headers, headerslen)) { if (!isOue(headers)) {
return -1; return -1;
} }
@ -122,30 +119,28 @@ extern(D) int oueNumHeaders(ref int num_headers, const(void) *headers, size_t he
return headers_nlen; return headers_nlen;
} }
extern(D) int ouePointHeaders(ref const(usb_extreme_base)* headers, const(void)* raw_headers, size_t headerslen) { extern(D) int ouePointHeaders(ref const(usb_extreme_base)* headers, const(void)[] raw_headers) {
import core.stdc.stdio;
int headers_nlen; int headers_nlen;
if (oueNumHeaders(headers_nlen, raw_headers, headerslen) <= 0) { if (oueNumHeaders(headers_nlen, raw_headers) <= 0) {
return -1; return -1;
} }
headers = cast(const(usb_extreme_base)*) raw_headers; auto headersArr = castArray!(const(usb_extreme_base))(raw_headers)[];
headers = headersArr.ptr;
return headers_nlen; return headers_nlen;
} }
extern(D) int oueHeadersVersion(ref UsbExtremeVersion oueVersion, const(void) *headers, size_t headerslen) { extern(D) int oueHeadersVersion(ref UsbExtremeVersion oueVersion, const(void)[] headers) {
auto headers_oeu = cast(usb_extreme_v1*) headers; auto headers_oeu = castArray!(usb_extreme_v1)(headers);
auto headers_nlen = headerslen / USBEXTREME_HEADER_SIZE;
auto first_version = UsbExtremeVersion.V0; auto first_version = UsbExtremeVersion.V0;
int i;
if(!isOue(headers, headerslen)) { if (!isOue(headers)) {
return -1; return -1;
} }
for(i = 0; i < headers_nlen; i++) { foreach (i, header; headers_oeu) {
auto header = headers_oeu[i];
if (i == 0) { if (i == 0) {
first_version = getVersion(header.usb_extreme_version); first_version = getVersion(header.usb_extreme_version);
} else { } else {
@ -160,26 +155,24 @@ extern(D) int oueHeadersVersion(ref UsbExtremeVersion oueVersion, const(void) *h
return 1; return 1;
} }
extern(D) int oueReadHeaders(ref usb_extreme_headers headers, const(void)* raw_headers, size_t headerslen) { extern(D) int oueReadHeaders(ref usb_extreme_headers headers, const(void)[] raw_headers) {
const(usb_extreme_base)* headers_ptr;
UsbExtremeVersion oueVersion; UsbExtremeVersion oueVersion;
auto num_headers = cast(int) (headerslen / USBEXTREME_HEADER_SIZE); auto num_headers = cast(int) (raw_headers.length / USBEXTREME_HEADER_SIZE);
usb_extreme_headers headers_temp = {null, null, 0, 0, UsbExtremeVersion.V0};
if (!isOue(raw_headers)) {
if (ouePointHeaders(headers_ptr, raw_headers, headerslen) <= 0) {
return -1;
}
if (oueHeadersVersion(oueVersion, raw_headers, headerslen) <= 0) {
return -1; return -1;
} }
headers_temp.first_header = raw_headers; if (oueHeadersVersion(oueVersion, raw_headers) <= 0) {
headers_temp.headers = headers_ptr; return -1;
headers_temp.num_headers = num_headers; }
headers_temp.headerslen = headerslen;
headers_temp.oueVersion = oueVersion; auto headersArr = castArray!(usb_extreme_base)(raw_headers);
headers = headers_temp; headers = usb_extreme_headers(raw_headers.ptr,
headersArr.ptr,
num_headers,
raw_headers.length,
oueVersion);
return 1; return 1;
} }
@ -221,3 +214,9 @@ extern(D) int oueRead(usb_extreme_filestat[] filestat, const(usb_extreme_headers
return i; return i;
} }
private R[] castArray(R, T) (T[] array) { // Workaround for https://issues.dlang.org/show_bug.cgi?id=20088
auto ptr = array.ptr;
auto castPtr = cast(R*) ptr;
return castPtr[0..(array.length / R.sizeof)];
}