Skip to content

Commit

Permalink
Size_t has inconsistent sizes on different platforms, remove this from
Browse files Browse the repository at this point in the history
the multiplatform apis as that breaks build.
  • Loading branch information
pdvrieze committed Nov 10, 2023
1 parent e5046e1 commit 3bdf01a
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ public class FileInputStream(public val filePtr: CPointer<FILE>) : InputStream()
public override val eof: Boolean
get() = feof(filePtr) != 0

public override fun <T : CPointed> read(buffer: CArrayPointer<T>, size: size_t, bufferSize: size_t): size_t {
public override fun <T : CPointed> read(buffer: CArrayPointer<T>, size: MPSizeT, bufferSize: MPSizeT): MPSizeT {
clearerr(filePtr)
val itemsRead: size_t = fread(buffer, size, bufferSize, filePtr).convert()
if (itemsRead == SIZE0) {
val itemsRead = MPSizeT(fread(buffer, size.sizeT, bufferSize.sizeT, filePtr).convert<uint64_t>())
if (itemsRead.value == 0uL) {
val error = ferror(filePtr)
if (error != 0) {
throw IOException.fromErrno(error)
Expand Down Expand Up @@ -79,13 +79,13 @@ public class FileInputStream(public val filePtr: CPointer<FILE>) : InputStream()
require(off in b.indices) { "Offset before start of array" }
require(endIdx <= b.size) { "Range size beyond buffer size" }
return b.usePinned { buf ->
read(buf.addressOf(off), sizeOf<ByteVar>().convert(), len.convert()).convert()
read(buf.addressOf(off), MPSizeT(sizeOf<ByteVar>().convert()), MPSizeT(len.convert())).value.convert()
}
}

public fun read(buffer: UByteArray, offset: Int = 0, len: Int = buffer.size - offset): Int {
buffer.usePinned { buf ->
return read(buf.addressOf(offset), 1.convert(), len.convert()).toInt()
return read(buf.addressOf(offset), MPSizeT(1u), MPSizeT(len.toULong())).value.toInt()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@ public class FileOutputStream(public val filePtr: CPointer<FILE>) : OutputStream

public fun write(buffer: UByteArray, begin: Int = 0, end: Int = buffer.size - begin): Unit {
var loopBegin: Int = begin
var remaining: size_t = (end - loopBegin).convert()
var remaining = MPSizeT((end - loopBegin).toULong())
buffer.usePinned { buf ->
while (remaining > SIZE0) {
while (remaining.value > 0uL) {
val bufferPtr = buf.addressOf(loopBegin)
val written = writePtr(bufferPtr, remaining)
loopBegin += written.toInt()
loopBegin += written.value.toInt()
remaining -= written
}
}
Expand All @@ -57,48 +57,49 @@ public class FileOutputStream(public val filePtr: CPointer<FILE>) : OutputStream

public override fun write(buffer: ByteArray, begin: Int, end: Int): Unit {
var loopBegin: Int = begin
var remaining: size_t = end.convert<size_t>() - loopBegin.convert<size_t>()
var remaining = MPSizeT((end - loopBegin).toULong())
buffer.usePinned { buf ->
while (remaining > SIZE0) {
while (remaining.value > 0uL) {
val bufStart = buf.addressOf(loopBegin)
val written = writePtr(bufStart, remaining)
loopBegin += written.toInt()
loopBegin += written.value.toInt()
remaining -= written
}
}
}

/** Write buffers to the underlying file (where valid). */
@OptIn(ExperimentalForeignApi::class)
public fun flush() {
if (fflush(filePtr) != 0) {
throw IOException.fromErrno()
}
}

public override fun <T : CPointed> writePtr(buffer: CArrayPointer<T>, size: size_t, count: size_t): size_t {
public override fun <T : CPointed> writePtr(buffer: CArrayPointer<T>, size: MPSizeT, count: MPSizeT): MPSizeT {
clearerr(filePtr)
val elemsWritten: size_t = fwrite(buffer, size, count, filePtr)
if (elemsWritten == SIZE0 && count != SIZE0) {
val elemsWritten = MPSizeT(fwrite(buffer, size.sizeT, count.sizeT, filePtr).convert())
if (elemsWritten.value == 0uL && count.value != 0uL) {
val e = ferror(filePtr)
throw IOException.fromErrno(e)
}
return elemsWritten
}

public override fun <T : CPointed> writeAllPtr(buffer: CArrayPointer<T>, size: size_t, count: size_t) {
public override fun <T : CPointed> writeAllPtr(buffer: CArrayPointer<T>, size: MPSizeT, count: MPSizeT) {

clearerr(filePtr)
var elemsRemaining: size_t = count
var elemsRemaining: size_t = count.sizeT
var currentBufferPointer = buffer
while (elemsRemaining > SIZE0) {
val elemsWritten : size_t = fwrite(currentBufferPointer, size, count, filePtr)
val elemsWritten : size_t = fwrite(currentBufferPointer, size.sizeT, count.sizeT, filePtr)
if (elemsWritten == SIZE0) {
val e = ferror(filePtr)
throw IOException.fromErrno(e)
}
elemsRemaining -= elemsWritten

currentBufferPointer = interpretCPointer((currentBufferPointer.rawValue + (elemsWritten * size).toLong()))!!
currentBufferPointer = interpretCPointer((currentBufferPointer.rawValue + (elemsWritten * size.value).toLong()))!!
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ package nl.adaptivity.xmlutil.core.impl.multiplatform
import kotlinx.cinterop.CArrayPointer
import kotlinx.cinterop.CPointed
import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.convert
import platform.posix.size_t
import platform.posix.uint32_t
import platform.posix.uint64_t

public actual abstract class InputStream : Closeable {
public abstract val eof: Boolean
Expand All @@ -49,5 +52,13 @@ public actual abstract class InputStream : Closeable {
public actual abstract fun read(): Int

@ExperimentalForeignApi
public abstract fun <T : CPointed> read(buffer: CArrayPointer<T>, size: size_t, bufferSize: size_t): size_t
public abstract fun <T : CPointed> read(buffer: CArrayPointer<T>, size: MPSizeT, bufferSize: MPSizeT): MPSizeT
}

public value class MPSizeT(public val value: uint64_t) {
public operator fun minus(other: MPSizeT): MPSizeT = MPSizeT(value - other.value)
public operator fun plus(other: MPSizeT): MPSizeT = MPSizeT(value + other.value)

@OptIn(ExperimentalForeignApi::class)
public val sizeT: size_t get() = value.convert<size_t>()
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ public class InputStreamReader(public val inputStream: InputStream) : Reader() {
inputBufferOffset = inputBufferEnd - inputBufferOffset
}
inputBufferEnd = inputBuffer.usePinned { b ->
inputStream.read(b.addressOf(inputBufferOffset), 1u, (inputBuffer.size - inputBufferOffset).convert())
.toInt() + inputBufferOffset
inputStream.read(b.addressOf(inputBufferOffset), MPSizeT(1u), MPSizeT((inputBuffer.size - inputBufferOffset).toULong()))
.value.toInt() + inputBufferOffset
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,31 +21,31 @@
package nl.adaptivity.xmlutil.core.impl.multiplatform

import kotlinx.cinterop.*
import platform.posix.size_t
import platform.posix.uint64_t

public actual abstract class OutputStream : Closeable {
/**
* Write the buffer with the given amount of elements. It gets the element size from the type parameter.
*/
@ExperimentalForeignApi
public inline fun <reified T : CVariable> writePtr(buffer: CArrayPointer<T>, count: size_t): size_t {
return writePtr(buffer, sizeOf<T>().convert(), count)
public inline fun <reified T : CVariable> writePtr(buffer: CArrayPointer<T>, count: MPSizeT): MPSizeT {
return writePtr(buffer, MPSizeT(sizeOf<T>().convert<uint64_t>()), count)
}

/**
* Write the buffer to the underlying stream. Effectively wrapping fwrite.
*/
@ExperimentalForeignApi
public abstract fun <T : CPointed> writePtr(buffer: CArrayPointer<T>, size: size_t, count: size_t): size_t
public abstract fun <T : CPointed> writePtr(buffer: CArrayPointer<T>, size: MPSizeT, count: MPSizeT): MPSizeT

@ExperimentalForeignApi
public inline fun <reified T : CVariable> writeAllPtr(buffer: CArrayPointer<T>, count: Int) {
writeAllPtr(buffer, sizeOf<T>().convert(), count.convert())
writeAllPtr(buffer, MPSizeT(sizeOf<T>().convert<uint64_t>()), MPSizeT(count.toULong()))
}


@ExperimentalForeignApi
public abstract fun <T : CPointed> writeAllPtr(buffer: CArrayPointer<T>, size: size_t, count: size_t)
public abstract fun <T : CPointed> writeAllPtr(buffer: CArrayPointer<T>, size: MPSizeT, count: MPSizeT)

public actual abstract fun write(b: Int)

Expand All @@ -59,6 +59,6 @@ public actual abstract class OutputStream : Closeable {
require(off in 0 until b.size) { "Offset before start of array" }
require(endIdx <= b.size) { "Range size beyond buffer size" }

b.usePinned { writePtr(it.addressOf(off), sizeOf<ByteVar>().convert(), len.convert()) }
b.usePinned { writePtr(it.addressOf(off), MPSizeT(sizeOf<ByteVar>().convert<uint64_t>()), MPSizeT(len.toULong())) }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import kotlinx.cinterop.*
import nl.adaptivity.xmlutil.core.impl.multiplatform.FileOutputStream.Mode
import platform.posix.FILE
import platform.posix.size_t
import platform.posix.uint64_t

public class OutputStreamWriter(public val outStream: OutputStream) : Writer(), Closeable {

Expand All @@ -43,7 +44,7 @@ public class OutputStreamWriter(public val outStream: OutputStream) : Writer(),
val buffer = allocArray<UByteVar>(4)

val byteCount: size_t = addCodepointToBuffer(buffer, codepoint)
if (outStream.writePtr(buffer, byteCount) != byteCount) error("Failure to write full character")
if (outStream.writePtr(buffer, MPSizeT(byteCount.convert<uint64_t>())).sizeT != byteCount) error("Failure to write full character")
}
return this
}
Expand Down

0 comments on commit 3bdf01a

Please sign in to comment.