From ef8aedec5725c6c1d4ecb9f3698e2762bc09a423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=B1=B1=20=E5=81=A5=E5=A4=AA?= Date: Tue, 28 Mar 2023 08:58:32 +0900 Subject: [PATCH 1/6] refactor: move method order --- .../kotlincsv/client/CsvFileWriter.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt b/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt index 8c98102..73afe68 100644 --- a/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt +++ b/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt @@ -98,15 +98,6 @@ class CsvFileWriter internal constructor( writer.print(rowStr) } - private fun willWriteEndTerminator() { - if (ctx.outputLastLineTerminator) { - writeTerminator() - stateHandler.setStateOfWroteLineEndTerminator() - } else { - stateHandler.setStateOfNotWroteLineEndTerminator() - } - } - /** * Will write terminator if and only if * 1. has wrote first line @@ -126,6 +117,15 @@ class CsvFileWriter internal constructor( stateHandler.setStateOfWroteLineEndTerminator() } + private fun willWriteEndTerminator() { + if (ctx.outputLastLineTerminator) { + writeTerminator() + stateHandler.setStateOfWroteLineEndTerminator() + } else { + stateHandler.setStateOfNotWroteLineEndTerminator() + } + } + private fun attachQuote(field: String): String { val shouldQuote = when (ctx.quote.mode) { WriteQuoteMode.ALL -> true From 98deb9a7e438f2eaf8a8eecdd687906137b4012a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=B1=B1=20=E5=81=A5=E5=A4=AA?= Date: Tue, 28 Mar 2023 09:03:32 +0900 Subject: [PATCH 2/6] refactor CsvWriterStateHandler --- .../kotlincsv/client/CsvWriterState.kt | 18 +++++++----------- .../kotlincsv/client/CsvFileWriter.kt | 6 ++---- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt b/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt index e5fff87..b266e30 100644 --- a/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt +++ b/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt @@ -6,20 +6,16 @@ package com.github.doyaaaaaken.kotlincsv.client */ internal class CsvWriterStateHandler { - private sealed class CsvWriterState(val wroteFirstLine: Boolean, val wroteLineEndTerminator: Boolean) { - object InitialState : CsvWriterState(wroteFirstLine = false, wroteLineEndTerminator = false) - object HasNotWroteLineEndTerminator : CsvWriterState(wroteFirstLine = true, wroteLineEndTerminator = false) - object HasWroteLineEndTerminator : CsvWriterState(wroteFirstLine = true, wroteLineEndTerminator = true) + private sealed class CsvWriterState { + object InitialState : CsvWriterState() + object HasNotWroteLineEndTerminator : CsvWriterState() + object HasWroteLineEndTerminator : CsvWriterState() } private var state: CsvWriterState = CsvWriterState.InitialState - fun hasWroteFirstLine(): Boolean { - return state.wroteFirstLine - } - - fun hasWroteLineEndTerminator(): Boolean { - return state.wroteLineEndTerminator + fun hasNotWroteLineEndTerminator(): Boolean { + return state is CsvWriterState.HasNotWroteLineEndTerminator } fun setStateOfWroteLineEndTerminator() { @@ -29,4 +25,4 @@ internal class CsvWriterStateHandler { fun setStateOfNotWroteLineEndTerminator() { state = CsvWriterState.HasNotWroteLineEndTerminator } -} \ No newline at end of file +} diff --git a/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt b/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt index 73afe68..0a4ce0a 100644 --- a/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt +++ b/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt @@ -99,12 +99,10 @@ class CsvFileWriter internal constructor( } /** - * Will write terminator if and only if - * 1. has wrote first line - * 2. state is set to has not wrote last line terminator + * Will write terminator if writer has not wrote last line terminator on previous line. */ private fun willWritePreTerminator() { - if (stateHandler.hasWroteFirstLine() && !stateHandler.hasWroteLineEndTerminator()) { + if (stateHandler.hasNotWroteLineEndTerminator()) { writeTerminator() } } From 447a4491f69aa6a144da4f0843a54d3f793251ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=B1=B1=20=E5=81=A5=E5=A4=AA?= Date: Tue, 28 Mar 2023 09:10:19 +0900 Subject: [PATCH 3/6] remove unnecessary line --- .../com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt b/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt index 0a4ce0a..5ddfd02 100644 --- a/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt +++ b/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt @@ -118,7 +118,6 @@ class CsvFileWriter internal constructor( private fun willWriteEndTerminator() { if (ctx.outputLastLineTerminator) { writeTerminator() - stateHandler.setStateOfWroteLineEndTerminator() } else { stateHandler.setStateOfNotWroteLineEndTerminator() } From 9b048db9bbd55744809b2d93592186182050ba74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=B1=B1=20=E5=81=A5=E5=A4=AA?= Date: Tue, 28 Mar 2023 10:58:27 +0900 Subject: [PATCH 4/6] refactor: rename methods and classes --- .../doyaaaaaken/kotlincsv/client/CsvWriterState.kt | 14 +++++++------- .../doyaaaaaken/kotlincsv/client/CsvFileWriter.kt | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt b/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt index b266e30..5b4fac2 100644 --- a/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt +++ b/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt @@ -8,21 +8,21 @@ internal class CsvWriterStateHandler { private sealed class CsvWriterState { object InitialState : CsvWriterState() - object HasNotWroteLineEndTerminator : CsvWriterState() - object HasWroteLineEndTerminator : CsvWriterState() + object HasWroteTerminator : CsvWriterState() + object MustWriteTerminatorOnNextLineHead : CsvWriterState() } private var state: CsvWriterState = CsvWriterState.InitialState fun hasNotWroteLineEndTerminator(): Boolean { - return state is CsvWriterState.HasNotWroteLineEndTerminator + return state is CsvWriterState.MustWriteTerminatorOnNextLineHead } - fun setStateOfWroteLineEndTerminator() { - state = CsvWriterState.HasWroteLineEndTerminator + fun setStateOfHasWroteTerminator() { + state = CsvWriterState.HasWroteTerminator } - fun setStateOfNotWroteLineEndTerminator() { - state = CsvWriterState.HasNotWroteLineEndTerminator + fun setStateOfMustWriteTerminatorOnNextLineHead() { + state = CsvWriterState.MustWriteTerminatorOnNextLineHead } } diff --git a/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt b/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt index 5ddfd02..c850670 100644 --- a/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt +++ b/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt @@ -112,14 +112,14 @@ class CsvFileWriter internal constructor( */ private fun writeTerminator() { writer.print(ctx.lineTerminator) - stateHandler.setStateOfWroteLineEndTerminator() + stateHandler.setStateOfHasWroteTerminator() } private fun willWriteEndTerminator() { if (ctx.outputLastLineTerminator) { writeTerminator() } else { - stateHandler.setStateOfNotWroteLineEndTerminator() + stateHandler.setStateOfMustWriteTerminatorOnNextLineHead() } } From 6036742f792608d131e0b1f412f8249c7f11af04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=B1=B1=20=E5=81=A5=E5=A4=AA?= Date: Tue, 28 Mar 2023 11:03:22 +0900 Subject: [PATCH 5/6] refactor state handler --- .../kotlincsv/client/CsvWriterState.kt | 21 +++++-------------- .../kotlincsv/client/CsvFileWriter.kt | 6 +++--- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt b/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt index 5b4fac2..c40534b 100644 --- a/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt +++ b/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt @@ -2,27 +2,16 @@ package com.github.doyaaaaaken.kotlincsv.client /** * CSV writer state and handler - * @author blacmko18 */ internal class CsvWriterStateHandler { - private sealed class CsvWriterState { - object InitialState : CsvWriterState() - object HasWroteTerminator : CsvWriterState() - object MustWriteTerminatorOnNextLineHead : CsvWriterState() - } - - private var state: CsvWriterState = CsvWriterState.InitialState - - fun hasNotWroteLineEndTerminator(): Boolean { - return state is CsvWriterState.MustWriteTerminatorOnNextLineHead - } + private var mustWriteTerminatorOnNextLineHead: Boolean = false - fun setStateOfHasWroteTerminator() { - state = CsvWriterState.HasWroteTerminator + fun mustWriteTerminatorOnLineHead(): Boolean { + return mustWriteTerminatorOnNextLineHead } - fun setStateOfMustWriteTerminatorOnNextLineHead() { - state = CsvWriterState.MustWriteTerminatorOnNextLineHead + fun setMustWriteTerminatorOnNextLineHead(must: Boolean) { + mustWriteTerminatorOnNextLineHead = must } } diff --git a/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt b/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt index c850670..0e3b025 100644 --- a/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt +++ b/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt @@ -102,8 +102,9 @@ class CsvFileWriter internal constructor( * Will write terminator if writer has not wrote last line terminator on previous line. */ private fun willWritePreTerminator() { - if (stateHandler.hasNotWroteLineEndTerminator()) { + if (stateHandler.mustWriteTerminatorOnLineHead()) { writeTerminator() + stateHandler.setMustWriteTerminatorOnNextLineHead(false) } } @@ -112,14 +113,13 @@ class CsvFileWriter internal constructor( */ private fun writeTerminator() { writer.print(ctx.lineTerminator) - stateHandler.setStateOfHasWroteTerminator() } private fun willWriteEndTerminator() { if (ctx.outputLastLineTerminator) { writeTerminator() } else { - stateHandler.setStateOfMustWriteTerminatorOnNextLineHead() + stateHandler.setMustWriteTerminatorOnNextLineHead(true) } } From 653d40356ff82d8f8f497522f3741942d814bb51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=B1=B1=20=E5=81=A5=E5=A4=AA?= Date: Tue, 28 Mar 2023 11:12:57 +0900 Subject: [PATCH 6/6] Delete CSVWriterState --- .../kotlincsv/client/CsvWriterState.kt | 17 ----------------- .../kotlincsv/client/CsvFileWriter.kt | 13 ++++--------- 2 files changed, 4 insertions(+), 26 deletions(-) delete mode 100644 src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt diff --git a/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt b/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt deleted file mode 100644 index c40534b..0000000 --- a/src/commonMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvWriterState.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.github.doyaaaaaken.kotlincsv.client - -/** - * CSV writer state and handler - */ -internal class CsvWriterStateHandler { - - private var mustWriteTerminatorOnNextLineHead: Boolean = false - - fun mustWriteTerminatorOnLineHead(): Boolean { - return mustWriteTerminatorOnNextLineHead - } - - fun setMustWriteTerminatorOnNextLineHead(must: Boolean) { - mustWriteTerminatorOnNextLineHead = must - } -} diff --git a/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt b/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt index 0e3b025..2ddbe46 100644 --- a/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt +++ b/src/jvmMain/kotlin/com/github/doyaaaaaken/kotlincsv/client/CsvFileWriter.kt @@ -17,13 +17,10 @@ class CsvFileWriter internal constructor( private val writer: PrintWriter ) : ICsvFileWriter, Closeable, Flushable { - /** - * state handling to write terminator for next line - */ - private val stateHandler = CsvWriterStateHandler() - private val quoteNeededChars = setOf('\r', '\n', ctx.quote.char, ctx.delimiter) + private var hasWroteInitialChar: Boolean = false + /** * write one row */ @@ -96,15 +93,15 @@ class CsvFileWriter internal constructor( } } writer.print(rowStr) + hasWroteInitialChar = true } /** * Will write terminator if writer has not wrote last line terminator on previous line. */ private fun willWritePreTerminator() { - if (stateHandler.mustWriteTerminatorOnLineHead()) { + if (!ctx.outputLastLineTerminator && hasWroteInitialChar) { writeTerminator() - stateHandler.setMustWriteTerminatorOnNextLineHead(false) } } @@ -118,8 +115,6 @@ class CsvFileWriter internal constructor( private fun willWriteEndTerminator() { if (ctx.outputLastLineTerminator) { writeTerminator() - } else { - stateHandler.setMustWriteTerminatorOnNextLineHead(true) } }