From 552da72011e382fa0875e796770dc88d2d2acd44 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Tue, 26 May 2026 12:18:49 +0200 Subject: [PATCH] =?UTF-8?q?erste=20fassung=20einer=20.dbg=20library=20f?= =?UTF-8?q?=C3=BCr=20lisp=20Programme=20erzeugt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lisp/SSG_LIB_Commands.lsp | 11 -- Lisp/ssg_dbg.lsp | 237 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 237 insertions(+), 11 deletions(-) create mode 100644 Lisp/ssg_dbg.lsp diff --git a/Lisp/SSG_LIB_Commands.lsp b/Lisp/SSG_LIB_Commands.lsp index 791c18e..66c263b 100644 --- a/Lisp/SSG_LIB_Commands.lsp +++ b/Lisp/SSG_LIB_Commands.lsp @@ -4,17 +4,6 @@ ;; durch echte Funktionalitaet ersetzt werden. ;; ============================================================ -;; --- ILS / Kreisel-Module --- -(defun c:ILS_Kreisel () - (princ "\n[DUMMY] ILS_Kreisel aufgerufen") - (princ) -) - -(defun c:ILS_Eckrad () - (princ "\n[DUMMY] ILS_Eckrad aufgerufen") - (princ) -) - ;; --- ILS / Zusatzmodul --- (defun c:ILS_BTMT_Beladung () (princ "\n[DUMMY] ILS_BTMT_Beladung aufgerufen") diff --git a/Lisp/ssg_dbg.lsp b/Lisp/ssg_dbg.lsp new file mode 100644 index 0000000..9388392 --- /dev/null +++ b/Lisp/ssg_dbg.lsp @@ -0,0 +1,237 @@ +;; ============================================================ +;; SSG_DBG.LSP - Debug-Routinensammlung +;; +;; Funktionen: +;; (dbgopen "dateiname.dbg") - Oeffnet Debug-Datei +;; (dbgclose) - Schliesst Debug-Datei +;; (dbgon) - Aktiviert Debug-Ausgabe +;; (dbgoff) - Deaktiviert Debug-Ausgabe +;; (dbgf "funktionsname") - Schreibt Funktionseintritt mit { +;; (dbgreturn wert) - Schreibt Funktionsaustritt mit } = wert +;; (dbg wert) - Schreibt Variable mit aktuellem Wert +;; (dbgp "text") - Debug-Print (Alias fuer dbgmsg) +;; (dbgmsg "text") - Freitext-Nachricht loggen +;; +;; dbgon/dbgoff steuert, ob Ausgaben geschrieben werden. +;; Damit kann man gezielt nur bestimmte Abschnitte debuggen. +;; Ein (dbgoff) VOR (dbgopen) verhindert das Anlegen der Datei. +;; +;; Beispiel: +;; (dbgopen "test.dbg") +;; (dbgoff) ; ab hier keine Ausgabe +;; (dbgf "unwichtig") ; wird NICHT geschrieben +;; (dbgreturn 0) +;; (dbgon) ; ab hier wieder Ausgabe +;; (dbgf "meine-funktion") +;; (dbg 'x) +;; (dbgreturn ergebnis) +;; (dbgclose) +;; +;; Erzeugt z.B.: +;; meine-funktion(){ +;; x=42 +;; } = 99 +;; ============================================================ + +;; Globale Variablen +(setq *dbg-file* nil) ; Datei-Handle +(setq *dbg-indent* 0) ; Aktuelle Einruecktiefe +(setq *dbg-active* T) ; Debug-Ausgabe aktiv (Standard: ein) + +;; ------------------------------------------------------------ +;; DBGON - Debug-Ausgabe aktivieren +;; ------------------------------------------------------------ +(defun dbgon () + (setq *dbg-active* T) + (princ) +) + +;; ------------------------------------------------------------ +;; DBGOFF - Debug-Ausgabe deaktivieren +;; ------------------------------------------------------------ +(defun dbgoff () + (setq *dbg-active* nil) + (princ) +) + +;; ------------------------------------------------------------ +;; DBGOPEN - Debug-Datei oeffnen +;; Wenn *dbg-active* nil ist, wird keine Datei angelegt. +;; Parameter: +;; filename - Dateiname (z.B. "test.dbg") +;; envvar - Optional: Name einer Umgebungsvariable fuer das +;; Zielverzeichnis (z.B. "DXFM_LOG"). +;; Wenn nil oder nicht gesetzt, wird "." verwendet. +;; Aufruf: +;; (dbgopen "test.dbg" "DXFM_LOG") -> C:\...\log\test.dbg +;; (dbgopen "test.dbg" nil) -> .\test.dbg +;; (dbgopen "test.dbg") -> .\test.dbg +;; ------------------------------------------------------------ +(defun dbgopen (filename envvar / dir fullpath ts) + (if (not *dbg-active*) + (progn + (prompt "\n[DBG] Debug deaktiviert - keine Datei angelegt.") + (princ) + ) + (progn + ;; Verzeichnis bestimmen + (setq dir nil) + (if (and envvar (/= envvar "")) + (progn + (setq dir (getenv envvar)) + (prompt (strcat "\n[DBG] getenv " envvar " = " (if dir dir "nil"))) + ) + ) + (if (or (not dir) (= dir "")) + (setq dir ".") + ) + ;; Pfad zusammenbauen (Backslash am Ende sicherstellen) + (if (and (/= (substr dir (strlen dir) 1) "\\") + (/= (substr dir (strlen dir) 1) "/")) + (setq dir (strcat dir "\\")) + ) + (setq fullpath (strcat dir filename)) + (prompt (strcat "\n[DBG] Oeffne: " fullpath)) + (if *dbg-file* (close *dbg-file*)) + (setq *dbg-file* (open fullpath "w")) + (setq *dbg-indent* 0) + (if *dbg-file* + (progn + ;; Timestamp sicher erzeugen (menucmd kann nil liefern) + (setq ts (menucmd "M=$(edtime,$(getvar,date),YYYY-MO-DD HH:MM:SS)")) + (if (not ts) (setq ts "(kein Zeitstempel)")) + (write-line (strcat "=== DEBUG START " ts " ===") *dbg-file*) + (prompt (strcat "\n[DBG] Debug-Datei geoeffnet: " fullpath)) + ) + (prompt (strcat "\n[DBG] FEHLER: Konnte Debug-Datei nicht oeffnen: " fullpath)) + ) + (princ) + ) + ) +) + +;; ------------------------------------------------------------ +;; DBGCLOSE - Debug-Datei schliessen +;; ------------------------------------------------------------ +(defun dbgclose ( / ts) + (if *dbg-file* + (progn + (setq ts (menucmd "M=$(edtime,$(getvar,date),YYYY-MO-DD HH:MM:SS)")) + (if (not ts) (setq ts "(kein Zeitstempel)")) + (write-line (strcat "=== DEBUG ENDE " ts " ===") *dbg-file*) + (close *dbg-file*) + (setq *dbg-file* nil) + (setq *dbg-indent* 0) + (prompt "\n[DBG] Debug-Datei geschlossen.") + ) + (prompt "\n[DBG] Keine Debug-Datei geoeffnet.") + ) + (princ) +) + +;; ------------------------------------------------------------ +;; DBG-TABS - Hilfsfunktion: Erzeugt Einrueckung +;; ------------------------------------------------------------ +(defun dbg-tabs (/ result i) + (setq result "" i 0) + (repeat *dbg-indent* + (setq result (strcat result "\t")) + ) + result +) + +;; ------------------------------------------------------------ +;; DBG-TOSTRING - Hilfsfunktion: Wert in String umwandeln +;; ------------------------------------------------------------ +(defun dbg-tostring (val) + (cond + ((= val nil) "nil") + ((= (type val) 'STR) (strcat "\"" val "\"")) + ((= (type val) 'INT) (itoa val)) + ((= (type val) 'REAL) (rtos val 2 6)) + ((= (type val) 'LIST) + (strcat "(" (dbg-list-tostring val) ")") + ) + ((= (type val) 'ENAME) (strcat "")) + (T (vl-princ-to-string val)) + ) +) + +;; ------------------------------------------------------------ +;; DBG-LIST-TOSTRING - Hilfsfunktion: Liste in String +;; ------------------------------------------------------------ +(defun dbg-list-tostring (lst / result first) + (setq result "" first T) + (foreach item lst + (if first + (setq first nil) + (setq result (strcat result " ")) + ) + (setq result (strcat result (dbg-tostring item))) + ) + result +) + +;; ------------------------------------------------------------ +;; DBGF - Funktionseintritt loggen +;; Schreibt "funktionsname(){" und erhoeht Einrueckung +;; ------------------------------------------------------------ +(defun dbgf (funcname) + (if (and *dbg-file* *dbg-active*) + (progn + (write-line (strcat (dbg-tabs) funcname "(){") *dbg-file*) + (setq *dbg-indent* (1+ *dbg-indent*)) + ) + ) + (princ) +) + +;; ------------------------------------------------------------ +;; DBGRETURN - Funktionsaustritt loggen +;; Verringert Einrueckung und schreibt "} = wert" +;; ------------------------------------------------------------ +(defun dbgreturn (retval) + (if (and *dbg-file* *dbg-active*) + (progn + (setq *dbg-indent* (max 0 (1- *dbg-indent*))) + (write-line (strcat (dbg-tabs) "} = " (dbg-tostring retval)) *dbg-file*) + ) + ) + (princ) +) + +;; ------------------------------------------------------------ +;; DBG - Variable/Wert loggen +;; Schreibt " name='wert'" +;; Aufruf: (dbg 'varname) oder (dbg wert) +;; ------------------------------------------------------------ +(defun dbg (varname / val) + (if (and *dbg-file* *dbg-active*) + (if (= (type varname) 'SYM) + (progn + (setq val (eval varname)) + (write-line (strcat (dbg-tabs) (vl-symbol-name varname) "=" (dbg-tostring val)) *dbg-file*) + ) + (write-line (strcat (dbg-tabs) "value=" (dbg-tostring varname)) *dbg-file*) + ) + ) + (princ) +) + +;; ------------------------------------------------------------ +;; DBGMSG - Freitext-Nachricht loggen +;; ------------------------------------------------------------ +(defun dbgmsg (msg) + (if (and *dbg-file* *dbg-active*) + (write-line (strcat (dbg-tabs) ">> " msg) *dbg-file*) + ) + (princ) +) + +;; ------------------------------------------------------------ +;; DBGP - Alias fuer DBGMSG (debug print) +;; ------------------------------------------------------------ +(defun dbgp (msg) (dbgmsg msg)) + +(prompt "\nssg_dbg geladen.") +(princ)