From 30635a4d0835321c204cd3a9be67b43603a83575 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Tue, 10 Sep 2019 17:35:12 +0200 Subject: [PATCH] fixed parsing data from top output in cpu and memory reader --- Stats/Modules/CPU/CPUReader.swift | 12 +++++++----- Stats/Modules/Memory/MemoryReader.swift | 11 +++++++---- Stats/libs/Extensions.swift | 23 +++++++++++++++++++++++ 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/Stats/Modules/CPU/CPUReader.swift b/Stats/Modules/CPU/CPUReader.swift index 6a200851..76ae07d0 100644 --- a/Stats/Modules/CPU/CPUReader.swift +++ b/Stats/Modules/CPU/CPUReader.swift @@ -84,15 +84,17 @@ class CPUReader: Reader { var processes: [TopProcess] = [] outputString.enumerateLines { (line, stop) -> () in if line.matches("^\\d+ + .+ +\\d+.\\d *$") { - let arr = line.condenseWhitespace().split(separator: " ") - let pid = Int(arr[0]) ?? 0 - let command = String(arr[1]) - let usage = Double(arr[2]) ?? 0 + var str = line.trimmingCharacters(in: .whitespaces) + let pidString = str.findAndCrop(pattern: "^\\d+") + let usageString = str.findAndCrop(pattern: " [0-9]+\\.[0-9]*$") + let command = str.trimmingCharacters(in: .whitespaces) + + let pid = Int(pidString) ?? 0 + let usage = Double(usageString) ?? 0 let process = TopProcess(pid: pid, command: command, usage: usage) processes.append(process) } } - self.processes << processes } diff --git a/Stats/Modules/Memory/MemoryReader.swift b/Stats/Modules/Memory/MemoryReader.swift index 2f5d010b..c33fa3fe 100644 --- a/Stats/Modules/Memory/MemoryReader.swift +++ b/Stats/Modules/Memory/MemoryReader.swift @@ -76,10 +76,13 @@ class MemoryReader: Reader { var processes: [TopProcess] = [] outputString.enumerateLines { (line, stop) -> () in if line.matches("^\\d+ + .+ +\\d+.\\d[M\\+\\-]+ *$") { - let arr = line.condenseWhitespace().split(separator: " ") - let pid = Int(arr[0]) ?? 0 - let command = String(arr[1]) - guard let usage = Double(arr[2].filter("01234567890.".contains)) else { + var str = line.trimmingCharacters(in: .whitespaces) + let pidString = str.findAndCrop(pattern: "^\\d+") + let usageString = str.findAndCrop(pattern: " [0-9]+M(\\+)*(\\-)*$") + let command = str.trimmingCharacters(in: .whitespaces) + + let pid = Int(pidString) ?? 0 + guard let usage = Double(usageString.filter("01234567890.".contains)) else { return } let process = TopProcess(pid: pid, command: command, usage: usage * Double(1024 * 1024)) diff --git a/Stats/libs/Extensions.swift b/Stats/libs/Extensions.swift index 558e864b..9a37663d 100755 --- a/Stats/libs/Extensions.swift +++ b/Stats/libs/Extensions.swift @@ -205,3 +205,26 @@ extension NSColor { return String(format:"#%06x", rgb) } } + +extension String { + mutating func findAndCrop(pattern: String) -> String { + let regex = try! NSRegularExpression(pattern: pattern) + let stringRange = NSRange(location: 0, length: self.utf16.count) + var line = self + + if let searchRange = regex.firstMatch(in: self, options: [], range: stringRange) { + let start = self.index(self.startIndex, offsetBy: searchRange.range.lowerBound) + let end = self.index(self.startIndex, offsetBy: searchRange.range.upperBound) + let value = String(self[start..