Remove the sys package
This commit is contained in:
		@@ -1,14 +0,0 @@
 | 
				
			|||||||
rule gas
 | 
					 | 
				
			||||||
  command = gcc -c $in -o $out
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rule archive
 | 
					 | 
				
			||||||
  command = ar rcs $out $in
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
build abs.o: gas x64/linux/math/abs.S
 | 
					 | 
				
			||||||
build log.o: gas x64/linux/math/log.S
 | 
					 | 
				
			||||||
build equal.o: gas x64/linux/memory/equal.S
 | 
					 | 
				
			||||||
build fill.o: gas x64/linux/memory/fill.S
 | 
					 | 
				
			||||||
build copy.o: gas x64/linux/memory/copy.S
 | 
					 | 
				
			||||||
build syscall.o: gas x64/linux/syscall.S
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
build tanya.a: archive syscall.o copy.o fill.o equal.o log.o abs.o
 | 
					 | 
				
			||||||
@@ -1,8 +0,0 @@
 | 
				
			|||||||
	.text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	.globl thrd_current
 | 
					 | 
				
			||||||
	.type thrd_current, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
thrd_current:
 | 
					 | 
				
			||||||
	mov %fs:0, %rax
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
@@ -1,35 +0,0 @@
 | 
				
			|||||||
	.text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// fabsf.
 | 
					 | 
				
			||||||
	.globl _D5tanya4math8nbtheory4fabsFNaNbNiNffZf
 | 
					 | 
				
			||||||
	.type _D5tanya4math8nbtheory4fabsFNaNbNiNffZf, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_D5tanya4math8nbtheory4fabsFNaNbNiNffZf:
 | 
					 | 
				
			||||||
	mov $0x7fffffff, %eax
 | 
					 | 
				
			||||||
	movq %rax, %xmm1
 | 
					 | 
				
			||||||
	andpd %xmm1, %xmm0
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// fabs.
 | 
					 | 
				
			||||||
	.globl _D5tanya4math8nbtheory4fabsFNaNbNiNfdZd
 | 
					 | 
				
			||||||
	.type _D5tanya4math8nbtheory4fabsFNaNbNiNfdZd, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_D5tanya4math8nbtheory4fabsFNaNbNiNfdZd:
 | 
					 | 
				
			||||||
	mov $0x7fffffffffffffff, %rax
 | 
					 | 
				
			||||||
	movq %rax, %xmm1
 | 
					 | 
				
			||||||
	andpd %xmm1, %xmm0
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// fabsl.
 | 
					 | 
				
			||||||
	.globl _D5tanya4math8nbtheory4fabsFNaNbNiNfeZe
 | 
					 | 
				
			||||||
	.type _D5tanya4math8nbtheory4fabsFNaNbNiNfeZe, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Load the parameter from the stack onto FP stack, execute 'fabs' instruction
 | 
					 | 
				
			||||||
// The result is returned in ST0.
 | 
					 | 
				
			||||||
_D5tanya4math8nbtheory4fabsFNaNbNiNfeZe:
 | 
					 | 
				
			||||||
	fldt 0x8(%rsp)
 | 
					 | 
				
			||||||
	fabs
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
@@ -1,48 +0,0 @@
 | 
				
			|||||||
	.text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// logf.
 | 
					 | 
				
			||||||
	.globl _D5tanya4math8nbtheory4logfFNaNbNiNffZf
 | 
					 | 
				
			||||||
	.type _D5tanya4math8nbtheory4logfFNaNbNiNffZf, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_D5tanya4math8nbtheory4logfFNaNbNiNffZf:
 | 
					 | 
				
			||||||
	movss %xmm0, -4(%rsp) // Put the argument onto the stack
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fldln2 // Put lb(e) onto the FPU stack
 | 
					 | 
				
			||||||
	flds -4(%rsp) // Put a float onto the FPU stack
 | 
					 | 
				
			||||||
	fyl2x // %st1 * lb(%st0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	 // The result is on the FPU stack, but returned in %xmm0
 | 
					 | 
				
			||||||
	fstps -4(%rsp)
 | 
					 | 
				
			||||||
	movss -4(%rsp), %xmm0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// log.
 | 
					 | 
				
			||||||
	.globl _D5tanya4math8nbtheory3logFNaNbNiNfdZd
 | 
					 | 
				
			||||||
	.type _D5tanya4math8nbtheory3logFNaNbNiNfdZd, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_D5tanya4math8nbtheory3logFNaNbNiNfdZd:
 | 
					 | 
				
			||||||
	movsd %xmm0, -8(%rsp) // Put the argument onto the stack
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fldln2 // Put lb(e) onto the FPU stack
 | 
					 | 
				
			||||||
	fldl -8(%rsp) // Put a double onto the FPU stack
 | 
					 | 
				
			||||||
	fyl2x // %st1 * lb(%st0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	 // The result is on the FPU stack, but returned in %xmm0
 | 
					 | 
				
			||||||
	fstpl -8(%rsp)
 | 
					 | 
				
			||||||
	movsd -8(%rsp), %xmm0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// logl.
 | 
					 | 
				
			||||||
	.globl _D5tanya4math8nbtheory4loglFNaNbNiNfeZe
 | 
					 | 
				
			||||||
	.type _D5tanya4math8nbtheory4loglFNaNbNiNfeZe, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_D5tanya4math8nbtheory4loglFNaNbNiNfeZe:
 | 
					 | 
				
			||||||
	fldln2 // Put lb(e) onto the FPU stack
 | 
					 | 
				
			||||||
	fldt 8(%rsp) // Put the argument onto the FPU stack
 | 
					 | 
				
			||||||
	fyl2x // %st1 * lb(%st0)
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
@@ -1,67 +0,0 @@
 | 
				
			|||||||
	.text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * copyMemory.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * rdi - source length
 | 
					 | 
				
			||||||
 * rsi - source data.
 | 
					 | 
				
			||||||
 * rdx - target length.
 | 
					 | 
				
			||||||
 * rcx - target data.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
	.globl _D5tanya6memory2op10copyMemoryFNaNbNixAvAvZv
 | 
					 | 
				
			||||||
	.type _D5tanya6memory2op10copyMemoryFNaNbNixAvAvZv, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_D5tanya6memory2op10copyMemoryFNaNbNixAvAvZv:
 | 
					 | 
				
			||||||
		mov %rdi, %rdx
 | 
					 | 
				
			||||||
		mov %rcx, %rdi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		cmp  $0x08, %rdx
 | 
					 | 
				
			||||||
		jc aligned_1
 | 
					 | 
				
			||||||
		test $0x07, %edi
 | 
					 | 
				
			||||||
		jz aligned_8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	naligned:
 | 
					 | 
				
			||||||
		movsb
 | 
					 | 
				
			||||||
		dec  %rdx
 | 
					 | 
				
			||||||
		test $0x07, %edi
 | 
					 | 
				
			||||||
		jnz naligned
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	aligned_8:
 | 
					 | 
				
			||||||
		mov %rdx,  %rcx
 | 
					 | 
				
			||||||
		shr $0x03, %rcx
 | 
					 | 
				
			||||||
		rep movsq
 | 
					 | 
				
			||||||
		and $0x07, %edx
 | 
					 | 
				
			||||||
		jz end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	aligned_1:
 | 
					 | 
				
			||||||
		// Write the remaining bytes
 | 
					 | 
				
			||||||
		mov %rdx, %rcx
 | 
					 | 
				
			||||||
		rep movsb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	end:
 | 
					 | 
				
			||||||
		ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * moveMemory.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * rdi - source length
 | 
					 | 
				
			||||||
 * rsi - source data.
 | 
					 | 
				
			||||||
 * rdx - target length.
 | 
					 | 
				
			||||||
 * rcx - target data.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
	.globl _D5tanya6memory2op10moveMemoryFNaNbNixAvAvZv
 | 
					 | 
				
			||||||
	.type _D5tanya6memory2op10moveMemoryFNaNbNixAvAvZv, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_D5tanya6memory2op10moveMemoryFNaNbNixAvAvZv:
 | 
					 | 
				
			||||||
		mov %rdi, %rdx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		lea -1(%rdx, %rsi), %rsi
 | 
					 | 
				
			||||||
		lea -1(%rdx, %rcx), %rdi
 | 
					 | 
				
			||||||
		mov %rdx, %rcx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		std // Set the direction flag
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		rep movsb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		cld // Clear the direction flag
 | 
					 | 
				
			||||||
		ret
 | 
					 | 
				
			||||||
@@ -1,59 +0,0 @@
 | 
				
			|||||||
	.text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * equalMemory.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * rdi - r1 length
 | 
					 | 
				
			||||||
 * rsi - r1 data.
 | 
					 | 
				
			||||||
 * rdx - r2 length.
 | 
					 | 
				
			||||||
 * rcx - r2 data.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
	.globl _D5tanya6memory2op11equalMemoryFNaNbNixAvxQdZb
 | 
					 | 
				
			||||||
	.type _D5tanya6memory2op11equalMemoryFNaNbNixAvxQdZb, @function
 | 
					 | 
				
			||||||
_D5tanya6memory2op11equalMemoryFNaNbNixAvxQdZb:
 | 
					 | 
				
			||||||
		// Compare the lengths
 | 
					 | 
				
			||||||
		cmp %rdx, %rdi
 | 
					 | 
				
			||||||
		jne not_equal
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		mov %rcx, %rdi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Check if we're aligned
 | 
					 | 
				
			||||||
		cmp $0x08, %rdx
 | 
					 | 
				
			||||||
		jc aligned_1
 | 
					 | 
				
			||||||
		test $0x07, %edi
 | 
					 | 
				
			||||||
		jz aligned_8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	naligned:
 | 
					 | 
				
			||||||
		cmpsb
 | 
					 | 
				
			||||||
		jne not_equal
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dec %rdx
 | 
					 | 
				
			||||||
		test $0x07, %edi
 | 
					 | 
				
			||||||
		jnz naligned
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	aligned_8:
 | 
					 | 
				
			||||||
		mov %rdx,  %rcx
 | 
					 | 
				
			||||||
		shr $0x03, %rcx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		repe cmpsq
 | 
					 | 
				
			||||||
		jne not_equal
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		and $0x07, %edx
 | 
					 | 
				
			||||||
		jz equal
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	aligned_1: // Compare the remaining bytes
 | 
					 | 
				
			||||||
		mov %rdx, %rcx
 | 
					 | 
				
			||||||
		cmp $0x0, %rcx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		repe cmpsb
 | 
					 | 
				
			||||||
		jne not_equal
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	equal:
 | 
					 | 
				
			||||||
		mov $0x01, %rax // Return 1
 | 
					 | 
				
			||||||
		jmp end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	not_equal:
 | 
					 | 
				
			||||||
		xor %rax, %rax // Return 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	end:
 | 
					 | 
				
			||||||
		ret
 | 
					 | 
				
			||||||
