mirror of
https://github.com/PDP-10/its.git
synced 2026-02-20 06:25:45 +00:00
Added INQUIR, the user account management program.
This commit is contained in:
284
src/inquir/fake-s.28
Normal file
284
src/inquir/fake-s.28
Normal file
@@ -0,0 +1,284 @@
|
||||
;;; -*- Mode:LISP; -*-î
|
||||
î
|
||||
;;; FAKE-STRING: Package for manipulating fake strings as real stringsî
|
||||
î
|
||||
;;; `fake' string definitions for:î
|
||||
;;;î
|
||||
;;; (STRINGP obj) - Returns T if obj is a fake string.î
|
||||
;;; (CHARACTER s) - Coerces a string to a character.î
|
||||
;;; (CHAR-UPCASE c) - Uppercases a character.î
|
||||
;;; (CHAR-DOWNCASE c) - Lowercases a character.î
|
||||
;;; (STRING-UPCASE s) - Uppercases a string.î
|
||||
;;; (STRING-DOWNCASE s) - Lowercases a string.î
|
||||
;;; (STRING-APPEND s1 s2 ...) - Appends any number of strings together.î
|
||||
î
|
||||
;;; *ALPHABETIC-CASE-AFFECTS-STRING-COMPARISON* - T or NIL global flag.î
|
||||
;;; (STRING symbol) - Creates a string.î
|
||||
;;; (STRING-LENGTH s) - Returns number of chars.î
|
||||
;;; (SUBSTRING s start &optional end) - Takes substrings.î
|
||||
;;; (STRING-SEARCH key s1 &optional start end) - Searches for strings.î
|
||||
î
|
||||
;;; Package created and maintained by KMP@MC.î
|
||||
;;; Kludgey enhancements courtesy of CSTACY@MC.î
|
||||
î
|
||||
(SSTATUS FEATURE FAKE-S)î
|
||||
î
|
||||
(EVAL-WHEN (EVAL COMPILE)î
|
||||
(IF (NOT (GET 'UMLMAC 'VERSION))î
|
||||
(LOAD '((DSK LISP) UMLMAC FASL))))î
|
||||
î
|
||||
î
|
||||
;;; Gloabl variable for users to control case sensitivity during comparisons. î
|
||||
î
|
||||
(DECLARE (SPECIAL *ALPHABETIC-CASE-AFFECTS-STRING-COMPARISON*))î
|
||||
î
|
||||
î
|
||||
(SETQ *ALPHABETIC-CASE-AFFECTS-STRING-COMPARISON* NIL)î
|
||||
î
|
||||
î
|
||||
;;; (STRINGP x)î
|
||||
;;;î
|
||||
;;; Predicate returns true iff x is a fake string, otherwise returns false.î
|
||||
;;;î
|
||||
;;; Note: Because of the way Maclisp implements fake strings, SYMBOLP willî
|
||||
;;; also return true for fake strings. Hence, in any case where î
|
||||
;;; dispatching is being done on type, do the STRINGP check before theî
|
||||
;;; SYMBOLP check as in:î
|
||||
;;;î
|
||||
;;; (COND ...î
|
||||
;;; ((STRINGP x) ...) ;Check strings firstî
|
||||
;;; ((SYMBOLP x) ...) ;Things that aren't STRINGP are `real' symbolsî
|
||||
;;; ...)î
|
||||
î
|
||||
(DEFUN STRINGP (X)î
|
||||
(AND (SYMBOLP X) (GET X '+INTERNAL-STRING-MARKER)))î
|
||||
î
|
||||
;;; (STRING-EQUAL string1 string2)î
|
||||
;;;î
|
||||
;;; Predicate compares string1 and string2 returning true iff string1 î
|
||||
;;; and string2 represent the same string. Case is not significant in î
|
||||
;;; comparisons.î
|
||||
î
|
||||
(DEFUN STRING-EQUAL (S1 S2)î
|
||||
(IF (FIXP S1) (SETQ S1 (CHAR-UPCASE S1)))î
|
||||
(IF (FIXP S2) (SETQ S2 (CHAR-UPCASE S2)))î
|
||||
(COND ((FIXP S1)î
|
||||
(COND ((FIXP S2) (= S1 S2))î
|
||||
((SYMBOLP S2)î
|
||||
(LET ((PNAME (PNGET S2 7.)))î
|
||||
(AND (NULL (CDR PNAME))î
|
||||
(= (CAR PNAME) (LSH S1 #o35)))))î
|
||||
(T (ERROR "Not a string -- STRING-EQUAL" S2))))î
|
||||
((SYMBOLP S1)î
|
||||
(COND ((FIXP S2)î
|
||||
(LET ((PNAME (PNGET S1 7.)))î
|
||||
(AND (NULL (CDR PNAME))î
|
||||
(= (CAR PNAME) (LSH S2 #o35)))))î
|
||||
((SYMBOLP S2)î
|
||||
(DO ((L1 (PNGET S1 7.) (CDR L1))î
|
||||
(L2 (PNGET S2 7.) (CDR L2))î
|
||||
(CHAR1 0.) (CHAR2 0.))î
|
||||
((NULL L1) (NULL L2))î
|
||||
(DECLARE (FIXNUM CHAR1 CHAR2))î
|
||||
(IF (NULL L2) (RETURN NIL))î
|
||||
(LET ((W1 (FIXNUM-IDENTITY (CAR L1)))î
|
||||
(W2 (FIXNUM-IDENTITY (CAR L2))))î
|
||||
(DECLARE (FIXNUM W1 W2))î
|
||||
(IF (AND (NOT (= W1 W2))î
|
||||
(DO ((BP #o3507 (- BP #o700)))î
|
||||
((MINUSP BP) NIL)î
|
||||
(DECLARE (FIXNUM BP))î
|
||||
(SETQ CHAR1 (LDB BP W1)î
|
||||
CHAR2 (LDB BP W2))î
|
||||
(COND ((NOT *ALPHABETIC-CASE-AFFECTS-STRING-COMPARISON*)î
|
||||
(IF (NOT (OR (< CHAR1 #/a)î
|
||||
(> CHAR1 #/z)))î
|
||||
(SETQ CHAR1 (+ CHAR1 #.(- #/A #/a))))î
|
||||
(IF (NOT (OR (< CHAR2 #/a)î
|
||||
(> CHAR2 #/z)))î
|
||||
(SETQ CHAR2 (+ CHAR2 #.(- #/A #/a))))))î
|
||||
(IF (NOT (= CHAR1 CHAR2))î
|
||||
(RETURN T))))î
|
||||
(RETURN NIL)))))î
|
||||
(T (ERROR "Not a string -- STRING-EQUAL" S2))))î
|
||||
(T (ERROR "Not a string -- STRING-EQUAL" S1))))î
|
||||
î
|
||||
î
|
||||
î
|
||||
î
|
||||
;;; (CHARACTER x)î
|
||||
;;;î
|
||||
;;; Coerces x to be a character in fixnum representation.î
|
||||
;;; If x is a fixnum, it is returned.î
|
||||
;;; If x is a symbol, the first character of its pname is returned.î
|
||||
;;; If x is a fake string, its first character is returned.î
|
||||
î
|
||||
(DEFUN CHARACTER (X)î
|
||||
(COND ((SYMBOLP X) (GETCHARN X 1.))î
|
||||
((FIXP X) X)î
|
||||
(T (ERROR "Not a string -- CHARACTER" X))))î
|
||||
î
|
||||
;;; (STRING-APPEND string1 string2 string3 ...)î
|
||||
;;;î
|
||||
;;; Returns a string which is the concatenation of the given strings.î
|
||||
î
|
||||
(DEFUN STRING-APPEND NARGSî
|
||||
(DECLARE (FIXNUM NARGS))î
|
||||
(DO ((STRING "" (COND ((FIXP (ARG I)) (FORMAT NIL "~A~C" STRING (ARG I)))î
|
||||
((SYMBOLP (ARG I)) (FORMAT NIL "~A~A" STRING (ARG I)))î
|
||||
(T (ERROR "Not a string -- STRING-APPEND" (ARG I)))))î
|
||||
(I 1 (1+ I)))î
|
||||
((> I NARGS) STRING)î
|
||||
(DECLARE (FIXNUM I))))î
|
||||
î
|
||||
;;; (STRING-UPCASE string)î
|
||||
;;;î
|
||||
;;; Returns an uppercased copy of string.î
|
||||
î
|
||||
(DEFUN STRING-UPCASE (STRING)î
|
||||
(DO ((L (+INTERNAL-GET-PNAME STRING 'STRING-UPCASE) (CDR L))î
|
||||
(NEW-L NIL))î
|
||||
((NULL L) (+INTERNAL-MAKE-STRING (NREVERSE NEW-L)))î
|
||||
(DO ((WORD (FIXNUM-IDENTITY (CAR L)))î
|
||||
(BP #o3507 (- BP #o700))î
|
||||
(NEW 0. (DPB CHAR BP NEW))î
|
||||
(CHAR 0.))î
|
||||
((MINUSP BP) (PUSH NEW NEW-L))î
|
||||
(DECLARE (FIXNUM WORD BP NEW CHAR))î
|
||||
(COND ((NOT (OR (< (SETQ CHAR (LDB BP WORD)) #/a) (> CHAR #/z)))î
|
||||
(SETQ CHAR (+ CHAR #.(- #/A #/a))))))))î
|
||||
î
|
||||
;;; (STRING-DOWNCASE string)î
|
||||
;;;î
|
||||
;;; Returns a lowercased copy of string.î
|
||||
î
|
||||
(DEFUN STRING-DOWNCASE (STRING)î
|
||||
(DO ((L (+INTERNAL-GET-PNAME STRING 'STRING-DOWNCASE) (CDR L))î
|
||||
(NEW-L NIL))î
|
||||
((NULL L) (+INTERNAL-MAKE-STRING (NREVERSE NEW-L)))î
|
||||
(DO ((WORD (FIXNUM-IDENTITY (CAR L)))î
|
||||
(BP #o3507 (- BP #o700))î
|
||||
(NEW 0. (DPB CHAR BP NEW))î
|
||||
(CHAR 0.))î
|
||||
((MINUSP BP) (PUSH NEW NEW-L))î
|
||||
(DECLARE (FIXNUM WORD BP NEW CHAR))î
|
||||
(COND ((NOT (OR (< (SETQ CHAR (LDB BP WORD)) #/A) (> CHAR #/Z)))î
|
||||
(SETQ CHAR (+ CHAR #.(- #/a #/A))))))))î
|
||||
î
|
||||
î
|
||||
;;; (CHAR-UPCASE C)î
|
||||
;;;î
|
||||
;;; Returns the character C in uppercase.î
|
||||
î
|
||||
(DEFUN CHAR-UPCASE (C)î
|
||||
(COND ((NOT (FIXP C)) (ERROR "Not a character -- CHAR-UPCASE"))î
|
||||
((OR (< C #/a) (> C #/z)) C)î
|
||||
(T (+ C #.(- #/A #/a)))))î
|
||||
î
|
||||
;;; (CHAR-DOWNCASE C)î
|
||||
;;;î
|
||||
;;; Returns the character C in lowercase.î
|
||||
î
|
||||
(DEFUN CHAR-DOWNCASE (C)î
|
||||
(COND ((NOT (FIXP C)) (ERROR "Not a character -- CHAR-DOWNCASE"))î
|
||||
((OR (< C #/A) (> C #/Z)) C)î
|
||||
(T (+ C #.(- #/a #/A)))))î
|
||||
î
|
||||
î
|
||||
;;;; Kludgey enhancements.î
|
||||
î
|
||||
;;; (STRING Symbol)î
|
||||
î
|
||||
(DEFUN STRING (SYMBOL)î
|
||||
(IF (NOT (SYMBOLP SYMBOL))î
|
||||
(ERROR "Not a symbol -- ~A" SYMBOL 'STRING))î
|
||||
(LET ((FOO (COPYSYMBOL SYMBOL T)))î
|
||||
(PUTPROP FOO T '+INTERNAL-STRING-MARKER)î
|
||||
FOO))î
|
||||
î
|
||||
î
|
||||
;;; (STRING-LENGTH String)î
|
||||
;;;î
|
||||
;;; Returns the number of characters in String.î
|
||||
î
|
||||
(DEFUN STRING-LENGTH (STRING)î
|
||||
(- (FLATSIZE STRING) 2)) ;; FLATC doesn't work right for strings, sigh.î
|
||||
î
|
||||
î
|
||||
;;; (SUBSTRING String Start &optional End)î
|
||||
;;; î
|
||||
;;; Extracts a substring of String, from Start up to End,î
|
||||
;;; not including End. Origins are zero based.î
|
||||
;;; If End is not specified, get the rest of the string from Start.î
|
||||
î
|
||||
(DEFUN SUBSTRING (STRING START &OPTIONAL END)î
|
||||
(SETQ STRING (STRING STRING)) ;Coerce so symbols work.î
|
||||
(IF (NULL END)î
|
||||
(SETQ END (STRING-LENGTH STRING)))î
|
||||
(LET ((N 0)î
|
||||
(RESULT-BP #O3507)î
|
||||
(NEW-WORD 0)î
|
||||
(NEW-WORDS))î
|
||||
(DO ((WORDS (+INTERNAL-GET-PNAME STRING 'SUBSTRING) (CDR WORDS)))î
|
||||
((NULL WORDS) (STRING-APPEND (+INTERNAL-MAKE-STRING (NREVERSE NEW-WORDS))))î
|
||||
(DO ((WORD (CAR WORDS) (CAR WORDS))î
|
||||
(BP #O3507 (- BP #O700))î
|
||||
(CHAR 0.))î
|
||||
((MINUSP BP))î
|
||||
(SETQ CHAR (LDB BP WORD))î
|
||||
(WHEN (AND (NOT (ZEROP CHAR)) ;;FLUSH NULS.î
|
||||
(>= N START)î
|
||||
(< N END))î
|
||||
(SETQ NEW-WORD (DPB CHAR RESULT-BP NEW-WORD))î
|
||||
(SETQ RESULT-BP (- RESULT-BP #O700))î
|
||||
(WHEN (OR (MINUSP RESULT-BP)î
|
||||
(<= N (STRING-LENGTH STRING)))î
|
||||
(PUSH NEW-WORD NEW-WORDS)î
|
||||
(SETQ NEW-WORD 0)î
|
||||
(SETQ RESULT-BP #O3507)))î
|
||||
(SETQ N (1+ N))))))î
|
||||
î
|
||||
î
|
||||
;;; This version will probably CONS a lot of list structure insideî
|
||||
;;; SUBSTRING, but it was the easiest way to write it.î
|
||||
î
|
||||
(DEFUN STRING-SEARCH (KEY STRING &OPTIONAL (START 0) END)î
|
||||
(IF (NULL END)î
|
||||
(SETQ END (STRING-LENGTH STRING)))î
|
||||
(COND ((ZEROP (+ (STRING-LENGTH STRING) (STRING-LENGTH KEY)))î
|
||||
0)î
|
||||
(T (*CATCH 'FOUND-ITî
|
||||
(DO ((N START (1+ N)))î
|
||||
((OR (= N (STRING-LENGTH STRING))î
|
||||
(> (STRING-LENGTH KEY) (- (STRING-LENGTH STRING) N))î
|
||||
(= N END))î
|
||||
NIL)î
|
||||
(IF (STRING-EQUAL KEY (SUBSTRING STRING Nî
|
||||
(+ N (STRING-LENGTH KEY))))î
|
||||
(*THROW 'FOUND-IT N)))))))î
|
||||
î
|
||||
î
|
||||
î
|
||||
î
|
||||
î
|
||||
;;; Utility functions. Not for use by users.î
|
||||
î
|
||||
;;; Takes a symbol, fake string, or fixnum and returns its pname.î
|
||||
î
|
||||
(DEFUN +INTERNAL-GET-PNAME (STRING FN)î
|
||||
(COND ((SYMBOLP STRING) (PNGET STRING 7.))î
|
||||
((FIXP STRING) (NCONS (LSH STRING #o35)))î
|
||||
(T (ERROR "Not a string -- ~A" STRING FN))))î
|
||||
î
|
||||
;;; Takes a pname and returns a fake string.î
|
||||
î
|
||||
(DEFUN +INTERNAL-MAKE-STRING (PNAME)î
|
||||
(SETQ PNAME (PNPUT PNAME NIL))î
|
||||
(PUTPROP PNAME T '+INTERNAL-STRING-MARKER)î
|
||||
PNAME)î
|
||||
î
|
||||
î
|
||||
;;; Local Modes:;î
|
||||
;;; Mode:LISP;î
|
||||
;;; Lisp IF Indent:2;î
|
||||
;;; End:;î
|
||||
41
src/inquir/inquir.(dump)
Normal file
41
src/inquir/inquir.(dump)
Normal file
@@ -0,0 +1,41 @@
|
||||
;;; -*- LISP -*-
|
||||
;;; Init file for dumping out a new version of INQUIR.
|
||||
|
||||
(COMMENT) ;magic
|
||||
|
||||
(PROGN (CLOSE (PROG1 INFILE (INPUSH -1))) ; Close this init file
|
||||
|
||||
(LOAD "DSK: INQUIR; INQUIR FASL")
|
||||
|
||||
(SETQ BASE 10. IBASE 10. *NOPOINT ())
|
||||
|
||||
(DEFPROP DEBUG ((DSK LIBLSP) DEBUG FASL) AUTOLOAD)
|
||||
|
||||
(FORMAT T "~&Dumping: Inquire.~A" (GET 'INQUIR 'VERSION))
|
||||
|
||||
(SSTATUS TOPLEVEL '(TOPLEVEL)) ; Init our toplevel
|
||||
(SSTATUS FEATURE NOLDMSG) ; No load messages after dump
|
||||
(SETQ GC-OVERFLOW '(LAMBDA (X) T)) ; Prevent GC-OVERFLOW lossage
|
||||
|
||||
(ALLOC '(LIST 60000.)) ; Set GC parameters
|
||||
(ALLOC '(SYMBOL 50000.))
|
||||
(ALLOC '(FIXNUM 10000.))
|
||||
|
||||
(GCTWA) ; Reclaim worthless symbols
|
||||
(GC) ; GC cruft made during dump
|
||||
|
||||
(SSTATUS FLUSH T) ; Share with system LISP
|
||||
(SUSPEND ":KILL "
|
||||
(LIST '(DSK INQUIR) 'INQBIN (GET 'INQUIR 'VERSION))) ; Dump
|
||||
|
||||
((LAMBDA (FILENAME)
|
||||
(COND (FILENAME
|
||||
(COND ((NOT (ERRSET (PROGN
|
||||
(FORMAT T "~&Loading fix file ~A~%"
|
||||
(NAMESTRING FILENAME))
|
||||
(LOAD FILENAME))
|
||||
T))
|
||||
(FORMAT T "~&;Bug in patch load. Please report this."))))))
|
||||
(PROBEF (LIST '(DSK INQUIR) 'INQFIX (GET 'INQUIR 'VERSION))))
|
||||
|
||||
(TOPLEVEL))
|
||||
1351
src/inquir/inquir.182
Normal file
1351
src/inquir/inquir.182
Normal file
File diff suppressed because it is too large
Load Diff
234
src/inquir/lsrrtn.31
Normal file
234
src/inquir/lsrrtn.31
Normal file
@@ -0,0 +1,234 @@
|
||||
;;; -*- Mode: MIDAS -*-î
|
||||
î
|
||||
TITLE LSRRTN - LSR1 database interface.î
|
||||
;Originally by RLB, extended by CSTACY.î
|
||||
î
|
||||
SUBTTL Basic definitionsî
|
||||
î
|
||||
.FASLî
|
||||
.INSRT sys:.fasl defsî
|
||||
.SXEVAL (SSTATUS FEATURE LSRRTN) î
|
||||
î
|
||||
;;; Get the system LSR1 database routines.î
|
||||
î
|
||||
lsrtns"$$ovly==1 ;Map only a few pages and hack overlaying.î
|
||||
lsrtns"$$hsnm==1 ;HSNAME lookup.î
|
||||
lsrtns"$$ulnm==0 ;No last name searching.î
|
||||
lsrtns"$$ulnp==0 ;No abbrev l.name lookups.î
|
||||
lsrtns"$$unam==0 ;No name permutations.î
|
||||
î
|
||||
lsrtns"a==t ;LSRTNS requires some ACs.î
|
||||
lsrtns"b==ttî
|
||||
lsrtns"c==dî
|
||||
lsrtns"d==rî
|
||||
lsrtns"e==f î
|
||||
.INSRT dsk:syseng;lsrtnsî
|
||||
î
|
||||
;;; Random utility routines and macros.î
|
||||
î
|
||||
;;; Given a Byte pointer in D, return a list of chars in B.î
|
||||
î
|
||||
chlp0: setz b, ;start with ()î
|
||||
chlp: ildb tt,d ;get a charî
|
||||
jumpe tt,chlpx ;zero terminatesî
|
||||
jsp t,fxcons ;turn into fixnumî
|
||||
call 2,.function CONS ;cons onto listî
|
||||
move b,aî
|
||||
jrst chlp ;go for another charî
|
||||
chlpx: popj p, ;all done.î
|
||||
î
|
||||
î
|
||||
;;; Item numbers.î
|
||||
î
|
||||
.SXEVA (SETQ I$UNAM #0 ) ;UNAMEî
|
||||
.SXEVA (SETQ I$NAME #1 ) ;FULL NAMEî
|
||||
.SXEVA (SETQ I$NICK #2 ) ;NICKNAMEî
|
||||
.SXEVA (SETQ I$LOCL #3 ) ;LOCAL ITEMSî
|
||||
.SXEVA (SETQ I$MITA #4 ) ;MIT ADDRESSî
|
||||
.SXEVA (SETQ I$MITT #5 ) ;MIT TELEPHONE NUMBERî
|
||||
.SXEVA (SETQ I$HOMA #6 ) ;HOME ADDRESSî
|
||||
.SXEVA (SETQ I$HOMT #7 ) ;HOME TELEPHONE NUMBERî
|
||||
.SXEVA (SETQ I$SUPR #10 ) ;SUPERVISOR(S)î
|
||||
.SXEVA (SETQ I$PROJ #11 ) ;PROJECTî
|
||||
.SXEVA (SETQ I$DIR #12 ) ;FILE DIR NAMESî
|
||||
.SXEVA (SETQ I$AUTH #13 ) ;AUTHORIZATIONî
|
||||
.SXEVA (SETQ I$GRP #14 ) ;GROUP AFFILIATIONî
|
||||
.SXEVA (SETQ I$REL #15 ) ;RELATION TO GROUPî
|
||||
.SXEVA (SETQ I$BRTH #16 ) ;BIRTHDAYî
|
||||
.SXEVA (SETQ I$REM #17 ) ;REMARKSî
|
||||
.SXEVA (SETQ I$NETA #20 ) ;NETWORK ADDRESSî
|
||||
.SXEVA (SETQ I$ALTR #21 ) ;USER AND TIME OF LAST ALTERATIONî
|
||||
.SXEVA (SETQ I$MACH #22 ) ;SUNAME@MACHINE PAIRSî
|
||||
î
|
||||
î
|
||||
SUBTTL Mapping the database.î
|
||||
î
|
||||
;;; (LSRMAP <number of pages to use>)î
|
||||
;;; opens up and maps in the inquir database for looking up people.î
|
||||
;;; Returns a file object to be passed to other routines.î
|
||||
;;; Uses GETCOR to reserve address space. Don't try this too many timesî
|
||||
;;; since the addr space isn't reused.î
|
||||
î
|
||||
.ENTRY LSRMAP SUBR 1+1î
|
||||
jsp t,fxnv1 ;get & save # pages to use, a->ttî
|
||||
push fxp,ttî
|
||||
;; (OPEN '|INQUIR;LSR1 >| '(IN))î
|
||||
movei a,.atom INQUIR/;LSR1/ >î
|
||||
movei b,.sx (IN)î
|
||||
call 2,.function OPENî
|
||||
push p,aî
|
||||
;; extract I/O channel number from the file array, into TTî
|
||||
movei tt,f.chanî
|
||||
move tt,@ttsar(a)î
|
||||
push fxp,ttî
|
||||
;; get pages via getcorî
|
||||
move tt,-1(fxp) ;# pagesî
|
||||
pushj p,getcor ;request addr space from Lispî
|
||||
jumpe tt,corlos ;its addr is returned zero if none avblî
|
||||
idivi tt,2000 ;cvt to page numberî
|
||||
movn d,-1(fxp) ;get number of pages requested to constructî
|
||||
hrl tt,d ;aobjn to themî
|
||||
;; construct args for lsrmapî
|
||||
move lsrtns"b,tt ;aobjn to free page rangeî
|
||||
move lsrtns"a,(fxp) ;disk channel numberî
|
||||
;; Get the INQUIR data base mapped inî
|
||||
pushj p,lsrtns"lsrmap ;try to map in the data baseî
|
||||
jrst lsrluz ;no skip if it lostî
|
||||
;; I guess we won, clean up and return the file object.î
|
||||
opnbye: sub fxp,[2,,2]î
|
||||
pop p,aî
|
||||
popj p,î
|
||||
î
|
||||
;;; Return () instead of file obj.î
|
||||
corlos:î
|
||||
lsrluz: move a,(p) ;get the file objî
|
||||
call 1,.function CLOSE ;close itî
|
||||
setzm (p) ;return ()î
|
||||
jrst opnbyeî
|
||||
î
|
||||
î
|
||||
SUBTTL Stepping through the database.î
|
||||
î
|
||||
;;; The screw with stepping through the database is thatî
|
||||
;;; LSRDTA and LSRNXT return a core address, not a file address.î
|
||||
;;;î
|
||||
;;; For example, you can not search by stepping through the database andî
|
||||
;;; storing the addresses of the found entries, because succesive LSRNXTsî
|
||||
;;; will not necessarily leave the entries mapped. Instead, you mustî
|
||||
;;; process each entry as you find it, and then call LSRNXT.î
|
||||
î
|
||||
î
|
||||
;;; (LSRDTA <file-object>î
|
||||
;;;î
|
||||
;;; Returns the core address of the first data entry.î
|
||||
;;; This can be used to get an initial pointer for LSRNXT.î
|
||||
;;; Returns -1 if the LSR1 database does not appear to be mapped.î
|
||||
î
|
||||
.ENTRY LSRDTA SUBR 1+1î
|
||||
push p,[fix1] ;Ncallable: (declare (fixnum (lsrnxt ...)))î
|
||||
; so return machine number in TT.î
|
||||
movei tt,f.chan ;Pick up disk channel number.î
|
||||
move lsrtns"a,@ttsar(a)î
|
||||
move lsrtns"b,lsrtns"datfpgî
|
||||
imuli lsrtns"b,2000 ;File data page => addr first entryî
|
||||
pushj p,lsrtns"lsrget ;Map it and get core addr.î
|
||||
movni lsrtns"b,1 ; Say -1 for lossage.î
|
||||
move tt,lsrtns"b ;Return value.î
|
||||
popj p,î
|
||||
î
|
||||
;;; (LSRNXT <file-obj> <core address>)î
|
||||
;;;î
|
||||
;;; Given the core address of an entry, returns the core address of theî
|
||||
;;; next sequential entry in the LSR1 database. Returns -1 iff thereî
|
||||
;;; are no more entries.î
|
||||
î
|
||||
.ENTRY LSRNXT SUBR 2+1î
|
||||
push p,[fix1] ;Ncallable: (declare (fixnum (lsrnxt ...)))î
|
||||
; so return machine number in TT.î
|
||||
movei tt,f.chan ;Pick up disk channel number.î
|
||||
move lsrtns"a,@ttsar(a)î
|
||||
move lsrtns"b,(b)î
|
||||
pushj p,lsrtns"lsrnxt ;Get entry into lsrtns"b.î
|
||||
movni lsrtns"b,1 ; Say -1 for lossage.î
|
||||
move tt,lsrtns"b ;Return value.î
|
||||
popj p,î
|
||||
î
|
||||
î
|
||||
SUBTTL Looking up a user.î
|
||||
î
|
||||
;;; (LSRUNM <file obj returned by LSRMAP> <uname>)î
|
||||
;;; Returns a magic number to be passed to LSRITM, etc., or -1 if uname unknown.î
|
||||
;;; Actually, the "magic number" is the entry's core address returnedî
|
||||
;;; by the lib subr.î
|
||||
î
|
||||
.ENTRY LSRUNM SUBR 2+1î
|
||||
push p,cfix1 ;NCALLable!î
|
||||
movei tt,f.chan ;pick up disk channel numberî
|
||||
move tt,@ttsar(a)î
|
||||
push fxp,tt ;and save itî
|
||||
move a,b ;(car (pnget <uname> 6))î
|
||||
movei b,.atom #6.î
|
||||
call 2,.function PNGETî
|
||||
hlrz a,(a)î
|
||||
move lsrtns"b,(a) ;set up uname in 6bit for lsrunmî
|
||||
pop fxp,lsrtns"a ;the channelî
|
||||
pushj p,lsrtns"lsrunm ;get entry addr in lsrtns"bî
|
||||
movni lsrtns"b,1 ;-1 for lossî
|
||||
move tt,lsrtns"b ;move to where Lisp wants it.î
|
||||
popj p,î
|
||||
î
|
||||
î
|
||||
SUBTTL Fetching an item.î
|
||||
î
|
||||
;;; (LSRITM <item number> <magic number>)î
|
||||
;;; returns the <item number> slot of the entry <magic number>î
|
||||
;;; returned by LSRUNM.î
|
||||
;;; This file sets the symbols I$UNAM etc to the correct values.î
|
||||
;;; Look after this function, and in :INFO LIB LSRTNS .î
|
||||
î
|
||||
.ENTRY LSRITM SUBR 2+1î
|
||||
jsp t,fxnv1 ;item number, a->ttî
|
||||
jsp t,fxnv2 ;address, b->dî
|
||||
push fxp,d ;save so we don't have to worry about ac corresî
|
||||
movem tt,lsrtns"aî
|
||||
pop fxp,lsrtns"bî
|
||||
pushj p,lsrtns"lsritm ;returns bp in lsrtns"aî
|
||||
skipa d,[440700,,[0]] ;unless there was no skip: use null string thenî
|
||||
move d,lsrtns"a ;d is input bpî
|
||||
pushj p,chlp0î
|
||||
move a,b ;reverse the list and atomifyî
|
||||
call 1,.function NREVERSEî
|
||||
jcall 1,.function IMPLODE ;Return the symbol!î
|
||||
î
|
||||
î
|
||||
SUBTTL HSNAME hackery.î
|
||||
;;; Most often you want (STATUS HSNAME user) and not LSRHTL.î
|
||||
î
|
||||
;;; (LSRHTL <file object> <uname>)î
|
||||
;;; Returns a symbol which is the hsname of the argument uname.î
|
||||
;;; Returns NIL if unknown.î
|
||||
î
|
||||
.ENTRY LSRHTL SUBR 2+1î
|
||||
push p,cfix1 ;NCALLable!î
|
||||
movei tt,f.chan ;pick up disk channel numberî
|
||||
move tt,@ttsar(a)î
|
||||
push fxp,tt ;and save itî
|
||||
move a,b ;(car (pnget <uname> 6))î
|
||||
movei b,.atom #6.î
|
||||
call 2,.function PNGETî
|
||||
hlrz a,(a)î
|
||||
move lsrtns"a,(a) ;set up uname in 6bit for lsrunmî
|
||||
pop fxp,lsrtns"b ;the channelî
|
||||
movei c,lsrtns"hx$nrm ;use the normal table.î
|
||||
setz lsrtns"c, ;use the local site.î
|
||||
pushj p,lsrtns"lsrhtl ;get entry addr in lsrtns"bî
|
||||
jrst [ move d,[440700,,[0]] ; use null string for pretend resultî
|
||||
jrst lsrht1 ]î
|
||||
move r,lsrtns"b ;get Bp to user's directory nameî
|
||||
move d,[440600,,r]î
|
||||
lsrht1: pushj p,chlp0 ;CONS up list of letters symbol from Bp in Dî
|
||||
move a,b ;reverse the list and atomifyî
|
||||
call 1,.function NREVERSEî
|
||||
jcall 1,.function IMPLODE ;Return the symbol!î
|
||||
î
|
||||
FASENDî
|
||||
BIN
src/inquir/netrtn.fasl
Normal file
BIN
src/inquir/netrtn.fasl
Normal file
Binary file not shown.
232
src/inquir/reader.28
Normal file
232
src/inquir/reader.28
Normal file
@@ -0,0 +1,232 @@
|
||||
;;; -*- LISP -*-î
|
||||
î
|
||||
(EVAL-WHEN (EVAL COMPILE) (LOAD '((LIBLSP) TTY FASL)))î
|
||||
î
|
||||
(DECLARE (SPECIAL INITIAL-TTY-SPECIFICATIONS SMART-TTY))î
|
||||
î
|
||||
(DECLARE (*LEXPR WHERE-TTY-SHOULD-BE))î
|
||||
î
|
||||
(COND ((NOT (BOUNDP 'SMART-TTY))î
|
||||
(SETQ SMART-TTY (NOT (NOT (MEMQ 'CURSORPOS (STATUS FILEM TYO)))))))î
|
||||
î
|
||||
(DEFUN SMART-TTY? () SMART-TTY)î
|
||||
î
|
||||
(DEFUN BACK-UP-AND-OVERSTRIKE (POS)î
|
||||
(LET ((INITIAL-POS (CDR (CURSORPOS))))î
|
||||
(COND ((= INITIAL-POS POS)î
|
||||
(TYO 10. TYO))î
|
||||
((> INITIAL-POS POS)î
|
||||
(DO ((I INITIAL-POS (1- I)))î
|
||||
((= I POS) T)î
|
||||
(TYO 8. TYO)î
|
||||
(TYO 92. TYO)î
|
||||
(TYO 8. TYO)))î
|
||||
(Tî
|
||||
(TYO 10. TYO)î
|
||||
(DO ((I INITIAL-POS (1+ I)))î
|
||||
((= I POS) T)î
|
||||
(TYO 32. TYO))))))î
|
||||
î
|
||||
(DEFUN FANCY-RUBOUT (POS CHAR)î
|
||||
; ((LAMBDA (CURRENT) ;debugging codeî
|
||||
; (CURSORPOS 23. 0. TYO)î
|
||||
; (PRINC (LIST 'POS= POS 'ASCII= CHAR) TYO)î
|
||||
; (PRINC '| --MORE--| TYO)î
|
||||
; (TYI TYI)î
|
||||
; (CURSORPOS 23. 0. TYO)î
|
||||
; (CURSORPOS 'L TYO)î
|
||||
; (CURSORPOS (CAR CURRENT) (CDR CURRENT) TYO))î
|
||||
; (CURSORPOS))î
|
||||
(COND ((= CHAR 10.)î
|
||||
(CURSORPOS 'U TYO)î
|
||||
(CURSORPOS 'L TYO))î
|
||||
((= CHAR 13.)î
|
||||
(CURSORPOS (1- (CAR (CURSORPOS))) POS)î
|
||||
(CURSORPOS 'L TYO))î
|
||||
(Tî
|
||||
(CURSORPOS NIL POS TYO)î
|
||||
(CURSORPOS 'L TYO))))î
|
||||
î
|
||||
(DEFUN READER$RUBOUT (POS SMART-FLAG CHAR)î
|
||||
(COND (SMART-FLAG (FANCY-RUBOUT POS CHAR))î
|
||||
(T (BACK-UP-AND-OVERSTRIKE POS))))î
|
||||
î
|
||||
(DEFUN REDISPLAY (LINE PROMPT) (REDISPLAY1 LINE PROMPT))î
|
||||
î
|
||||
(DEFUN REDISPLAY1 (LINE PROMPT)î
|
||||
(COND ((ANDî
|
||||
(SMART-TTY?)î
|
||||
(EQ (CAR (WHERE-TTY-SHOULD-BE)) (CAR (CURSORPOS))))î
|
||||
(CURSORPOS NIL 0. TYO)î
|
||||
(CURSORPOS 'L TYO))î
|
||||
(T (CURSORPOS 'A TYO)))î
|
||||
(COND (PROMPT (PRINC PROMPT TYO))î
|
||||
(T (CURSORPOS NIL (CDAR (LAST LINE)) TYO)))î
|
||||
(DO ((L (REVERSE LINE) (CDR L)))î
|
||||
((NULL L))î
|
||||
(COND ((ATOM (CAR L))î
|
||||
(CURSORPOS NIL (LINEL TYO) TYO)î
|
||||
(PRINC '- TYO)î
|
||||
(TERPRI TYO))î
|
||||
(Tî
|
||||
(RPLACD (CAR L) (CDR (CURSORPOS TYO)))î
|
||||
(TYO (CAAR L) TYO))))î
|
||||
(WHERE-TTY-SHOULD-BE (CURSORPOS TYO)))î
|
||||
î
|
||||
(DEFUN SCROD-DISPLAY () (NOT (EQUAL (WHERE-TTY-SHOULD-BE) (CURSORPOS TYO))))î
|
||||
î
|
||||
(DEFUN WHERE-TTY-SHOULD-BE Xî
|
||||
(COND ((ZEROP X) (GET 'INPUT-LINE 'WHERE-TTY-SHOULD-BE))î
|
||||
((= X 1.) (PUTPROP 'INPUT-LINE (ARG 1) 'WHERE-TTY-SHOULD-BE))î
|
||||
(T (BREAK |(Wrong Number of Args to WHERE-TTY-SHOULD-BE)|))))î
|
||||
î
|
||||
(DEFUN ONE-LINE-ONLY (LINE)î
|
||||
(DO ((L LINE (CDR L))î
|
||||
(A NIL))î
|
||||
((NULL L) (REVERSE A))î
|
||||
(COND ((OR (EQ (CAR L) '<CR>)î
|
||||
(MEMBER (CAAR L) '(13. 10.)))î
|
||||
(RETURN (REVERSE A)))î
|
||||
(T (SETQ A (CONS (CAR L) A))))))î
|
||||
î
|
||||
(DEFUN RUBBING-OUT @î
|
||||
(COND ((ZEROP @) (GET 'INPUT-LINE 'RUBBING-OUT))î
|
||||
(T (PUTPROP 'INPUT-LINE (ARG 1) 'RUBBING-OUT))))î
|
||||
î
|
||||
(SSTATUS TTYINT 23. NIL)î
|
||||
î
|
||||
(DEFUN READER$DELETE (LINE PROMPT)î
|
||||
(PROG (POS CHAR)î
|
||||
(COND ((NULL LINE)î
|
||||
(PRINC (ASCII 7.) TYO)î
|
||||
(RETURN NIL)))î
|
||||
(COND ((ATOM (CAR LINE))î
|
||||
(CURSORPOS (1- (CAR (CURSORPOS))) (1- (LINEL TYO)) TYO)î
|
||||
(WHERE-TTY-SHOULD-BE (CURSORPOS))î
|
||||
(SETQ LINE (CDR LINE))))î
|
||||
(SETQ POS (CDAR LINE))î
|
||||
(SETQ CHAR (CAAR LINE))î
|
||||
(SETQ LINE (CDR LINE))î
|
||||
(COND ((SCROD-DISPLAY) (REDISPLAY LINE PROMPT))î
|
||||
(Tî
|
||||
(READER$RUBOUT POS (SMART-TTY?) CHAR)))î
|
||||
(WHERE-TTY-SHOULD-BE (CURSORPOS))î
|
||||
(RUBBING-OUT T)î
|
||||
(RETURN LINE)))î
|
||||
î
|
||||
(DEFUN ADD (CHAR LINE PROMPT)î
|
||||
(PROG (POS)î
|
||||
(SETQ POS (CDAR LINE))î
|
||||
(COND ((SCROD-DISPLAY) (REDISPLAY LINE PROMPT)))î
|
||||
(COND ((> (+ (FLATC (ASCII CHAR)) (CDR (CURSORPOS)))î
|
||||
(LINEL TYO))î
|
||||
(CURSORPOS NIL (LINEL TYO) TYO)î
|
||||
(PRINC '- TYO)î
|
||||
(TERPRI TYO)î
|
||||
(SETQ LINE (CONS '<CR> LINE))))î
|
||||
(SETQ LINE (CONS (CONS CHAR (CDR (CURSORPOS))) LINE))î
|
||||
(COND ((RUBBING-OUT) (UPDATE-DISPLAY)))î
|
||||
(RUBBING-OUT NIL)î
|
||||
(TYO CHAR TYO)î
|
||||
(RETURN LINE)))î
|
||||
î
|
||||
(DEFUN UPDATE-DISPLAY ()î
|
||||
(COND ((NOT (SMART-TTY?)) (TYO 10. TYO))))î
|
||||
î
|
||||
(DEFUN CLEAR-SCREEN ()î
|
||||
(CURSORPOS 'C TYO))î
|
||||
î
|
||||
(DEFUN LINE-READ-A-NUMBER (PROMPT TYPE)î
|
||||
(PROG (NUM)î
|
||||
TOPî
|
||||
(SETQ NUM (READER PROMPT '(13.)))î
|
||||
(SETQ NUMî
|
||||
(CARî
|
||||
(ERRSET (READLIST (DELETE '| | NUM))î
|
||||
NIL)))î
|
||||
(COND ((NUMBERP NUM)î
|
||||
(RETURN (COND (TYPE (FUNCALL TYPE NUM))î
|
||||
(T NUM))))î
|
||||
(Tî
|
||||
(CURSORPOS 'A TYO)î
|
||||
(PRINC '|Data must be numeric. Please retry.| TYO)î
|
||||
(CURSORPOS 'A TYO)î
|
||||
(GO TOP)))))î
|
||||
î
|
||||
(DEFUN READER (PROMPT TERMINAL)î
|
||||
(DO-WITH-TTY-OFFî
|
||||
(PROG (TEMP)î
|
||||
(PRINC PROMPT TYO)î
|
||||
(WHERE-TTY-SHOULD-BE (CURSORPOS))î
|
||||
(SETQ TEMPî
|
||||
(DO ((C (TYI TYI) (TYI TYI))î
|
||||
(LINE NIL))î
|
||||
((MEMBER C TERMINAL) LINE)î
|
||||
(COND ((= C 127.)î
|
||||
(SETQ LINE (READER$DELETE LINE PROMPT)))î
|
||||
((= C 12.)î
|
||||
(CLEAR-SCREEN)î
|
||||
(REDISPLAY LINE PROMPT))î
|
||||
((= C 18.)î
|
||||
; ((LAMBDA (TEMP)î
|
||||
; (CURSORPOS 12. 0. TYO)î
|
||||
; (PRINT (LIST 'LINE= LINEî
|
||||
; 'ONE= (ONE-LINE-ONLY LINE)))î
|
||||
; (CURSORPOS (CAR TEMP) (CDR TEMP) TYO))î
|
||||
; (CURSORPOS))î
|
||||
(REDISPLAY (ONE-LINE-ONLY LINE) NIL))î
|
||||
((= C 21.)î
|
||||
(SETQ LINE (READER$FLUSH-LINE LINE PROMPT)))î
|
||||
((= C 23.)î
|
||||
(SETQ LINE (READER$DELETE-WORD LINE PROMPT)))î
|
||||
(T (SETQ LINE (ADD C LINE PROMPT))))î
|
||||
(WHERE-TTY-SHOULD-BE (CURSORPOS))))î
|
||||
(SETQ TEMPî
|
||||
(DO ((L TEMP (CDR L))î
|
||||
(A NIL))î
|
||||
((NULL L) A)î
|
||||
(COND ((NOT (ATOM (CAR L)))î
|
||||
(SETQ A (CONS (ASCII (CAAR L)) A))))))î
|
||||
(RETURN TEMP))))î
|
||||
î
|
||||
(DEFUN READER$DELETE-WORD (LINE PROMPT)î
|
||||
(READER$FLUSH-ALPHA (READER$FLUSH-NON-ALPHA LINE PROMPT) PROMPT))î
|
||||
î
|
||||
(DEFUN READER$FLUSH-NON-ALPHA (LINE PROMPT)î
|
||||
(DO ((L LINE))î
|
||||
((OR (NULL L) (AND (NOT (ATOM (CAR L))) (ALPHAP (CAAR L)))) L)î
|
||||
(SETQ L (READER$DELETE L PROMPT))î
|
||||
(WHERE-TTY-SHOULD-BE (CURSORPOS))))î
|
||||
î
|
||||
(DEFUN READER$FLUSH-ALPHA (LINE PROMPT)î
|
||||
(DO ((L LINE))î
|
||||
((OR (NULL L) (ATOM (CAR L)) (NOT (ALPHAP (CAAR L)))) L)î
|
||||
(SETQ L (READER$DELETE L PROMPT))î
|
||||
(WHERE-TTY-SHOULD-BE (CURSORPOS))))î
|
||||
î
|
||||
(DEFUN READER$FLUSH-LINE (LINE PROMPT)î
|
||||
(DO ((L (AND LINE (READER$DELETE LINE PROMPT))î
|
||||
(READER$DELETE L PROMPT)))î
|
||||
((OR (NULL L)î
|
||||
(AND (NOT (ATOM (CAR L))) (= (CAAR L) 13.)))î
|
||||
L)))î
|
||||
î
|
||||
(DEFUN ALPHAP (X)î
|
||||
(AND (NUMBERP X)î
|
||||
(OR (AND (> X 64.) (< X 91.))î
|
||||
(AND (> X 96.) (< X 123.)))))î
|
||||
î
|
||||
(DEFUN READ-ALTMODE (PROMPT)î
|
||||
(IMPLODE (READER PROMPT '(27.))))î
|
||||
î
|
||||
(DEFUN READ-<CR> (PROMPT)î
|
||||
(IMPLODE (READER PROMPT '(13.))))î
|
||||
î
|
||||
(DEFUN READ-SPACE (PROMPT)î
|
||||
(IMPLODE (READER PROMPT '(32.))))î
|
||||
î
|
||||
(DEFUN R ()î
|
||||
(CURSORPOS 'A TYO)î
|
||||
(READER '|> | '(13.)))î
|
||||
î
|
||||
(DEFPROP READER T LOADED)
|
||||
Reference in New Issue
Block a user