;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; EDITOR VISUAL DEL LENGUAJE C ;; ;; Modulo: headers.lsp ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; Autor: J. Rafael R. Ochoa ;; ;; e-mail: rochoa@zeus.umich.mx ;; ;; Universidad Michoacana de ;; ;; Morelia, Mich. MEXICO ;; ;; ;; ;; Marzo 1998 ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (setq lista nil) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; de headers ;;;;;;;;;;;;;;; ;; Macro utilizada para cargar el contenido del archivo ;; headers.txt en la variable global "lista" ;;;;;;; ;(with-open-file (ver-headers "c:\\maestria\\compil~1\\editor~1\\headers.txt" ; :direction :input) ; (do ((elemento (read ver-headers nil) ; (read ver-headers nil))) ; ((not elemento)) ; (push elemento lista))) ;;;;; (crea-headers lista 20 5) <<==== ;;;;;;;;;;;;;;;;;;; ;; Funcion empleada para la creacion de los headers ;; en la *ventana-secundaria* A cada header se le ;; asocia un hotspot ;;;;;;; (defun crea-headers (lista-de-headers pos_x pos_y) (cond ((null lista-de-headers) nil) (T (progn (ghw:draw-rectangle *ventana-secundaria* pos_x pos_y 80 30 :pen *lapiz-azul* :brush *relleno-amarillo*) (ghw:draw-text *ventana-secundaria* (+ pos_x 5) (+ pos_y 5) (string (car lista-de-headers))) (let ((hotspot (ghw:make-hotspot *ventana-secundaria* :x pos_x :y pos_y :width 80 :height 30 :status :active))) (ghw:add-to-object-method hotspot :mouse-left-down '(:after (entro))) (ghw:add-to-object-method hotspot :mouse-out '(:after (salio)))) (crea-headers (cdr lista-de-headers) pos_x (+ pos_y 40)))))) (defun header-stdio () (ghw:draw-rectangle *ventana-secundaria* 20 5 80 30 :pen *lapiz-azul* :brush *relleno-amarillo*) (ghw:draw-text *ventana-secundaria* 25 10 "stdio.h") (let ((hotspot (ghw:make-hotspot *ventana-secundaria* :x 20 :y 5 :width 80 :height 30 :status :active))) (ghw:add-to-object-method hotspot :mouse-left-down '(:after (entro-stdio))))) (defun header-stdlib () (ghw:draw-rectangle *ventana-secundaria* 20 45 80 30 :pen *lapiz-azul* :brush *relleno-amarillo*) (ghw:draw-text *ventana-secundaria* 25 50 "stdlib.h") (let ((hotspot (ghw:make-hotspot *ventana-secundaria* :x 20 :y 45 :width 80 :height 30 :status :active))) (ghw:add-to-object-method hotspot :mouse-left-down '(:after (entro-stdlib))))) (defun header-string () (ghw:draw-rectangle *ventana-secundaria* 20 85 80 30 :pen *lapiz-azul* :brush *relleno-amarillo*) (ghw:draw-text *ventana-secundaria* 25 90 "string.h") (let ((hotspot (ghw:make-hotspot *ventana-secundaria* :x 20 :y 85 :width 80 :height 30 :status :active))) (ghw:add-to-object-method hotspot :mouse-left-down '(:after (entro-string))))) (defun entro-stdio (hotspot &rest ignore) (if (agrega-header 'stdio.h) (escribe-encabezado "#include <stdio.h>"))) (defun entro-stdlib (hotspot &rest ignore) (if (agrega-header 'stdlib.h) (escribe-encabezado "#include <stdlib.h>"))) (defun entro-string (hotspot &rest ignore) (if (agrega-header 'string.h) (escribe-encabezado "#include <string.h>"))) (defun escribe-encabezado (encabezado) (ghw:draw-text *ventana-principal* 20 posicion-renglon encabezado) (setq posicion-renglon (+ posicion-renglon 20))) (defun borra-texto (x1 y1 x2 y2) (ghw:draw-rectangle *ventana-secundaria* x1 y1 x2 y2 :pen *lapiz-azul*)) (defun entro (hotspot &rest ignore) (borra-texto 10 285 70 40) (ghw:draw-text (ghw:hotspot-window hotspot) 30 300 "hola") (ghw:force-window-output)) (defun salio (hotspot &rest ignore) (borra-texto 10 285 70 40) (ghw:draw-text (ghw:hotspot-window hotspot) 30 300 "adios") (ghw:force-window-output)) (defun limpia (hotspot &rest ignore) (limpia-ventana-secundaria)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Almacenamiento de los headers que se ;;; han empleado (setq *headers-usados* nil) ;;;;;;;;;;;;;;;; ;; Funcion que forma la lista de headers empleados ;;;; (defun agrega-header (header) (let ((header-en-la-lista? (search (list header) *headers-usados*))) (cond ;; NO se encuentra aun en la lista de headers ((null header-en-la-lista?) (pushnew header *headers-usados*)) ;; si se encuentra (T nil))))