From 712382dbc6a1f21396ff4682f7e3bec78f617c5a Mon Sep 17 00:00:00 2001 From: Pranav Mangal Date: Thu, 17 Sep 2026 23:46:52 +0530 Subject: [PATCH] fix: Parse negative ASCII integer values correctly --- Sources/App/PointerExtensions.swift | 18 ++++++------- Tests/AppTests/geocoding_apiTests.swift | 34 +++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/Sources/App/PointerExtensions.swift b/Sources/App/PointerExtensions.swift index 59d2506..db8ee6f 100644 --- a/Sources/App/PointerExtensions.swift +++ b/Sources/App/PointerExtensions.swift @@ -42,15 +42,16 @@ extension UnsafeRawBufferPointer { var asciiToInt32: Int32 { let ascii0 = Character("0").asciiValue! + var sign: Int32 = 1; var ret: Int32 = 0; for val in self { if val == 45 { - ret = ret * -1 + sign = -1 } else { ret = ret * 10 + Int32(val - ascii0) } } - return ret + return ret * sign } var asciiToUInt32: UInt32 { @@ -68,31 +69,30 @@ extension UnsafeRawBufferPointer { var asciiToInt16: Int16 { let ascii0 = Character("0").asciiValue! + var sign: Int16 = 1; var ret: Int16 = 0; for val in self { if val == 45 { - ret = ret * -1 + sign = -1 } else { ret = ret * 10 + Int16(val - ascii0) } } - return ret + return ret * sign } var asciiToInt8: Int8 { let ascii0 = Character("0").asciiValue! + var sign: Int8 = 1; var ret: Int8 = 0; - if self.count > 2 { - print(self.string) - } for val in self { if val == 45 { - ret = ret * -1 + sign = -1 } else { ret = ret * 10 + Int8(val - ascii0) } } - return ret + return ret * sign } /*var asciiToInt: Int64 { diff --git a/Tests/AppTests/geocoding_apiTests.swift b/Tests/AppTests/geocoding_apiTests.swift index 194761d..304e8db 100644 --- a/Tests/AppTests/geocoding_apiTests.swift +++ b/Tests/AppTests/geocoding_apiTests.swift @@ -143,4 +143,38 @@ final class geocoding_apiTests: XCTestCase { XCTAssertEqual(GeocodingDatabase.Geonames.populationToRank(2_000_000), 1.0) XCTAssertEqual(GeocodingDatabase.Geonames.populationToRank(10_000_000), 1.0) } + + func testAsciiToIntParsing() { + let zero = "0".data(using: .utf8)! + let neg8 = "-42".data(using: .utf8)! + let neg16 = "-233".data(using: .utf8)! + let neg32 = "-1234567".data(using: .utf8)! + let pos8 = "42".data(using: .utf8)! + let pos16 = "1234".data(using: .utf8)! + let pos32 = "1234567".data(using: .utf8)! + + zero.withUnsafeBytes { ptr in + XCTAssertEqual(ptr.asciiToInt16, 0) + XCTAssertEqual(ptr.asciiToInt32, 0) + XCTAssertEqual(ptr.asciiToInt8, 0) + } + neg8.withUnsafeBytes { ptr in + XCTAssertEqual(ptr.asciiToInt8, -42) + } + neg16.withUnsafeBytes { ptr in + XCTAssertEqual(ptr.asciiToInt16, -233) + } + neg32.withUnsafeBytes { ptr in + XCTAssertEqual(ptr.asciiToInt32, -1_234_567) + } + pos8.withUnsafeBytes { ptr in + XCTAssertEqual(ptr.asciiToInt8, 42) + } + pos16.withUnsafeBytes { ptr in + XCTAssertEqual(ptr.asciiToInt16, 1234) + } + pos32.withUnsafeBytes { ptr in + XCTAssertEqual(ptr.asciiToInt32, 1_234_567) + } + } }