;; ============================================================ ;; 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)