@@ -1,160 +0,0 @@
 | 
				
			|||||||
	.text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * fillMemory.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * rdi - length.
 | 
					 | 
				
			||||||
 * rsi - pointer.
 | 
					 | 
				
			||||||
 * rdx - value filled with a byte.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
	.globl _D5tanya6memory2op10fillMemoryFNaNbNiAvmZv
 | 
					 | 
				
			||||||
	.type _D5tanya6memory2op10fillMemoryFNaNbNiAvmZv, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_D5tanya6memory2op10fillMemoryFNaNbNiAvmZv:
 | 
					 | 
				
			||||||
		// Check for zero length
 | 
					 | 
				
			||||||
		test    %rdi, %rdi
 | 
					 | 
				
			||||||
		jz end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		mov     %rdi, %rax
 | 
					 | 
				
			||||||
		mov     %rsi, %r8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		movq    %rdx,  %xmm0
 | 
					 | 
				
			||||||
		movlhps %xmm0, %xmm0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Check if the pointer is aligned to a 16-byte boundary
 | 
					 | 
				
			||||||
		and     $-0x10, %r8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Compute the number of misaligned bytes
 | 
					 | 
				
			||||||
		mov  %rsi, %r9
 | 
					 | 
				
			||||||
		sub  %r8,  %r9
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		test %r9,  %r9
 | 
					 | 
				
			||||||
		jz aligned
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Get the number of bytes to be written until we are aligned
 | 
					 | 
				
			||||||
		mov $0x10, %rcx
 | 
					 | 
				
			||||||
		sub %r9,   %rcx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		mov %rsi,  %r8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// If the length is less than the number of misaligned bytes,
 | 
					 | 
				
			||||||
		// write one byte at a time and exit
 | 
					 | 
				
			||||||
		cmp %rax, %rcx
 | 
					 | 
				
			||||||
		jg aligned_1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	naligned:
 | 
					 | 
				
			||||||
		mov %dl, (%r8) // Write a byte
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Advance the pointer. Decrease the total number of bytes
 | 
					 | 
				
			||||||
		// and the misaligned ones
 | 
					 | 
				
			||||||
		inc %r8
 | 
					 | 
				
			||||||
		dec %rcx
 | 
					 | 
				
			||||||
		dec %rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Checks if we are aligned
 | 
					 | 
				
			||||||
		test %rcx, %rcx
 | 
					 | 
				
			||||||
		jnz naligned
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	aligned:
 | 
					 | 
				
			||||||
		// Checks if we're done writing bytes
 | 
					 | 
				
			||||||
		test %rax, %rax
 | 
					 | 
				
			||||||
		jz end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Write 1 byte at a time
 | 
					 | 
				
			||||||
		cmp $8, %rax
 | 
					 | 
				
			||||||
		jl aligned_1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Write 8 bytes at a time
 | 
					 | 
				
			||||||
		cmp $16, %rax
 | 
					 | 
				
			||||||
		jl aligned_8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Write 16 bytes at a time
 | 
					 | 
				
			||||||
		cmp $32, %rax
 | 
					 | 
				
			||||||
		jl aligned_16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Write 32 bytes at a time
 | 
					 | 
				
			||||||
		cmp $64, %rax
 | 
					 | 
				
			||||||
		jl aligned_32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	aligned_64:
 | 
					 | 
				
			||||||
		movdqa %xmm0, (%r8)
 | 
					 | 
				
			||||||
		movdqa %xmm0, 16(%r8)
 | 
					 | 
				
			||||||
		movdqa %xmm0, 32(%r8)
 | 
					 | 
				
			||||||
		movdqa %xmm0, 48(%r8)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		add $64, %r8
 | 
					 | 
				
			||||||
		sub $64, %rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		cmp $64, %rax
 | 
					 | 
				
			||||||
		jge aligned_64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Checks if we're done writing bytes
 | 
					 | 
				
			||||||
		test %rax, %rax
 | 
					 | 
				
			||||||
		jz end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Write 1 byte at a time
 | 
					 | 
				
			||||||
		cmp $8, %rax
 | 
					 | 
				
			||||||
		jl aligned_1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Write 8 bytes at a time
 | 
					 | 
				
			||||||
		cmp $16, %rax
 | 
					 | 
				
			||||||
		jl aligned_8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Write 16 bytes at a time
 | 
					 | 
				
			||||||
		cmp $32, %rax
 | 
					 | 
				
			||||||
		jl aligned_16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	aligned_32:
 | 
					 | 
				
			||||||
		movdqa %xmm0, (%r8)
 | 
					 | 
				
			||||||
		movdqa %xmm0, 16(%r8)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		add $32, %r8
 | 
					 | 
				
			||||||
		sub $32, %rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Checks if we're done writing bytes
 | 
					 | 
				
			||||||
		test %rax, %rax
 | 
					 | 
				
			||||||
		jz end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Write 1 byte at a time
 | 
					 | 
				
			||||||
		cmp $8, %rax
 | 
					 | 
				
			||||||
		jl aligned_1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Write 8 bytes at a time
 | 
					 | 
				
			||||||
		cmp $16, %rax
 | 
					 | 
				
			||||||
		jl aligned_8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	aligned_16:
 | 
					 | 
				
			||||||
		movdqa %xmm0, (%r8)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		add $16, %r8
 | 
					 | 
				
			||||||
		sub $16, %rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Checks if we're done writing bytes
 | 
					 | 
				
			||||||
		test %rax, %rax
 | 
					 | 
				
			||||||
		jz end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Write 1 byte at a time
 | 
					 | 
				
			||||||
		cmp $8, %rax
 | 
					 | 
				
			||||||
		jl aligned_1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	aligned_8:
 | 
					 | 
				
			||||||
		mov %rdx, (%r8)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		add $8, %r8
 | 
					 | 
				
			||||||
		sub $8, %rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Checks if we're done writing bytes
 | 
					 | 
				
			||||||
		test %rax, %rax
 | 
					 | 
				
			||||||
		jz end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	aligned_1:
 | 
					 | 
				
			||||||
		mov %dl, (%r8)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		inc %r8
 | 
					 | 
				
			||||||
		dec %rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		test %rax, %rax
 | 
					 | 
				
			||||||
		jnz aligned_1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	end:
 | 
					 | 
				
			||||||
		ret
 | 
					 | 
				
			||||||
@@ -1,65 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
The kernel uses the following registers:
 | 
					 | 
				
			||||||
%rdi, %rsi, %rdx, %r8, %r9, %r10
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The number of the syscall is passed in %rax.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
A syscall clobbers:
 | 
					 | 
				
			||||||
