toD: More D-fy code, remove pointer, use foreach

Signed-off-by: Ernesto Castellotti <erny.castell@gmail.com>
This commit is contained in:
Ernesto Castellotti 2019-08-27 15:49:43 +02:00
parent 192384a3c3
commit 667df34a4a
5 changed files with 70 additions and 66 deletions

View File

@ -3,6 +3,9 @@ import core.stdc.stdlib;
import usbextreme; import usbextreme;
extern(C) int main(int argc, char[]* argv) { extern(C) int main(int argc, char[]* argv) {
usb_extreme_headers headers;
usb_extreme_filestat[10] filestatsBuf = void;
if (argc < 2) { if (argc < 2) {
printf("Usage: open-usbextreme-example <path/to/ul.cfg>\n"); printf("Usage: open-usbextreme-example <path/to/ul.cfg>\n");
return 1; return 1;
@ -29,18 +32,14 @@ extern(C) int main(int argc, char[]* argv) {
fread(data, size, 1, f); fread(data, size, 1, f);
fclose(f); fclose(f);
usb_extreme_headers headers;
if (oueReadHeaders(headers, data[0..size]) <= 0) { if (oueReadHeaders(headers, data[0..size]) <= 0) {
return 1; return 1;
} }
auto filestats = oueRead(filestatsBuf, headers);
usb_extreme_filestat[10] filestats = void; foreach (filestat; filestats) {
int nstats = oueRead(filestats, headers); printf("Game name [%d]: %s\n", filestat.offset, filestat.name.ptr);
int i;
for(i = 0; i < nstats; i++) {
printf("Game name [%d]: %s\n", filestats[i].offset, filestats[i].name.ptr);
} }
return 0; return 0;

View File

@ -64,6 +64,7 @@ enum UsbExtremeVersion
{ {
V0 = 0, V0 = 0,
V1, V1,
Unknown,
} }
enum SCECdvdMediaType enum SCECdvdMediaType
{ {
@ -83,16 +84,16 @@ enum SCECdvdMediaType
SCECdDVDV, SCECdDVDV,
SCECdIllegalMediaoffset, SCECdIllegalMediaoffset,
} }
extern (D) int isOue(const(void)[] headers); extern (D) bool 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); extern (D) int oueNumHeaders(const(void)[] headers);
extern (D) int ouePointHeaders(ref const(usb_extreme_base)[] headers, const(void)[] raw_headers); extern (D) int ouePointHeaders(ref const(usb_extreme_base)[] headers, const(void)[] raw_headers);
extern (D) int oueHeadersVersion(ref UsbExtremeVersion oueVersion, const(void)[] headers); extern (D) UsbExtremeVersion oueHeadersVersion(const(void)[] headers);
extern (D) int oueReadHeaders(ref usb_extreme_headers headers, const(void)[] raw_headers); 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) usb_extreme_filestat[] oueRead(usb_extreme_filestat[] filestats, const(usb_extreme_headers) headers);
private R[] castArray(R, T)(T[] array) private R[] castArray(R, T)(T[] array)
{ {
auto ptr = array.ptr; auto ptr = array.ptr;
auto castPtr = cast(R*)ptr; auto castPtr = cast(R*)ptr;
return castPtr[0..array.length / R.sizeof]; return castPtr[0..array.length * T.sizeof / R.sizeof];
} }

View File

@ -38,7 +38,8 @@ typedef enum {
typedef enum { typedef enum {
USB_EXTREME_V0 = 0x00, USB_EXTREME_V0 = 0x00,
USB_EXTREME_V1 USB_EXTREME_V1,
USB_EXTREME_UNKNOWN
} usb_extreme_versions; } usb_extreme_versions;
typedef struct __attribute__((__packed__)) { typedef struct __attribute__((__packed__)) {

View File

@ -11,7 +11,9 @@ 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[0..headerslen]); auto result = oueNumHeaders(headers[0..headerslen]);
*num_headers = result;
return result;
} }
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) {
@ -21,7 +23,14 @@ extern(C) int oue_point_headers(const(usb_extreme_base)** headers, const(void)*
} }
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[0..headerslen]); auto result = oueHeadersVersion(headers[0..headerslen]);
if (result == UsbExtremeVersion.Unknown) {
return -1;
}
*oueVersion = result;
return 1;
} }
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) {
@ -29,5 +38,6 @@ extern(C) int oue_read_headers(usb_extreme_headers* headers, const(void)* raw_he
} }
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) {
return oueRead(filestat[0..filestats_nlen], headers); auto result = oueRead(filestat[0..filestats_nlen], headers);
return cast(int) result.length;
} }

