GLOBAL.LSP



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;						;;
;;	EDITOR VISUAL DEL LENGUAJE C		;;
;;	Modulo: global.lsp			;;
;;						;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;						;;
;;	Autor: J. Rafael R. Ochoa		;;
;;	e-mail: rochoa@zeus.umich.mx    	;;
;;	Universidad Michoacana de 		;;
;;	Morelia, Mich. MEXICO			;;
;;						;;
;;	Marzo 1998				;;
;;						;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;




;;;;	VARIABLES GLOBALES


(setq tipos-de-variables nil)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 	de las variables-globales

;(with-open-file (ver-tipos "c:\\maestria\\compil~1\\editor~1\\tipos.txt"
;	:direction :input)
;	(do ((elemento (read ver-tipos nil)
;		(read ver-tipos nil)))
;		((not elemento))
;  	(push elemento tipos-de-variables)))

(defun muestra-tipos (lista-de-tipos pos_x pos_y)
  (cond ((null lista-de-tipos) 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-tipos)))
	       (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))))                           
	       (muestra-tipos (cdr lista-de-tipos) pos_x (+ pos_y 40))))))


(defun global-int ()
  (ghw:draw-rectangle *ventana-secundaria* 20 5 80 30
		        :pen *lapiz-azul* :brush *relleno-amarillo*)
	       (ghw:draw-text *ventana-secundaria* 25 10 
				"int")
	       (let ((hotspot
       			(ghw:make-hotspot *ventana-secundaria* :x 20 :y 5
               			:width 80 :height 30
               			:status :active)))
       			(ghw:add-to-object-method hotspot :mouse-out
                                        '(:after (borra-hotspot)))  
       			(ghw:add-to-object-method hotspot :mouse-left-down
                                        '(:after (pide-int)))))

(defun pide-int (hotspot &rest ignore)
	     (obten-valor-global 'int))	
  

(defun global-float ()
  (ghw:draw-rectangle *ventana-secundaria* 20 45 80 30
		        :pen *lapiz-azul* :brush *relleno-amarillo*)
	       (ghw:draw-text *ventana-secundaria* 25 50 
				"float")
	       (let ((hotspot
       			(ghw:make-hotspot *ventana-secundaria* :x 20 :y 45
               			:width 80 :height 30
               			:status :active)))
       			(ghw:add-to-object-method hotspot :mouse-out
                                        '(:after (borra-hotspot)))  
       			(ghw:add-to-object-method hotspot :mouse-left-down
                                        '(:after (pide-float)))))

(defun pide-float (hotspot &rest ignore)
	     (obten-valor-global 'float))

 
(defun global-double ()
  (ghw:draw-rectangle *ventana-secundaria* 20 85 80 30
		        :pen *lapiz-azul* :brush *relleno-amarillo*)
	       (ghw:draw-text *ventana-secundaria* 25 90 
				"double")
	       (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 (pide-double)))))

(defun pide-double (hotspot &rest ignore)
	     (obten-valor-global 'double))


(defun global-char ()
  (ghw:draw-rectangle *ventana-secundaria* 20 125 80 30
		        :pen *lapiz-azul* :brush *relleno-amarillo*)
	       (ghw:draw-text *ventana-secundaria* 25 130 
				"char")
	       (let ((hotspot
       			(ghw:make-hotspot *ventana-secundaria* :x 20 :y 125
               			:width 80 :height 30
               			:status :active)))
       			(ghw:add-to-object-method hotspot :mouse-left-down
                                        '(:after (pide-char)))))

(defun pide-char (hotspot &rest ignore)
	     (obten-valor-global 'char))



(defun global-apuntador-a-caracter ()
  (ghw:draw-rectangle *ventana-secundaria* 20 165 80 30
		        :pen *lapiz-azul* :brush *relleno-amarillo*)
	       (ghw:draw-text *ventana-secundaria* 25 170 
				"char *")
	       (let ((hotspot
       			(ghw:make-hotspot *ventana-secundaria* :x 20 :y 165
               			:width 80 :height 30
               			:status :active)))
       			(ghw:add-to-object-method hotspot :mouse-left-down
                                        '(:after (pide-apuntador)))))

(defun pide-apuntador (hotspot &rest ignore)
	     (obten-valor-global 'char*))


(defun global-arreglo-de-caracteres ()
  (ghw:draw-rectangle *ventana-secundaria* 20 205 80 30
		        :pen *lapiz-azul* :brush *relleno-amarillo*)
	       (ghw:draw-text *ventana-secundaria* 25 210 
				"char []")
	       (let ((hotspot
       			(ghw:make-hotspot *ventana-secundaria* :x 20 :y 205
               			:width 80 :height 30
               			:status :active)))
       			(ghw:add-to-object-method hotspot :mouse-left-down
                                        '(:after (entro-string)))))



(defun arreglo-de-caracteres ()
  	(ghw:draw-rectangle *ventana-secundaria* 20 240 185 30
		        :pen *lapiz-azul* :brush *relleno-amarillo*)
	       (ghw:draw-text *ventana-secundaria* 30 245
				"Arreglo de caracteres"))



(defun variable-tipo-char ()
  	(apuntador-a-caracter)
	(arreglo-de-caracteres))

(defun apuntador-a-caracter ()
  	(ghw:draw-rectangle *ventana-secundaria* 20 200 180 30
		        :pen *lapiz-azul* :brush *relleno-amarillo*)
	       (ghw:draw-text *ventana-secundaria* 30 205
				"Apuntador a Caracter")
	       (let ((hotspot
       			(ghw:make-hotspot *ventana-secundaria* :x 20 :y 300
               			:width 120 :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)))))                





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;	Almacenamiento de las variables
;;;	globales

;;;;;;;;;;;;;;;;
;; *variables-globales* contiene una lista de
;; de cada variable global y su tipo
;;;;
(setq *variables-globales* nil)

;;;;;;;;;;;;;;;;
;; Funcion que forma la lista de variables globales
;;;;
(defun agrega-variable-global (variable tipo)
(if (null (encuentra-variable variable *variables-globales*))
    	(progn
	     (if (null *variables-globales*)
		 	(progn
			(ghw:draw-text *ventana-principal* 40 posicion-renglon
					 "/* Variables Globales */")
			(setq posicion-renglon (+ posicion-renglon 20))))
  		(push (variable-con-tipo variable tipo) *variables-globales*)
		  (imprime-variable-global tipo variable))))

;;;;;;;;;;;;;;;;
;; Impresion de la variable global
;;;;
(defun imprime-variable-global (tipo variable)
(let ((tipo-en-minusculas
       (nstring-downcase (string tipo))))
(let ((tipo-y-variable
       (concatenate 'string tipo-en-minusculas " " variable "\;")))
(ghw:draw-text *ventana-principal* 20 posicion-renglon tipo-y-variable)
  (setq posicion-renglon (+ posicion-renglon 20)))))



;;;;;;;;;;;;;;;;
;; Forma un par que contiene la variable y su tipo
;;;; 
(defun variable-con-tipo (variable tipo)
  (list variable tipo))

;;;;;;;;;;;;;;;;
;; Funcion que busca si existe una variable en la lista de
;; variables. Si existe regresa una lista que contiene
;; la variable junto con su tipo. Si no existe regresa nil
;;;;
(defun encuentra-variable (variable lista-de-variables)
	(let ((par 
		(car lista-de-variables)))
	(cond ((null par) nil)
		((string= variable (car par)) par)
		(t (encuentra-variable variable (cdr lista-de-variables))))))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;	Peticion del nombre de la variable global
;;;;;;
(defun obten-valor-global (tipo)
(let ((nombre-global 
	(ghw:make-window :title "Variable global"
  			         :x-scrollbar-p nil
				 :y-scrollbar-p nil
				 :height 70 :width 250
				 :system-menu-p nil
				 :reshapeable-p nil
				 :status :active)))
(let ((stream (ws::make-window-stream nombre-global)))
(let ((input (read-line stream)))
(agrega-variable-global input tipo)
(setf (ghw:window-caret-p nombre-global) t)
(ghw:flush-window nombre-global)))))