.cfg Parser hinzu implementieren lassen. Spezifische Omniflo export routine die syncron in Lisp lief entfernt
This commit is contained in:
+7
-123
@@ -15,129 +15,11 @@
|
||||
;; ============================================================
|
||||
|
||||
|
||||
;; --- Datei zeilenweise einlesen ---
|
||||
(defun omni:read-file-lines (datei / f zeile ergebnis)
|
||||
(setq f (open datei "r"))
|
||||
(if (null f)
|
||||
(progn
|
||||
(princ (strcat "\n[OMNI] FEHLER: Datei nicht gefunden: " datei))
|
||||
nil
|
||||
)
|
||||
(progn
|
||||
(setq ergebnis nil)
|
||||
(while (setq zeile (read-line f))
|
||||
(setq ergebnis (cons zeile ergebnis))
|
||||
)
|
||||
(close f)
|
||||
(reverse ergebnis)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
;; --- Whitespace und Komma am Ende einer Zeile entfernen ---
|
||||
(defun omni:trim (s / len ch)
|
||||
(setq s (vl-string-trim " \t\r\n" s))
|
||||
(setq len (strlen s))
|
||||
(if (and (> len 0) (= (substr s len 1) ","))
|
||||
(setq s (substr s 1 (1- len)))
|
||||
)
|
||||
(vl-string-trim " \t\r\n" s)
|
||||
)
|
||||
|
||||
|
||||
;; --- JSON-Wert parsen (String, Zahl, null) ---
|
||||
(defun omni:parse-value (val-str / len)
|
||||
(setq val-str (omni:trim val-str))
|
||||
(cond
|
||||
((= val-str "null") nil)
|
||||
((= (substr val-str 1 1) "\"")
|
||||
;; String: Anfuehrungszeichen entfernen
|
||||
(setq len (strlen val-str))
|
||||
(if (and (> len 1) (= (substr val-str len 1) "\""))
|
||||
(substr val-str 2 (- len 2))
|
||||
val-str
|
||||
)
|
||||
)
|
||||
(T
|
||||
;; Zahl
|
||||
(if (vl-string-search "." val-str)
|
||||
(atof val-str)
|
||||
(atoi val-str)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
;; --- Eine Key-Value-Zeile parsen -> dotted pair oder nil ---
|
||||
(defun omni:parse-kv-line (zeile / pos key rest val)
|
||||
(setq zeile (omni:trim zeile))
|
||||
;; Muss mit " beginnen (Key)
|
||||
(if (and (> (strlen zeile) 0) (= (substr zeile 1 1) "\""))
|
||||
(progn
|
||||
;; Key extrahieren: zweites Anfuehrungszeichen finden
|
||||
;; vl-string-search ist 0-basiert, substr ist 1-basiert
|
||||
(setq pos (vl-string-search "\"" zeile 1))
|
||||
(if pos
|
||||
(progn
|
||||
(setq key (substr zeile 2 (1- pos)))
|
||||
;; Rest nach dem schliessenden " extrahieren
|
||||
(setq rest (substr zeile (+ pos 2)))
|
||||
;; ":" im Rest finden
|
||||
(setq pos (vl-string-search ":" rest))
|
||||
(if pos
|
||||
(progn
|
||||
(setq val (substr rest (+ pos 2)))
|
||||
(cons key (omni:parse-value val))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
;; --- JSON-Array von flachen Objekten parsen ---
|
||||
(defun omni:parse-json-array (zeilen / in-obj obj ergebnis zeile kv trimmed)
|
||||
(setq in-obj nil
|
||||
obj nil
|
||||
ergebnis nil
|
||||
)
|
||||
(foreach zeile zeilen
|
||||
(setq trimmed (omni:trim zeile))
|
||||
(cond
|
||||
;; Objekt-Start
|
||||
((= trimmed "{")
|
||||
(setq in-obj T
|
||||
obj nil
|
||||
)
|
||||
)
|
||||
;; Objekt-Ende
|
||||
((or (= trimmed "}") (= trimmed "},"))
|
||||
(if (and in-obj obj)
|
||||
(setq ergebnis (cons (reverse obj) ergebnis))
|
||||
)
|
||||
(setq in-obj nil)
|
||||
)
|
||||
;; Key-Value-Zeile innerhalb eines Objekts
|
||||
(in-obj
|
||||
(setq kv (omni:parse-kv-line zeile))
|
||||
(if kv (setq obj (cons kv obj)))
|
||||
)
|
||||
)
|
||||
)
|
||||
(reverse ergebnis)
|
||||
)
|
||||
|
||||
|
||||
;; --- JSON-Datei laden und als Liste von Alists zurueckgeben ---
|
||||
(defun omni:load-json (datei / zeilen)
|
||||
(setq zeilen (omni:read-file-lines datei))
|
||||
(if zeilen
|
||||
(omni:parse-json-array zeilen)
|
||||
)
|
||||
;; Duenner Wrapper um den zentralen JSON-Parser aus ssg_core.lsp
|
||||
;; (ssg-load-json), damit fuer alle Module derselbe Parser-Standard gilt.
|
||||
(defun omni:load-json (datei)
|
||||
(ssg-load-json datei)
|
||||
)
|
||||
|
||||
|
||||
@@ -245,8 +127,10 @@
|
||||
;; eintrag = Assoziationsliste (Rueckgabe von omni:get-bogen etc.)
|
||||
;; key = Schluesselname z.B. "Radius"
|
||||
;; Beispiel: (omni:val (omni:get-bogen 821104025) "Radius") -> 550
|
||||
;; Duenner Wrapper um ssg-val (ssg_core.lsp), damit fuer alle Module
|
||||
;; derselbe Alist-Zugriffsstandard gilt.
|
||||
(defun omni:val (eintrag key)
|
||||
(cdr (assoc key eintrag))
|
||||
(ssg-val eintrag key)
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user