V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MrKrabs
V2EX  ›  Swift

5 分钟用 Swift 写个 ripripgrep

  •  
  •   MrKrabs · 2 天前 · 287 次点击

    你别管什么 NFC ,NFD ,咱只是想搜出日语呢

    import Foundation
    import ArgumentParser
    
    @main
    struct Ripripgrep: ParsableCommand {
    
      @Option(name: .shortAndLong)
      var patterns: [String]
    
      @Argument(help: "use stdin if no args")
      var files: [String] = []
    
      func validate() throws {
        if patterns.isEmpty {
          fatalError("no patterns!")
        }
      }
    
      struct Worker {
        var line: UnsafeMutablePointer<CChar>?
        var linecap = 0
        let patterns: [Regex<AnyRegexOutput>]
    
        mutating func start(stream: UnsafeMutablePointer<FILE>) {
          while case let linelen = getline(&line, &linecap, stream),
                linelen > 0 {
            let line = String(decoding: UnsafeRawBufferPointer(start: line!, count: linelen-1), as: UTF8.self)
            if patterns.allSatisfy({ line.contains($0) }) {
              print(line)
            }
          }
        }
      }
    
      func run() throws {
    
        var worker = Worker(patterns: try patterns.map { try Regex($0).ignoresCase() })
    
        if files.isEmpty {
          // use stdin
          worker.start(stream: stdin)
        } else {
          for file in files {
            let stream = fopen(file, "rb")!
            defer { fclose(stream) }
            worker.start(stream: stream)
          }
        }
      }
    
    }
    
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1139 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:42 · PVG 02:42 · LAX 11:42 · JFK 14:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.