;;; -*- Mode:LISP; Package:SYSTEM-INTERNALS; Base:10; Patch-File:T; Readtable:ZL -*-


;;; KLUDGES.
;;; NIL USES #\^G SYNTAX.

(DEFUN XR-#\-MACRO (STREAM IGNORE &OPTIONAL BITS)
  (MULTIPLE-VALUE-BIND (NIL NIL CHAR)
      (XR-XRTYI STREAM NIL T)
    (LOGIOR
      (%LOGDPB (OR BITS 0) %%KBD-CONTROL-META 0)
      (COND ((= CHAR #/^)
	     (SEND STREAM :UNTYI CHAR)
	     (PKG-BIND PKG-KEYWORD-PACKAGE
	       (LET ((FROB (INTERNAL-READ STREAM T NIL T)))
		 (COND (*READ-SUPPRESS*
			0)
		       ((STRING-EQUAL FROB "^")
			#/^)
		       ('ELSE
			(logxor #o100 (char-upcase (AREF (STRING FROB) 1))))))))
	    ((NOT (OR ( #/A CHAR #/Z) ( #/a CHAR #/z)))
	     CHAR)
	    ('ELSE
	     (SEND STREAM :UNTYI CHAR)
	     (PKG-BIND PKG-KEYWORD-PACKAGE
	       (LET ((FROB (INTERNAL-READ STREAM T NIL T)))	;Get symbolic name of character
		 (IF *READ-SUPPRESS* 0		;READ returns NIL in this case; don't bomb.
		   (IF (= (STRING-LENGTH FROB) 1)
		       XR-XRTYI-PREV-CHAR 
		     (OR (CDR (ASSQ FROB XR-SPECIAL-CHARACTER-NAMES))
			 (XR-PARSE-KEYBOARD-CHAR FROB)
			 (READ-ERROR
			   "#\~A is not a defined character-name." FROB)))))))))))
