Add base project data

master
Marko Semet 2020-05-27 11:30:58 +02:00
parent 451f13ce32
commit 60154c0217
5 changed files with 222 additions and 0 deletions

23
.editorconfig 100644
View File

@ -0,0 +1,23 @@
[*.d]
charset = UTF-8
dfmt_align_switch_statements = true
dfmt_brace_style = allman
dfmt_compact_labeled_statements = true
dfmt_keep_line_breaks = false
dfmt_outdent_attributes = true
dfmt_outdent_labels = true
dfmt_selective_import_space = true
dfmt_single_template_constraint_indent = false
dfmt_soft_max_line_length = 120
dfmt_space_after_cast = true
dfmt_space_after_keywords = false
dfmt_space_before_aa_colon = false
dfmt_space_before_function_parameters = false
dfmt_split_operator_at_line_end = false
dfmt_template_constraint_style = conditional_newline_indent
end_of_line = lf
indent_size = 4
indent_style = tab
insert_final_newline = true
max_line_length = 120
tab_width = 4

2
.gitignore vendored
View File

@ -24,3 +24,5 @@ docs/
# Code coverage
*.lst
/dub.selections.json
/structs-test-library

10
dub.json 100644
View File

@ -0,0 +1,10 @@
{
"authors": [
"Marko Semet <marko@marko10-000.de>"
],
"copyright": "Copyright © 2020, Marko Semet <marko@marko10-000.de>",
"description": "Binary formating like the python struct module.",
"license": "LGPL-3.0",
"name": "structs",
"targetType": "sourceLibrary"
}

View File

@ -0,0 +1,131 @@
module structs.endian;
private
{
import std.bitmanip;
import std.system;
}
public
{
/++
+ Dumps the value with little endian.
+ Params:
+ value = Input value to dump
+ destination = Target output buffer
+/
@nogc pure nothrow void dumpBigEndian(TYPE)(immutable TYPE value, ref ubyte[TYPE.sizeof] destination)
{
(cast(ubyte[]) destination).write!(TYPE, Endian.bigEndian)(value, 0);
}
/++
+ Dumps the value in big endian.
+ Params:
+ value = Input value to dump
+ destination = Target output buffer
+/
@nogc pure nothrow void dumpLittleEndian(TYPE)(immutable TYPE value, ref ubyte[TYPE.sizeof] destination)
{
(cast(ubyte[]) destination).write!(TYPE, Endian.littleEndian)(value, 0);
}
/++
+ Dumps the value in the system's endian.
+ Params:
+ value = Input value to dump
+ destination = Target output buffer
+/
@nogc pure nothrow void dumpNative(TYPE)(immutable TYPE value, ubyte[TYPE.sizeof] destination)
{
static if (endian == Endian.bigEndian)
{
dumpBigEndian(value, destination);
}
else static if (endian == Endian.littleEndian)
{
dumpLittleEndian(value, destination);
}
else
{
static assert(false);
}
}
}
private unittest
{
// Test dump big endian
{
// 1 Byte
ubyte[1] target = [0];
dumpBigEndian!byte(1, target);
assert(target == [1]);
dumpBigEndian!ubyte(2, target);
assert(target == [2]);
dumpBigEndian!char(3, target);
assert(target == [3]);
}
{
ubyte[2] target = [0, 0];
dumpBigEndian!short(0x0102, target);
assert(target == [1, 2]);
dumpBigEndian!ushort(0x0304, target);
assert(target == [3, 4]);
}
{
ubyte[4] target = [0, 0, 0, 0];
dumpBigEndian!int(0x01020304, target);
assert(target == [1, 2, 3, 4]);
dumpBigEndian!uint(0x05060708, target);
assert(target == [5, 6, 7, 8]);
}
{
ubyte[8] target = [0, 0, 0, 0, 0, 0, 0, 0];
dumpBigEndian!long(0x0102030405060708, target);
assert(target == [1, 2, 3, 4, 5, 6, 7, 8]);
dumpBigEndian!ulong(0x090a0b0c0d0e0f10, target);
assert(target == [9, 10, 11, 12, 13, 14, 15, 16]);
}
// Test dump little endian
{
// 1 Byte
ubyte[1] target = [0];
dumpLittleEndian!byte(1, target);
assert(target == [1]);
dumpLittleEndian!ubyte(2, target);
assert(target == [2]);
dumpLittleEndian!char(3, target);
assert(target == [3]);
}
{
ubyte[2] target = [0, 0];
dumpLittleEndian!short(0x0102, target);
assert(target == [2, 1]);
dumpLittleEndian!ushort(0x0304, target);
assert(target == [4, 3]);
}
{
ubyte[4] target = [0, 0, 0, 0];
dumpLittleEndian!int(0x01020304, target);
assert(target == [4, 3, 2, 1]);
dumpLittleEndian!uint(0x05060708, target);
assert(target == [8, 7, 6, 5]);
}
{
ubyte[8] target = [0, 0, 0, 0, 0, 0, 0, 0];
dumpLittleEndian!long(0x0102030405060708, target);
assert(target == [8, 7, 6, 5, 4, 3, 2, 1]);
dumpLittleEndian!ulong(0x090a0b0c0d0e0f10, target);
assert(target == [16, 15, 14, 13, 12, 11, 10, 9]);
}
}

View File

@ -0,0 +1,56 @@
module structs;
private
{
import std.array;
import std.bitmanip;
import std.system;
/++
+ Supported format types
+/
enum FormatType
{
INT_8, /// Signed integer 8 bit
INT_16, /// Signed integer 16 bit
INT_32, /// Signed integer 32 bit
INT_64, /// Signed integer 64 bit
UINT_8, /// Unsigned integer 8 bit
UINT_16, /// Unsigned integer 16 bit
UINT_32, /// Unsigned integer 32 bit
UINT_64 /// Unsigned integer 64 bit
}
/++
+ A element of a package
+/
struct Element
{
Endian endian; /// The endian to use
bool isArray; /// If it's an array
size_t arraySize; /// Array size
FormatType formatType; /// The formated type
}
/++
+ Removes the whitespaces of the string.
+ Params:
+ source = The source string to format
+ Returns: String without whitespaces
+/
pure string remove_whitespaces(string source)
{
return source.replace(" ", "");
}
// Test remove whitespaces.
unittest
{
assert(remove_whitespaces(" a b c ") == "abc");
}
}
public
{
}