From 273dc5b1044e2f847d8bce02b3b4af7506ddeef8 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 5 Apr 2026 17:15:24 -0500 Subject: [PATCH] Replace CSVWriter with manual string building for KMP migration --- .../kotlin/org/isoron/platform/io/Strings.kt | 10 ++++++++++ .../java/org/isoron/uhabits/core/models/HabitList.kt | 9 ++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/uhabits-core/src/commonMain/kotlin/org/isoron/platform/io/Strings.kt b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/io/Strings.kt index 6c552498..585a2d3d 100644 --- a/uhabits-core/src/commonMain/kotlin/org/isoron/platform/io/Strings.kt +++ b/uhabits-core/src/commonMain/kotlin/org/isoron/platform/io/Strings.kt @@ -22,3 +22,13 @@ package org.isoron.platform.io expect fun format(format: String, arg: String): String expect fun format(format: String, arg: Int): String expect fun format(format: String, arg: Double): String + +fun csvLine(fields: Array): String { + return fields.joinToString(",") { field -> + if (field.any { it == ',' || it == '"' || it == '\n' || it == '\r' }) { + "\"${field.replace("\"", "\"\"")}\"" + } else { + field + } + } + "\n" +} diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt index e8e44e01..73becf14 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt @@ -18,7 +18,7 @@ */ package org.isoron.uhabits.core.models -import com.opencsv.CSVWriter +import org.isoron.platform.io.csvLine import org.isoron.platform.io.format import java.io.IOException import java.io.Writer @@ -192,8 +192,7 @@ abstract class HabitList : Iterable { "Target Value", "Archived?" ) - val csv = CSVWriter(out) - csv.writeNext(header, false) + out.write(csvLine(header)) for (habit in this) { val (numerator, denominator) = habit.frequency val cols = arrayOf( @@ -210,9 +209,9 @@ abstract class HabitList : Iterable { if (habit.isNumerical) habit.targetValue.toString() else "", habit.isArchived.toString() ) - csv.writeNext(cols, false) + out.write(csvLine(cols)) } - csv.close() + out.close() } abstract fun resort()