(FILECREATED "15-Nov-84 14:03:31" {ERIS}<LAFITE>LAFITE.;105 64452  

      changes to:  (VARS LAFITECOMS LAFITEGLOBALS LAFITECOMMANDMENUITEMS LAFITESUBQUITMENUITEMS 
			 LAFITEPROFILEVARS)
		   (RECORDS MAILSERVER)
		   (FNS \LAFITEDEFAULTHOST&DIR \LAFITE.MODE.TITLE MAKELAFITECOMMANDWINDOW LAFITEMODE 
			\LAFITE.AFTERLOGIN \LAFITE.QUIT.PROC \LAFITE.QUIT \LAFITE.READ.PROFILE 
			\LAFITE.SUBQUIT \LAFITE.RESTART PROMPTFORFILENAME DOMAINLAFITECOMMAND 
			\LAFITE.START.PROC \LAFITE.GLOBAL.INIT \LAFITE.SHOW.MODE LAFITE 
			LA.LONGFILENAME)

      previous date: "24-Sep-84 15:19:52" {ERIS}<LAFITE>LAFITE.;92)


(* Copyright (c) 1982, 1983, 1984 by Xerox Corporation and Bolt Beranek and Newman Inc.
. All rights reserved.)

(PRETTYCOMPRINT LAFITECOMS)

