2023-07-21 21:54:03 +00:00
|
|
|
//
|
|
|
|
// NdbTagElem.swift
|
|
|
|
// damus
|
|
|
|
//
|
|
|
|
// Created by William Casarin on 2023-07-21.
|
|
|
|
//
|
|
|
|
|
|
|
|
import Foundation
|
|
|
|
|
2023-07-23 18:55:36 +00:00
|
|
|
struct NdbStrIter: IteratorProtocol {
|
|
|
|
typealias Element = CChar
|
|
|
|
|
|
|
|
var ind: Int
|
|
|
|
let str: ndb_str
|
|
|
|
let tag: NdbTagElem // stored for lifetime reasons
|
|
|
|
|
|
|
|
mutating func next() -> CChar? {
|
|
|
|
let c = str.str[ind]
|
|
|
|
if (c != 0) {
|
|
|
|
ind += 1
|
|
|
|
return c
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
init(tag: NdbTagElem) {
|
|
|
|
self.str = ndb_tag_str(tag.note.note, tag.tag, tag.index)
|
|
|
|
self.ind = 0
|
|
|
|
self.tag = tag
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct NdbTagElem: Sequence {
|
|
|
|
let note: NdbNote
|
|
|
|
let tag: UnsafeMutablePointer<ndb_tag>
|
2023-07-21 21:54:03 +00:00
|
|
|
let index: Int32
|
|
|
|
|
2023-07-22 23:56:13 +00:00
|
|
|
init(note: NdbNote, tag: UnsafeMutablePointer<ndb_tag>, index: Int32) {
|
2023-07-21 21:54:03 +00:00
|
|
|
self.note = note
|
|
|
|
self.tag = tag
|
|
|
|
self.index = index
|
|
|
|
}
|
|
|
|
|
2023-07-23 18:55:36 +00:00
|
|
|
var is_id: Bool {
|
|
|
|
return ndb_tag_str(note.note, tag, index).flag == NDB_PACKED_ID
|
|
|
|
}
|
|
|
|
|
|
|
|
var count: Int {
|
|
|
|
let r = ndb_tag_str(note.note, tag, index)
|
|
|
|
if r.flag == NDB_PACKED_ID {
|
|
|
|
return 32
|
|
|
|
} else {
|
|
|
|
return strlen(r.str)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-22 23:56:13 +00:00
|
|
|
func matches_char(_ c: AsciiCharacter) -> Bool {
|
|
|
|
return ndb_tag_matches_char(note.note, tag, index, c.cchar) == 1
|
2023-07-21 21:54:03 +00:00
|
|
|
}
|
|
|
|
|
2023-07-23 18:55:36 +00:00
|
|
|
func data() -> NdbData {
|
|
|
|
let s = ndb_tag_str(note.note, tag, index)
|
|
|
|
return NdbData(note: note, str: s)
|
|
|
|
}
|
|
|
|
|
|
|
|
func id() -> Data? {
|
|
|
|
guard case .id(let id) = self.data() else { return nil }
|
|
|
|
return id.id
|
|
|
|
}
|
|
|
|
|
2023-07-21 21:54:03 +00:00
|
|
|
func string() -> String {
|
2023-07-23 18:55:36 +00:00
|
|
|
switch self.data() {
|
|
|
|
case .id(let id):
|
|
|
|
return hex_encode(id.id)
|
|
|
|
case .str(let s):
|
|
|
|
return String(cString: s.str, encoding: .utf8) ?? ""
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func makeIterator() -> NdbStrIter {
|
|
|
|
return NdbStrIter(tag: self)
|
2023-07-21 21:54:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|