(DEFINE-FILE-INFO PACKAGE "IL" READTABLE "INTERLISP" BASE 10)
(FILECREATED "12-Jan-88 13:41:30" {QV}<NOTECARDS>1.3LNEXT>PMIPATCH067.;2 23227  

      changes to%:  (VARS PMIPATCH067COMS)

      previous date%: "14-Dec-87 20:05:55" {QV}<NOTECARDS>1.3KNEXT>PMIPATCH067.;21)


(* "
Copyright (c) 1987, 1988 by Xerox Corporation.  All rights reserved.
")

(PRETTYCOMPRINT PMIPATCH067COMS)

(RPAQQ PMIPATCH067COMS 
       ((DECLARE%: DONTCOPY (PROPS (PMIPATCH067 MAKEFILE-ENVIRONMENT)
                                   (PMIPATCH067 FILETYPE)))
        

(* ;;; "Obsolete in NCLOGGER: NCLOG.FetchLogInfo NCLOG.SetLogInfo")

        

(* ;;; "New in NCLOGGER")

        (GLOBALVARS NCLOG.ListOfAllEventTypes NCLOG.ListOfEventTypes NCLOG.NumHashArray)
        (VARS (NCLOG.NumHashArray (HASHARRAY NCLOG.HashArraySize))
              (NCLOG.ListOfAllEventTypes '(GetNewCard MakeCard.Begin MakeCard.End EditCard.Begin 
                                                 EditCard.End SaveCard.Begin SaveCard.End 
                                                 QuitCard.Begin QuitCard.End AssignTitle.Begin 
                                                 AssignTitle.End CacheCard UncacheCard DelCard 
                                                 MakeLink DelLink PutMainCardData PutLinks PutTitle 
                                                 PutPropList RecomputeBrowser.Begin 
                                                 RecomputeBrowser.End RelayoutBrowser.Begin 
                                                 RelayoutBrowser.End AddCardType StartLogging))
              (NCLOG.ListOfEventTypes NCLOG.ListOfAllEventTypes))
        (FNS NCLOG.FetchLogInfoList NCLOG.SetLogInfoList NCLOG.OpenLoggingStream 
             NCLOG.SetEventTypesToLog NCLOG.UIDFromNum)
        (ADVISE NC.GetNewCard)
        

(* ;;; "Changed in NCLOGGER")

        (RECORDS NCLogInfo)
        (FNS NCLOG.StartLogging NCLOG.SuspendLogging NCLOG.StopLogging NCLOG.LoggingOnP 
             NCLOG.LogEvent NCLOG.NumFromUID)
        (ADVISE NC.DeleteNoteCardInternal NC.DelToLink)))
(DECLARE%: DONTCOPY 

(PUTPROPS PMIPATCH067 MAKEFILE-ENVIRONMENT (:PACKAGE "IL" :READTABLE "INTERLISP" :BASE 10))

(PUTPROPS PMIPATCH067 FILETYPE :TCOMPL)
)



(* ;;; "Obsolete in NCLOGGER: NCLOG.FetchLogInfo NCLOG.SetLogInfo")




(* ;;; "New in NCLOGGER")

(DECLARE%: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS NCLOG.ListOfAllEventTypes NCLOG.ListOfEventTypes NCLOG.NumHashArray)
)

(RPAQ NCLOG.NumHashArray (HASHARRAY NCLOG.HashArraySize))

(RPAQQ NCLOG.ListOfAllEventTypes 
       (GetNewCard MakeCard.Begin MakeCard.End EditCard.Begin EditCard.End SaveCard.Begin 
              SaveCard.End QuitCard.Begin QuitCard.End AssignTitle.Begin AssignTitle.End CacheCard 
              UncacheCard DelCard MakeLink DelLink PutMainCardData PutLinks PutTitle PutPropList 
              RecomputeBrowser.Begin RecomputeBrowser.End RelayoutBrowser.Begin RelayoutBrowser.End 
              AddCardType StartLogging))