(RPAQQ LAFITECOMS [(COMS (E (SETQ LAFITESYSTEMDATE (DATE)))
			 (VARS LAFITEVERSION# LAFITESYSTEMDATE))
	(COMS (FNS LAFITE \LAFITE.START.PROC LA.CREATE.UPDATE.MENUS \LAFITE.PROCESS 
		   \LAFITE.START.ABORT \LAFITE.QUIT \LAFITE.RESTART \LAFITE.SUBQUIT \LAFITE.QUIT.PROC 
		   \LAFITEDEFAULTHOST&DIR LAFITEDEFAULTHOST&DIR MAKELAFITECOMMANDWINDOW 
		   EXTRACTMENUCOMMAND DOMAINLAFITECOMMAND)
	      (PROP ARGNAMES LAFITE)
	      (FNS LAFITEMODE \LAFITE.SHOW.MODE \LAFITE.MODE.TITLE)
	      (PROP VARTYPE LAFITEMODELST)
	      (INITVARS (\LAFITEMODE)
			(\LAFITE.AUTHENTICATION.FAILURE)))
	(INITVARS * LAFITEPROFILEVARS)
	(INITVARS * LAFITERANDOMGLOBALS)
	(VARS * LAFITEMARKS)
	(VARS LAFITECOMMANDMENUITEMS LAFITEUPDATEMENUITEMS LAFITECLOSEITEM LAFITEUPDATETOCITEM 
	      LAFITECLOSELABELS ANOTHERFOLDERMENUITEM LAFITESUBQUITMENUITEMS)
	(INITVARS (LAFITESTATUSWINDOW)
		  (\ACTIVELAFITEFOLDERS)
		  (\LAFITEPROFILECHANGED)
		  (\LAFITE.TEMPFILES)
		  (LAFITEPRIMARYDISPLAYWINDOW)
		  (LAFITEMAILFOLDERS)
		  (LAFITEFOLDERSMENU)
		  (LAFITEUPDATEMENUS)
		  (\LAFITE.MODE.CHOICES)
		  (LAFITESUBQUITMENU))
	(FNS LA.RESETSHADE LA.REMOVEDUPLICATES COLLECTOLDFILES LA.SETDIFFERENCE NTHMESSAGE 
	     \LAFITE.MAKE.MSGARRAY \LAFITE.ADDMESSAGES.TO.ARRAY)
	(COMS (* Display aids)
	      (CURSORS LA.CROSSCURSOR))
	(COMS (INITVARS (\LAFITE.ACTIVE)
			(\LAFITE.READY)
			(\LAFITEDEFAULTHOST&DIR)
			(\LAFITEUSERDATA))
	      (ADDVARS (\SYSTEMCACHEVARS \LAFITE.READY \LAFITEUSERDATA))
	      (FNS LAFITE.AROUNDEXIT CHECKLAFITEMAILFOLDERS \LAFITE.REBROWSEFOLDER \LAFITE.AFTERLOGIN)
	      )
	(COMS (* Low level file functions)
	      (FNS \LAFITE.WRITE.PROFILE \LAFITE.READ.PROFILE DELETEMAILFOLDER FORGETMAILFILE 
		   \LAFITE.UNCACHE.FOLDER \LAFITE.OPEN.FOLDER \LAFITE.OPENSTREAM \LAFITE.CREATE.MENU 
		   \LAFITE.EOF \LAFITE.CLOSE.FOLDER PROMPTFORFILENAME \LAFITE.PROMPTFORFOLDER 
		   MAKELAFITEMAILFOLDERSMENU MAILFOLDERBUSY LA.LONGFILENAME PROFILEFILENAME 
		   TOCFILENAME LA.SHORTFILENAME)
	      (FNS COPY7BITFILE FIXLAURELFILE \LAFITE.BROWSE.LAURELFILE \LAFITE.FIX.LAUREL.FOLDER))
	[COMS (FNS \LAFITE.GLOBAL.INIT)
	      (DECLARE: DONTEVAL@LOAD DOCOPY (FILES LAFITEBROWSE LAFITESEND LAFITEMAIL TEDIT 
						    ATTACHEDWINDOW)
			(P (\LAFITE.GLOBAL.INIT]
	(DECLARE: DOEVAL@COMPILE DONTCOPY (COMS * LAFITECOMPILETIME))
	(INITRECORDS MAILFOLDER LAFITEMSG)
	(SYSRECORDS MAILFOLDER LAFITEMSG)
	(DECLARE: DOEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA)
									    (NLAML)
									    (LAMA LAFITE])

(RPAQQ LAFITEVERSION# 9)

(RPAQQ LAFITESYSTEMDATE "15-Nov-84 14:03:34")
(DEFINEQ

(LAFITE
  [LAMBDA X                                                  (* bvm: "30-Oct-84 17:04")

          (* * The first argument should be ON or OFF. The second argument, if supplied, is the name of the mailfile Lafite 
	  should browse unless the second argument is NIL in which case no mailfile will be browsed. If there is no second 
	  argument then default to DEFAULTMAILFOLDERNAME mailfile -- currently ACTIVE * *)


    (SELECTQ (COND
	       ((ILESSP X 1)                                 (* Lafite called with no args *)
		 (QUOTE ON))
	       (T (ARG X 1)))
	     [(ON on)
	       (COND
		 (\LAFITE.ACTIVE (TOTOPW LAFITESTATUSWINDOW)
				 (QUOTE ON))
		 ((NOT (THIS.PROCESS))
		   "No Processes!")
		 (T (COND
		      ((NOT (WINDOWP LAFITESTATUSWINDOW))
			(MAKELAFITECOMMANDWINDOW)))
		    (PRINTLAFITESTATUS "Initializing")
		    (SETQ \LAFITE.ACTIVE (QUOTE INIT))
		    (\LAFITE.PROCESS [LIST (FUNCTION \LAFITE.START.PROC)
					   [KWOTE (COND
						    ((ILEQ X 1)
						      DEFAULTMAILFOLDERNAME)
						    (T (ARG X 2]
					   (KWOTE (for I from 3 to X collect (ARG X I]
				     (QUOTE LAFITE))
		    (QUOTE ON]
	     ((OFF off)
	       (COND
		 (\LAFITE.ACTIVE                             (* Lafite was on *)
				 [COND
				   ((EQ \LAFITE.ACTIVE (QUOTE INIT))
                                                             (* Zap the initializer)
				     (DEL.PROCESS (QUOTE LAFITE]
				 (\LAFITE.QUIT.PROC (ASSOC (QUOTE Quit)
							   LAFITECOMMANDMENUITEMS)
						    LAFITEMAINMENU)))
	       (QUOTE OFF))
	     (LISPERROR "ILLEGAL ARG" (ARG X 1])

(\LAFITE.START.PROC
  [LAMBDA (MAILFILE OPTIONS)                                 (* bvm: " 5-Nov-84 17:22")
    (RESETSAVE NIL (LIST (FUNCTION \LAFITE.START.ABORT)))
    (\LAFITEDEFAULTHOST&DIR (OR LAFITEDEFAULTHOST&DIR LOGINHOST/DIR))
    (SETQ \LAFITE.BROWSELOCK (CREATE.MONITORLOCK "Lafite Browser Control"))
                                                             (* Used by anyone creating browsers or otherwise 
							     concerned with changes to \ACTIVELAFITEFOLDERS)
    (SETQ \LAFITE.MAINLOCK (CREATE.MONITORLOCK "Lafite Main"))
                                                             (* Used by \LAFITE.CLOSE.OTHER.FOLDERS or anyone who 
							     needs access to multiple arbitrary folders)
    (SETQ \LAFITE.PROFILELOCK (CREATE.MONITORLOCK "Lafite Profile"))
    (SETQ \LAFITE.HARDCOPYLOCK (CREATE.MONITORLOCK "Lafite hardcopy"))
                                                             (* Used by anyone reading or writing the Lafite 
							     profile)
    (\LAFITE.READ.PROFILE)
    (SETQ LAFITEUPDATEMENUS (CONS (LA.CREATE.UPDATE.MENUS LAFITEUPDATEMENUITEMS NIL NIL 
							  "Update Options")
				  (LA.CREATE.UPDATE.MENUS LAFITEUPDATEMENUITEMS LAFITECLOSELABELS 
							  LAFITECLOSEITEM "Close/Shrink Options")))
    (SETQ \LAFITE.READY T)
    (pushnew \AFTERLOGINFNS (FUNCTION \LAFITE.AFTERLOGIN))
    (pushnew AROUNDEXITFNS (FUNCTION LAFITE.AROUNDEXIT))
    (SETQ \LAFITE.ACTIVE T)
    (WITH.MONITOR \LAFITE.MAILSERVERLOCK (\LAFITE.GET.USER.DATA))
                                                             (* Authenticate user first, so that MSGFROMMEP works)
    (ADD.PROCESS (CONSTANT (LIST (FUNCTION LAFITEMAILWATCH)))
		 (QUOTE RESTARTABLE)
		 (QUOTE HARDRESET)
		 (QUOTE AFTEREXIT)
		 (QUOTE SUSPEND))
    (COND
      ((OR MAILFILE (AND (EQMEMB (QUOTE SHRINK)
				 OPTIONS)
			 (SETQ MAILFILE DEFAULTMAILFOLDERNAME)))
	(\LAFITE.BROWSE (ASSOC (QUOTE Browse)
			       (fetch (MENU ITEMS) of LAFITEMAINMENU))
			LAFITEMAINMENU NIL MAILFILE OPTIONS)))
                                                             (* Finally, enable menu)
    (replace (MENU WHENSELECTEDFN) of LAFITEMAINMENU with (FUNCTION DOMAINLAFITECOMMAND])

(LA.CREATE.UPDATE.MENUS
  [LAMBDA (MENUITEMS LASTLABELS LASTITEM TITLE)              (* bvm: "29-May-84 15:09")
    (PROG (OTHERMENUS)
          [COND
	    (MENUITEMS (SETQ OTHERMENUS (LA.CREATE.UPDATE.MENUS (CDR MENUITEMS)
								(CDR LASTLABELS)
								LASTITEM TITLE)))
	    (T (SETQ MENUITEMS (LIST LAFITEUPDATETOCITEM]
          (RETURN (CONS (\LAFITE.CREATE.MENU (COND
					       [LASTITEM (APPEND MENUITEMS
								 (LIST (CONS (CAR LASTLABELS)
									     (CDR LASTITEM]
					       (T MENUITEMS))
					     TITLE)
			OTHERMENUS])

(\LAFITE.PROCESS
  [LAMBDA (FORM NAME ALLOWLOGOUT RESTARTABLE)                (* bvm: "25-Mar-84 17:16")

          (* * Creates a process running FORM which by default is not restartable and will not permit LOGOUT while it is 
	  running)


    (ADD.PROCESS FORM (QUOTE NAME)
		 NAME
		 (QUOTE RESTARTABLE)
		 (OR RESTARTABLE (QUOTE NO))
		 (QUOTE BEFOREEXIT)
		 (COND
		   (ALLOWLOGOUT NIL)
		   (T (QUOTE DON'T])

(\LAFITE.START.ABORT
  [LAMBDA NIL                                                (* bvm: "25-Mar-84 16:44")
    (COND
      ((AND RESETSTATE (NEQ \LAFITE.ACTIVE T))
	(CLOSEW LAFITESTATUSWINDOW)
	(SETQ LAFITESTATUSWINDOW (SETQ \LAFITE.ACTIVE])

(\LAFITE.QUIT
  [LAMBDA (ITEM MENU BUTTON)                                 (* bvm: " 7-Nov-84 11:48")
    (COND
      ((EQ BUTTON (QUOTE MIDDLE))
	(\LAFITE.SUBQUIT ITEM MENU))
      (T (\LAFITE.PROCESS (LIST (FUNCTION \LAFITE.QUIT.PROC)
				(KWOTE ITEM)
				(KWOTE MENU))
			  (QUOTE LAFITEQUIT])

(\LAFITE.RESTART
  [LAMBDA (ITEM MENU)                                        (* bvm: " 7-Nov-84 11:56")
    (COND
      ((\LAFITE.QUIT.PROC ITEM MENU)
	(LAFITE (QUOTE ON)
		NIL])

(\LAFITE.SUBQUIT
  [LAMBDA (ITEM MENU)                                        (* bvm: " 7-Nov-84 11:58")
    (PROG ((MODES (for MODE in LAFITEMODELST when (LISTP (CDR MODE))
		     collect (LIST (CONCAT (CAR MODE)
					   " Mode")
				   (KWOTE (LIST (CAR MODE)))
				   "Change to this mode of mail sending/retrieving")))
	   COMMAND)
          (COND
	    ((NOT (EQUAL \LAFITE.MODE.CHOICES (SETQ \LAFITE.MODE.CHOICES MODES)))
                                                             (* Recompute menu)
	      (SETQ LAFITESUBQUITMENU)))
          (COND
	    ([LISTP (SETQ COMMAND (MENU (.LAFITEMENU. LAFITESUBQUITMENU (APPEND 
									   LAFITESUBQUITMENUITEMS 
										MODES)
						      "Mode Change"]
	      (LAFITEMODE (CAR COMMAND)))
	    (COMMAND (\LAFITE.PROCESS (LIST COMMAND (KWOTE ITEM)
					    (KWOTE MENU))
				      (QUOTE LAFITEQUIT])

(\LAFITE.QUIT.PROC
  [LAMBDA (ITEM MENU)                                        (* bvm: " 9-Nov-84 14:49")
    (RESETLST (LA.RESETSHADE ITEM MENU)
	      (OBTAIN.MONITORLOCK \LAFITE.BROWSELOCK NIL T)
	      (OBTAIN.MONITORLOCK \LAFITE.MAINLOCK NIL T)
	      (PROG ((HOW? 5)
		     MENUREG)
		    (OR \LAFITE.ACTIVE (RETURN T))
		    [for FOLDER in \ACTIVELAFITEFOLDERS bind LEVEL when (fetch (MAILFOLDER 
										    BROWSERWINDOW)
									   of FOLDER)
		       do 

          (* * Determine what to do with open browsers. Essentially same as the CLOSEFN for a browser, but we offer a single 
	  menu that offers all the choices that the most particular window might need)


			  (COND
			    ((ILESSP (SETQ LEVEL (COND
					 ((fetch (MAILFOLDER HARDCOPYSTREAM) of FOLDER)
					   1)
					 ((fetch (MAILFOLDER FOLDERNEEDSUPDATE) of FOLDER)
					   2)
					 ((fetch (MAILFOLDER FOLDERNEEDSEXPUNGE) of FOLDER)
					   3)
					 ((NEQ (fetch (MAILFOLDER #OFMESSAGES) of FOLDER)
					       (fetch (MAILFOLDER TOCLASTMESSAGE#) of FOLDER))
					   4)
					 (T 5)))
				     HOW?)
			      (SETQ HOW? LEVEL]
		    [COND
		      [(SETQ HOW? (CAR (NTH (CDR LAFITEUPDATEMENUS)
					    HOW?)))
			(SETQ HOW? (\LAFITE.CREATE.MENU [APPEND (fetch (MENU ITEMS) of HOW?)
								(QUOTE (("Don't Quit" NIL 
									 "Abort the Quit command"]
							"How should browsers be closed?"))
			(SETQ MENUREG (WINDOWPROP (WFROMMENU MENU)
						  (QUOTE REGION)))
			(SETQ HOW? (OR (MENU HOW? (create POSITION
							  XCOORD ←(IDIFFERENCE (fetch (REGION RIGHT)
										  of MENUREG)
									       (fetch (MENU 
										       IMAGEWIDTH)
										  of HOW?))
							  YCOORD ←(IDIFFERENCE (fetch (REGION BOTTOM)
										  of MENUREG)
									       (fetch (MENU 
										      IMAGEHEIGHT)
										  of HOW?)))
					     T)
				       (RETURN]
		      (T (SETQ HOW? (FUNCTION \LAFITE.FINISH.UPDATE]
		    [for FOLDER in (APPEND \ACTIVELAFITEFOLDERS) bind BROWSERWINDOW
		       do (COND
			    ((NOT (SETQ BROWSERWINDOW (fetch (MAILFOLDER BROWSERWINDOW) of FOLDER)))
			      (\LAFITE.CLOSE.FOLDER FOLDER T))
			    (T (APPLY* HOW? BROWSERWINDOW FOLDER (QUOTE CLOSE]
		    (SETQ \ACTIVELAFITEFOLDERS)
		    (PROGN [for WINDOW in LAFITEEDITORWINDOWS
			      do                             (* now close the edit and display windows *)
				 (COND
				   ((WINDOWP WINDOW)
				     (COND
				       ((OPENWP WINDOW)
					 (CLOSEW WINDOW))
				       ([WINDOWP (SETQ WINDOW (WINDOWPROP WINDOW (QUOTE ICONWINDOW]
					 (CLOSEW WINDOW]
			   (SETQ LAFITEEDITORWINDOWS NIL))
		    (AND \LAFITE.OUTBOX (CLOSEW (fetch OBWINDOW of \LAFITE.OUTBOX)))
		    (COND
		      (\LAFITEPROFILECHANGED (\LAFITE.WRITE.PROFILE)))
		    (SETQ AROUNDEXITFNS (REMOVE (FUNCTION LAFITE.AROUNDEXIT)
						AROUNDEXITFNS))
		    (PROGN (for FILE in \LAFITE.TEMPFILES
			      do                             (* delete any temp files laying around *)
				 (CLOSEF? FILE)
				 (DELFILE FILE))
			   (SETQ \LAFITE.TEMPFILES))
		    (SETQ \LAFITE.ACTIVE NIL)
		    (DEL.PROCESS (FUNCTION LAFITEMAILWATCH))
		    (LAFITECLEARCACHE)
		    (COND
		      ((OPENWP LAFITESTATUSWINDOW)
			(CLOSEW LAFITESTATUSWINDOW)))
		    [SETQ LAFITESUBQUITMENU (SETQ \LAFITE.MODE.CHOICES (SETQ LAFITEFORMATMENU
			  (SETQ LAFITEFOLDERSMENU (SETQ LAFITEFORMSMENU (SETQ LAFITEFORMFILES
				(SETQ \LAFITE.LAST.STATUS (SETQ LAFITEPRIMARYDISPLAYWINDOW
				    (SETQ \LAFITEDEFAULTHOST&DIR (SETQ LAFITEUPDATEMENUS
					(SETQ LAFITEMAINMENU (SETQ LAFITESTATUSWINDOW NIL]
		    (RETURN T])

(\LAFITEDEFAULTHOST&DIR
  [LAMBDA (HOST&DIR)                                         (* DECLARATIONS: (PROPRECORD 
							     (HOST DIRECTORY)))
                                                             (* bvm: "13-Nov-84 12:32")
    (PROG ((OLDHOST&DIR (fetch PACKEDHOST&DIR of \LAFITEDEFAULTHOST&DIR))
	   HOST UNPACKEDFIELDS)
          (COND
	    ((OR (NULL HOST&DIR)
		 (EQ (SETQ OLDHOST&DIR (U-CASE OLDHOST&DIR))
		     HOST&DIR))                              (* User wants the value, or there is no change)
	      (RETURN HOST&DIR)))
          (SETQ UNPACKEDFIELDS (UNPACKFILENAME HOST&DIR))    (* now make sure its a legitimate HOST&DIR *)
          (RETURN (COND
		    ((AND (HOSTNAMEP (SETQ HOST (fetch HOST of UNPACKEDFIELDS)))
			  (DIRECTORYNAMEP HOST&DIR)
			  (NOT (IGREATERP (LENGTH UNPACKEDFIELDS)
					  4)))               (* set both the visible and invisble variables *)
		      (SETQ \LAFITEDEFAULTHOST&DIR (create DEFAULTHOST&DIR
							   DEFAULTHOST ← HOST
							   DEFAULTDIR ←(fetch DIRECTORY of 
										   UNPACKEDFIELDS)
							   PACKEDHOST&DIR ← HOST&DIR))
                                                             (* reset all the appropriate menus *)
		      (SETQ LAFITEFOLDERSMENU (SETQ LAFITEFORMSMENU))
		      OLDHOST&DIR)
		    (T (ERROR "Invalid HOST/DIRECTORY" HOST&DIR])

(LAFITEDEFAULTHOST&DIR
  [LAMBDA (HOST&DIR)                                         (* bvm: "22-Feb-84 16:27")

          (* * Temporary definition until we can do it right)


    (SETQ LAFITEDEFAULTHOST&DIR HOST&DIR])

(MAKELAFITECOMMANDWINDOW
  [LAMBDA NIL                                                (* bvm: "11-Nov-84 18:28")
    (PROG (STATUSWINDOW MENUW MENUWREGION POSITION HEIGHT WIDTH)
          [SETQ MENUW (MENUWINDOW (SETQ LAFITEMAINMENU (create MENU
							       ITEMS ← LAFITECOMMANDMENUITEMS
							       WHENSELECTEDFN ←(FUNCTION NILL)
							       CENTERFLG ← T
							       TITLE ←(OR (\LAFITE.MODE.TITLE)
									  "L a f i t e")
							       MENUFONT ← LAFITEMENUFONT
							       MENUTITLEFONT ← LAFITETITLEFONT]
          (SETQ WIDTH (IMAX [fetch (REGION WIDTH) of (SETQ MENUWREGION (WINDOWPROP MENUW
										   (QUOTE REGION]
			    LAFITESTATUSWINDOWMINWIDTH))
          [SETQ HEIGHT (HEIGHTIFWINDOW (FIX (FTIMES (FONTPROP LAFITEMENUFONT (QUOTE HEIGHT))
						    1.5]
          (SETQ POSITION (OR LAFITESTATUSWINDOWPOSITION (GETBOXPOSITION WIDTH
									(IPLUS HEIGHT
									       (fetch (REGION HEIGHT)
										  of MENUWREGION))
									NIL NIL NIL 
						   "Specify position of the Lafite Command Menu.")))
          (SETQ STATUSWINDOW (CREATEW (create REGION
					      LEFT ←(fetch (POSITION XCOORD) of POSITION)
					      BOTTOM ←(IPLUS (fetch (POSITION YCOORD) of POSITION)
							     (fetch (REGION HEIGHT) of MENUWREGION))
					      WIDTH ← WIDTH
					      HEIGHT ← HEIGHT)))
          (DSPFONT LAFITEMENUFONT STATUSWINDOW)
          (ATTACHWINDOW MENUW STATUSWINDOW (QUOTE BOTTOM))
          [WINDOWPROP STATUSWINDOW (QUOTE BUTTONEVENTFN)
		      (FUNCTION (LAMBDA (WINDOW)
			  (COND
			    ((LASTMOUSESTATE (NOT UP))
			      (SETQ \LAFITE.LAST.STATUS)
			      (\LAFITE.WAKE.WATCHER]
          (WINDOWPROP STATUSWINDOW (QUOTE MAINWINDOWMINSIZE)
		      (CONS 0 HEIGHT))
          (WINDOWPROP STATUSWINDOW (QUOTE MAINWINDOWMAXSIZE)
		      (CONS MAX.SMALLP HEIGHT))
          (OPENW STATUSWINDOW)
          (RETURN (SETQ LAFITESTATUSWINDOW STATUSWINDOW])

(EXTRACTMENUCOMMAND
  [LAMBDA (ITEM)                                             (* DECLARATIONS: (RECORD (LABEL FORM HELPSTRING)))
                                                             (* mdy: "20-OCT-82 15:07")
    (if (NLISTP ITEM)
	then ITEM
      elseif (fetch FORM of ITEM)
	then (EVAL (fetch FORM of ITEM))
      else (fetch LABEL of ITEM])

(DOMAINLAFITECOMMAND
  [LAMBDA (ITEM MENU BUTTON)                                 (* bvm: " 5-Nov-84 16:50")
    (APPLY* (EXTRACTMENUCOMMAND ITEM)
	    ITEM MENU BUTTON])
)

(PUTPROPS LAFITE ARGNAMES (NIL (ON/OFF MAILFILE . OPTIONS) . U))
(DEFINEQ

(LAFITEMODE
  [LAMBDA (MODE)                                             (* bvm: "11-Nov-84 18:28")
    (PROG1 (fetch LAFITEMODE of \LAFITEMODE)
	   (COND
	     (MODE (while [LITATOM (CDR (SETQ MODE (OR (ASSOC MODE LAFITEMODELST)
						       (\ILLEGAL.ARG MODE]
		      do (SETQ MODE (CDR MODE)))
		   (COND
		     ((NEQ (fetch LAFITEMODE of \LAFITEMODE)
			   (fetch LAFITEMODE of (SETQ \LAFITEMODE MODE)))
                                                             (* Mode changed, kick mailwatcher)
		       (\LAFITE.SHOW.MODE)
		       (WITH.MONITOR \LAFITE.MAILSERVERLOCK (SETQ \LAFITEUSERDATA)
				     (PRINTLAFITESTATUS "Reinitializing")
				     (\LAFITE.WAKE.WATCHER])

(\LAFITE.SHOW.MODE
  [LAMBDA NIL                                                (* bvm: "30-Oct-84 16:53")
    (PROG ((TITLE (\LAFITE.MODE.TITLE))
	   (MENU LAFITEMAINMENU))
          (COND
	    (TITLE (replace (MENU TITLE) of MENU with TITLE)
		   (UPDATE/MENU/IMAGE MENU)
		   (REDISPLAYW (WFROMMENU MENU])

(\LAFITE.MODE.TITLE
  [LAMBDA NIL                                                (* bvm: "12-Nov-84 17:03")

          (* * If user wants mode shown in Lafite status window, this returns a suitable title for that window)


    (AND \LAFITEMODE [SELECTQ LAFITESHOWMODEFLG
			      (ALWAYS T)
			      (NIL NIL)
			      (CDR (for X in LAFITEMODELST collect X
				      when (LISTP (CDR (LISTP X]
	 (CONCAT "L a f i t e  (" (fetch LAFITEMODE of \LAFITEMODE)
		 ")"])
)

(PUTPROPS LAFITEMODELST VARTYPE ALIST)

(RPAQ? \LAFITEMODE )

(RPAQ? \LAFITE.AUTHENTICATION.FAILURE )

(RPAQQ LAFITEPROFILEVARS ((LAFITEDEFAULTHOST&DIR)
			  (LAFITEBUFFERSIZE 20)
			  (LAFITEIFFROMMETHENSEENFLG T)
			  [LAFITEMENUFONT (FONTCREATE (QUOTE (HELVETICA 10 BOLD]
			  [LAFITETITLEFONT (FONTCREATE (QUOTE (HELVETICA 12 BOLD]
			  [LAFITEDISPLAYFONT (FONTCREATE (QUOTE (TIMESROMAN 12]
			  (LAFITEHARDCOPYFONT LAFITEDISPLAYFONT)
			  [LAFITEBROWSERFONT (FONTCREATE (QUOTE (GACHA 10]
			  (LAFITEPROFILE.NAME (QUOTE LAFITE))
			  (LAFITEPROFILE.EXT (QUOTE PROFILE))
			  (DEFAULTMAILFOLDERNAME (QUOTE ACTIVE.MAIL))
			  (LAFITEMAIL.EXT (QUOTE MAIL))
			  (LAFITESTATUSWINDOWMINWIDTH 200)
			  (LAFITESTATUSWINDOWPOSITION (create POSITION XCOORD ← 735 YCOORD ← 650))
			  (LAFITEDEBUGFLG)
			  (LAFITEMODEDEFAULT)
			  (LAFITESHOWMODEFLG T)))

(RPAQ? LAFITEDEFAULTHOST&DIR )

(RPAQ? LAFITEBUFFERSIZE 20)

(RPAQ? LAFITEIFFROMMETHENSEENFLG T)

(RPAQ? LAFITEMENUFONT (FONTCREATE (QUOTE (HELVETICA 10 BOLD))))

(RPAQ? LAFITETITLEFONT (FONTCREATE (QUOTE (HELVETICA 12 BOLD))))

(RPAQ? LAFITEDISPLAYFONT (FONTCREATE (QUOTE (TIMESROMAN 12))))

(RPAQ? LAFITEHARDCOPYFONT LAFITEDISPLAYFONT)

(RPAQ? LAFITEBROWSERFONT (FONTCREATE (QUOTE (GACHA 10))))

(RPAQ? LAFITEPROFILE.NAME (QUOTE LAFITE))

(RPAQ? LAFITEPROFILE.EXT (QUOTE PROFILE))

(RPAQ? DEFAULTMAILFOLDERNAME (QUOTE ACTIVE.MAIL))

(RPAQ? LAFITEMAIL.EXT (QUOTE MAIL))

(RPAQ? LAFITESTATUSWINDOWMINWIDTH 200)

(RPAQ? LAFITESTATUSWINDOWPOSITION (create POSITION XCOORD ← 735 YCOORD ← 650))

(RPAQ? LAFITEDEBUGFLG )

(RPAQ? LAFITEMODEDEFAULT )

(RPAQ? LAFITESHOWMODEFLG T)

(RPAQQ LAFITERANDOMGLOBALS ((UNSUPPLIEDFIELDSTR "---")
			    (LAFITEBUSYWAITTIME 1000)
			    (LAFITEITEMBUSYSHADE 43605)
			    (LAFITEEOL "
")))

(RPAQ? UNSUPPLIEDFIELDSTR "---")

(RPAQ? LAFITEBUSYWAITTIME 1000)

(RPAQ? LAFITEITEMBUSYSHADE 43605)

(RPAQ? LAFITEEOL "
")

(RPAQQ LAFITEMARKS ((SEENMARK (CHARCODE SP))
		    (UNSEENMARK (CHARCODE ?))
		    (MOVETOMARK (CHARCODE m))
		    (FORWARDMARK (CHARCODE f))
		    (ANSWERMARK (CHARCODE a))
		    (HARDCOPYBATCHMARK (CHARCODE H))
		    (HARDCOPYMARK (CHARCODE h))))

(RPAQ SEENMARK (CHARCODE SP))

(RPAQ UNSEENMARK (CHARCODE ?))

(RPAQ MOVETOMARK (CHARCODE m))

(RPAQ FORWARDMARK (CHARCODE f))

(RPAQ ANSWERMARK (CHARCODE a))

(RPAQ HARDCOPYBATCHMARK (CHARCODE H))

(RPAQ HARDCOPYMARK (CHARCODE h))

(RPAQQ LAFITECOMMANDMENUITEMS ((Browse (QUOTE \LAFITE.BROWSE)
				       "Browse a mail file; MIDDLE for subcommands")
			       ("Send Mail" (QUOTE \LAFITE.MESSAGEFORM)
					    
				  "Open a message composition window; MIDDLE for choice of forms")
			       (Quit (QUOTE \LAFITE.QUIT)
				     "Update and close all mail files and stop Lafite")))

(RPAQQ LAFITEUPDATEMENUITEMS (("Do Hardcopy Only" (QUOTE \LAFITE.HARDCOPYONLY.PROC)
						  "Will print batched hardcopy but not update file")
			      ("Write out changes only" (QUOTE \LAFITE.UPDATE.PROC)
							
				   "Will update physical file to reflect new marks and deletions")
			      ("Expunge deleted messages" (QUOTE \LAFITE.EXPUNGE.PROC)
							  
					 "Will rewrite mail file, expunging all deleted messages")))

(RPAQQ LAFITECLOSEITEM ("Don't update file" (QUOTE ##CLOSE##)
					    "Just close/shrink the window - don't update it."))

(RPAQQ LAFITEUPDATETOCITEM ("Update table of contents" (FUNCTION \LAFITE.UPDATE.PROC)
						       
			       "Write table of contents file to speed next browse of this folder"))

(RPAQQ LAFITECLOSELABELS ("Don't Update or Hardcopy" "Don't update file" "Don't expunge file" 
						     "Just close"))

(RPAQQ ANOTHERFOLDERMENUITEM ("** Other Folder **" (QUOTE ##ANOTHERFILE##)
						   
					     "You will be asked to specify another mail filename"))

(RPAQQ LAFITESUBQUITMENUITEMS ((Quit (QUOTE \LAFITE.QUIT)
				     "Turn Lafite off")
			       (Restart (QUOTE \LAFITE.RESTART)
					"Turn Lafite off then back on")))

(RPAQ? LAFITESTATUSWINDOW )

(RPAQ? \ACTIVELAFITEFOLDERS )

(RPAQ? \LAFITEPROFILECHANGED )

(RPAQ? \LAFITE.TEMPFILES )

(RPAQ? LAFITEPRIMARYDISPLAYWINDOW )

(RPAQ? LAFITEMAILFOLDERS )

(RPAQ? LAFITEFOLDERSMENU )

(RPAQ? LAFITEUPDATEMENUS )

(RPAQ? \LAFITE.MODE.CHOICES )

(RPAQ? LAFITESUBQUITMENU )
(DEFINEQ

(LA.RESETSHADE
  [LAMBDA (ITEM MENU OLDSHADE)                               (* bvm: " 2-Mar-84 11:43")

          (* * Shades ITEM in MENU to indicate Lafite is busy, leaves something on resetlst to unshade it)


    (RESETSAVE (SHADEITEM ITEM MENU LAFITEITEMBUSYSHADE)
	       (LIST (FUNCTION SHADEITEM)
		     ITEM MENU (OR OLDSHADE WHITESHADE])

(LA.REMOVEDUPLICATES
  [LAMBDA (LST)                                              (* bvm: "18-Dec-83 16:07")

          (* * a case-independent intersection of LST and LST * *)


    (for X in LST bind RESULT unless (for GOOD in RESULT thereis (UCASE.STREQUAL X GOOD))
       do                                                    (* Collect only if we haven't seen this name before)
	  (push RESULT X)
       finally (RETURN (COND
			 ((CDR RESULT)
			   (REVERSE RESULT))
			 (T RESULT])

(COLLECTOLDFILES
  [LAMBDA (FILES EXT)                                        (* bvm: " 6-Jan-84 11:05")
    (for FILE in FILES when (AND FILE (INFILEP (LA.LONGFILENAME FILE EXT))) collect 
                                                             (* use only those mail files that do exist *)
										    FILE])

(LA.SETDIFFERENCE
  [LAMBDA (X Y)                                              (* bvm: "20-Dec-83 18:14")

          (* * Returns subset of X not in Y, case-independently)


    (for ELT in X collect ELT unless (for OTHER in Y thereis (UCASE.STREQUAL ELT OTHER])

(NTHMESSAGE
  [LAMBDA (MESSAGES N)                                       (* bvm: " 3-Jan-84 12:11")
    (ELT MESSAGES N])

(\LAFITE.MAKE.MSGARRAY
  [LAMBDA (SIZE OLDARRAY OLDSIZE)                            (* bvm: " 3-Jan-84 11:07")

          (* * Creates an array at least large enough to hold SIZE message descriptors. If OLDARRAY is given, its elements 
	  up to OLDSIZE are copied into the new array)


    (PROG [(NEWARRAY (ARRAY (IMAX (IPLUS SIZE 32)
				  (CEIL SIZE 64))
			    (QUOTE POINTER]
          [COND
	    (OLDARRAY (for I from 1 to OLDSIZE do (SETA NEWARRAY I (ELT OLDARRAY I]
          (RETURN NEWARRAY])

(\LAFITE.ADDMESSAGES.TO.ARRAY
  [LAMBDA (MSGARRAY MESSAGELIST FIRSTMSG# LASTMSG#)          (* bvm: " 3-Jan-84 11:26")

          (* * Adds to MSGARRAY the messages from MESSAGELIST, which should be numbered FIRSTMSG# thru LASTMSG# -
	  returns a new array if MSGARRAY wasn't large enough)


    [COND
      ((OR (NULL MSGARRAY)
	   (IGREATERP LASTMSG# (ARRAYSIZE MSGARRAY)))
	(SETQ MSGARRAY (\LAFITE.MAKE.MSGARRAY LASTMSG# MSGARRAY (SUB1 FIRSTMSG#]
    (COND
      ((NEQ (fetch (LAFITEMSG #) of (CAR MESSAGELIST))
	    FIRSTMSG#)
	(SHOULDNT)))
    (for MSG in MESSAGELIST as MSG# from FIRSTMSG# do (SETA MSGARRAY MSG# MSG))
    MSGARRAY])
)



(* Display aids)

(RPAQ LA.CROSSCURSOR (CURSORCREATE (READBITMAP) 8 8))
(16 16
"L@@C"
"N@@G"
"G@@N"
"CHAL"
"ALCH"
"@NG@"
"@GN@"
"@CL@"
"@CL@"
"@GN@"
"@NG@"
"ALCH"
"CHAL"
"G@@N"
"N@@G"
"L@@C")
(RPAQ? \LAFITE.ACTIVE )

(RPAQ? \LAFITE.READY )

(RPAQ? \LAFITEDEFAULTHOST&DIR )

(RPAQ? \LAFITEUSERDATA )

(ADDTOVAR \SYSTEMCACHEVARS \LAFITE.READY \LAFITEUSERDATA)
(DEFINEQ

(LAFITE.AROUNDEXIT
  [LAMBDA (EVENT)                                            (* bvm: "14-Aug-84 13:51")
    (SELECTQ EVENT
	     [(BEFORELOGOUT)
	       (SETQ \LAFITEUSERDATA NIL)
	       (RESETLST (for FOLDER in \ACTIVELAFITEFOLDERS when (OBTAIN.MONITORLOCK
								    (fetch (MAILFOLDER FOLDERLOCK)
								       of FOLDER)
								    T T)
			    do (\LAFITE.CLOSE.FOLDER FOLDER T]
	     [(AFTERLOGOUT AFTERSAVEVM AFTERSYSOUT AFTERMAKESYS)
	       (COND
		 ((EQ \LAFITE.ACTIVE T)
		   (PRINTLAFITESTATUS "Reinitializing")
		   (RESTART.PROCESS (QUOTE LAFITEMAILWATCH))
		   (CHECKLAFITEMAILFOLDERS]
	     NIL])

(CHECKLAFITEMAILFOLDERS
  [LAMBDA NIL                                                (* bvm: "14-Aug-84 13:54")

          (* * On returning from LOGOUT check to see that all the mailfiles are in a consistence state -- the user might 
	  have run Laurel and screwed up Lafite's data, or run Lafite from another machine * *)


    (COND
      ((AND \ACTIVELAFITEFOLDERS (NOT \LAFITE.READY))
	(WITH.MONITOR \LAFITE.BROWSELOCK
		      [COND
			((NOT \LAFITE.READY)
			  (SETQ \ACTIVELAFITEFOLDERS
			    (for FOLDER in \ACTIVELAFITEFOLDERS bind NEWESTNAME FULLNAME 
								     BROWSERWINDOW
			       collect FOLDER when (COND
						     ((NULL (SETQ BROWSERWINDOW (fetch (MAILFOLDER
											 
										    BROWSERWINDOW)
										   of FOLDER)))
                                                             (* Not really active, forget it)
						       (\LAFITE.CLOSE.FOLDER FOLDER T)
						       NIL)
						     ((COND
							 ((EQ (SETQ NEWESTNAME
								(INFILEP (fetch (MAILFOLDER 
									    VERSIONLESSFOLDERNAME)
									    of FOLDER)))
							      (SETQ FULLNAME (fetch (MAILFOLDER
										      FULLFOLDERNAME)
										of FOLDER)))
							   (COND
							     ((IEQP (GETFILEINFO FULLNAME
										 (QUOTE LENGTH))
								    (fetch (MAILFOLDER FOLDEREOFPTR)
								       of FOLDER))
                                                             (* Assume it hasn't changed if it's the same length)
							       T)
							     ((OPENWP BROWSERWINDOW)
							       (CLEARW BROWSERWINDOW)
							       (\LAFITE.PROCESS
								 (LIST (FUNCTION 
									 \LAFITE.REBROWSEFOLDER)
								       (KWOTE FOLDER))
								 (QUOTE LAFITEBROWSE))
							       T)
							     (T (printout PROMPTWINDOW T FULLNAME 
									  " has changed")
								NIL)))
							 ([OR (NOT NEWESTNAME)
							      (ILESSP (FILENAMEFIELD NEWESTNAME
										     (QUOTE VERSION))
								      (FILENAMEFIELD FULLNAME
										     (QUOTE VERSION]
							   (printout PROMPTWINDOW T 
								     "Couldn't find file "
								     FULLNAME)
							   NIL)
							 (T (printout PROMPTWINDOW T NEWESTNAME 
					   " is a newer version than is currently being browsed."
								      T)
							    NIL))
						       T)
						     (T (printout PROMPTWINDOW 
								 " - closing its browser window.")
							(CLOSEW (LAB.FLUSHWINDOW BROWSERWINDOW FOLDER)
								)
							(\LAFITE.CLOSE.FOLDER FOLDER T)
							NIL]
		      (SETQ \LAFITE.READY T])

(\LAFITE.REBROWSEFOLDER
  [LAMBDA (MAILFOLDER)                                       (* bvm: "28-Mar-84 14:43")
    (WITH.MONITOR (fetch (MAILFOLDER FOLDERLOCK) of MAILFOLDER)
		  (LAB.PROMPTPRINT MAILFOLDER "Folder has changed--rebrowsing...")
		  (CLEARW (fetch (MAILFOLDER BROWSERWINDOW) of MAILFOLDER))
		  (LAB.LOADFOLDER MAILFOLDER)
		  (replace (MAILFOLDER BROWSERPROMPTDIRTY) of MAILFOLDER with T])

(\LAFITE.AFTERLOGIN
  [LAMBDA (HOST USER)                                        (* bvm: "11-Nov-84 18:28")
                                                             (* Called when LOGIN gets new info.
							     If HOST = NIL, this is the global login, which means we
							     should get new data)
    (COND
      ((NULL HOST)
	(LAFITECLEARCACHE)
	(\LAFITE.WAKE.WATCHER])
)



(* Low level file functions)

(DEFINEQ

(\LAFITE.WRITE.PROFILE
  [LAMBDA NIL                                                (* bvm: "13-Jan-84 10:58")
    (PROG ((PROFILEFILE (PROFILEFILENAME)))
          (WITH.MONITOR \LAFITE.PROFILELOCK (SETQ PROFILEFILE (OPENFILE PROFILEFILE (QUOTE OUTPUT)
									(QUOTE NEW)))
			(PRIN2 LAFITEMAILFOLDERS PROFILEFILE)
			(PRIN1 " " PROFILEFILE)
			(PRIN2 LAFITEFORMFILES PROFILEFILE)
			(CLOSEF PROFILEFILE))
          (SETQ \LAFITEPROFILECHANGED])

(\LAFITE.READ.PROFILE
  [LAMBDA NIL                                                (* bvm: " 7-Nov-84 11:26")
    (PROG ((PROFILEFILE (PROFILEFILENAME))
	   NEWFILES)
          (SETQ \LAFITEPROFILECHANGED)
          (COND
	    [(INFILEP PROFILEFILE)                           (* read in the profile file *)
	      (WITH.MONITOR \LAFITE.PROFILELOCK (OPENFILE PROFILEFILE (QUOTE INPUT))
			    (SETQ LAFITEMAILFOLDERS (READ PROFILEFILE))
			    (SETQ LAFITEFORMFILES (READ PROFILEFILE))
			    (CLOSEF PROFILEFILE))
	      (COND
		((NEQ (CAR LAFITEMAILFOLDERS)
		      (fetch PACKEDHOST&DIR of \LAFITEDEFAULTHOST&DIR))
                                                             (* Old format)
		  [SETQ LAFITEMAILFOLDERS (CONS (fetch PACKEDHOST&DIR of \LAFITEDEFAULTHOST&DIR)
						(for FILE in LAFITEMAILFOLDERS
						   collect (LA.SHORTFILENAME FILE LAFITEMAIL.EXT]
		  (SETQ \LAFITEPROFILECHANGED T)))
	      (COND
		([AND NIL (NOT (EQUAL (CDR LAFITEMAILFOLDERS)
				      (SETQ NEWFILES (COLLECTOLDFILES (CDR LAFITEMAILFOLDERS)
								      LAFITEMAIL.EXT]
                                                             (* This takes too long)
		  (RPLACD LAFITEMAILFOLDERS NEWFILES)
		  (SETQ LAFITEFOLDERSMENU)
		  (SETQ \LAFITEPROFILECHANGED T)))
	      (COND
		([AND NIL (NOT (EQUAL LAFITEFORMFILES (SETQ LAFITEFORMFILES (COLLECTOLDFILES 
										  LAFITEFORMFILES 
										   LAFITEFORM.EXT]
		  (SETQ LAFITEFORMSMENU)
		  (SETQ \LAFITEPROFILECHANGED T]
	    (T (SETQ LAFITEMAILFOLDERS (CONS (fetch PACKEDHOST&DIR of \LAFITEDEFAULTHOST&DIR)
					     (SETQ LAFITEFORMFILES NIL])

(DELETEMAILFOLDER
  [LAMBDA (MAILFOLDER)                                       (* bvm: "21-Feb-84 14:55")

          (* * deletes the associated files and tells Lafite to forget about that mail file * *)


    (PROG (FILE)
          (FORGETMAILFILE (OR (fetch (MAILFOLDER SHORTFOLDERNAME) of MAILFOLDER)
			      (LA.SHORTFILENAME (fetch (MAILFOLDER VERSIONLESSFOLDERNAME)
						   of MAILFOLDER)
						LAFITEMAIL.EXT)))
          (CLOSEF? (SETQ FILE (fetch (MAILFOLDER FULLFOLDERNAME) of MAILFOLDER)))
          (DELFILE FILE)
          (SETQ FILE (TOCFILENAME FILE))
          (CLOSEF? FILE)
          (DELFILE FILE])

(FORGETMAILFILE
  [LAMBDA (FILENAME)                                         (* bvm: "21-Feb-84 14:55")

          (* * removes FILENAME from the list of known mail files and invalidates the menu cache)


    (SETQ LAFITEMAILFOLDERS (DREMOVE FILENAME LAFITEMAILFOLDERS))
    (SETQ \LAFITEPROFILECHANGED T)
    (SETQ LAFITEFOLDERSMENU])

(\LAFITE.UNCACHE.FOLDER
  [LAMBDA (ITEM MENU)                                        (* bvm: "21-Feb-84 14:58")
    (PROG [(FOLDER (MENU (OR LAFITEFOLDERSMENU (MAKELAFITEMAILFOLDERSMENU]
          (COND
	    (FOLDER (FORGETMAILFILE FOLDER)
		    (printout PROMPTWINDOW T FOLDER " forgotten."])

(\LAFITE.OPEN.FOLDER
  [LAMBDA (FOLDER ACCESS RECOG)                              (* bvm: "12-Jan-84 15:12")

          (* * For Interlisp-D its too inefficient to keep opening and closing the mail file so we will keep it open -
	  If the file wants to be open for INPUT do just that -- it may want to be a read-only mail file -- otherwise open 
	  it for BOTH -
	  FILE is always a fully qualified file name * *)


    (PROG ((STREAM (fetch (MAILFOLDER FOLDERSTREAM) of FOLDER))
	   [DESIREDACCESS (COND
			    ((EQ ACCESS (QUOTE INPUT))
			      ACCESS)
			    (T (QUOTE BOTH]
	   FILE)
          (RETURN (COND
		    ((AND STREAM (OPENP STREAM DESIREDACCESS))
		      STREAM)
		    (T (SETQ FILE (\LAFITE.OPENSTREAM (OR [COND
							    (STREAM 
                                                             (* Have to close file to reopen for BOTH)
								    (PROG1 (AND (OPENP STREAM)
										(CLOSEF STREAM))
									   (replace (MAILFOLDER
										      FOLDERSTREAM)
									      of FOLDER with NIL]
							  (fetch (MAILFOLDER FULLFOLDERNAME)
							     of FOLDER))
						      DESIREDACCESS RECOG (fetch (MAILFOLDER 
										    BROWSERWINDOW)
									     of FOLDER)))
		       (AND (EQ DESIREDACCESS (QUOTE BOTH))
			    (LINELENGTH MAX.SMALLP FILE))    (* So that LA.PRINTCOUNT won't introduce CR's.
							     Would be nice if PRINTNUM could be give a PRIN3 mode)
		       (replace (MAILFOLDER FOLDERSTREAM) of FOLDER with FILE])

(\LAFITE.OPENSTREAM
  [LAMBDA (FILE ACCESS RECOG BIGBUFS)                        (* bvm: " 6-Jan-84 12:24")
    [SETQ FILE (OPENSTREAM FILE ACCESS RECOG NIL (CONS (QUOTE (ENDOFSTREAMOP \LAFITE.EOF))
						       (AND BIGBUFS (LIST (LIST (QUOTE BUFFERS)
										LAFITEBUFFERSIZE]
    (WHENCLOSE FILE (QUOTE CLOSEALL)
	       (QUOTE NO))
    FILE])

(\LAFITE.CREATE.MENU
  [LAMBDA (ITEMS TITLE)                                      (* bvm: " 5-Mar-84 15:23")
    (create MENU
	    ITEMS ← ITEMS
	    MENUFONT ← LAFITEMENUFONT
	    TITLE ← TITLE
	    CENTERFLG ← T])

(\LAFITE.EOF
  [LAMBDA (STREAM)                                           (* bvm: "27-Dec-83 12:05")
                                                             (* End of stream op for Lafite mail folders.
							     Return endless CR's so that parses eventually stop)
    (CHARCODE CR])

(\LAFITE.CLOSE.FOLDER
  [LAMBDA (MAILFOLDER REALLYP)                               (* bvm: "14-Aug-84 13:54")

          (* * This is the companion to OPENMAILFILE)


    (PROG ((STREAM (fetch (MAILFOLDER FOLDERSTREAM) of MAILFOLDER)))
          (RETURN (COND
		    ((NULL STREAM)
		      NIL)
		    (REALLYP (PROG1 (AND (OPENP STREAM)
					 (CLOSEF STREAM))
				    (replace (MAILFOLDER FOLDERSTREAM) of MAILFOLDER with NIL)))
		    ((OPENP STREAM (QUOTE OUTPUT))
		      (FORCEOUTPUT STREAM T)
		      (fetch (MAILFOLDER FULLFOLDERNAME) of MAILFOLDER])

(PROMPTFORFILENAME
  [LAMBDA (WINDOW DEFAULT PROMPT)                            (* bvm: " 6-Nov-84 12:36")
    (RESETLST (OR PROMPT (SETQ PROMPT "Filename (CR to abort): "))
	      (RESETSAVE (TTY.PROCESS (THIS.PROCESS)))
	      (RESETSAVE NIL (LIST (COND
				     (WINDOW (FUNCTION CLEARW))
				     (T [SETQ WINDOW
					  (PROG ((FONT (DEFAULTFONT (QUOTE DISPLAY)))
						 WIDTH HEIGHT)
					        [SETQ WIDTH (WIDTHIFWINDOW
						    (IPLUS (STRINGWIDTH PROMPT FONT)
							   (ITIMES 50 (CHARWIDTH (CHARCODE A)
										 FONT]
					        [SETQ HEIGHT (HEIGHTIFWINDOW (FONTPROP FONT
										       (QUOTE HEIGHT]
					        (RETURN (CREATEW (create REGION
									 LEFT ←(IMIN LASTMOUSEX
										     (IDIFFERENCE
										       SCREENWIDTH 
										       WIDTH))
									 BOTTOM ←(IMIN LASTMOUSEY
										       (IDIFFERENCE
											 SCREENHEIGHT 
											 HEIGHT))
									 WIDTH ← WIDTH
									 HEIGHT ← HEIGHT]
					(FUNCTION CLOSEW)))
				   WINDOW))
	      (PROMPTFORWORD PROMPT DEFAULT NIL WINDOW])

(\LAFITE.PROMPTFORFOLDER
  [LAMBDA (WINDOW)                                           (* bvm: "27-Dec-83 19:12")
    (PROG [(FILE (MENU (OR LAFITEFOLDERSMENU (MAKELAFITEMAILFOLDERSMENU]
          (RETURN (SELECTQ FILE
			   (NIL NIL)
			   (##ANOTHERFILE## (PROMPTFORFILENAME WINDOW))
			   FILE])

(MAKELAFITEMAILFOLDERSMENU
  [LAMBDA NIL                                                (* bvm: " 6-Jan-84 11:26")
    (SETQ LAFITEFOLDERSMENU (create MENU
				    ITEMS ←(APPEND (SORT (CDR LAFITEMAILFOLDERS))
						   (LIST ANOTHERFOLDERMENUITEM))
				    TITLE ←(CONCAT "Folders on " (L-CASE (fetch PACKEDHOST&DIR 
									   \LAFITEDEFAULTHOST&DIR)))
				    CENTERFLG ← T])

(MAILFOLDERBUSY
  [LAMBDA (MAILFOLDER)                                       (* bvm: "29-Dec-83 18:11")
    (RESETFORM (CURSOR LA.CROSSCURSOR)
	       (BLOCK LAFITEBUSYWAITTIME])

(LA.LONGFILENAME
  [LAMBDA (FILENAME EXT)                                     (* DECLARATIONS: (PROPRECORD 
							     (HOST DIRECTORY EXTENSION)))
                                                             (* bvm: " 1-Nov-84 14:49")

          (* * Composes a (nearly) full-specified filename, filling in defaults from \LAFITEDEFAULTHOST&DIR)


    (PROG (FILEFIELDS GIVENHOST GIVENDIR)
          (OR FILENAME (RETURN))
          (SETQ FILEFIELDS (UNPACKFILENAME.STRING FILENAME))
          (SETQ GIVENHOST (fetch HOST of FILEFIELDS))
          (SETQ GIVENDIR (fetch DIRECTORY of FILEFIELDS))
          [COND
	    ((OR (NULL GIVENHOST)
		 GIVENDIR)
	      [COND
		((NULL GIVENHOST)
		  (replace HOST of FILEFIELDS with (fetch DEFAULTHOST of \LAFITEDEFAULTHOST&DIR]
	      (COND
		((NULL GIVENDIR)
		  (replace DIRECTORY of FILEFIELDS with (fetch DEFAULTDIR of \LAFITEDEFAULTHOST&DIR]
          (COND
	    ((NULL (fetch EXTENSION of FILEFIELDS))
	      (replace EXTENSION of FILEFIELDS with EXT)))
          (RETURN (PACKFILENAME FILEFIELDS])

(PROFILEFILENAME
  [LAMBDA NIL                                                (* bvm: " 2-Jan-84 15:57")
    (PACKFILENAME (QUOTE HOST)
		  (fetch DEFAULTHOST of \LAFITEDEFAULTHOST&DIR)
		  (QUOTE DIRECTORY)
		  (fetch DEFAULTDIR of \LAFITEDEFAULTHOST&DIR)
		  (QUOTE NAME)
		  LAFITEPROFILE.NAME
		  (QUOTE EXTENSION)
		  LAFITEPROFILE.EXT
		  (QUOTE VERSION)
		  1])

(TOCFILENAME
  [LAMBDA (MAILFILE)                                         (* M.Yonke "12-APR-83 12:44")
    (if MAILFILE
	then (PACKFILENAME (QUOTE EXTENSION)
			   (CONCAT (FILENAMEFIELD MAILFILE (QUOTE EXTENSION))
				   LAFITETOC.EXT)
			   (QUOTE BODY)
			   MAILFILE])

(LA.SHORTFILENAME
  [LAMBDA (FILE EXT KEEPVERSIONFLG)                          (* DECLARATIONS: (PROPRECORD 
							     (HOST DEVICE DIRECTORY EXTENSION VERSION)))
                                                             (* bvm: " 6-Jan-84 11:02")

          (* * returns that shortest file name that is compatible with \LAFITEDEFAULTHOST&DIR and EXT and no version number 
	  -- the result is used in menu creation * *)


    (COND
      (FILE (PROG [(FILEFIELDS (COND
				 ((LISTP FILE)               (* Already unpacked)
				   (APPEND FILE))
				 (T (UNPACKFILENAME FILE]
	          (COND
		    ((EQ (fetch HOST of FILEFIELDS)
			 (fetch DEFAULTHOST of \LAFITEDEFAULTHOST&DIR))
		      (replace HOST of FILEFIELDS with NIL)))
	          (COND
		    ((EQ (fetch DIRECTORY of FILEFIELDS)
			 (fetch DEFAULTDIR of \LAFITEDEFAULTHOST&DIR))
		      (replace DIRECTORY of FILEFIELDS with NIL)))
	          (COND
		    ((EQ EXT (fetch EXTENSION of FILEFIELDS))
		      (replace EXTENSION of FILEFIELDS with NIL)))
	          (COND
		    ((NOT KEEPVERSIONFLG)
		      (replace VERSION of FILEFIELDS with NIL)))
	          (RETURN (PACKFILENAME FILEFIELDS])
)
(DEFINEQ

(COPY7BITFILE
  [LAMBDA (SRCFIL DSTFIL)                                    (* bvm: " 5-Jan-84 10:57")
    (RESETLST (PROG (INSTREAM OUTSTREAM CH)
		    [RESETSAVE NIL (LIST (QUOTE CLOSEF)
					 (SETQ INSTREAM (OPENSTREAM SRCFIL (QUOTE INPUT)
								    NIL NIL (QUOTE ((SEQUENTIAL
										       T)
										     (ENDOFSTREAMOP
										       NILL]
		    [RESETSAVE NIL (LIST [FUNCTION (LAMBDA (STREAM)
					     (SETQ STREAM (CLOSEF STREAM))
					     (AND RESETSTATE (DELFILE STREAM]
					 (SETQ OUTSTREAM (OPENSTREAM
					     (OR DSTFIL (PACKFILENAME (QUOTE VERSION)
								      NIL
								      (QUOTE BODY)
								      (FULLNAME INSTREAM)))
					     (QUOTE OUTPUT)
					     (QUOTE NEW)
					     NIL
					     (LIST (QUOTE (SEQUENTIAL T))
						   (LIST (QUOTE LENGTH)
							 (GETFILEINFO INSTREAM (QUOTE LENGTH]
		    (while (SETQ CH (BIN INSTREAM)) do (BOUT OUTSTREAM (LOGAND CH 127)))
		    (RETURN (FULLNAME OUTSTREAM])

(FIXLAURELFILE
  [LAMBDA (MAILFILE)                                         (* bvm: "21-Feb-84 14:35")
    (PROG (FOLDER)
          (COND
	    ((SETQ FOLDER (WITH.MONITOR \LAFITE.BROWSELOCK (\LAFITE.GETMAILFOLDER MAILFILE)))
	      (\LAFITE.FIX.LAUREL.FOLDER FOLDER])

(\LAFITE.BROWSE.LAURELFILE
  [LAMBDA (ITEM MENU FILE)                                   (* bvm: "23-Jul-84 16:24")
    (\LAFITE.BROWSE ITEM MENU FILE (QUOTE LAUREL])

(\LAFITE.FIX.LAUREL.FOLDER
  [LAMBDA (MAILFOLDER)                                       (* bvm: "24-Sep-84 15:19")
    (RESETLST (PROG (STREAM CH BROWSERPROMPTWINDOW)
		    (OBTAIN.MONITORLOCK (fetch (MAILFOLDER FOLDERLOCK) of MAILFOLDER)
					NIL T)
		    (COND
		      ((SETQ BROWSERPROMPTWINDOW (fetch (MAILFOLDER BROWSERPROMPTWINDOW)
						    of MAILFOLDER))
			(printout BROWSERPROMPTWINDOW "Laurel scan... ")))
		    (SETQ STREAM (\LAFITE.OPEN.FOLDER MAILFOLDER (QUOTE BOTH)))
		    (RESETSAVE NIL (LIST (FUNCTION \LAFITE.CLOSE.FOLDER)
					 MAILFOLDER T))
		    (SETFILEINFO STREAM (QUOTE ENDOFSTREAMOP)
				 (FUNCTION NILL))
		    [while (SETQ CH (BIN STREAM)) do (COND
						       ((IGREATERP CH 127)
							 (\BACKFILEPTR STREAM)
							 (BOUT STREAM (LOGAND CH 127]
		    (RETURN (FULLNAME STREAM])
)
(DEFINEQ

(\LAFITE.GLOBAL.INIT
  [LAMBDA NIL                                                (* bvm: "30-Oct-84 16:33")
                                                             (* need to do this so you can send a message without 
							     "starting" lafite *)
    (DECLARE (GLOBALVARS BackgroundMenu BackgroundMenuCommands))
    (COND
      ((NOT (ASSOC (QUOTE SendMail)
		   BackgroundMenuCommands))
	[SETQ BackgroundMenuCommands (APPEND BackgroundMenuCommands
					     (LIST (LIST (QUOTE SendMail)
							 (KWOTE (LIST (FUNCTION \LAFITE.MESSAGEFORM)))
							 "Bring up a message sending form."]
	(SETQ BackgroundMenu NIL)))
    (LAFITE.INIT.PARSETABLES)
    (SETQ \LAFITE.MAILSERVERLOCK (CREATE.MONITORLOCK "Lafite Mail Servers"))
                                                             (* Used by anyone who calls \LAFITE.GET.USER.DATA or 
							     otherwise tries to muck with \LAFITEUSERDATA)
    NIL])
)
(DECLARE: DONTEVAL@LOAD DOCOPY 
(FILESLOAD LAFITEBROWSE LAFITESEND LAFITEMAIL TEDIT ATTACHEDWINDOW)

(\LAFITE.GLOBAL.INIT)
)
(DECLARE: DOEVAL@COMPILE DONTCOPY 

(RPAQQ LAFITECOMPILETIME [(FILES (IMPORT)
				 MAILCLIENT)
			  (RECORDS LAFITEUSERDATA LAFITEOPS LAFITEMSG MAILFOLDER DEFAULTHOST&DIR 
				   MAILSERVER)
			  (CONSTANTS (LAFITESTAMPLENGTH 24)
				     (DELETEDFLAG (CHARCODE D))
				     (UNDELETEDFLAG (CHARCODE U))
				     (SEENFLAG (CHARCODE S))
				     (UNSEENFLAG (CHARCODE U))
				     (LAFITEDELETEPOSITION 20)
				     (LAFITESEENPOSITION 21)
				     (LAFITEMARKPOSITION 22))
			  (CONSTANTS LAFITETOCPASSWORD LAFITETOCOVERHEADPERENTRY 
				     LAFITETOCHEADERLENGTH LAFITETOCMARKBYTEOFFSET)
			  (I.S.OPRS SELECTEDIN)
			  (MACROS UCASE.STREQUAL WORDIN FIXPIN WORDOUT FIXPOUT UCASECODE NTHMESSAGE 
				  .LAFITEMENU. MAYBEVERIFYMSG ASSURE.LAFITE.READY)
			  (GLOBALVARS * LAFITEGLOBALS)
			  (DECLARE: DONTEVAL@COMPILE (TEMPLATES WINDOWPROP WINDOWADDPROP 
								WINDOWDELPROP))
			  (COMS (FNS RELEASE.LAFITE)
				(ADDVARS (DONTCOMPILEFNS RELEASE.LAFITE])
(FILESLOAD (IMPORT)
	   MAILCLIENT)
[DECLARE: EVAL@COMPILE 

(RECORD LAFITEUSERDATA (FULLUSERNAME UNPACKEDUSERNAME ENCRYPTEDPASSWORD SHORTUSERNAME . MAILSERVERS))

(RECORD LAFITEOPS (LAFITEMODE SENDPARSER SENDER ANSWERER AUTHENTICATOR))

(DATATYPE LAFITEMSG ((PARSED? FLAG)
		     (DELETED? FLAG)
		     (SEEN? FLAG)
		     (FORMATTED? FLAG)
		     (NIL FLAG)
		     (NIL FLAG)
		     (NIL FLAG)
		     (NIL FLAG)
		     (BEGIN POINTER)
		     (MARKCHAR BYTE)
		     (MESSAGELENGTH POINTER)
		     (# WORD)
		     (STAMPLENGTH WORD)
		     (TOCLENGTH WORD)
		     (NIL WORD)
		     (MESSAGELENGTHCHANGED? FLAG)
		     (MARKSCHANGED? FLAG)
		     (SELECTED? FLAG)
		     (MSGFROMMECHECKED? FLAG)
		     (MSGFROMMETRUTH FLAG)
		     (NIL FLAG)
		     (NIL FLAG)
		     (NIL FLAG)
		     (DATE POINTER)
		     (FROM POINTER)
		     (SUBJECT POINTER)
		     (TO POINTER))                           (* BEGIN is the only absolute pointer into the message 
							     file -- all other positions are relative to BEGIN -- 
							     see the ACCESSFNS *)
		    (BLOCKRECORD LAFITEMSG ((PARSED&DELETED&SEENBITS BITS 3)
				  (NIL BITS 5)
				  (NIL POINTER)))
		    (BLOCKRECORD LAFITEMSG ((MSGFLAGBITS BITS 8)
				  (NIL POINTER)))
		    [ACCESSFNS LAFITEMSG ((END (IPLUS (fetch (LAFITEMSG MESSAGELENGTH) of DATUM)
						      (fetch (LAFITEMSG BEGIN) of DATUM)))
				(START (IPLUS (fetch (LAFITEMSG BEGIN) of DATUM)
					      (fetch (LAFITEMSG STAMPLENGTH) of DATUM)))
				(SEENFILEPTR (IPLUS (fetch (LAFITEMSG BEGIN) of DATUM)
						    LAFITESEENPOSITION))
				(MARKFILEPTR (IPLUS (fetch (LAFITEMSG BEGIN) of DATUM)
						    LAFITEMARKPOSITION))
				(DELETEFILEPTR (IPLUS (fetch (LAFITEMSG BEGIN) of DATUM)
						      LAFITEDELETEPOSITION))
				(MSGFROMMEP (COND
					      ((fetch (LAFITEMSG MSGFROMMECHECKED?) of DATUM)
						(fetch (LAFITEMSG MSGFROMMETRUTH) of DATUM))
					      (T (LA.MSGFROMMEP DATUM)))
					    (PROG1 (replace (LAFITEMSG MSGFROMMETRUTH) of DATUM
						      with NEWVALUE)
						   (replace (LAFITEMSG MSGFROMMECHECKED?)
						      of DATUM with T])

(DATATYPE MAILFOLDER ((BROWSERPROMPTDIRTY FLAG)
		      (BROWSERREADY FLAG)
		      (FOLDERNEEDSUPDATE FLAG)
		      (FOLDERNEEDSEXPUNGE FLAG)
		      (FOLDERBEINGUPDATED FLAG)
		      (HARDCOPYPENDING FLAG)
		      (NIL FLAG)
		      (FULLFOLDERNAME POINTER)
		      (VERSIONLESSFOLDERNAME POINTER)
		      (SHORTFOLDERNAME POINTER)
		      (FOLDERSTREAM POINTER)
		      (MESSAGEDESCRIPTORS POINTER)
		      (FOLDERLOCK POINTER)
		      (#OFMESSAGES WORD)
		      (TOCLASTMESSAGE# WORD)
		      (BROWSERFONTHEIGHT WORD)
		      (BROWSERFONTASCENT WORD)
		      (BROWSERFONTDESCENT WORD)
		      (BROWSERMAXXPOS WORD)
		      (ORDINALXPOS WORD)
		      (DATEXPOS WORD)
		      (FROMXPOS WORD)
		      (FROMMAXXPOS WORD)
		      (SUBJECTXPOS WORD)
		      (BROWSERDIGITWIDTH WORD)
		      (FIRSTSELECTEDMESSAGE WORD)
		      (LASTSELECTEDMESSAGE WORD)
		      (FIRSTCHANGEDMESSAGE WORD)
		      (CURRENTEOMLENGTH WORD)
		      (CURRENTDISPLAYEDSTREAM POINTER)
		      (BROWSEREXTENT POINTER)
		      (BROWSERORIGIN POINTER)
		      (BROWSERSELECTIONREGION POINTER)
		      (BROWSERWINDOW POINTER)
		      (BROWSERMENU POINTER)
		      (BROWSERMENUWINDOW POINTER)
		      (BROWSERPROMPTWINDOW POINTER)
		      (ORIGINALBROWSERTITLE POINTER)
		      (FOLDERDISPLAYWINDOWS POINTER)
		      (FOLDEREOFPTR POINTER)
		      (DEFAULTMOVETOFILE POINTER)
		      (CURRENTDISPLAYEDMESSAGE POINTER)
		      (BROWSERUPDATEFROMHERE POINTER)
		      (EXTRAFIELD POINTER)
		      (FOLDERCREATIONDATE POINTER)
		      (HARDCOPYMESSAGES POINTER)
		      (HARDCOPYSTREAM POINTER)))

(RECORD DEFAULTHOST&DIR (DEFAULTHOST DEFAULTDIR PACKEDHOST&DIR))

(RECORD MAILSERVER (MAILSERVEROPS MAILPORT MAILSERVERNAME CONTINUANCE . MAILSTATE))
]
(/DECLAREDATATYPE (QUOTE LAFITEMSG)
		  (QUOTE (FLAG FLAG FLAG FLAG FLAG FLAG FLAG FLAG POINTER BYTE POINTER WORD WORD WORD 
			       WORD FLAG FLAG FLAG FLAG FLAG FLAG FLAG FLAG POINTER POINTER POINTER 
			       POINTER)))
(/DECLAREDATATYPE (QUOTE MAILFOLDER)
		  (QUOTE (FLAG FLAG FLAG FLAG FLAG FLAG FLAG POINTER POINTER POINTER POINTER POINTER 
			       POINTER WORD WORD WORD WORD WORD WORD WORD WORD WORD WORD WORD WORD 
			       WORD WORD WORD WORD POINTER POINTER POINTER POINTER POINTER POINTER 
			       POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER 
			       POINTER POINTER POINTER POINTER)))
(DECLARE: EVAL@COMPILE 

(RPAQQ LAFITESTAMPLENGTH 24)

(RPAQ DELETEDFLAG (CHARCODE D))

(RPAQ UNDELETEDFLAG (CHARCODE U))

(RPAQ SEENFLAG (CHARCODE S))

(RPAQ UNSEENFLAG (CHARCODE U))

(RPAQQ LAFITEDELETEPOSITION 20)

(RPAQQ LAFITESEENPOSITION 21)

(RPAQQ LAFITEMARKPOSITION 22)

(CONSTANTS (LAFITESTAMPLENGTH 24)
	   (DELETEDFLAG (CHARCODE D))
	   (UNDELETEDFLAG (CHARCODE U))
	   (SEENFLAG (CHARCODE S))
	   (UNSEENFLAG (CHARCODE U))
	   (LAFITEDELETEPOSITION 20)
	   (LAFITESEENPOSITION 21)
	   (LAFITEMARKPOSITION 22))
)
(DECLARE: EVAL@COMPILE 

(RPAQQ LAFITETOCPASSWORD 45610)

(RPAQQ LAFITETOCOVERHEADPERENTRY 12)

(RPAQQ LAFITETOCHEADERLENGTH 10)

(RPAQQ LAFITETOCMARKBYTEOFFSET 4)

(CONSTANTS LAFITETOCPASSWORD LAFITETOCOVERHEADPERENTRY LAFITETOCHEADERLENGTH LAFITETOCMARKBYTEOFFSET)
)
(DECLARE: EVAL@COMPILE 
[I.S.OPR (QUOTE SELECTEDIN)
	 NIL
	 (QUOTE (bind ($$MESSAGES ← (fetch (MAILFOLDER MESSAGEDESCRIPTORS)
					   of BODY))
		      ($$MSG# ← (SUB1 (fetch (MAILFOLDER FIRSTSELECTEDMESSAGE)
					     of BODY)))
		      ($$MSGLAST ← (fetch (MAILFOLDER LASTSELECTEDMESSAGE)
					  of BODY))
		      until
		      (IGREATERP (add $$MSG# 1)
				 $$MSGLAST)
		      when
		      (fetch (LAFITEMSG SELECTED?)
			     of
			     (SETQ I.V. (NTHMESSAGE $$MESSAGES $$MSG#]
)
(DECLARE: EVAL@COMPILE 

(PUTPROPS UCASE.STREQUAL MACRO ((X Y)
				(EQ (ALPHORDER X Y UPPERCASEARRAY)
				    (QUOTE EQUAL))))

(PUTPROPS WORDIN DMACRO (= . \WIN))

(PUTPROPS WORDIN MACRO (= . \WIN))

(PUTPROPS FIXPIN DMACRO (OPENLAMBDA (STREAM)
				    (\MAKENUMBER (WORDIN STREAM)
						 (WORDIN STREAM))))

(PUTPROPS WORDOUT DMACRO (= . \WOUT))

(PUTPROPS FIXPOUT DMACRO [OPENLAMBDA (STREAM N)
				     (PROGN (WORDOUT STREAM (LRSH N 16))
					    (WORDOUT STREAM (LOGAND N 65535])

(PUTPROPS UCASECODE MACRO (OPENLAMBDA (CHAR)
				      (COND
					((AND (IGEQ CHAR (CHARCODE a))
					      (ILEQ CHAR (CHARCODE z)))
					  (LOGAND CHAR 95))
					(T CHAR))))

(PUTPROPS NTHMESSAGE MACRO (= . ELT))

(PUTPROPS .LAFITEMENU. MACRO [(NAME ITEMS TITLE)
			      (PROGN (DECLARE (GLOBALVARS NAME))
				     (OR NAME (SETQ NAME (\LAFITE.CREATE.MENU ITEMS TITLE])

(PUTPROPS MAYBEVERIFYMSG MACRO ((MSG MAILFOLDER)
				(AND LAFITEVERIFYFLG (\LAFITE.VERIFYMSG MSG MAILFOLDER))))

(PUTPROPS ASSURE.LAFITE.READY MACRO (NIL (OR \LAFITE.READY (CHECKLAFITEMAILFOLDERS))))
)

(RPAQQ LAFITEGLOBALS (LAFITESHOWMODEFLG \LAFITE.MODE.CHOICES LAFITESUBQUITMENU LAFITESUBQUITMENUITEMS 
					LAFITEMODEDEFAULT LAFITEMODELST \LAFITEMODE 
					LAFITEUPDATETOCITEM LAFITETEMPFILEHOSTNAME 
					LAFITEMOVETOCONFIRMFLG LAFITECLOSELABELS LAFITECLOSEITEM 
					LAFITEUPDATEMENUS LAFITESUBBROWSEMENU ANOTHERFOLDERMENUITEM 
					ANSWERMARK AROUNDEXITFNS BROWSERMARKXPOSITION BackgroundMenu 
					BackgroundMenuCommands DEFAULTMAILFOLDERNAME FORWARDMARK 
					HARDCOPYBATCHMARK HARDCOPYMARK LA.CROSSCURSOR 
					LA.SELECTION.BITMAP LAFITEBROWSERFONT LAFITEBROWSERMENUITEMS 
					LAFITEBROWSERREGION LAFITEBUFFERSIZE LAFITEBUSYWAITTIME 
					LAFITECOMMANDMENUITEMS LAFITEDEFAULTHOST&DIR 
					LAFITEDELETEDLINEHEIGHT LAFITEDISPLAYAFTERDELETEFLG 
					LAFITEDISPLAYFONT LAFITEDISPLAYREGION LAFITEEDITORWINDOWS 
					LAFITEENDOFMESSAGEFONT LAFITEENDOFMESSAGESTR LAFITEEOL 
					LAFITEEXTRAMENUFLG LAFITEFOLDERSMENU LAFITEFORM.EXT 
					LAFITEFORMFILES LAFITEFORMSMENU LAFITEFROMFRACTION 
					LAFITEHARDCOPY.MIN.TOC LAFITEHARDCOPYBATCHFLG 
					LAFITEHARDCOPYBATCHSHADE LAFITEHARDCOPYFONT 
					LAFITEHARDCOPYSEPARATOR LAFITEIMMEDIATECHANGESFLG 
					LAFITEITEMBUSYSHADE LAFITEMAIL.EXT LAFITEMAILFOLDERS 
					LAFITEMAINMENU LAFITEMENUFONT LAFITEMINFROMCHARS 
					LAFITENEWPAGEFLG LAFITEPRIMARYDISPLAYWINDOW LAFITEPROFILE.EXT 
					LAFITEPROFILE.NAME LAFITEREADONLYFLG LAFITESTATUSWINDOW 
					LAFITESTATUSWINDOWMINWIDTH LAFITESTATUSWINDOWPOSITION 
					LAFITESUBBROWSEMENUITEMS LAFITESYSTEMDATE LAFITETITLEFONT 
					LAFITETOC.EXT LAFITEUPDATEMENUITEMS LAFITEVERIFYFLG 
					LAFITEVERSION# LASTMOUSEBUTTONS LASTMOUSEX LASTMOUSEY 
					LOGINHOST/DIR MOVETOMARK MSGFOLDERICON MSGFOLDERMASK 
					MSGFOLDERTEMPLATE MSGSENTICON MSGSENTMASK MSGSENTTEMPLATE 
					PROMPTWINDOW SCREENHEIGHT SCREENWIDTH SEENMARK UNSEENMARK 
					UNSUPPLIEDFIELDSTR UPPERCASEARRAY \ACTIVELAFITEFOLDERS 
					\AFTERLOGINFNS \LAFITE.ACTIVE \LAFITE.BROWSELOCK 
					\LAFITE.HARDCOPYLOCK \LAFITE.LAST.STATUS 
					\LAFITE.MAILSERVERLOCK \LAFITE.MAINLOCK \LAFITE.PROFILELOCK 
					\LAFITE.READY \LAFITE.TEMPFILES \LAFITEDEFAULTHOST&DIR 
					\LAFITEPROFILECHANGED \LAFITEUSERDATA))
(DECLARE: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS LAFITESHOWMODEFLG \LAFITE.MODE.CHOICES LAFITESUBQUITMENU LAFITESUBQUITMENUITEMS 
	    LAFITEMODEDEFAULT LAFITEMODELST \LAFITEMODE LAFITEUPDATETOCITEM LAFITETEMPFILEHOSTNAME 
	    LAFITEMOVETOCONFIRMFLG LAFITECLOSELABELS LAFITECLOSEITEM LAFITEUPDATEMENUS 
	    LAFITESUBBROWSEMENU ANOTHERFOLDERMENUITEM ANSWERMARK AROUNDEXITFNS BROWSERMARKXPOSITION 
	    BackgroundMenu BackgroundMenuCommands DEFAULTMAILFOLDERNAME FORWARDMARK HARDCOPYBATCHMARK 
	    HARDCOPYMARK LA.CROSSCURSOR LA.SELECTION.BITMAP LAFITEBROWSERFONT LAFITEBROWSERMENUITEMS 
	    LAFITEBROWSERREGION LAFITEBUFFERSIZE LAFITEBUSYWAITTIME LAFITECOMMANDMENUITEMS 
	    LAFITEDEFAULTHOST&DIR LAFITEDELETEDLINEHEIGHT LAFITEDISPLAYAFTERDELETEFLG 
	    LAFITEDISPLAYFONT LAFITEDISPLAYREGION LAFITEEDITORWINDOWS LAFITEENDOFMESSAGEFONT 
	    LAFITEENDOFMESSAGESTR LAFITEEOL LAFITEEXTRAMENUFLG LAFITEFOLDERSMENU LAFITEFORM.EXT 
	    LAFITEFORMFILES LAFITEFORMSMENU LAFITEFROMFRACTION LAFITEHARDCOPY.MIN.TOC 
	    LAFITEHARDCOPYBATCHFLG LAFITEHARDCOPYBATCHSHADE LAFITEHARDCOPYFONT 
	    LAFITEHARDCOPYSEPARATOR LAFITEIMMEDIATECHANGESFLG LAFITEITEMBUSYSHADE LAFITEMAIL.EXT 
	    LAFITEMAILFOLDERS LAFITEMAINMENU LAFITEMENUFONT LAFITEMINFROMCHARS LAFITENEWPAGEFLG 
	    LAFITEPRIMARYDISPLAYWINDOW LAFITEPROFILE.EXT LAFITEPROFILE.NAME LAFITEREADONLYFLG 
	    LAFITESTATUSWINDOW LAFITESTATUSWINDOWMINWIDTH LAFITESTATUSWINDOWPOSITION 
	    LAFITESUBBROWSEMENUITEMS LAFITESYSTEMDATE LAFITETITLEFONT LAFITETOC.EXT 
	    LAFITEUPDATEMENUITEMS LAFITEVERIFYFLG LAFITEVERSION# LASTMOUSEBUTTONS LASTMOUSEX 
	    LASTMOUSEY LOGINHOST/DIR MOVETOMARK MSGFOLDERICON MSGFOLDERMASK MSGFOLDERTEMPLATE 
	    MSGSENTICON MSGSENTMASK MSGSENTTEMPLATE PROMPTWINDOW SCREENHEIGHT SCREENWIDTH SEENMARK 
	    UNSEENMARK UNSUPPLIEDFIELDSTR UPPERCASEARRAY \ACTIVELAFITEFOLDERS \AFTERLOGINFNS 
	    \LAFITE.ACTIVE \LAFITE.BROWSELOCK \LAFITE.HARDCOPYLOCK \LAFITE.LAST.STATUS 
	    \LAFITE.MAILSERVERLOCK \LAFITE.MAINLOCK \LAFITE.PROFILELOCK \LAFITE.READY 
	    \LAFITE.TEMPFILES \LAFITEDEFAULTHOST&DIR \LAFITEPROFILECHANGED \LAFITEUSERDATA)
)
(DECLARE: DONTEVAL@COMPILE 
(SETTEMPLATE (QUOTE WINDOWPROP)
	     (QUOTE (EVAL PROP EVAL . PPE)))
(SETTEMPLATE (QUOTE WINDOWADDPROP)
	     (QUOTE (EVAL PROP EVAL EVAL . PPE)))
(SETTEMPLATE (QUOTE WINDOWDELPROP)
	     (QUOTE (EVAL PROP EVAL . PPE)))
)
(DEFINEQ

(RELEASE.LAFITE
  [LAMBDA NIL                                                (* bvm: "31-Jul-84 21:40")
    (ADD.PROCESS (LIST (FUNCTION (LAMBDA NIL
			   (TTYDISPLAYSTREAM (CREATEW (QUOTE (0 248 467 163))
						      "Lafite Release"))
			   (DSPSCROLL T)
			   (WINDOWPROP (TTYDISPLAYSTREAM)
				       (QUOTE PAGEFULLFN)
				       (FUNCTION NILL))
			   (FILESLOAD (SYSLOAD)
				      COPYFILES)
			   (COPYFILES (QUOTE (LAFITE.DCOM LAFITEBROWSE.DCOM LAFITEMAIL.DCOM 
							  LAFITESEND.DCOM LAFITE LAFITEBROWSE 
							  LAFITEMAIL LAFITESEND))
				      (QUOTE {ERIS}<LAFITE>)
				      (QUOTE {ERIS}<LISPCORE>LIBRARY>)
				      T)
			   (printout T T "Lafite Release Complete"])
)

(ADDTOVAR DONTCOMPILEFNS RELEASE.LAFITE)
)
(/DECLAREDATATYPE (QUOTE MAILFOLDER)
		  (QUOTE (FLAG FLAG FLAG FLAG FLAG FLAG FLAG POINTER POINTER POINTER POINTER POINTER 
			       POINTER WORD WORD WORD WORD WORD WORD WORD WORD WORD WORD WORD WORD 
			       WORD WORD WORD WORD POINTER POINTER POINTER POINTER POINTER POINTER 
			       POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER 
			       POINTER POINTER POINTER POINTER)))
(/DECLAREDATATYPE (QUOTE LAFITEMSG)
		  (QUOTE (FLAG FLAG FLAG FLAG FLAG FLAG FLAG FLAG POINTER BYTE POINTER WORD WORD WORD 
			       WORD FLAG FLAG FLAG FLAG FLAG FLAG FLAG FLAG POINTER POINTER POINTER 
			       POINTER)))
[ADDTOVAR SYSTEMRECLST

(DATATYPE MAILFOLDER ((BROWSERPROMPTDIRTY FLAG)
		      (BROWSERREADY FLAG)
		      (FOLDERNEEDSUPDATE FLAG)
		      (FOLDERNEEDSEXPUNGE FLAG)
		      (FOLDERBEINGUPDATED FLAG)
		      (HARDCOPYPENDING FLAG)
		      (NIL FLAG)
		      (FULLFOLDERNAME POINTER)
		      (VERSIONLESSFOLDERNAME POINTER)
		      (SHORTFOLDERNAME POINTER)
		      (FOLDERSTREAM POINTER)
		      (MESSAGEDESCRIPTORS POINTER)
		      (FOLDERLOCK POINTER)
		      (#OFMESSAGES WORD)
		      (TOCLASTMESSAGE# WORD)
		      (BROWSERFONTHEIGHT WORD)
		      (BROWSERFONTASCENT WORD)
		      (BROWSERFONTDESCENT WORD)
		      (BROWSERMAXXPOS WORD)
		      (ORDINALXPOS WORD)
		      (DATEXPOS WORD)
		      (FROMXPOS WORD)
		      (FROMMAXXPOS WORD)
		      (SUBJECTXPOS WORD)
		      (BROWSERDIGITWIDTH WORD)
		      (FIRSTSELECTEDMESSAGE WORD)
		      (LASTSELECTEDMESSAGE WORD)
		      (FIRSTCHANGEDMESSAGE WORD)
		      (CURRENTEOMLENGTH WORD)
		      (CURRENTDISPLAYEDSTREAM POINTER)
		      (BROWSEREXTENT POINTER)
		      (BROWSERORIGIN POINTER)
		      (BROWSERSELECTIONREGION POINTER)
		      (BROWSERWINDOW POINTER)
		      (BROWSERMENU POINTER)
		      (BROWSERMENUWINDOW POINTER)
		      (BROWSERPROMPTWINDOW POINTER)
		      (ORIGINALBROWSERTITLE POINTER)
		      (FOLDERDISPLAYWINDOWS POINTER)
		      (FOLDEREOFPTR POINTER)
		      (DEFAULTMOVETOFILE POINTER)
		      (CURRENTDISPLAYEDMESSAGE POINTER)
		      (BROWSERUPDATEFROMHERE POINTER)
		      (EXTRAFIELD POINTER)
		      (FOLDERCREATIONDATE POINTER)
		      (HARDCOPYMESSAGES POINTER)
		      (HARDCOPYSTREAM POINTER)))

(DATATYPE LAFITEMSG ((PARSED? FLAG)
		     (DELETED? FLAG)
		     (SEEN? FLAG)
		     (FORMATTED? FLAG)
		     (NIL FLAG)
		     (NIL FLAG)
		     (NIL FLAG)
		     (NIL FLAG)
		     (BEGIN POINTER)
		     (MARKCHAR BYTE)
		     (MESSAGELENGTH POINTER)
		     (# WORD)
		     (STAMPLENGTH WORD)
		     (TOCLENGTH WORD)
		     (NIL WORD)
		     (MESSAGELENGTHCHANGED? FLAG)
		     (MARKSCHANGED? FLAG)
		     (SELECTED? FLAG)
		     (MSGFROMMECHECKED? FLAG)
		     (MSGFROMMETRUTH FLAG)
		     (NIL FLAG)
		     (NIL FLAG)
		     (NIL FLAG)
		     (DATE POINTER)
		     (FROM POINTER)
		     (SUBJECT POINTER)
		     (TO POINTER)))
]
(DECLARE: DOEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS 

(ADDTOVAR NLAMA )

(ADDTOVAR NLAML )

(ADDTOVAR LAMA LAFITE)
)
(PUTPROPS LAFITE COPYRIGHT ("Xerox Corporation and Bolt Beranek and Newman Inc." 1982 1983 1984))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (3355 18880 (LAFITE 3365 . 5153) (\LAFITE.START.PROC 5155 . 7569) (
LA.CREATE.UPDATE.MENUS 7571 . 8130) (\LAFITE.PROCESS 8132 . 8567) (\LAFITE.START.ABORT 8569 . 8820) (
\LAFITE.QUIT 8822 . 9166) (\LAFITE.RESTART 9168 . 9371) (\LAFITE.SUBQUIT 9373 . 10365) (
\LAFITE.QUIT.PROC 10367 . 14434) (\LAFITEDEFAULTHOST&DIR 14436 . 15909) (LAFITEDEFAULTHOST&DIR 15911
 . 16141) (MAKELAFITECOMMANDWINDOW 16143 . 18278) (EXTRACTMENUCOMMAND 18280 . 18690) (
DOMAINLAFITECOMMAND 18692 . 18878)) (18951 20648 (LAFITEMODE 18961 . 19754) (\LAFITE.SHOW.MODE 19756
 . 20116) (\LAFITE.MODE.TITLE 20118 . 20646)) (25061 27988 (LA.RESETSHADE 25071 . 25430) (
LA.REMOVEDUPLICATES 25432 . 25976) (COLLECTOLDFILES 25978 . 26327) (LA.SETDIFFERENCE 26329 . 26631) (
NTHMESSAGE 26633 . 26762) (\LAFITE.MAKE.MSGARRAY 26764 . 27298) (\LAFITE.ADDMESSAGES.TO.ARRAY 27300 . 
27986)) (28374 32473 (LAFITE.AROUNDEXIT 28384 . 29042) (CHECKLAFITEMAILFOLDERS 29044 . 31602) (
\LAFITE.REBROWSEFOLDER 31604 . 32054) (\LAFITE.AFTERLOGIN 32056 . 32471)) (32511 44421 (
\LAFITE.WRITE.PROFILE 32521 . 32981) (\LAFITE.READ.PROFILE 32983 . 34794) (DELETEMAILFOLDER 34796 . 
35463) (FORGETMAILFILE 35465 . 35812) (\LAFITE.UNCACHE.FOLDER 35814 . 36127) (\LAFITE.OPEN.FOLDER 
36129 . 37672) (\LAFITE.OPENSTREAM 37674 . 38030) (\LAFITE.CREATE.MENU 38032 . 38259) (\LAFITE.EOF 
38261 . 38566) (\LAFITE.CLOSE.FOLDER 38568 . 39162) (PROMPTFORFILENAME 39164 . 40345) (
\LAFITE.PROMPTFORFOLDER 40347 . 40660) (MAKELAFITEMAILFOLDERSMENU 40662 . 41056) (MAILFOLDERBUSY 41058
 . 41244) (LA.LONGFILENAME 41246 . 42459) (PROFILEFILENAME 42461 . 42853) (TOCFILENAME 42855 . 43144) 
(LA.SHORTFILENAME 43146 . 44419)) (44422 46794 (COPY7BITFILE 44432 . 45391) (FIXLAURELFILE 45393 . 
45676) (\LAFITE.BROWSE.LAURELFILE 45678 . 45851) (\LAFITE.FIX.LAUREL.FOLDER 45853 . 46792)) (46795 
47817 (\LAFITE.GLOBAL.INIT 46805 . 47815)) (60566 61277 (RELEASE.LAFITE 60576 . 61275)))))
STOP