%rax, %rcx, %r11
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The returned value is placed in %rax.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
	.text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 1 parameter.
 | 
					 | 
				
			||||||
	.globl _D5tanya3sys5linux7syscallQiFNbNillZl
 | 
					 | 
				
			||||||
	.type _D5tanya3sys5linux7syscallQiFNbNillZl, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_D5tanya3sys5linux7syscallQiFNbNillZl:
 | 
					 | 
				
			||||||
	movq %rsi, %rax // Syscall number.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	syscall
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 2 parameters.
 | 
					 | 
				
			||||||
	.globl _D5tanya3sys5linux7syscallQiFNbNilllZl
 | 
					 | 
				
			||||||
	.type _D5tanya3sys5linux7syscallQiFNbNilllZl, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_D5tanya3sys5linux7syscallQiFNbNilllZl:
 | 
					 | 
				
			||||||
	movq %rdx, %rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	syscall
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 3 parameters.
 | 
					 | 
				
			||||||
	.globl _D5tanya3sys5linux7syscallQiFNbNillllZl
 | 
					 | 
				
			||||||
	.type _D5tanya3sys5linux7syscallQiFNbNillllZl, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_D5tanya3sys5linux7syscallQiFNbNillllZl:
 | 
					 | 
				
			||||||
	movq %rcx, %rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	syscall
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 6 parameters.
 | 
					 | 
				
			||||||
	.globl _D5tanya3sys5linux7syscallQiFNbNilllllllZl
 | 
					 | 
				
			||||||
	.type _D5tanya3sys5linux7syscallQiFNbNilllllllZl, @function
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_D5tanya3sys5linux7syscallQiFNbNilllllllZl:
 | 
					 | 
				
			||||||
	pushq %rbp
 | 
					 | 
				
			||||||
	movq %rsp, %rbp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	movq 16(%rbp), %rax
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mov %rcx, %r10
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	syscall
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	leave
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
							
								
								
									
										10
									
								
								dub.json
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								dub.json
									
									
									
									
									
								
							@@ -11,7 +11,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"dependencies": {
 | 
						"dependencies": {
 | 
				
			||||||
		"tanya:meta": "*",
 | 
							"tanya:meta": "*",
 | 
				
			||||||
		"tanya:sys": "*",
 | 
					 | 
				
			||||||
		"tanya:os": "*",
 | 
							"tanya:os": "*",
 | 
				
			||||||
		"tanya:encoding": "*",
 | 
							"tanya:encoding": "*",
 | 
				
			||||||
		"tanya:middle": "*",
 | 
							"tanya:middle": "*",
 | 
				
			||||||
@@ -24,7 +23,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"subPackages": [
 | 
						"subPackages": [
 | 
				
			||||||
		"./meta",
 | 
							"./meta",
 | 
				
			||||||
		"./sys",
 | 
					 | 
				
			||||||
		"./os",
 | 
							"./os",
 | 
				
			||||||
		"./encoding",
 | 
							"./encoding",
 | 
				
			||||||
		"./middle",
 | 
							"./middle",
 | 
				
			||||||
@@ -45,9 +43,7 @@
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			"name": "native",
 | 
								"name": "native",
 | 
				
			||||||
			"targetType": "library",
 | 
								"targetType": "library",
 | 
				
			||||||
			"platforms": ["linux-x86_64-gdc"],
 | 
								"platforms": ["linux-x86_64"],
 | 
				
			||||||
			"preBuildCommands": ["ninja -C arch"],
 | 
					 | 
				
			||||||
			"lflags": ["arch/tanya.a"],
 | 
					 | 
				
			||||||
			"versions": ["TanyaNative"]
 | 
								"versions": ["TanyaNative"]
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
@@ -64,9 +60,7 @@
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"name": "unittest-native",
 | 
								"name": "unittest-native",
 | 
				
			||||||
			"platforms": ["linux-x86_64-gdc"],
 | 
								"platforms": ["linux-x86_64"],
 | 
				
			||||||
			"preBuildCommands": ["ninja -C arch"],
 | 
					 | 
				
			||||||
			"lflags": ["arch/tanya.a"],
 | 
					 | 
				
			||||||
			"versions": ["TanyaNative"],
 | 
								"versions": ["TanyaNative"],
 | 
				
			||||||
			"importPaths": [
 | 
								"importPaths": [
 | 
				
			||||||
				"./source",
 | 
									"./source",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,8 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"dependencies": {
 | 
						"dependencies": {
 | 
				
			||||||
		"tanya:meta": "*",
 | 
							"tanya:meta": "*",
 | 
				
			||||||
		"tanya:os": "*",
 | 
							"tanya:os": "*"
 | 
				
			||||||
		"tanya:sys": "*"
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"dependencies-linux": {
 | 
						"dependencies-linux": {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								middle/middle-test-library
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								middle/middle-test-library
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -15,11 +15,6 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
module tanya.memory.mallocator;
 | 
					module tanya.memory.mallocator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
version (TanyaNative)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
else:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import core.stdc.stdlib;
 | 
					import core.stdc.stdlib;
 | 
				
			||||||
import tanya.memory.allocator;
 | 
					import tanya.memory.allocator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,32 +14,18 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
module tanya.memory.mmappool;
 | 
					module tanya.memory.mmappool;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
version (TanyaNative):
 | 
					import core.sys.linux.sys.mman;
 | 
				
			||||||
 | 
					 | 
				
			||||||
import mir.linux._asm.unistd;
 | 
					 | 
				
			||||||
import tanya.memory.allocator;
 | 
					import tanya.memory.allocator;
 | 
				
			||||||
import tanya.memory.op;
 | 
					import tanya.memory.op;
 | 
				
			||||||
import tanya.os.error;
 | 
					import tanya.os.error;
 | 
				
			||||||
import tanya.sys.linux.syscall;
 | 
					 | 
				
			||||||
import tanya.sys.posix.mman;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
private void* mapMemory(const size_t length) @nogc nothrow pure @system
 | 
					extern(C) pragma(mangle, "mmap")
 | 
				
			||||||
{
 | 
					private void* mapMemory(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
 | 
				
			||||||
    auto p = syscall_(0,
 | 
					@nogc nothrow pure @system;
 | 
				
			||||||
                      length,
 | 
					 | 
				
			||||||
                      PROT_READ | PROT_WRITE,
 | 
					 | 
				
			||||||
                      MAP_PRIVATE | MAP_ANONYMOUS,
 | 
					 | 
				
			||||||
                      -1,
 | 
					 | 
				
			||||||
                      0,
 | 
					 | 
				
			||||||
                      NR_mmap);
 | 
					 | 
				
			||||||
    return p == -ErrorCode.noMemory ? null : cast(void*) p;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
private bool unmapMemory(shared void* addr, const size_t length)
 | 
					extern(C) pragma(mangle, "munmap")
 | 
				
			||||||
@nogc nothrow pure @system
 | 
					private bool unmapMemory(shared void* addr, size_t length)
 | 
				
			||||||
{
 | 
					@nogc nothrow pure @system;
 | 
				
			||||||
    return syscall_(cast(ptrdiff_t) addr, length, NR_munmap) == 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * This allocator allocates memory in regions (multiple of 64 KB for example).
 | 
					 * This allocator allocates memory in regions (multiple of 64 KB for example).
 | 
				
			||||||
@@ -206,7 +192,7 @@ final class MmapPool : Allocator
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                block.region.next.prev = block.region.prev;
 | 
					                block.region.next.prev = block.region.prev;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return unmapMemory(block.region, block.region.size);
 | 
					            return unmapMemory(block.region, block.region.size) == 0;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // Merge blocks if neigbours are free.
 | 
					        // Merge blocks if neigbours are free.
 | 
				
			||||||
        if (block.next !is null && block.next.free)
 | 
					        if (block.next !is null && block.next.free)
 | 
				
			||||||
@@ -394,9 +380,13 @@ final class MmapPool : Allocator
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        void* p = mapMemory(null,
 | 
				
			||||||
        void* p = mapMemory(regionSize);
 | 
					                regionSize,
 | 
				
			||||||
        if (p is null)
 | 
					                PROT_READ | PROT_WRITE,
 | 
				
			||||||
 | 
					                MAP_PRIVATE | MAP_ANONYMOUS,
 | 
				
			||||||
 | 
					                -1,
 | 
				
			||||||
 | 
					                0);
 | 
				
			||||||
 | 
					        if (cast(ptrdiff_t) p == -1)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -506,10 +496,10 @@ final class MmapPool : Allocator
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    // allocate() check.
 | 
					    // allocate() check.
 | 
				
			||||||
    size_t tooMuchMemory = size_t.max
 | 
					    size_t tooMuchMemory = size_t.max
 | 
				
			||||||
                         - MmapPool.alignment_
 | 
					        - MmapPool.alignment_
 | 
				
			||||||
                         - BlockEntry.sizeof * 2
 | 
					        - MmapPool.BlockEntry.sizeof * 2
 | 
				
			||||||
                         - RegionEntry.sizeof
 | 
					        - MmapPool.RegionEntry.sizeof
 | 
				
			||||||
                         - pageSize;
 | 
					        - MmapPool.pageSize;
 | 
				
			||||||
    assert(MmapPool.instance.allocate(tooMuchMemory) is null);
 | 
					    assert(MmapPool.instance.allocate(tooMuchMemory) is null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert(MmapPool.instance.allocate(size_t.max) is null);
 | 
					    assert(MmapPool.instance.allocate(size_t.max) is null);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,23 +14,7 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
module tanya.memory.op;
 | 
					module tanya.memory.op;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
version (TanyaNative)
 | 
					import core.stdc.string;
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    extern private void fillMemory(void[], size_t) pure nothrow @system @nogc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    extern private void copyMemory(const void[], void[])
 | 
					 | 
				
			||||||
    pure nothrow @system @nogc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    extern private void moveMemory(const void[], void[])
 | 
					 | 
				
			||||||
    pure nothrow @system @nogc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    extern private bool equalMemory(const void[], const void[])
 | 
					 | 
				
			||||||
    pure nothrow @system @nogc;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    import core.stdc.string;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
private enum alignMask = size_t.sizeof - 1;
 | 
					private enum alignMask = size_t.sizeof - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -56,14 +40,7 @@ in (source.length <= target.length)
 | 
				
			|||||||
in (source.length == 0 || source.ptr !is null)
 | 
					in (source.length == 0 || source.ptr !is null)
 | 
				
			||||||
in (target.length == 0 || target.ptr !is null)
 | 
					in (target.length == 0 || target.ptr !is null)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    version (TanyaNative)
 | 
					    memcpy(target.ptr, source.ptr, source.length);
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        copyMemory(source, target);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        memcpy(target.ptr, source.ptr, source.length);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
@@ -100,14 +77,7 @@ private template filledBytes(ubyte Byte, ubyte I = 0)
 | 
				
			|||||||
void fill(ubyte c = 0)(void[] memory) @trusted
 | 
					void fill(ubyte c = 0)(void[] memory) @trusted
 | 
				
			||||||
in (memory.length == 0 || memory.ptr !is null)
 | 
					in (memory.length == 0 || memory.ptr !is null)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    version (TanyaNative)
 | 
					    memset(memory.ptr, c, memory.length);
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        fillMemory(memory, filledBytes!c);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        memset(memory.ptr, c, memory.length);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
@@ -148,14 +118,7 @@ in (source.length <= target.length)
 | 
				
			|||||||
in (source.length == 0 || source.ptr !is null)
 | 
					in (source.length == 0 || source.ptr !is null)
 | 
				
			||||||
in (target.length == 0 || target.ptr !is null)
 | 
					in (target.length == 0 || target.ptr !is null)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    version (TanyaNative)
 | 
					    memmove(target.ptr, source.ptr, source.length);
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        moveMemory(source, target);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        memmove(target.ptr, source.ptr, source.length);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
@@ -330,15 +293,7 @@ bool equal(const void[] r1, const void[] r2) @nogc nothrow pure @trusted
 | 
				
			|||||||
in (r1.length == 0 || r1.ptr !is null)
 | 
					in (r1.length == 0 || r1.ptr !is null)
 | 
				
			||||||
in (r2.length == 0 || r2.ptr !is null)
 | 
					in (r2.length == 0 || r2.ptr !is null)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    version (TanyaNative)
 | 
					    return r1.length == r2.length && memcmp(r1.ptr, r2.ptr, r1.length) == 0;
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return equalMemory(r1, r2);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return r1.length == r2.length
 | 
					 | 
				
			||||||
            && memcmp(r1.ptr, r2.ptr, r1.length) == 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,21 +17,8 @@ module tanya.math.nbtheory;
 | 
				
			|||||||
import tanya.meta.trait;
 | 
					import tanya.meta.trait;
 | 
				
			||||||
import tanya.meta.transform;
 | 
					import tanya.meta.transform;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
version (TanyaNative)
 | 
					import core.math : fabs;
 | 
				
			||||||
{
 | 
					import std.math : log;
 | 
				
			||||||
    private extern float fabs(float) @nogc nothrow pure @safe;
 | 
					 | 
				
			||||||
    private extern double fabs(double) @nogc nothrow pure @safe;
 | 
					 | 
				
			||||||
    private extern real fabs(real) @nogc nothrow pure @safe;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private extern double log(double) @nogc nothrow pure @safe;
 | 
					 | 
				
			||||||
    private extern float logf(float) @nogc nothrow pure @safe;
 | 
					 | 
				
			||||||
    private extern real logl(real) @nogc nothrow pure @safe;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    import core.math : fabs;
 | 
					 | 
				
			||||||
    import std.math : log;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Calculates the absolute value of a number.
 | 
					 * Calculates the absolute value of a number.
 | 
				
			||||||
@@ -90,46 +77,19 @@ if (isFloatingPoint!T)
 | 
				
			|||||||
    static assert(is(typeof(r.abs) == real));
 | 
					    static assert(is(typeof(r.abs) == real));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
version (D_Ddoc)
 | 
					/**
 | 
				
			||||||
 | 
					 * Calculates natural logarithm of $(D_PARAM x).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Params:
 | 
				
			||||||
 | 
					 *  T = Argument type.
 | 
				
			||||||
 | 
					 *  x = Argument.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns: Natural logarithm of $(D_PARAM x).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					Unqual!T ln(T)(T x)
 | 
				
			||||||
 | 
					if (isFloatingPoint!T)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /**
 | 
					    return log(x);
 | 
				
			||||||
     * Calculates natural logarithm of $(D_PARAM x).
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * Params:
 | 
					 | 
				
			||||||
     *  T = Argument type.
 | 
					 | 
				
			||||||
     *  x = Argument.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * Returns: Natural logarithm of $(D_PARAM x).
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    Unqual!T ln(T)(T x)
 | 
					 | 
				
			||||||
    if (isFloatingPoint!T);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
else version (TanyaNative)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    Unqual!T ln(T)(T x) @nogc nothrow pure @safe
 | 
					 | 
				
			||||||
    if (isFloatingPoint!T)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        static if (is(Unqual!T == float))
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return logf(x);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else static if (is(Unqual!T == double))
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return log(x);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return logl(x);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    Unqual!T ln(T)(T x)
 | 
					 | 
				
			||||||
    if (isFloatingPoint!T)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return log(x);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,15 +20,7 @@ import tanya.meta.trait;
 | 
				
			|||||||
import tanya.meta.transform;
 | 
					import tanya.meta.transform;
 | 
				
			||||||
import tanya.range;
 | 
					import tanya.range;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
version (TanyaNative)
 | 
					version (Windows)
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    import mir.linux._asm.unistd;
 | 
					 | 
				
			||||||
    import tanya.sys.linux.syscall;
 | 
					 | 
				
			||||||
    import tanya.sys.posix.ioctl;
 | 
					 | 
				
			||||||
    import tanya.sys.posix.net.if_;
 | 
					 | 
				
			||||||
    import tanya.sys.posix.socket;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
else version (Windows)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    import tanya.sys.windows.ifdef;
 | 
					    import tanya.sys.windows.ifdef;
 | 
				
			||||||
    import tanya.sys.windows.iphlpapi;
 | 
					    import tanya.sys.windows.iphlpapi;
 | 
				
			||||||
@@ -52,39 +44,7 @@ else version (Posix)
 | 
				
			|||||||
uint nameToIndex(R)(R name) @trusted
 | 
					uint nameToIndex(R)(R name) @trusted
 | 
				
			||||||
if (isInputRange!R && is(Unqual!(ElementType!R) == char) && hasLength!R)
 | 
					if (isInputRange!R && is(Unqual!(ElementType!R) == char) && hasLength!R)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    version (TanyaNative)
 | 
					    version (Windows)
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        if (name.length >= IF_NAMESIZE)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return 0;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        ifreq ifreq_ = void;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        copy(name, ifreq_.ifr_name[]);
 | 
					 | 
				
			||||||
        ifreq_.ifr_name[name.length] = '\0';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        auto socket = syscall(AF_INET,
 | 
					 | 
				
			||||||
                              SOCK_DGRAM | SOCK_CLOEXEC,
 | 
					 | 
				
			||||||
                              0,
 | 
					 | 
				
			||||||
                              NR_socket);
 | 
					 | 
				
			||||||
        if (socket <= 0)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return 0;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        scope (exit)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            syscall(socket, NR_close);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (syscall(socket,
 | 
					 | 
				
			||||||
                    SIOCGIFINDEX,
 | 
					 | 
				
			||||||
                    cast(ptrdiff_t) &ifreq_,
 | 
					 | 
				
			||||||
                    NR_ioctl) == 0)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return ifreq_.ifr_ifindex;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else version (Windows)
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (name.length > IF_MAX_STRING_SIZE)
 | 
					        if (name.length > IF_MAX_STRING_SIZE)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -155,33 +115,7 @@ String indexToName(uint index) @nogc nothrow @trusted
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    import tanya.memory.op : findNullTerminated;
 | 
					    import tanya.memory.op : findNullTerminated;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    version (TanyaNative)
 | 
					    version (Windows)
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        ifreq ifreq_ = void;
 | 
					 | 
				
			||||||
        ifreq_.ifr_ifindex = index;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        auto socket = syscall(AF_INET,
 | 
					 | 
				
			||||||
                              SOCK_DGRAM | SOCK_CLOEXEC,
 | 
					 | 
				
			||||||
                              0,
 | 
					 | 
				
			||||||
                              NR_socket);
 | 
					 | 
				
			||||||
        if (socket <= 0)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return String();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        scope (exit)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            syscall(socket, NR_close);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (syscall(socket,
 | 
					 | 
				
			||||||
                    SIOCGIFNAME,
 | 
					 | 
				
			||||||
                    cast(ptrdiff_t) &ifreq_,
 | 
					 | 
				
			||||||
                    NR_ioctl) == 0)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return String(findNullTerminated(ifreq_.ifr_name));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return String();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else version (Windows)
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        NET_LUID luid;
 | 
					        NET_LUID luid;
 | 
				
			||||||
        if (ConvertInterfaceIndexToLuid(index, &luid) != 0)
 | 
					        if (ConvertInterfaceIndexToLuid(index, &luid) != 0)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								sys/dub.json
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								sys/dub.json
									
									
									
									
									
								
							@@ -1,13 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
	"name": "sys",
 | 
					 | 
				
			||||||
	"description": "Low-level operating system bindings and definitions",
 | 
					 | 
				
			||||||
	"targetType": "library",
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"sourcePaths": [
 | 
					 | 
				
			||||||
		"."
 | 
					 | 
				
			||||||
	],
 | 
					 | 
				
			||||||
	"importPaths": [
 | 
					 | 
				
			||||||
		"."
 | 
					 | 
				
			||||||
	],
 | 
					 | 
				
			||||||
	"dflags-dmd": ["-dip1000"]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,59 +0,0 @@
 | 
				
			|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
					 | 
				
			||||||
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
					 | 
				
			||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright: Eugene Wissner 2018-2020.
 | 
					 | 
				
			||||||
 * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
 | 
					 | 
				
			||||||
 *                  Mozilla Public License, v. 2.0).
 | 
					 | 
				
			||||||
 * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
module tanya.sys.linux.syscall;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version (TanyaNative):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern ptrdiff_t syscall(ptrdiff_t, ptrdiff_t)
 | 
					 | 
				
			||||||
@nogc nothrow @system;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern ptrdiff_t syscall(ptrdiff_t, ptrdiff_t, ptrdiff_t)
 | 
					 | 
				
			||||||
@nogc nothrow @system;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern ptrdiff_t syscall(ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t)
 | 
					 | 
				
			||||||
@nogc nothrow @system;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern ptrdiff_t syscall(ptrdiff_t,
 | 
					 | 
				
			||||||
                         ptrdiff_t,
 | 
					 | 
				
			||||||
                         ptrdiff_t,
 | 
					 | 
				
			||||||
                         ptrdiff_t,
 | 
					 | 
				
			||||||
                         ptrdiff_t,
 | 
					 | 
				
			||||||
                         ptrdiff_t,
 | 
					 | 
				
			||||||
                         ptrdiff_t) @nogc nothrow @system;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Same syscalls as above but pure.
 | 
					 | 
				
			||||||
private template getOverloadMangling(size_t n)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    enum string getOverloadMangling = __traits(getOverloads,
 | 
					 | 
				
			||||||
                                               tanya.sys.linux.syscall,
 | 
					 | 
				
			||||||
                                               "syscall")[n].mangleof;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pragma(mangle, getOverloadMangling!0)
 | 
					 | 
				
			||||||
extern ptrdiff_t syscall_(ptrdiff_t, ptrdiff_t)
 | 
					 | 
				
			||||||
@nogc nothrow pure @system;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pragma(mangle, getOverloadMangling!1)
 | 
					 | 
				
			||||||
extern ptrdiff_t syscall_(ptrdiff_t, ptrdiff_t, ptrdiff_t)
 | 
					 | 
				
			||||||
@nogc nothrow pure @system;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pragma(mangle, getOverloadMangling!2)
 | 
					 | 
				
			||||||
extern ptrdiff_t syscall_(ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t)
 | 
					 | 
				
			||||||
@nogc nothrow pure @system;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pragma(mangle, getOverloadMangling!3)
 | 
					 | 
				
			||||||
extern ptrdiff_t syscall_(ptrdiff_t,
 | 
					 | 
				
			||||||
                          ptrdiff_t,
 | 
					 | 
				
			||||||
                          ptrdiff_t,
 | 
					 | 
				
			||||||
                          ptrdiff_t,
 | 
					 | 
				
			||||||
                          ptrdiff_t,
 | 
					 | 
				
			||||||
                          ptrdiff_t,
 | 
					 | 
				
			||||||
                          ptrdiff_t) @nogc nothrow pure @system;
 | 
					 | 
				
			||||||
@@ -1,76 +0,0 @@
 | 
				
			|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
					 | 
				
			||||||
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
					 | 
				
			||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright: Eugene Wissner 2018-2020.
 | 
					 | 
				
			||||||
 * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
 | 
					 | 
				
			||||||
 *                  Mozilla Public License, v. 2.0).
 | 
					 | 
				
			||||||
 * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
module tanya.sys.posix.ioctl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version (TanyaNative):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    SIOCADDRT = 0x890B, // Add routing table entry.
 | 
					 | 
				
			||||||
    SIOCDELRT = 0x890C, // Delete routing table entry.
 | 
					 | 
				
			||||||
    SIOCRTMSG = 0x890D, // Call to routing system.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SIOCGIFNAME = 0x8910, // Get iface name.
 | 
					 | 
				
			||||||
    SIOCSIFLINK = 0x8911, // Set iface channel.
 | 
					 | 
				
			||||||
    SIOCGIFCONF = 0x8912, // Get iface list.
 | 
					 | 
				
			||||||
    SIOCGIFFLAGS = 0x8913, // Get flags.
 | 
					 | 
				
			||||||
    SIOCSIFFLAGS = 0x8914, // Set flags.
 | 
					 | 
				
			||||||
    SIOCGIFADDR = 0x8915, // Get PA address.
 | 
					 | 
				
			||||||
    SIOCSIFADDR = 0x8916, // Set PA address.
 | 
					 | 
				
			||||||
    SIOCGIFDSTADDR = 0x8917, // Get remote PA address.
 | 
					 | 
				
			||||||
    SIOCSIFDSTADDR = 0x8918, // Set remote PA address.
 | 
					 | 
				
			||||||
    SIOCGIFBRDADDR = 0x8919, // Get broadcast PA address.
 | 
					 | 
				
			||||||
    SIOCSIFBRDADDR = 0x891a, // Set broadcast PA address.
 | 
					 | 
				
			||||||
    SIOCGIFNETMASK = 0x891b, // Get network PA mask.
 | 
					 | 
				
			||||||
    SIOCSIFNETMASK = 0x891c, // Set network PA mask.
 | 
					 | 
				
			||||||
    SIOCGIFMETRIC = 0x891d, // Get metric.
 | 
					 | 
				
			||||||
    SIOCSIFMETRIC = 0x891e, // Set metric.
 | 
					 | 
				
			||||||
    SIOCGIFMEM = 0x891f, // Get memory address (BSD).
 | 
					 | 
				
			||||||
    SIOCSIFMEM = 0x8920, // Set memory address (BSD).
 | 
					 | 
				
			||||||
    SIOCGIFMTU = 0x8921, // Get MTU size.
 | 
					 | 
				
			||||||
    SIOCSIFMTU = 0x8922, // Set MTU size.
 | 
					 | 
				
			||||||
    SIOCSIFNAME = 0x8923, // Set interface name.
 | 
					 | 
				
			||||||
    SIOCSIFHWADDR = 0x8924, // Set hardware address.
 | 
					 | 
				
			||||||
    SIOCGIFENCAP = 0x8925, // Get/set encapsulations.
 | 
					 | 
				
			||||||
    SIOCSIFENCAP = 0x8926,
 | 
					 | 
				
			||||||
    SIOCGIFHWADDR = 0x8927, // Get hardware address.
 | 
					 | 
				
			||||||
    SIOCGIFSLAVE = 0x8929, // Driver slaving support.
 | 
					 | 
				
			||||||
    SIOCSIFSLAVE = 0x8930,
 | 
					 | 
				
			||||||
    SIOCADDMULTI = 0x8931, // Multicast address lists.
 | 
					 | 
				
			||||||
    SIOCDELMULTI = 0x8932,
 | 
					 | 
				
			||||||
    SIOCGIFINDEX = 0x8933, // Name -> if_index mapping.
 | 
					 | 
				
			||||||
    SIOGIFINDEX = SIOCGIFINDEX, // Misprint compatibility.
 | 
					 | 
				
			||||||
    SIOCSIFPFLAGS = 0x8934, // Set/get extended flags set.
 | 
					 | 
				
			||||||
    SIOCGIFPFLAGS = 0x8935,
 | 
					 | 
				
			||||||
    SIOCDIFADDR = 0x8936, // Delete PA address.
 | 
					 | 
				
			||||||
    SIOCSIFHWBROADCAST = 0x8937, // Set hardware broadcast address.
 | 
					 | 
				
			||||||
    SIOCGIFCOUNT = 0x8938, // Get number of devices.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SIOCGIFBR = 0x8940, // Bridging support.
 | 
					 | 
				
			||||||
    SIOCSIFBR = 0x8941, // Set bridging options.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SIOCGIFTXQLEN = 0x8942, // Get the tx queue length.
 | 
					 | 
				
			||||||
    SIOCSIFTXQLEN = 0x8943, // Set the tx queue length.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SIOCDARP = 0x8953, // Delete ARP table entry.
 | 
					 | 
				
			||||||
    SIOCGARP = 0x8954, // Get ARP table entry.
 | 
					 | 
				
			||||||
    SIOCSARP = 0x8955, // Set ARP table entry.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SIOCDRARP = 0x8960, // Delete RARP table entry.
 | 
					 | 
				
			||||||
    SIOCGRARP = 0x8961, // Get RARP table entry.
 | 
					 | 
				
			||||||
    SIOCSRARP = 0x8962, // Set RARP table entry.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SIOCGIFMAP = 0x8970, // Get device parameters.
 | 
					 | 
				
			||||||
    SIOCSIFMAP = 0x8971, // Set device parameters.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SIOCADDDLCI = 0x8980, // Create new DLCI device.
 | 
					 | 
				
			||||||
    SIOCDELDLCI = 0x8981, // Delete DLCI device.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,29 +0,0 @@
 | 
				
			|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
					 | 
				
			||||||
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
					 | 
				
			||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright: Eugene Wissner 2018-2020.
 | 
					 | 
				
			||||||
 * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
 | 
					 | 
				
			||||||
 *                  Mozilla Public License, v. 2.0).
 | 
					 | 
				
			||||||
 * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
module tanya.sys.posix.mman;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version (TanyaNative):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    PROT_EXEC = 0x4, // Page can be executed.
 | 
					 | 
				
			||||||
    PROT_NONE = 0x0, // Page cannot be accessed.
 | 
					 | 
				
			||||||
    PROT_READ = 0x1, // Page can be read.
 | 
					 | 
				
			||||||
    PROT_WRITE = 0x2, // Page can be written.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    MAP_FIXED = 0x10, // Interpret addr exactly.
 | 
					 | 
				
			||||||
    MAP_PRIVATE = 0x02, // Changes are private.
 | 
					 | 
				
			||||||
    MAP_SHARED = 0x01, // Share changes.
 | 
					 | 
				
			||||||
    MAP_ANONYMOUS = 0x20, // Don't use a file.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,25 +0,0 @@
 | 
				
			|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
					 | 
				
			||||||
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
					 | 
				
			||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright: Eugene Wissner 2018-2020.
 | 
					 | 
				
			||||||
 * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
 | 
					 | 
				
			||||||
 *                  Mozilla Public License, v. 2.0).
 | 
					 | 
				
			||||||
 * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
module tanya.sys.posix.net.if_;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version (TanyaNative):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum size_t IF_NAMESIZE = 16;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct ifreq
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    char[IF_NAMESIZE] ifr_name;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    union
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        int ifr_ifindex;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,150 +0,0 @@
 | 
				
			|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
					 | 
				
			||||||
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
					 | 
				
			||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright: Eugene Wissner 2018-2020.
 | 
					 | 
				
			||||||
 * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
 | 
					 | 
				
			||||||
 *                  Mozilla Public License, v. 2.0).
 | 
					 | 
				
			||||||
 * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
module tanya.sys.posix.socket;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version (TanyaNative):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Protocol families.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
enum
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    PF_UNSPEC = 0, // Unspecified.
 | 
					 | 
				
			||||||
    PF_LOCAL = 1, // Local to host (pipes and file-domain).
 | 
					 | 
				
			||||||
    PF_UNIX = PF_LOCAL, // POSIX name for PF_LOCAL.
 | 
					 | 
				
			||||||
    PF_FILE = PF_LOCAL, // Another non-standard name for PF_LOCAL.
 | 
					 | 
				
			||||||
    PF_INET = 2, // IP protocol family.
 | 
					 | 
				
			||||||
    PF_AX25 = 3, // Amateur Radio AX.25.
 | 
					 | 
				
			||||||
    PF_IPX = 4, // Novell Internet Protocol.
 | 
					 | 
				
			||||||
    PF_APPLETALK = 5, // Appletalk DDP.
 | 
					 | 
				
			||||||
    PF_NETROM = 6, // Amateur radio NetROM.
 | 
					 | 
				
			||||||
    PF_BRIDGE = 7, // Multiprotocol bridge.
 | 
					 | 
				
			||||||
    PF_ATMPVC = 8, // ATM PVCs.
 | 
					 | 
				
			||||||
    PF_X25 = 9, // Reserved for X.25 project.
 | 
					 | 
				
			||||||
    PF_INET6 = 10, // IP version 6.
 | 
					 | 
				
			||||||
    PF_ROSE = 11, // Amateur Radio X.25 PLP.
 | 
					 | 
				
			||||||
    PF_DECnet = 12, // Reserved for DECnet project.
 | 
					 | 
				
			||||||
    PF_NETBEUI = 13, // Reserved for 802.2LLC project.
 | 
					 | 
				
			||||||
    PF_SECURITY = 14, // Security callback pseudo AF.
 | 
					 | 
				
			||||||
    PF_KEY = 15, // PF_KEY key management API.
 | 
					 | 
				
			||||||
    PF_NETLINK = 16, // Kernel user interface device.
 | 
					 | 
				
			||||||
    PF_ROUTE = PF_NETLINK, // Alias to emulate 4.4BSD.
 | 
					 | 
				
			||||||
    PF_PACKET = 17, // Packet family.
 | 
					 | 
				
			||||||
    PF_ASH = 18, // Ash.
 | 
					 | 
				
			||||||
    PF_ECONET = 19, // Acorn Econet.
 | 
					 | 
				
			||||||
    PF_ATMSVC = 20, // ATM SVCs.
 | 
					 | 
				
			||||||
    PF_RDS = 21, // RDS sockets.
 | 
					 | 
				
			||||||
    PF_SNA = 22, // Linux SNA Project.
 | 
					 | 
				
			||||||
    PF_IRDA = 23, // IRDA sockets.
 | 
					 | 
				
			||||||
    PF_PPPOX = 24, // PPPoX sockets.
 | 
					 | 
				
			||||||
    PF_WANPIPE = 25, // Wanpipe API sockets.
 | 
					 | 
				
			||||||
    PF_LLC = 26, // Linux LLC.
 | 
					 | 
				
			||||||
    PF_IB = 27, // Native InfiniBand address.
 | 
					 | 
				
			||||||
    PF_MPLS = 28, // MPLS.
 | 
					 | 
				
			||||||
    PF_CAN = 29, // Controller Area Network.
 | 
					 | 
				
			||||||
    PF_TIPC = 30, // TIPC sockets.
 | 
					 | 
				
			||||||
    PF_BLUETOOTH = 31, // Bluetooth sockets.
 | 
					 | 
				
			||||||
    PF_IUCV = 32, // IUCV sockets.
 | 
					 | 
				
			||||||
    PF_RXRPC = 33, // RxRPC sockets.
 | 
					 | 
				
			||||||
    PF_ISDN = 34, // mISDN sockets.
 | 
					 | 
				
			||||||
    PF_PHONET = 35, // Phonet sockets.
 | 
					 | 
				
			||||||
    PF_IEEE802154 = 36, // IEEE 802.15.4 sockets.
 | 
					 | 
				
			||||||
    PF_CAIF = 37, // CAIF sockets.
 | 
					 | 
				
			||||||
    PF_ALG = 38, // Algorithm sockets.
 | 
					 | 
				
			||||||
    PF_NFC = 39, // NFC sockets.
 | 
					 | 
				
			||||||
    PF_VSOCK = 40, // vSockets.
 | 
					 | 
				
			||||||
    PF_MAX = 41, // For now.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Address families.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
enum
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    AF_UNSPEC = PF_UNSPEC,
 | 
					 | 
				
			||||||
    AF_LOCAL = PF_LOCAL,
 | 
					 | 
				
			||||||
    AF_UNIX = PF_UNIX,
 | 
					 | 
				
			||||||
    AF_FILE = PF_FILE,
 | 
					 | 
				
			||||||
    AF_INET = PF_INET,
 | 
					 | 
				
			||||||
    AF_AX25 = PF_AX25,
 | 
					 | 
				
			||||||
    AF_IPX = PF_IPX,
 | 
					 | 
				
			||||||
    AF_APPLETALK = PF_APPLETALK,
 | 
					 | 
				
			||||||
    AF_NETROM = PF_NETROM,
 | 
					 | 
				
			||||||
    AF_BRIDGE = PF_BRIDGE,
 | 
					 | 
				
			||||||
    AF_ATMPVC = PF_ATMPVC,
 | 
					 | 
				
			||||||
    AF_X25 = PF_X25,
 | 
					 | 
				
			||||||
    AF_INET6 = PF_INET6,
 | 
					 | 
				
			||||||
    AF_ROSE = PF_ROSE,
 | 
					 | 
				
			||||||
    AF_DECnet = PF_DECnet,
 | 
					 | 
				
			||||||
    AF_NETBEUI = PF_NETBEUI,
 | 
					 | 
				
			||||||
    AF_SECURITY = PF_SECURITY,
 | 
					 | 
				
			||||||
    AF_KEY = PF_KEY,
 | 
					 | 
				
			||||||
    AF_NETLINK = PF_NETLINK,
 | 
					 | 
				
			||||||
    AF_ROUTE = PF_ROUTE,
 | 
					 | 
				
			||||||
    AF_PACKET = PF_PACKET,
 | 
					 | 
				
			||||||
    AF_ASH = PF_ASH,
 | 
					 | 
				
			||||||
    AF_ECONET = PF_ECONET,
 | 
					 | 
				
			||||||
    AF_ATMSVC = PF_ATMSVC,
 | 
					 | 
				
			||||||
    AF_RDS = PF_RDS,
 | 
					 | 
				
			||||||
    AF_SNA = PF_SNA,
 | 
					 | 
				
			||||||
    AF_IRDA = PF_IRDA,
 | 
					 | 
				
			||||||
    AF_PPPOX = PF_PPPOX,
 | 
					 | 
				
			||||||
    AF_WANPIPE = PF_WANPIPE,
 | 
					 | 
				
			||||||
    AF_LLC = PF_LLC,
 | 
					 | 
				
			||||||
    AF_IB = PF_IB,
 | 
					 | 
				
			||||||
    AF_MPLS = PF_MPLS,
 | 
					 | 
				
			||||||
    AF_CAN = PF_CAN,
 | 
					 | 
				
			||||||
    AF_TIPC = PF_TIPC,
 | 
					 | 
				
			||||||
    AF_BLUETOOTH = PF_BLUETOOTH,
 | 
					 | 
				
			||||||
    AF_IUCV = PF_IUCV,
 | 
					 | 
				
			||||||
    AF_RXRPC = PF_RXRPC,
 | 
					 | 
				
			||||||
    AF_ISDN = PF_ISDN,
 | 
					 | 
				
			||||||
    AF_PHONET = PF_PHONET,
 | 
					 | 
				
			||||||
    AF_IEEE802154 = PF_IEEE802154,
 | 
					 | 
				
			||||||
    AF_CAIF = PF_CAIF,
 | 
					 | 
				
			||||||
    AF_ALG = PF_ALG,
 | 
					 | 
				
			||||||
    AF_NFC = PF_NFC,
 | 
					 | 
				
			||||||
    AF_VSOCK = PF_VSOCK,
 | 
					 | 
				
			||||||
    AF_MAX = PF_MAX,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Types of sockets.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
enum
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // Sequenced, reliable, connection-based byte streams.
 | 
					 | 
				
			||||||
    SOCK_STREAM = 1,
 | 
					 | 
				
			||||||
    // Connectionless, unreliable datagrams of fixed maximum length.
 | 
					 | 
				
			||||||
    SOCK_DGRAM = 2,
 | 
					 | 
				
			||||||
    // Raw protocol interface.
 | 
					 | 
				
			||||||
    SOCK_RAW = 3,
 | 
					 | 
				
			||||||
    // Reliably-delivered messages.
 | 
					 | 
				
			||||||
    SOCK_RDM = 4,
 | 
					 | 
				
			||||||
    // Sequenced, reliable, connection-based, datagrams of fixed maximum
 | 
					 | 
				
			||||||
    // length.
 | 
					 | 
				
			||||||
    SOCK_SEQPACKET = 5,
 | 
					 | 
				
			||||||
    // Datagram Congestion Control Protocol.
 | 
					 | 
				
			||||||
    SOCK_DCCP = 6,
 | 
					 | 
				
			||||||
    // Linux specific way of getting packets at the dev level. For writing rarp
 | 
					 | 
				
			||||||
    // and other similar things on the user level.
 | 
					 | 
				
			||||||
    SOCK_PACKET = 10,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Flags to be ORed into the type parameter of socket and socketpair and used
 | 
					 | 
				
			||||||
 * for the flags parameter of paccept.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
enum
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    SOCK_CLOEXEC = 0x80000, // Atomically set close-on-exec flag for the new descriptor(s).
 | 
					 | 
				
			||||||
    SOCK_NONBLOCK = 0x800, // Atomically mark descriptor(s) as non-blocking.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,64 +0,0 @@
 | 
				
			|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
					 | 
				
			||||||
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
					 | 
				
			||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Base type definitions and aliases.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This module doesn't provide aliases for all types used by Windows, but only
 | 
					 | 
				
			||||||
 * for types that can vary on different platforms. For example there is no
 | 
					 | 
				
			||||||
 * need to define `INT32` alias for D, since $(D_KEYWORD int) is always a
 | 
					 | 
				
			||||||
 * 32-bit signed integer. But `int` and its Windows alias `INT` is not the
 | 
					 | 
				
			||||||
 * same on all platforms in C, so its size can be something differen than
 | 
					 | 
				
			||||||
 * 32 bit, therefore an $(D_PSYMBOL INT) alias is available in this module.
 | 
					 | 
				
			||||||
 * $(D_PARAM TCHAR) can be a $(D_KEYWORD char) if Unicode isn't supported or
 | 
					 | 
				
			||||||
 * $(D_KEYWORD wchar) if Unicode is supported, so $(D_PSYMBOL TCHAR) is
 | 
					 | 
				
			||||||
 * defined here.
 | 
					 | 
				
			||||||
 * Also aliases for specific types like $(D_PSYMBOL SOCKET) are defined here.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Copyright: Eugene Wissner 2017-2020.
 | 
					 | 
				
			||||||
 * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
 | 
					 | 
				
			||||||
 *                  Mozilla Public License, v. 2.0).
 | 
					 | 
				
			||||||
 * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
module tanya.sys.windows.def;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version (Windows):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alias BYTE = ubyte;
 | 
					 | 
				
			||||||
alias TBYTE = wchar; // If Unicode, otherwise char.
 | 
					 | 
				
			||||||
alias CHAR = char; // Signed or unsigned char.
 | 
					 | 
				
			||||||
alias WCHAR = wchar;
 | 
					 | 
				
			||||||
alias TCHAR = wchar; // If Unicode, otherwise char.
 | 
					 | 
				
			||||||
alias SHORT = short;
 | 
					 | 
				
			||||||
alias USHORT = ushort;
 | 
					 | 
				
			||||||
alias WORD = ushort;
 | 
					 | 
				
			||||||
alias INT = int;
 | 
					 | 
				
			||||||
alias UINT = uint;
 | 
					 | 
				
			||||||
alias LONG = int;
 | 
					 | 
				
			||||||
alias ULONG = uint;
 | 
					 | 
				
			||||||
alias DWORD = uint;
 | 
					 | 
				
			||||||
alias LONGLONG = long; // Or double.
 | 
					 | 
				
			||||||
alias ULONGLONG = ulong; // Or double.
 | 
					 | 
				
			||||||
alias DWORDLONG = ulong;
 | 
					 | 
				
			||||||
alias FLOAT = float;
 | 
					 | 
				
			||||||
alias BOOL = int;
 | 
					 | 
				
			||||||
alias BOOLEAN = BYTE;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alias HANDLE = void*;
 | 
					 | 
				
			||||||
enum HANDLE INVALID_HANDLE_VALUE = cast(HANDLE) -1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum TRUE = 1;
 | 
					 | 
				
			||||||
enum FALSE = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alias PSTR = CHAR*;
 | 
					 | 
				
			||||||
alias PWSTR = WCHAR*;
 | 
					 | 
				
			||||||
alias PTSTR = TCHAR*;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
align(1) struct GUID
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint Data1;
 | 
					 | 
				
			||||||
    ushort Data2;
 | 
					 | 
				
			||||||
    ushort Data3;
 | 
					 | 
				
			||||||
    char[8] Data4;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,28 +0,0 @@
 | 
				
			|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
					 | 
				
			||||||
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
					 | 
				
			||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Copyright: Eugene Wissner 2018-2020.
 | 
					 | 
				
			||||||
 * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
 | 
					 | 
				
			||||||
 *                  Mozilla Public License, v. 2.0).
 | 
					 | 
				
			||||||
 * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
module tanya.sys.windows.ifdef;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version (Windows):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import tanya.sys.windows.def;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
union NET_LUID_LH
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ulong Value;
 | 
					 | 
				
			||||||
    ulong Info;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alias NET_LUID = NET_LUID_LH;
 | 
					 | 
				
			||||||
alias IF_LUID = NET_LUID_LH;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alias NET_IFINDEX = ULONG;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum size_t IF_MAX_STRING_SIZE = 256;
 | 
					 | 
				
			||||||
@@ -1,37 +0,0 @@
 | 
				
			|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
					 | 
				
			||||||
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
					 | 
				
			||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Copyright: Eugene Wissner 2018-2020.
 | 
					 | 
				
			||||||
 * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
 | 
					 | 
				
			||||||
 *                  Mozilla Public License, v. 2.0).
 | 
					 | 
				
			||||||
 * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
module tanya.sys.windows.iphlpapi;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version (Windows):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import tanya.sys.windows.def;
 | 
					 | 
				
			||||||
import tanya.sys.windows.ifdef;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern(Windows)
 | 
					 | 
				
			||||||
DWORD ConvertInterfaceNameToLuidA(const(CHAR)* InterfaceName,
 | 
					 | 
				
			||||||
                                  NET_LUID* InterfaceLuid)
 | 
					 | 
				
			||||||
@nogc nothrow @system;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern(Windows)
 | 
					 | 
				
			||||||
DWORD ConvertInterfaceLuidToIndex(const(NET_LUID)* InterfaceLuid,
 | 
					 | 
				
			||||||
                                  NET_IFINDEX* InterfaceIndex)
 | 
					 | 
				
			||||||
@nogc nothrow @system;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern(Windows)
 | 
					 | 
				
			||||||
DWORD ConvertInterfaceIndexToLuid(NET_IFINDEX InterfaceIndex,
 | 
					 | 
				
			||||||
                                  NET_LUID* InterfaceLuid)
 | 
					 | 
				
			||||||
@nogc nothrow @system;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern(Windows)
 | 
					 | 
				
			||||||
DWORD ConvertInterfaceLuidToNameA(const(NET_LUID)* InterfaceLuid,
 | 
					 | 
				
			||||||
                                  PSTR InterfaceName,
 | 
					 | 
				
			||||||
                                  size_t Length)
 | 
					 | 
				
			||||||
@nogc nothrow @system;
 | 
					 | 
				
			||||||
@@ -1,19 +0,0 @@
 | 
				
			|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
					 | 
				
			||||||
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
					 | 
				
			||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Copyright: Eugene Wissner 2017-2020.
 | 
					 | 
				
			||||||
 * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
 | 
					 | 
				
			||||||
 *                  Mozilla Public License, v. 2.0).
 | 
					 | 
				
			||||||
 * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
module tanya.sys.windows;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version (Windows):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public import tanya.sys.windows.def;
 | 
					 | 
				
			||||||
public import tanya.sys.windows.ifdef;
 | 
					 | 
				
			||||||
public import tanya.sys.windows.iphlpapi;
 | 
					 | 
				
			||||||
public import tanya.sys.windows.winbase;
 | 
					 | 
				
			||||||
public import tanya.sys.windows.winsock2;
 | 
					 | 
				
			||||||
@@ -1,53 +0,0 @@
 | 
				
			|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
					 | 
				
			||||||
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
					 | 
				
			||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Definitions from winbase.h.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Copyright: Eugene Wissner 2017-2020.
 | 
					 | 
				
			||||||
 * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
 | 
					 | 
				
			||||||
 *                  Mozilla Public License, v. 2.0).
 | 
					 | 
				
			||||||
 * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
module tanya.sys.windows.winbase;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version (Windows):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public import tanya.sys.windows.def;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct OVERLAPPED
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    size_t Internal;
 | 
					 | 
				
			||||||
    size_t InternalHigh;
 | 
					 | 
				
			||||||
    union
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        struct
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            DWORD Offset;
 | 
					 | 
				
			||||||
            DWORD OffsetHigh;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        void* Pointer;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    HANDLE hEvent;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern(Windows)
 | 
					 | 
				
			||||||
HANDLE CreateIoCompletionPort(HANDLE FileHandle,
 | 
					 | 
				
			||||||
                              HANDLE ExistingCompletionPort,
 | 
					 | 
				
			||||||
                              size_t CompletionKey,
 | 
					 | 
				
			||||||
                              DWORD NumberOfConcurrentThreads)
 | 
					 | 
				
			||||||
nothrow @system @nogc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern(Windows)
 | 
					 | 
				
			||||||
BOOL GetQueuedCompletionStatus(HANDLE CompletionPort,
 | 
					 | 
				
			||||||
                               DWORD* lpNumberOfBytes,
 | 
					 | 
				
			||||||
                               size_t* lpCompletionKey,
 | 
					 | 
				
			||||||
                               OVERLAPPED** lpOverlapped,
 | 
					 | 
				
			||||||
                               DWORD dwMilliseconds) nothrow @system @nogc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern(Windows)
 | 
					 | 
				
			||||||
BOOL GetOverlappedResult(HANDLE hFile,
 | 
					 | 
				
			||||||
                         OVERLAPPED* lpOverlapped,
 | 
					 | 
				
			||||||
                         DWORD* lpNumberOfBytesTransferred,
 | 
					 | 
				
			||||||
                         BOOL bWait) nothrow @system @nogc;
 | 
					 | 
				
			||||||
@@ -1,217 +0,0 @@
 | 
				
			|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
					 | 
				
			||||||
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
					 | 
				
			||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Definitions from winsock2.h, ws2def.h and MSWSock.h.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Copyright: Eugene Wissner 2017-2020.
 | 
					 | 
				
			||||||
 * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
 | 
					 | 
				
			||||||
 *                  Mozilla Public License, v. 2.0).
 | 
					 | 
				
			||||||
 * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
module tanya.sys.windows.winsock2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version (Windows):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public import tanya.sys.windows.def;
 | 
					 | 
				
			||||||
public import tanya.sys.windows.winbase;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alias SOCKET = size_t;
 | 
					 | 
				
			||||||
enum SOCKET INVALID_SOCKET = ~0;
 | 
					 | 
				
			||||||
enum SOCKET_ERROR = -1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    IOC_UNIX     = 0x00000000,
 | 
					 | 
				
			||||||
    IOC_WS2      = 0x08000000,
 | 
					 | 
				
			||||||
    IOC_PROTOCOL = 0x10000000,
 | 
					 | 
				
			||||||
    IOC_VOID     = 0x20000000,         // No parameters.
 | 
					 | 
				
			||||||
    IOC_OUT      = 0x40000000,         // Copy parameters back.
 | 
					 | 
				
			||||||
    IOC_IN       = 0x80000000,         // Copy parameters into.
 | 
					 | 
				
			||||||
    IOC_VENDOR   = 0x18000000,
 | 
					 | 
				
			||||||
    IOC_WSK      = (IOC_WS2 | 0x07000000), // _WIN32_WINNT >= 0x0600.
 | 
					 | 
				
			||||||
    IOC_INOUT    = (IOC_IN | IOC_OUT), // Copy parameter into and get back.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
template _WSAIO(int x, int y)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    enum _WSAIO = IOC_VOID | x | y;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
template _WSAIOR(int x, int y)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    enum _WSAIOR = IOC_OUT | x | y;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
template _WSAIOW(int x, int y)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    enum _WSAIOW = IOC_IN | x | y;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
template _WSAIORW(int x, int y)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    enum _WSAIORW = IOC_INOUT | x | y;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alias SIO_ASSOCIATE_HANDLE               = _WSAIOW!(IOC_WS2, 1);
 | 
					 | 
				
			||||||
alias SIO_ENABLE_CIRCULAR_QUEUEING       = _WSAIO!(IOC_WS2, 2);
 | 
					 | 
				
			||||||
alias SIO_FIND_ROUTE                     = _WSAIOR!(IOC_WS2, 3);
 | 
					 | 
				
			||||||
alias SIO_FLUSH                          = _WSAIO!(IOC_WS2, 4);
 | 
					 | 
				
			||||||
alias SIO_GET_BROADCAST_ADDRESS          = _WSAIOR!(IOC_WS2, 5);
 | 
					 | 
				
			||||||
alias SIO_GET_EXTENSION_FUNCTION_POINTER = _WSAIORW!(IOC_WS2, 6);
 | 
					 | 
				
			||||||
alias SIO_GET_QOS                        = _WSAIORW!(IOC_WS2, 7);
 | 
					 | 
				
			||||||
alias SIO_GET_GROUP_QOS                  = _WSAIORW!(IOC_WS2, 8);
 | 
					 | 
				
			||||||
alias SIO_MULTIPOINT_LOOPBACK            = _WSAIOW!(IOC_WS2, 9);
 | 
					 | 
				
			||||||
alias SIO_MULTICAST_SCOPE                = _WSAIOW!(IOC_WS2, 10);
 | 
					 | 
				
			||||||
alias SIO_SET_QOS                        = _WSAIOW!(IOC_WS2, 11);
 | 
					 | 
				
			||||||
alias SIO_SET_GROUP_QOS                  = _WSAIOW!(IOC_WS2, 12);
 | 
					 | 
				
			||||||
alias SIO_TRANSLATE_HANDLE               = _WSAIORW!(IOC_WS2, 13);
 | 
					 | 
				
			||||||
alias SIO_ROUTING_INTERFACE_QUERY        = _WSAIORW!(IOC_WS2, 20);
 | 
					 | 
				
			||||||
alias SIO_ROUTING_INTERFACE_CHANGE       = _WSAIOW!(IOC_WS2, 21);
 | 
					 | 
				
			||||||
alias SIO_ADDRESS_LIST_QUERY             = _WSAIOR!(IOC_WS2, 22);
 | 
					 | 
				
			||||||
alias SIO_ADDRESS_LIST_CHANGE            = _WSAIO!(IOC_WS2, 23);
 | 
					 | 
				
			||||||
alias SIO_QUERY_TARGET_PNP_HANDLE        = _WSAIOR!(IOC_WS2, 24);
 | 
					 | 
				
			||||||
alias SIO_NSP_NOTIFY_CHANGE              = _WSAIOW!(IOC_WS2, 25);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alias GROUP = uint;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    WSA_FLAG_OVERLAPPED = 0x01,
 | 
					 | 
				
			||||||
    WSA_FLAG_MULTIPOINT_C_ROOT = 0x02,
 | 
					 | 
				
			||||||
    WSA_FLAG_MULTIPOINT_C_LEAF = 0x04,
 | 
					 | 
				
			||||||
    WSA_FLAG_MULTIPOINT_D_ROOT = 0x08,
 | 
					 | 
				
			||||||
    WSA_FLAG_MULTIPOINT_D_LEAF = 0x10,
 | 
					 | 
				
			||||||
    WSA_FLAG_ACCESS_SYSTEM_SECURITY = 0x40,
 | 
					 | 
				
			||||||
    WSA_FLAG_NO_HANDLE_INHERIT = 0x80,
 | 
					 | 
				
			||||||
    WSA_FLAG_REGISTERED_IO = 0x100,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum MAX_PROTOCOL_CHAIN = 7;
 | 
					 | 
				
			||||||
enum BASE_PROTOCOL = 1;
 | 
					 | 
				
			||||||
enum LAYERED_PROTOCOL = 0;
 | 
					 | 
				
			||||||
enum WSAPROTOCOL_LEN = 255;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct WSAPROTOCOLCHAIN
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int ChainLen;
 | 
					 | 
				
			||||||
    DWORD[MAX_PROTOCOL_CHAIN] ChainEntries;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct WSABUF
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ULONG len;
 | 
					 | 
				
			||||||
    CHAR* buf;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct WSAPROTOCOL_INFO
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    DWORD                      dwServiceFlags1;
 | 
					 | 
				
			||||||
    DWORD                      dwServiceFlags2;
 | 
					 | 
				
			||||||
    DWORD                      dwServiceFlags3;
 | 
					 | 
				
			||||||
    DWORD                      dwServiceFlags4;
 | 
					 | 
				
			||||||
    DWORD                      dwProviderFlags;
 | 
					 | 
				
			||||||
    GUID                       ProviderId;
 | 
					 | 
				
			||||||
    DWORD                      dwCatalogEntryId;
 | 
					 | 
				
			||||||
    WSAPROTOCOLCHAIN           ProtocolChain;
 | 
					 | 
				
			||||||
    int                        iVersion;
 | 
					 | 
				
			||||||
    int                        iAddressFamily;
 | 
					 | 
				
			||||||
    int                        iMaxSockAddr;
 | 
					 | 
				
			||||||
    int                        iMinSockAddr;
 | 
					 | 
				
			||||||
    int                        iSocketType;
 | 
					 | 
				
			||||||
    int                        iProtocol;
 | 
					 | 
				
			||||||
    int                        iProtocolMaxOffset;
 | 
					 | 
				
			||||||
    int                        iNetworkByteOrder;
 | 
					 | 
				
			||||||
    int                        iSecurityScheme;
 | 
					 | 
				
			||||||
    DWORD                      dwMessageSize;
 | 
					 | 
				
			||||||
    DWORD                      dwProviderReserved;
 | 
					 | 
				
			||||||
    TCHAR[WSAPROTOCOL_LEN + 1] szProtocol;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const GUID WSAID_GETACCEPTEXSOCKADDRS = {
 | 
					 | 
				
			||||||
    0xb5367df2, 0xcbac, 0x11cf,
 | 
					 | 
				
			||||||
    [0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92],
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const GUID WSAID_ACCEPTEX = {
 | 
					 | 
				
			||||||
    0xb5367df1, 0xcbac, 0x11cf,
 | 
					 | 
				
			||||||
    [0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92],
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alias LPWSAOVERLAPPED_COMPLETION_ROUTINE = void function(DWORD dwError,
 | 
					 | 
				
			||||||
                                                         DWORD cbTransferred,
 | 
					 | 
				
			||||||
                                                         OVERLAPPED* lpOverlapped,
 | 
					 | 
				
			||||||
                                                         DWORD dwFlags) nothrow @nogc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern(Windows)
 | 
					 | 
				
			||||||
SOCKET WSASocket(int af,
 | 
					 | 
				
			||||||
                 int type,
 | 
					 | 
				
			||||||
                 int protocol,
 | 
					 | 
				
			||||||
                 WSAPROTOCOL_INFO* lpProtocolInfo,
 | 
					 | 
				
			||||||
                 GROUP g,
 | 
					 | 
				
			||||||
                 DWORD dwFlags) nothrow @system @nogc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern(Windows)
 | 
					 | 
				
			||||||
int WSARecv(SOCKET s,
 | 
					 | 
				
			||||||
            WSABUF* lpBuffers,
 | 
					 | 
				
			||||||
            DWORD dwBufferCount,
 | 
					 | 
				
			||||||
            DWORD* lpNumberOfBytesRecvd,
 | 
					 | 
				
			||||||
            DWORD* lpFlags,
 | 
					 | 
				
			||||||
            OVERLAPPED* lpOverlapped,
 | 
					 | 
				
			||||||
            LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
 | 
					 | 
				
			||||||
nothrow @system @nogc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern(Windows)
 | 
					 | 
				
			||||||
int WSASend(SOCKET s,
 | 
					 | 
				
			||||||
            WSABUF* lpBuffers,
 | 
					 | 
				
			||||||
            DWORD dwBufferCount,
 | 
					 | 
				
			||||||
            DWORD* lpNumberOfBytesRecvd,
 | 
					 | 
				
			||||||
            DWORD lpFlags,
 | 
					 | 
				
			||||||
            OVERLAPPED* lpOverlapped,
 | 
					 | 
				
			||||||
            LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
 | 
					 | 
				
			||||||
nothrow @system @nogc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern(Windows)
 | 
					 | 
				
			||||||
int WSAIoctl(SOCKET s,
 | 
					 | 
				
			||||||
             uint dwIoControlCode,
 | 
					 | 
				
			||||||
             void* lpvInBuffer,
 | 
					 | 
				
			||||||
             uint cbInBuffer,
 | 
					 | 
				
			||||||
             void* lpvOutBuffer,
 | 
					 | 
				
			||||||
             uint cbOutBuffer,
 | 
					 | 
				
			||||||
             uint* lpcbBytesReturned,
 | 
					 | 
				
			||||||
             OVERLAPPED* lpOverlapped,
 | 
					 | 
				
			||||||
             LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)             
 | 
					 | 
				
			||||||
nothrow @system @nogc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alias ADDRESS_FAMILY = USHORT;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct SOCKADDR
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ADDRESS_FAMILY sa_family;           // Address family.
 | 
					 | 
				
			||||||
    CHAR[14] sa_data;                   // Up to 14 bytes of direct address.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alias LPFN_GETACCEPTEXSOCKADDRS = void function(void*,
 | 
					 | 
				
			||||||
                                                DWORD,
 | 
					 | 
				
			||||||
                                                DWORD,
 | 
					 | 
				
			||||||
                                                DWORD,
 | 
					 | 
				
			||||||
                                                SOCKADDR**,
 | 
					 | 
				
			||||||
                                                INT*,
 | 
					 | 
				
			||||||
                                                SOCKADDR**,
 | 
					 | 
				
			||||||
                                                INT*) nothrow @nogc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alias LPFN_ACCEPTEX = extern(Windows) BOOL function(SOCKET,
 | 
					 | 
				
			||||||
                                                    SOCKET,
 | 
					 | 
				
			||||||
                                                    void*,
 | 
					 | 
				
			||||||
                                                    DWORD,
 | 
					 | 
				
			||||||
                                                    DWORD,
 | 
					 | 
				
			||||||
                                                    DWORD,
 | 
					 | 
				
			||||||
                                                    DWORD*,
 | 
					 | 
				
			||||||
                                                    OVERLAPPED*) @nogc nothrow;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    SO_MAXDG = 0x7009,
 | 
					 | 
				
			||||||
    SO_MAXPATHDG = 0x700A,
 | 
					 | 
				
			||||||
    SO_UPDATE_ACCEPT_CONTEXT = 0x700B,
 | 
					 | 
				
			||||||
    SO_CONNECT_TIME = 0x700C,
 | 
					 | 
				
			||||||
    SO_UPDATE_CONNECT_CONTEXT = 0x7010,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -3,11 +3,6 @@
 | 
				
			|||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
				
			||||||
module tanya.memory.tests.mallocator;
 | 
					module tanya.memory.tests.mallocator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
version (TanyaNative)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
else:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import tanya.memory.mallocator;
 | 
					import tanya.memory.mallocator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Fails with false
 | 
					// Fails with false
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,8 +3,6 @@
 | 
				
			|||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
				
			||||||
module tanya.memory.tests.mmappool;
 | 
					module tanya.memory.tests.mmappool;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
version (TanyaNative):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import tanya.memory.mmappool;
 | 
					import tanya.memory.mmappool;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@nogc nothrow pure @system unittest
 | 
					@nogc nothrow pure @system unittest
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user