View File

@ -57,7 +57,8 @@ struct usb_extreme_filestat {
enum UsbExtremeVersion { enum UsbExtremeVersion {
V0 = 0x00, V0 = 0x00,
V1 V1,
Unknown
} }
enum SCECdvdMediaType { enum SCECdvdMediaType {
@ -80,16 +81,16 @@ enum SCECdvdMediaType {
SCECdIllegalMediaoffset SCECdIllegalMediaoffset
} }
extern(D) int isOue(const(void)[] headers) { extern(D) bool isOue(const(void)[] headers) {
auto headers_oeu = castArray!(const usb_extreme_base)(headers); auto headers_oeu = castArray!(const usb_extreme_base)(headers);
foreach (header; headers_oeu) { foreach (header; headers_oeu) {
if (header.magic != USBEXTREME_MAGIC) { if (header.magic != USBEXTREME_MAGIC) {
return 0; return false;
} }
} }
return 1; return true;
} }
extern(D) UsbExtremeVersion getVersion(uint8_t usbExtremeVersion) { extern(D) UsbExtremeVersion getVersion(uint8_t usbExtremeVersion) {
@ -108,21 +109,20 @@ extern(D) UsbExtremeVersion getVersion(uint8_t usbExtremeVersion) {
} }
} }
extern(D) int oueNumHeaders(ref int num_headers, const(void)[] headers) { extern(D) int oueNumHeaders(const(void)[] headers) {
auto headers_nlen = cast(int) (castArray!(usb_extreme_base)(headers).length); auto headers_nlen = cast(int) (castArray!(usb_extreme_base)(headers).length);
if (!isOue(headers)) { if (!isOue(headers)) {
return -1; return -1;
} }
num_headers = headers_nlen;
return headers_nlen; return headers_nlen;
} }
extern(D) int ouePointHeaders(ref const(usb_extreme_base)[] headers, const(void)[] raw_headers) { extern(D) int ouePointHeaders(ref const(usb_extreme_base)[] headers, const(void)[] raw_headers) {
int headers_nlen; auto headers_nlen = oueNumHeaders(raw_headers);
if (oueNumHeaders(headers_nlen, raw_headers) <= 0) { if (headers_nlen <= 0) {
return -1; return -1;
} }
@ -130,12 +130,12 @@ extern(D) int ouePointHeaders(ref const(usb_extreme_base)[] headers, const(void)
return headers_nlen; return headers_nlen;
} }
extern(D) int oueHeadersVersion(ref UsbExtremeVersion oueVersion, const(void)[] headers) { extern(D) UsbExtremeVersion oueHeadersVersion(const(void)[] headers) {
auto headers_oeu = castArray!(usb_extreme_v1)(headers); auto headers_oeu = castArray!(usb_extreme_v1)(headers);
auto first_version = UsbExtremeVersion.V0; auto first_version = UsbExtremeVersion.V0;
if (!isOue(headers)) { if (!isOue(headers)) {
return -1; return UsbExtremeVersion.Unknown;
} }
foreach (i, header; headers_oeu) { foreach (i, header; headers_oeu) {
@ -143,25 +143,23 @@ extern(D) int oueHeadersVersion(ref UsbExtremeVersion oueVersion, const(void)[]
first_version = getVersion(header.usb_extreme_version); first_version = getVersion(header.usb_extreme_version);
} else { } else {
if (first_version != getVersion(header.usb_extreme_version)) { if (first_version != getVersion(header.usb_extreme_version)) {
oueVersion = UsbExtremeVersion.V0; return UsbExtremeVersion.V0;
return -2;
} }
} }
} }
oueVersion = first_version; return first_version;
return 1;
} }
extern(D) int oueReadHeaders(ref usb_extreme_headers headers, const(void)[] raw_headers) { extern(D) int oueReadHeaders(ref usb_extreme_headers headers, const(void)[] raw_headers) {
UsbExtremeVersion oueVersion; auto oueVersion = oueHeadersVersion(raw_headers);
auto num_headers = cast(int) (raw_headers.length / USBEXTREME_HEADER_SIZE); auto num_headers = oueNumHeaders(raw_headers);
if (!isOue(raw_headers)) { if (!isOue(raw_headers)) {
return -1; return -1;
} }
if (oueHeadersVersion(oueVersion, raw_headers) <= 0) { if (oueVersion == UsbExtremeVersion.Unknown) {
return -1; return -1;
} }
@ -174,43 +172,38 @@ extern(D) int oueReadHeaders(ref usb_extreme_headers headers, const(void)[] raw_
return 1; return 1;
} }
extern(D) int oueRead(usb_extreme_filestat[] filestat, const(usb_extreme_headers) headers) { extern(D) usb_extreme_filestat[] oueRead(usb_extreme_filestat[] filestats, const(usb_extreme_headers) headers) {
import core.stdc.string : strncpy, strncat; auto headers_full = castArray!(usb_extreme_v1)(headers.headers[0..headers.num_headers]);
auto headersLength = headers_full.length;
int fileStatsLength = 0;
int offset = cast(int) filestat.length; foreach (i, ref filestat; filestats) {
auto headers_full = cast(usb_extreme_v1*) headers.headers; if (headersLength == 0) {
usb_extreme_v1 header; return filestats[0..i];
usb_extreme_filestat filestats_temp = {0, ['0'], SCECdvdMediaType.SCECdNODISC, 0, 0, UsbExtremeVersion.V0};
uint16_t size = 0;
uint8_t video_mode = 0;
uint8_t usb_extreme_version;
int i;
for(i = 0; i < headers.num_headers; i++) {
if(offset == 0) {
return i;
} }
header = headers_full[i]; auto header = headers_full[i];
strncpy(filestats_temp.name.ptr, header.name.ptr, USBEXTREME_NAME_LENGTH); filestat.name[0..USBEXTREME_NAME_LENGTH] = header.name[0..$];
usb_extreme_version = header.usb_extreme_version; auto headerVersion = getVersion(header.usb_extreme_version);
uint16_t size = 0;
if(usb_extreme_version >= 1) { uint8_t videoMode = 0;
if (headerVersion >= 1) {
size = header.size; size = header.size;
video_mode = header.video_mode; videoMode = header.video_mode;
strncat(filestats_temp.name.ptr, header.name_ext.ptr, USBEXTREME_NAME_EXT_LENGTH); filestat.name[USBEXTREME_NAME_LENGTH..USBEXTREME_NAME_LENGTH + USBEXTREME_NAME_EXT_LENGTH] = header.name_ext[0..$];
} }
filestats_temp.size = size; filestat.size = size;
filestats_temp.type = cast(SCECdvdMediaType) header.type; filestat.type = cast(SCECdvdMediaType) header.type;
filestats_temp.offset = i; filestat.offset = cast(int) i;
filestats_temp.video_mode = video_mode; filestat.video_mode = videoMode;
filestats_temp.usb_extreme_version = cast(UsbExtremeVersion) usb_extreme_version; filestat.usb_extreme_version = headerVersion;
filestat[i] = filestats_temp; headersLength -= 1;
offset -= 1; fileStatsLength += 1;
} }
return i; return filestats[0..fileStatsLength];
} }
private R[] castArray(R, T) (T[] array) { // Workaround for https://issues.dlang.org/show_bug.cgi?id=20088 private R[] castArray(R, T) (T[] array) { // Workaround for https://issues.dlang.org/show_bug.cgi?id=20088