(RPAQ NCLOG.ListOfEventTypes NCLOG.ListOfAllEventTypes)
(DEFINEQ

(NCLOG.FetchLogInfoList
  [LAMBDA (NoteFile)                                         (* pmi%: "23-Oct-87 15:03")
          
          (* * Fetch the NCLogInfo records from the NoteFile if any.
          If NoteFile is nil, then return the global one.)
          
          (* * pmi 10/23/87%: Was NCLOG.FetchLogInfo, changed to handle a list of 
          NCLogInfos on each notefile.)

    (DECLARE (GLOBALVARS NCLOG.GlobalLogInfo))
    (COND
       ((type? NoteFile NoteFile)
        (NCP.NoteFileProp NoteFile 'NCLogInfoList))
       ((NULL NoteFile)
        NCLOG.GlobalLogInfo)
       (T NIL])

(NCLOG.SetLogInfoList
  [LAMBDA (NoteFile NewLogInfoRecord)                        (* pmi%: "28-Oct-87 16:06")
          
          (* * Add this NewLogInfoRecord to the list of the NCLogInfo records for 
          NoteFile. If NoteFile is nil, then replace the global one.)
          
          (* * pmi 10/28/87%: Was NCLOG.SetLogInfo, changed to keep a list of NCLogInfos 
          on a notefile, instead of just one. Also now reset list of NCLogInfos to NIL if 
          NewLogInfoRecord is NIL.)

    (DECLARE (GLOBALVARS NCLOG.GlobalLogInfo))
    (if (type? NoteFile NoteFile)
        then (if NewLogInfoRecord
                 then (NCP.NoteFileAddProp NoteFile 'NCLogInfoList NewLogInfoRecord)
               else (NCP.NoteFileProp NoteFile 'NCLogInfoList NIL))
             NewLogInfoRecord
      elseif (NULL NoteFile)
        then (SETQ NCLOG.GlobalLogInfo NewLogInfoRecord)
             NewLogInfoRecord
      else NIL])

(NCLOG.OpenLoggingStream
  [LAMBDA (NoteFile LoggingFileName LoggingStream NCLogInfo EventTypesToLog)
                                                             (* pmi%: "28-Oct-87 17:57")
          
          (* * Creates a new NCLogInfo record for this notefile and logging filename.
          Opens a stream to the logging file and sets the appropriate fields of the 
          NCLogInfo record. Returns the NCLogInfo record, if successful.)
          
          (* * pmi 10/28/87%: Now takes EventTypesToLog argument which determines which 
          set of event types will be logged.)

    (if NCLogInfo
      else (SETQ NCLogInfo (create NCLogInfo))
           (NCLOG.SetLogInfoList NoteFile NCLogInfo))
    (if (SETQ LoggingStream (OPENSTREAM (OR LoggingStream LoggingFileName)
                                   'BOTH))
        then (replace (NCLogInfo LoggingStream) of NCLogInfo with LoggingStream)
             (replace (NCLogInfo LoggingOnFlg) of NCLogInfo with T)
             (replace (NCLogInfo LoggingFileName) of NCLogInfo with (FULLNAME LoggingStream))
             (replace (NCLogInfo EventTypesToLog) of NCLogInfo with EventTypesToLog)
             (NCLOG.WriteLogFileHeader LoggingStream NoteFile)
             NCLogInfo])

(NCLOG.SetEventTypesToLog
  [LAMBDA (NoteFile NCLogInfo EventTypesToLog)               (* pmi%: "28-Oct-87 11:20")
          
          (* * pmi 10/28/87%: Created to change the EventTypesToLog field in the 
          NCLogInfo record of NoteFile. If EventTypesToLog is NIL, then change the 
          EventTypesToLog fields of all NCLogInfo records associated with NoteFile.
          If NoteFile is NIL, change the EventTypesToLog field of the global NCLogInfo 
          record. If EventTypesToLog is NIL, then use NCLOG.ListOfEventTypes.)

    (DECLARE (GLOBALVARS NCLOG.GlobalLogInfo NCLOG.ListOfEventTypes))
    (LET ((NCLogInfoList (NCLOG.FetchLogInfoList NoteFile)))
         (OR EventTypesToLog (SETQ EventTypesToLog NCLOG.ListOfEventTypes))
         (if NoteFile
             then (if NCLogInfo
                      then (for NCLogInfoRecord in NCLogInfoList when (EQ NCLogInfoRecord NCLogInfo)
                              do (replace (NCLogInfo EventTypesToLog) of NCLogInfo with 
                                                                                      EventTypesToLog
                                        ))
                    else (for NCLogInfoRecord in NCLogInfoList
                            do (replace (NCLogInfo EventTypesToLog) of NCLogInfo with EventTypesToLog
                                      )))
           else (replace (NCLogInfo EventTypesToLog) of NCLOG.GlobalLogInfo with EventTypesToLog])

(NCLOG.UIDFromNum
  [LAMBDA (Num)                                              (* pmi%: "23-Nov-87 12:06")
          
          (* * Translate an integer into a UID using a global hash array.)

    (DECLARE (GLOBALVARS NCLOG.NumHashArray))
    (GETHASH Num NCLOG.NumHashArray])
)
[XCL:REINSTALL-ADVICE 'NC.GetNewCard :AFTER '((:LAST (NCLOG.LogEvent 'GetNewCard NoteFile
                                                            (LIST !VALUE Type]
(READVISE NC.GetNewCard)



(* ;;; "Changed in NCLOGGER")

(DECLARE%: EVAL@COMPILE

(DATATYPE NCLogInfo (LoggingStream LoggingOnFlg NoticedUIDs EventTypesToLog LoggingFileName))
)
(/DECLAREDATATYPE 'NCLogInfo '(POINTER POINTER POINTER POINTER POINTER) '((NCLogInfo 0 POINTER)
                                                                          (NCLogInfo 2 POINTER)
                                                                          (NCLogInfo 4 POINTER)
                                                                          (NCLogInfo 6 POINTER)
                                                                          (NCLogInfo 8 POINTER))
       '10)
(DEFINEQ

(NCLOG.StartLogging
  [LAMBDA (NoteFile LoggingFileNameOrNCLogInfo EventTypesToLog)
                                                             (* pmi%: "29-Oct-87 10:32")
          
          (* * Turn on logging for NoteFile. If logging was already on, then do nothing 
          and return NIL. If LoggingFileName is NIL, then use a {nodircore} file.)
          
          (* * pmi 10/23/87%: Add current LoggingFileName to NCLogInfo record for this 
          NoteFile)
          
          (* * pmi 10/27/87%: Made changes to accommodate multiple NCLogInfo records per 
          notefile. Also changed so that NIL for NoteFile means turn on global logging.
          Now returns the relevent NCLogInfo record.)
          
          (* * pmi 10/28/87%: Now takes EventTypesToLog argument which determines which 
          set of event types will be logged.)

    (DECLARE (GLOBALVARS NCLOG.ListOfEventTypes))
    (LET ((NCLogInfoList (NCLOG.FetchLogInfoList NoteFile))
          NCLogInfo LoggingFileName LoggingStream)
          
          (* * Sort out LoggingFileNameOrNCLogInfo)

         (if (type? NCLogInfo LoggingFileNameOrNCLogInfo)
             then (SETQ NCLogInfo LoggingFileNameOrNCLogInfo)
                  (SETQ LoggingFileName NIL)
           elseif LoggingFileNameOrNCLogInfo
             then (SETQ NCLogInfo NIL)
                  (SETQ LoggingFileName (FULLNAME LoggingFileNameOrNCLogInfo 'NEW))
           else (SETQ LoggingFileName '{NODIRCORE}NCLOGFILE))
         (OR EventTypesToLog (SETQ EventTypesToLog NCLOG.ListOfEventTypes))
          
          (* * Look for LoggingFileNameOrNCLogInfo as either a NCLogInfo record on this 
          notefile or a filename contained in one of the NCLogInfo records.)

         (if [AND NoteFile NCLogInfoList (OR (FMEMB NCLogInfo NCLogInfoList)
                                             (SETQ NCLogInfo (for NCLogInfoRecord in NCLogInfoList
                                                                thereis (EQUAL LoggingFileName
                                                                               (fetch (NCLogInfo
                                                                                       
                                                                                      LoggingFileName
                                                                                       ) of 
                                                                                      NCLogInfoRecord
                                                                                      ]
             then (if (fetch (NCLogInfo LoggingOnFlg) of NCLogInfo)
                      then 
          
          (* * Logging is already on. Bail out.)

                           NIL
                    elseif (AND (SETQ LoggingStream (fetch (NCLogInfo LoggingStream) of NCLogInfo))
                                (OPENP LoggingStream 'BOTH))
                      then 
          
          (* * Logging file exists and is open.)

                           (replace (NCLogInfo LoggingOnFlg) of NCLogInfo with T)
                           NCLogInfo
                    else 
          
          (* * There's no LoggingStream or it's closed, so make one using 
          LoggingFileName.)

                         (NCLOG.OpenLoggingStream NoteFile LoggingFileName LoggingStream NCLogInfo 
                                EventTypesToLog))
           else 
          
          (* * This notefile has no logging happening;
          start one op.)

                (NCLOG.OpenLoggingStream NoteFile LoggingFileName NIL NIL EventTypesToLog])

(NCLOG.SuspendLogging
  [LAMBDA (NoteFile NCLogInfo)                               (* pmi%: "27-Oct-87 17:43")
          
          (* * Temporarily turn off the logging on NoteFile, but don't close 
          LoggingStream.)
          
          (* * pmi 10/27/87%: Changed to handle multiple NCLogInfo records per notefile.
          If no NCLogInfo is specified, suspend its logging.
          If not, suspend logging on all NCLogInfo records associated with this notefile.
          Also changed do that a NIL NoteFile means suspend global logging.)

    (DECLARE (GLOBALVARS NCLOG.GlobalLogInfo))
    (LET (NCLogInfoList (NCLOG.FetchLogInfoList NoteFile))
         (if NoteFile
             then (if NCLogInfo
                      then (AND (MEMBER NCLogInfo NCLogInfoList)
                                (replace (NCLogInfo LoggingOnFlg) of NCLogInfo with NIL))
                    else (for NCLogInfoRecord in NCLogInfoList
                            do (replace (NCLogInfo LoggingOnFlg) of NCLogInfoRecord with NIL)))
           else (replace (NCLogInfo LoggingOnFlg) of NCLOG.GlobalLogInfo with NIL])

(NCLOG.StopLogging
  [LAMBDA (NoteFile NCLogInfo WriteLegendFlg)                (* pmi%: "28-Oct-87 12:19")
          
          (* * Turn off notefile logging. Return the result of closing the LoggingStream.
          If WriteLegendFlg is non-nil, then write down a legend mapping numbers to UIDs.
          Write down the location of the start of the legend at the end of the file.)
          
          (* * pmi 10/28/87%: Changed to handle multiple NCLogInfo records per notefile.
          If a NCLogInfo is specified, then stop logging on it.
          If not, stop logging on all NCLogInfo records associated with this notefile.)

    (DECLARE (GLOBALVARS NC.OrigReadTable))
    (if (NCLOG.LoggingOnP NoteFile NCLogInfo)
        then (LET (NCLogInfoList LoggingStream)
                  (NCLOG.SuspendLogging NoteFile NCLogInfo)
                  [SETQ NCLogInfoList (MKLIST (OR NCLogInfo (NCLOG.FetchLogInfoList NoteFile]
                  (for NCLogInfoRecord in NCLogInfoList
                     collect (SETQ LoggingStream (fetch (NCLogInfo LoggingStream) of NCLogInfoRecord)
                              )
                           (if (AND WriteLegendFlg LoggingStream (OPENP LoggingStream))
                               then (LET ((StartLegendLoc (GETFILEPTR LoggingStream)))
                                         (for UID in (fetch (NCLogInfo NoticedUIDs) of 
                                                                                      NCLogInfoRecord
                                                            ) do (PRINT (LIST (NCLOG.NumFromUID
                                                                               UID)
                                                                              UID)
                                                                        LoggingStream 
                                                                        NC.OrigReadTable))
                                         (PRINT StartLegendLoc LoggingStream NC.OrigReadTable)))
                           (PROG1 (AND LoggingStream (OPENP LoggingStream)
                                       (CLOSEF LoggingStream))
                                  (replace (NCLogInfo LoggingStream) of NCLogInfoRecord with NIL)
                                  (replace (NCLogInfo NoticedUIDs) of NCLogInfoRecord with NIL])

(NCLOG.LoggingOnP
  [LAMBDA (NoteFile NCLogInfo)                               (* pmi%: " 3-Nov-87 11:55")
          
          (* * Return non-nil if logging is turned on for NoteFile.)
          
          (* * pmi 10/27/87%: Changed to handle multiple NCLogInfo records per notefile.
          If no NCLogInfo is specified and there is at least one NCLogInfo record on this 
          notefile with a non-NIL LoggingOnFlg, then T is returned.
          Also, now returns the LoggingOnFlg for NCLOG.GlobalLogInfo if NoteFile is NIL.)

    (DECLARE (GLOBALVARS NCLOG.GlobalLogInfo))
    (LET ((NCLogInfoList (NCLOG.FetchLogInfoList NoteFile)))
         (if NoteFile
             then (if NCLogInfo
                      then (AND (MEMBER NCLogInfo NCLogInfoList)
                                (fetch (NCLogInfo LoggingOnFlg) of NCLogInfo))
                    else (for NCLogInfoRecord in NCLogInfoList thereis (fetch (NCLogInfo LoggingOnFlg
                                                                                     ) of 
                                                                                      NCLogInfoRecord
                                                                              )))
           elseif (type? NCLogInfo NCLOG.GlobalLogInfo)
             then (fetch (NCLogInfo LoggingOnFlg) of NCLOG.GlobalLogInfo)
           else NIL])

(NCLOG.LogEvent
  [LAMBDA (EventType NoteFile EventArgs)                     (* pmi%: "27-Oct-87 18:09")
          
          (* * Log an event of type EventType happening to NoteFile with args EventArgs.
          NoteFile may be NIL if there's no notefile object.
          Can log either on global logging stream or on Logging stream for given notefile 
          or both.)
          
          (* * pmi 10/27/87%: Changed to handle multiple NCLogInfo records for a 
          notefile.)

    (LET ((EventTime (IDATE))
          GlobalLogInfo NoteFileLogInfo LoggingStream)       (* Log on global logging stream if 
                                                             turned on.)
         (if (AND (NCLOG.LoggingOnP NIL)
                  (SETQ GlobalLogInfo (NCLOG.FetchLogInfo NIL))
                  (SETQ LoggingStream (fetch (NCLogInfo LoggingStream) of GlobalLogInfo))
                  (OPENP LoggingStream 'OUTPUT))
             then (NCLOG.WriteEventToLogStream LoggingStream GlobalLogInfo EventType NoteFile 
                         EventTime (MKLIST EventArgs)))      (* Log on local logging stream if 
                                                             turned on.)
         (if (type? NoteFile NoteFile)
             then (for NoteFileLogInfo in (NCLOG.FetchLogInfoList NoteFile)
                     when (AND (NCLOG.LoggingOnP NoteFile NoteFileLogInfo)
                               (SETQ LoggingStream (fetch (NCLogInfo LoggingStream) of 
                                                                                      NoteFileLogInfo
                                                          ))
                               (OPENP LoggingStream 'OUTPUT)
                               (FMEMB EventType (fetch (NCLogInfo EventTypesToLog) of NoteFileLogInfo
                                                       )))
                     do (NCLOG.WriteEventToLogStream LoggingStream NoteFileLogInfo EventType NoteFile 
                               EventTime (MKLIST EventArgs])

(NCLOG.NumFromUID
  [LAMBDA (UID)                                              (* pmi%: "14-Dec-87 19:15")
          
          (* * Translate the UID into an integer using a global hash array.
          This is to save space on the logging file.)
          
          (* * pmi 11/24/87%: Added NCLOG.NumHashArray for getting UID's back from 
          numbers later.)

    (DECLARE (GLOBALVARS NCLOG.UIDHashArray NCLOG.NumHashArray NCLOG.UIDCtr))
    (if (GETHASH UID NCLOG.UIDHashArray)
      else (PUTHASH UID (add NCLOG.UIDCtr 1)
                  NCLOG.UIDHashArray)
           (PUTHASH NCLOG.UIDCtr UID NCLOG.NumHashArray])
)
[XCL:REINSTALL-ADVICE 'NC.DeleteNoteCardInternal :BEFORE '((:LAST (NCLOG.LogEvent 'DelCard
                                                                         (fetch (Card NoteFile)
                                                                                of Card)
                                                                         Card))
                                                           (:LAST (NCLOG.LogEvent 'DelCard
                                                                         (fetch (Card NoteFile)
                                                                                of Card)
                                                                         (LIST Card (NC.FetchTitle
                                                                                     Card]
[XCL:REINSTALL-ADVICE 'NC.DelToLink :BEFORE
       '((:LAST (NCLOG.LogEvent 'DelLink (fetch (Card NoteFile)
                                                of
                                                (fetch (Link SourceCard)
                                                       of Link))
                       Link))
         (:LAST (LET [(NoteFile (fetch (Card NoteFile)
                                       of
                                       (fetch (Link SourceCard)
                                              of Link]
                     (if (type? Link Link)
                         then
                         (NCLOG.LogEvent 'DelLink NoteFile (LIST Link (fetch (Link SourceCard)
                                                                             of Link)
                                                                 (fetch (Link DestinationCard)
                                                                        of Link)
                                                                 (fetch (Link Label)
                                                                        of Link)
                                                                 (fetch (Link AnchorMode)
                                                                        of Link)
                                                                 (fetch (Link DisplayMode)
                                                                        of Link)))
                         else
                         (NCLOG.LogEvent 'DelLink NoteFile Link]
(READVISE NC.DeleteNoteCardInternal NC.DelToLink)
(PUTPROPS PMIPATCH067 COPYRIGHT ("Xerox Corporation" 1987 1988))
(DECLARE%: DONTCOPY
  (FILEMAP (NIL (3078 7958 (NCLOG.FetchLogInfoList 3088 . 3722) (NCLOG.SetLogInfoList 3724 . 4730) (
NCLOG.OpenLoggingStream 4732 . 6082) (NCLOG.SetEventTypesToLog 6084 . 7657) (NCLOG.UIDFromNum 7659 . 
7956)) (8809 20688 (NCLOG.StartLogging 8819 . 12651) (NCLOG.SuspendLogging 12653 . 13881) (
NCLOG.StopLogging 13883 . 16374) (NCLOG.LoggingOnP 16376 . 17859) (NCLOG.LogEvent 17861 . 20011) (
NCLOG.NumFromUID 20013 . 20686)))))
STOP