Annotation of 42BSD/ucb/lisp/lisplib/common2.l, revision 1.1

1.1     ! root        1: (setq rcs-common2-
        !             2:    "$Header: common2.l,v 1.7 83/09/12 15:23:23 layer Exp $")
        !             3: 
        !             4: ;;
        !             5: ;; common2.l                           -[Sat Aug 13 12:55:56 1983 by jkf]-
        !             6: ;;
        !             7: ;; lesser used functions
        !             8: ;;
        !             9: 
        !            10: 
        !            11: (declare (macros t))
        !            12: 
        !            13: ;--- process functions
        !            14: ; these functions permit the user to start up processes and either
        !            15: ; to either wait for their completion or to continue processing,
        !            16: ; communicating with them through a pipe.
        !            17: ;
        !            18: ; the main function, *process, is written in C.  These functions
        !            19: ; handle the common cases
        !            20: ;
        !            21: ;--- *process-send  :: start a process and return port to write to
        !            22: ;
        !            23: (defun *process-send (command)
        !            24:    (cadr (*process command nil t)))
        !            25: 
        !            26: ;--- *process-receive :: start a process and return port to read from
        !            27: ;
        !            28: (defun *process-receive (command)
        !            29:    (car (*process command t)))
        !            30: 
        !            31: ;--- process :: the old nlambda version of process
        !            32: ;  this function is kept around for compatibility
        !            33: ; use: (process command [frompipe [topipe]])
        !            34: ;  if the from and to pipes aren't given, run it and wait
        !            35: ;
        !            36: (defun process fexpr (args)
        !            37:    (declare (*args 1 3))
        !            38:    (let ((command (car args))
        !            39:         (fromport (cadr args))
        !            40:         (toport (caddr args)))
        !            41:       (cond ((null (cdr args)) (*process command))  ; call and wait
        !            42:            (t (let ((res (*process command fromport toport)))
        !            43:                  (cond (fromport (set fromport (cadr res))))
        !            44:                  (cond (toport (set toport (car res))))
        !            45:                  ; return pid
        !            46:                  (caddr res))))))
        !            47: 
        !            48: 
        !            49: ;--- msg : print a message consisting of strings and values
        !            50: ; arguments are:
        !            51: ;   N      - print a newline
        !            52: ;   (N foo) - print foo newlines (foo is evaluated)
        !            53: ;   B       - print a blank
        !            54: ;   (B foo) - print foo blanks (foo is evaluated)
        !            55: ;   (P foo) - print following args to port foo (foo is evaluated)
        !            56: ;   D      - drain
        !            57: ;   other   - evaluate a princ the result (remember strings eval to themselves)
        !            58: 
        !            59: (defmacro msg (&rest msglist)
        !            60:   (do ((ll msglist (cdr ll))
        !            61:        (result)
        !            62:        (cur nil nil)
        !            63:        (curport nil)
        !            64:        (current))
        !            65:       ((null ll) `(progn ,@(nreverse result)))
        !            66:       (setq current (car ll))
        !            67:       (If (dtpr current)
        !            68:          then (If (eq (car current) 'N)
        !            69:                   then (setq cur `(msg-tyo-char 10 ,(cadr current)))
        !            70:                elseif (eq (car current) 'B)
        !            71:                   then (setq cur `(msg-tyo-char 32 ,(cadr current)))
        !            72:                elseif (eq (car current) 'P)
        !            73:                   then (setq curport (cadr current))
        !            74:                else (setq cur `(msg-print ,current)))
        !            75:        elseif (eq current 'N)
        !            76:          then (setq cur (list 'terpr))         ; (can't use backquote
        !            77:        elseif (eq current 'B)                  ; since must have new
        !            78:          then (setq cur (list 'tyo 32))        ; dtpr cell at end)
        !            79:        elseif (eq current 'D)
        !            80:          then (setq cur '(drain))
        !            81:        else (setq cur `(msg-print ,current)))
        !            82:       (If cur 
        !            83:          then (setq result (cons (If curport then (nconc cur (ncons curport))
        !            84:                                              else cur)
        !            85:                                  result)))))
        !            86: 
        !            87: (defun msg-tyo-char (ch n &optional (port nil))
        !            88:   (do ((i n (1- i)))
        !            89:       ((< i 1))
        !            90:       (cond ((eq ch 10) (terpr port))
        !            91:            (t (tyo ch port)))))
        !            92: 
        !            93: (defun msg-print (item &optional (port nil))
        !            94:    (patom item port))
        !            95: 
        !            96: ;--- printblanks :: print out a stream of blanks to the given port
        !            97: ; (printblanks 'x_numberofblanks 'p_port)
        !            98: ;
        !            99: (def printblanks
        !           100:    (lambda (n prt)
        !           101:       (let ((easy (memq n '( 0  ""
        !           102:                             1  " "
        !           103:                             2  "  "
        !           104:                             3  "   "
        !           105:                             4  "    "
        !           106:                             5  "     "
        !           107:                             6  "      "
        !           108:                             7  "       "
        !           109:                             8  "        "))))
        !           110:         (cond (easy (patom (cadr easy) prt))
        !           111:               (t (do ((i n (1- i)))
        !           112:                      ((<& i 1))
        !           113:                      (patom " " prt)))))))
        !           114: 
        !           115: 
        !           116: 
        !           117: 
        !           118: 
        !           119: ; --- linelength [numb]
        !           120: ;
        !           121: ; sets the linelength (actually just varib linel) to the
        !           122: ; number given: numb
        !           123: ; if numb is not given, the current line length is returned
        !           124: ; 
        !           125: 
        !           126: (declare (special linel))
        !           127: 
        !           128: (setq linel 80)
        !           129: 
        !           130: (def linelength
        !           131:      (nlambda (form)
        !           132:              (cond ((null form) linel )
        !           133:                    ((numberp (car form)) (setq linel (car form)))
        !           134:                    (t linel))))
        !           135: 
        !           136: ; ========================================
        !           137: ;
        !           138: ;      (charcnt port) 
        !           139: ; returns the number of characters left on the current line
        !           140: ; on the given port
        !           141: ;
        !           142: ; =======================================
        !           143: 
        !           144: 
        !           145: (def charcnt
        !           146:      (lambda (port) (- linel (nwritn port))))
        !           147: 
        !           148: ;--- nthcdr :: do n cdrs of the list and return the result
        !           149: ;
        !           150: ; 
        !           151: (defun nthcdr (index list)
        !           152:    (cond ((fixp index)
        !           153:          (cond ((<& index 0)
        !           154:                 (cons nil list))
        !           155:                ((=& index 0)
        !           156:                 list)
        !           157:                (t (nthcdr (1- index) (cdr list)))))
        !           158:         (t (error "Non fixnum first argument to nthcdr " index))))
        !           159: 
        !           160: ;--- nthcdr (cmacro) :: version of nthcdr for use by the compiler
        !           161: ;
        !           162: (defcmacro nthcdr (index list)
        !           163:    (if (and (fixp index) (=& index 0))
        !           164:       then list        ; (nthcdr 0 expr) => expr
        !           165:       else (let ((val (assq index '((1  . cdr)
        !           166:                                    (2  . cddr)
        !           167:                                    (3  . cdddr)
        !           168:                                    (4  . cddddr)
        !           169:                                    (5  . cdddddr)
        !           170:                                    (6  . cddddddr)))))
        !           171:              (cond (val `(,(cdr val) ,list))   ; (nthcdr 1-6 list)
        !           172:                    (t `(nthcdr ,index ,list)))))) ; other cases
        !           173: 
        !           174: 
        !           175: ;--- nth :: return nth element of the list
        !           176: ; cdr index times and then car to get the element.
        !           177: ; thus the first element is 0
        !           178: ;
        !           179: (defun nth (index list)
        !           180:    (car (nthcdr index list)))
        !           181: 
        !           182: ;--- nth (cmacro) :: compiler macro to do the same thing
        !           183: ;
        !           184: (defcmacro nth (index list)
        !           185:    `(car (nthcdr ,index ,list)))
        !           186: 
        !           187:    
        !           188: 
        !           189: 
        !           190: ;;==============================
        !           191: ;  (assqr val alist)
        !           192: ; acts much like assq, it looks for val in the cdr of elements of
        !           193: ; the alist and returns the element if found.
        !           194: ; fix this when the compiler works
        !           195: (eval-when nil (def assqr 
        !           196:     (lambda (val alist)
        !           197:        (do ((al alist (cdr al)))
        !           198:            ((null al) nil)
        !           199:            (cond ((eq val (cdar al)) (return (car al))))))))
        !           200: 
        !           201: 
        !           202: ; ====================
        !           203: ; (listp 'x) is t if x is a non-atom or nil
        !           204: ; ====================
        !           205: (def listp (lambda (val) (or (dtpr val) (null val))))
        !           206: 
        !           207: 
        !           208: 
        !           209: ;--- memcar - VAL : lispval
        !           210: ;          - LIS : list
        !           211: ;      returns t if VAL found as the car of a top level element.
        !           212: ;temporarily turn this off till the compiler can handle it.
        !           213: (eval-when nil (def memcar 
        !           214:   (lambda (a l)
        !           215:          (do ((ll l (cdr ll)))
        !           216:              ((null ll) nil)
        !           217:              (cond ((equal (caar ll) a) (return (cdar ll))))))))
        !           218: 
        !           219: ; =================================
        !           220: ;
        !           221: ;      (memcdr 'val 'listl)
        !           222: ;
        !           223: ; the list listl is searched for a list
        !           224: ; with cdr equal to val. if found, the
        !           225: ; car of that list is returned.
        !           226: ; ==================================
        !           227: ;fix this when compiler works ok
        !           228: (eval-when nil (def memcdr 
        !           229:   (lambda (a l)
        !           230:          (do ((ll l (cdr ll)))
        !           231:              ((null ll) nil)
        !           232:              (cond ((equal (cdar ll) a) (return (caar l))))))))
        !           233: 
        !           234: 
        !           235: ;this looks like funcall, so we will just use it
        !           236: '(def apply* 
        !           237:   (nlambda ($x$)
        !           238:        (eval (cons (eval (car $x$)) (cdr $x$)))))
        !           239: 
        !           240: (putd 'apply* (getd 'funcall))
        !           241: 
        !           242: (defun remq (item list &optional (cnt -1))     ;no tail recursion sucks.
        !           243:    (let ((head nil)
        !           244:         (tail nil))
        !           245:       (do ((l list (cdr l))
        !           246:           (newcell))
        !           247:          ((null l) head)
        !           248:          (cond ((or (not (eq (car l) item))
        !           249:                     (=& 0 cnt))
        !           250:                 (setq newcell (list (car l)))
        !           251:                 (cond ((null head) (setq head newcell))
        !           252:                       (t (rplacd tail newcell)))
        !           253:                 (setq tail newcell))
        !           254:                (t (setq cnt (1- cnt)))))))
        !           255: 
        !           256: (defun tab n
        !           257:    (prog (nn prt over)
        !           258:       (setq nn (arg 1))
        !           259:       (cond ((>& n 1) (setq prt (arg 2))))
        !           260:       (cond ((>& (setq over (nwritn prt)) nn)
        !           261:             (terpri prt)
        !           262:             (setq over 0)))
        !           263:       (printblanks (- nn over) prt)))
        !           264: 
        !           265: ;--- charcnt :: returns the number of characters left on the current line
        !           266: ;      p - port
        !           267: ;(local function)
        !           268: (def charcnt
        !           269:      (lambda (port) (- linel (nwritn port))))
        !           270: 
        !           271: ;(local function)
        !           272: ;
        !           273: (declare (special $outport$))
        !           274: (def $patom1 (lambda (x) (patom x $outport$)))
        !           275: 
        !           276: ;;; --- cmu  functions ---
        !           277: (def attach
        !           278:    (lambda (x y)
        !           279:           (cond ((dtpr y) (rplacd y (cons (car y) (cdr y))) (rplaca y x))
        !           280:                 (t (error "An atom can't be attached to " y)))))
        !           281: (def Cnth
        !           282:    (lambda (x n)
        !           283:           (cond ((> 1 n) (cons nil x))
        !           284:                 (t
        !           285:                    (prog nil
        !           286:                     lp   (cond ((or (atom x) (eq n 1)) (return x)))
        !           287:                          (setq x (cdr x))
        !           288:                          (setq n (1- n))
        !           289:                          (go lp))))))
        !           290: 
        !           291: 
        !           292: 
        !           293: 
        !           294: (def dsubst
        !           295:    (lambda (x y z)
        !           296:           (prog (b)
        !           297:                 (cond ((eq y (setq b z)) (return (copy x))))
        !           298:                 lp
        !           299:                 (cond ((atom z) (return b))
        !           300:                       ((cond ((symbolp y) (eq y (car z))) (t (equal y (car z))))
        !           301:                        (rplaca z (copy x)))
        !           302:                       (t (dsubst x y (car z))))
        !           303:                 (cond ((and y (eq y (cdr z))) (rplacd z (copy x)) (return b)))
        !           304:                 (setq z (cdr z))
        !           305:                 (go lp))))
        !           306: 
        !           307: (putd 'eqstr (getd 'equal))
        !           308: 
        !           309: (defun insert (x l comparefn nodups)
        !           310:       (cond ((null l) (list x))
        !           311:             ((atom l) (error "an atom, can't be inserted into" l))
        !           312:             ((and nodups (member x l)) l)
        !           313:            (t (cond
        !           314:                 ((null comparefn) (setq comparefn (function alphalessp))))
        !           315:                (prog (l1 n n1 y)
        !           316:                      (setq l1 l)
        !           317:                      (setq n (length l))
        !           318:                 a    (setq n1 (/ (add1 n) 2))
        !           319:                      (setq y (Cnth l1 n1))
        !           320:                      (cond ((< n 3)
        !           321:                             (cond ((funcall comparefn x (car y))
        !           322:                                    (cond
        !           323:                                     ((not (equal x (car y)))
        !           324:                                      (rplacd y (cons (car y) (cdr y)))
        !           325:                                      (rplaca y x))))
        !           326:                                   ((eq n 1) (rplacd y (cons x (cdr y))))
        !           327:                                   ((funcall comparefn x (cadr y))
        !           328:                                    (cond
        !           329:                                     ((not (equal x (cadr y)))
        !           330:                                      (rplacd (cdr y)
        !           331:                                              (cons (cadr y) (cddr y)))
        !           332:                                      (rplaca (cdr y) x))))
        !           333:                                   (t (rplacd (cdr y) (cons x (cddr y))))))
        !           334:                            ((funcall comparefn x (car y))
        !           335:                             (cond
        !           336:                              ((not (equal x (car y)))
        !           337:                               (setq n (sub1 n1))
        !           338:                               (go a))))
        !           339:                            (t (setq l1 (cdr y)) (setq n (- n n1)) (go a))))
        !           340:                l)))
        !           341: 
        !           342: 
        !           343: 
        !           344: 
        !           345: (def kwote (lambda (x) (list 'quote x)))
        !           346: 
        !           347: (def lconc
        !           348:      (lambda 
        !           349:       (ptr x)
        !           350:       (prog (xx)
        !           351:             (return
        !           352:              (cond ((atom x) ptr)
        !           353:                    (t (setq xx (last x))
        !           354:                       (cond ((atom ptr) (cons x xx))
        !           355:                             ((dtpr (cdr ptr))
        !           356:                              (rplacd (cdr ptr) x)
        !           357:                              (rplacd ptr xx))
        !           358:                             (t (rplaca (rplacd ptr xx) x)))))))))
        !           359: (def ldiff
        !           360:      (lambda (x y)
        !           361:       (cond ((eq x y) nil)
        !           362:             ((null y) x)
        !           363:             (t
        !           364:              (prog (v z)
        !           365:                    (setq z (setq v (ncons (car x))))
        !           366:               loop (setq x (cdr x))
        !           367:                    (cond ((eq x y) (return z))
        !           368:                          ((null x) (error "not a tail - ldiff")))
        !           369:                    (setq v (cdr (rplacd v (ncons (car x)))))
        !           370:                    (go loop))))))
        !           371: 
        !           372: (def lsubst
        !           373:      (lambda (x y z)
        !           374:       (cond ((null z) nil)
        !           375:             ((atom z) (cond ((eq y z) x) (t z)))
        !           376:             ((equal y (car z)) (nconc (copy x) (lsubst x y (cdr z))))
        !           377:             (t (cons (lsubst x y (car z)) (lsubst x y (cdr z)))))))
        !           378: 
        !           379: (def merge
        !           380:    (lambda (a b %%cfn)
        !           381:       (declare (special %%cfn))
        !           382:       (cond ((null %%cfn) (setq %%cfn (function alphalessp))))
        !           383:       (merge1 a b)))
        !           384: 
        !           385: (def merge1
        !           386:    (lambda (a b)
        !           387:       (declare (special %%cfn))
        !           388:       (cond ((null a) b)
        !           389:            ((null b) a)
        !           390:            (t
        !           391:               (prog (val end)
        !           392:                  (setq val
        !           393:                        (setq end
        !           394:                              (cond ((funcall %%cfn (car a) (car b))
        !           395:                                     (prog1 a (setq a (cdr a))))
        !           396:                                    (t (prog1 b (setq b (cdr b)))))))
        !           397:                  loop (cond ((null a) (rplacd end b) (return val))
        !           398:                             ((null b) (rplacd end a) (return val))
        !           399:                             ((funcall %%cfn (car a) (car b))
        !           400:                              (rplacd end a)
        !           401:                              (setq a (cdr a)))
        !           402:                             (t (rplacd end b) (setq b (cdr b))))
        !           403:                  (setq end (cdr end))
        !           404:                  (go loop))))))
        !           405: 
        !           406: (defmacro neq (a b) `(not (eq ,a ,b)))
        !           407: 
        !           408: (putd 'nthchar (getd 'getchar))
        !           409: ;(def nthchar
        !           410: ;     (lambda (x n)
        !           411: ;      (cond ((plusp n) (car (Cnth (explodec x) n)))
        !           412: ;            ((minusp n) (car (Cnth (reverse (explodec x)) (minus n))))
        !           413: ;            ((zerop n) nil))))
        !           414: 
        !           415: (defmacro quote! (&rest a) (quote!-expr-mac a))
        !           416: 
        !           417: (eval-when (compile eval load)
        !           418:    
        !           419: (defun quote!-expr-mac (form)
        !           420:    (cond ((null form) nil)
        !           421:         ((atom form) `',form)
        !           422:         ((eq (car form) '!)
        !           423:          `(cons ,(cadr form) ,(quote!-expr-mac (cddr form))))
        !           424:         ((eq (car form) '!!)
        !           425:          (cond ((cddr form) `(append ,(cadr form)
        !           426:                                       ,(quote!-expr-mac (cddr form))))
        !           427:                (t (cadr form))))
        !           428:         (t `(cons ,(quote!-expr-mac (car form))
        !           429:                    ,(quote!-expr-mac (cdr form))))))
        !           430: 
        !           431: )
        !           432: 
        !           433: (defun remove (item list &optional (cnt -1))
        !           434:   (let ((head '())
        !           435:        (tail nil))
        !           436:     (do ((l list (cdr l))
        !           437:         (newcell))
        !           438:        ((null l) head)
        !           439:       (cond ((or (not (equal (car l) item))
        !           440:                 (zerop cnt))
        !           441:             (setq newcell (list (car l)))
        !           442:             (cond ((null head) (setq head newcell))
        !           443:                   (t (rplacd tail newcell)))
        !           444:             (setq tail newcell))
        !           445:            (t (setq cnt (1- cnt)))))))
        !           446: 
        !           447: (def subpair
        !           448:      (lambda (old new expr)
        !           449:       (cond (old (subpr expr old (or new '(nil)))) (t expr))))
        !           450: 
        !           451: (def subpr
        !           452:    (lambda (expr l1 l2)
        !           453:           (prog (d a)
        !           454:                 (cond ((atom expr) (go lp))
        !           455:                       ((setq d (cdr expr)) (setq d (subpr d l1 l2))))
        !           456:                 (setq a (subpr (car expr) l1 l2))
        !           457:                 (return
        !           458:                    (cond ((or (neq a (car expr))
        !           459:                               (neq d (cdr expr))) (cons a d))
        !           460:                          (t expr)))
        !           461:                 lp   (cond ((null l1) (return expr))
        !           462:                            (l2 (cond ((eq expr (car l1))
        !           463:                                       (return (car l2)))))
        !           464:                            (t (cond ((eq expr (caar l1))
        !           465:                                      (return (cdar l1))))))
        !           466:                 (setq l1 (cdr l1))
        !           467:                 (and l2 (setq l2 (or (cdr l2) '(nil))))
        !           468:                 (go lp))))
        !           469: (def tailp
        !           470:    (lambda (x y)
        !           471:           (and x
        !           472:                (prog nil
        !           473:                      lp   (cond ((atom y) (return nil)) ((eq x y) (return x)))
        !           474:                  (setq y (cdr y))
        !           475:                  (go lp)))))
        !           476: 
        !           477: (def tconc
        !           478:      (lambda (p x)
        !           479:       (cond ((atom p) (cons (setq x (ncons x)) x))
        !           480:             ((dtpr (cdr p)) (rplacd p (cdr (rplacd (cdr p) (ncons x)))))
        !           481:             (t (rplaca p (cdr (rplacd p (ncons x))))))))
        !           482: 
        !           483: ;--- int:vector-range-error
        !           484: ; this is called from compiled code if a vector reference is made
        !           485: ; which is out of bounds.  it should print an error message and
        !           486: ; never return
        !           487: (defun int:vector-range-error (vec index)
        !           488:    (error "vector index out of range detected in compiled code "
        !           489:          (list vec index)))
        !           490: 
        !           491: ;--- int:wrong-number-of-args-error :: pass wna error message to user
        !           492: ; this is called from compiled code (through wnaerr in the C interpreter)
        !           493: ; when it has been detected that the wrong number of arguments have
        !           494: ; been passed.  The state of the arguments are:
        !           495: ;      args 1 to (- n 3) are the acutal arguments
        !           496: ;      arg (- n 2) is the name of the function called
        !           497: ;      arg (- n 1) is the minimum number of arguments allowed
        !           498: ;      arg n is the maximum number of arguments allowed
        !           499: ;              (or -1 if there is no maximum)
        !           500: (defun int:wrong-number-of-args-error n
        !           501:    (let ((max (arg n))
        !           502:         (min (arg (1- n)))
        !           503:         (name (arg (- n 2))))
        !           504:       (do ((i (- n 3) (1- i))
        !           505:           (x)
        !           506:           (args))
        !           507:          ((<& i 1)
        !           508:           ; cases
        !           509:           ;  exact number
        !           510:           ;  min and max
        !           511:           ;  only a min
        !           512:           (if (=& min max)
        !           513:              then (setq x
        !           514:                    (format nil
        !           515:                     "`~a' expects ~r argument~p but was given ~@d:"
        !           516:                     name min min (length args)))
        !           517:            elseif (=& max -1)
        !           518:              then (setq x
        !           519:                    (format nil
        !           520:                     "`~a' expects at least ~r argument~p but was given ~@d:"
        !           521:                      name min min (length args)))
        !           522:              else (setq x
        !           523:                    (format nil
        !           524:                     "`~a' expects between ~r and ~r arguments but was given ~@d:"
        !           525:                     name min max (length args))))
        !           526:                   
        !           527:           (error x args))
        !           528:          (push (arg i) args))))   
        !           529: ;--- functions to retrieve parts of the vector returned by
        !           530: ;    filestat
        !           531: ;
        !           532: (eval-when (compile eval)
        !           533:    (defmacro filestat-chk (name index)
        !           534:             `(defun ,name (arg)
        !           535:                      (cond ((vectorp arg)
        !           536:                             (vref arg ,index))
        !           537:                            (t (error (concat ',name '|: bad arg |) arg))))))
        !           538: (filestat-chk filestat:mode    0)
        !           539: (filestat-chk filestat:type    1)
        !           540: (filestat-chk filestat:nlink   2)
        !           541: (filestat-chk filestat:uid     3)
        !           542: (filestat-chk filestat:gid     4)
        !           543: (filestat-chk filestat:size    5)
        !           544: (filestat-chk filestat:atime   6)
        !           545: (filestat-chk filestat:mtime   7)
        !           546: (filestat-chk filestat:ctime   8)
        !           547: (filestat-chk filestat:dev     9)
        !           548: (filestat-chk filestat:rdev    10)
        !           549: (filestat-chk filestat:ino     11)
        !           550: 
        !           551: ;; lisp coded showstack and baktrace.
        !           552: ;;
        !           553: 
        !           554: (declare (special showstack-prinlevel showstack-prinlength
        !           555:                  showstack-printer prinlevel prinlength))
        !           556: 
        !           557: (or (boundp 'showstack-prinlevel) (setq showstack-prinlevel 3))
        !           558: (or (boundp 'showstack-prinlength) (setq showstack-prinlength 4))
        !           559: (or (boundp 'showstack-printer)        (setq showstack-printer 'print))
        !           560: (or (getd 'old-showstack) (putd 'old-showstack (getd  'showstack)))
        !           561: (or (getd 'old-baktrace) (putd 'old-baktrace (getd  'baktrace)))
        !           562: 
        !           563: ;--- showstack :: do a stack backtrace.
        !           564: ; arguments (unevaluated) are
        !           565: ;      t  - print trace expressions too (normally they are not printed)
        !           566: ;      N  - for some fixnum N, only print N levels.
        !           567: ;      len N - set prinlength to N
        !           568: ;      lev N - set prinlevel to N
        !           569: ;
        !           570: (defun showstack fexpr (args)
        !           571:    (showstack-baktrace args t))
        !           572: 
        !           573: (defun baktrace fexpr (args)
        !           574:    (showstack-baktrace args nil))
        !           575: 
        !           576: (defun showstack-baktrace (args showstackp)
        !           577:    (let ((print-trace nil)
        !           578:         (levels-to-print -1)
        !           579:         (prinlevel showstack-prinlevel)
        !           580:         (prinlength showstack-prinlength)
        !           581:         (res nil)
        !           582:         (newres nil)
        !           583:         (oldval nil)
        !           584:         (stk nil))
        !           585:       ;; scan arguments
        !           586:       (do ((xx args (cdr xx)))
        !           587:          ((null xx))
        !           588:          (cond ((eq t (car xx)) (setq print-trace t))
        !           589:                ((fixp (car xx)) (setq levels-to-print (car xx)))
        !           590:                ((eq 'lev (car xx))
        !           591:                 (setq xx (cdr xx) prinlevel (car xx)))
        !           592:                ((eq 'len (car xx))
        !           593:                 (setq xx (cdr xx) prinlength (car xx)))))
        !           594:       ;; print the levels
        !           595:       (do ((levs levels-to-print)
        !           596:           (firsttime t nil))
        !           597:          ((or (equal 0 stk)
        !           598:               (zerop levs))
        !           599:           (terpr))
        !           600:          (setq res (int:showstack stk))
        !           601:          (cond ((null res) (terpr) (return nil)))
        !           602:          (setq stk (cdr res)
        !           603:                res (car res))
        !           604:          (cond ((or print-trace (not (trace-funp res)))
        !           605:                 (cond ((and oldval showstackp)
        !           606:                        (setq newres (subst-eq '<**> oldval res)))
        !           607:                       (t (setq newres res)))
        !           608:                 (cond (showstackp (funcall showstack-printer newres) (terpr))
        !           609:                       (t (baktraceprint newres firsttime)))
        !           610:                 (setq levs (1- levs))
        !           611:                 (setq oldval res))))))
        !           612: 
        !           613: (defun baktraceprint (form firsttime)
        !           614:    (cond ((not firsttime) (patom " -- ")))
        !           615:    (cond ((> (nwritn) 65) (terpr)))
        !           616:    (cond ((atom form) (print form))
        !           617:         (t (let ((prinlevel 1)
        !           618:                  (prinlength 2))
        !           619:               (cond ((dtpr form) (print (car form)))
        !           620:                     (t (print form)))))))
        !           621: 
        !           622: 
        !           623: ;--- trace-funp  :: see if this is a trace function call
        !           624: ; return t if this call is a result of tracing a function, or of calling
        !           625: ; showstack
        !           626: ;
        !           627: (defun trace-funp (expr)
        !           628:    (or (and (symbolp expr)
        !           629:            (memq expr '(T-eval  T-apply T-setq
        !           630:                                 eval int:showstack showstack-baktrace)))
        !           631:        (and (dtpr expr)
        !           632:            (cond ((symbolp (car expr))
        !           633:                   (memq (car expr) '(trace-break T-cond T-eval T-setq
        !           634:                                                  T-apply)))
        !           635:                  ((dtpr (car expr))
        !           636:                   (and (eq 'lambda (caar expr))
        !           637:                        (eq 'T-arglst (caadar expr))))))))
        !           638: 
        !           639: ;--- subst-eq  :: replace parts eq to new with old
        !           640: ; make new list structure
        !           641: ;
        !           642: (defun subst-eq (new old list)
        !           643:    (cond ((eq old list)
        !           644:          new)
        !           645:         ((and (dtpr list)
        !           646:               (subst-eqp old list))
        !           647:          (cond ((eq old (car list))
        !           648:                 (cons new (subst-eq new old (cdr list))))
        !           649:                ((dtpr (car list))
        !           650:                 (cons (subst-eq new old (car list))
        !           651:                       (subst-eq new old (cdr list))))
        !           652:                (t (cons (car list)
        !           653:                         (subst-eq new old (cdr list))))))
        !           654:         (t list)))
        !           655: 
        !           656: (defun subst-eqp (old list)
        !           657:    (cond ((eq old list) t)
        !           658:         ((dtpr list)
        !           659:          (or (subst-eqp old (car list))
        !           660:              (subst-eqp old (cdr list))))
        !           661:         (t nil)))
        !           662: 
        !           663: 
        !           664: 
        !           665: ;;; environment macros
        !           666: 
        !           667: (defmacro environment (&rest args)
        !           668:    (do ((xx args (cddr xx))
        !           669:        (when)(action)(res))
        !           670:        ((null xx)
        !           671:        `(progn 'compile
        !           672:                ,@(nreverse res)))
        !           673:        (setq when (car xx)
        !           674:             action (cadr xx))
        !           675:        (if (atom when)
        !           676:          then (setq when (ncons when)))
        !           677:        (if (and (dtpr action)
        !           678:                (symbolp (car action)))
        !           679:          then (setq action (cons (concat "environment-" (car action))
        !           680:                                  (cdr action))))
        !           681:        (push `(eval-when ,when ,action) res)))
        !           682:        
        !           683: 
        !           684: (defun environment-files fexpr (names)
        !           685:    (mapc '(lambda (filename)
        !           686:             (if (not (get filename 'version)) then (load filename)))
        !           687:         names))
        !           688: 
        !           689: (defun environment-syntax fexpr (names)
        !           690:    (mapc '(lambda (class)
        !           691:             (caseq class
        !           692:                 (maclisp (cvttomaclisp))
        !           693:                 (intlisp (cvttointlisp))
        !           694:                 (ucilisp (cvttoucilisp))
        !           695:                 ((franz franzlisp) (cvttofranzlisp))
        !           696:                 (t (error "unknown syntax conversion type " class))))
        !           697:         names))
        !           698: 
        !           699: ;--- standard environments
        !           700: (defmacro environment-maclisp (&rest args)
        !           701:    `(environment (compile load eval) (files machacks)
        !           702:                 (compile eval) (syntax maclisp)
        !           703:                 ,@args))
        !           704: 
        !           705: 
        !           706: (defmacro environment-lmlisp (&rest args)
        !           707:    `(environment (compile load eval) (files machacks lmhacks)
        !           708:                 (compile eval) (syntax maclisp)
        !           709:                 ,@args))
        !           710: 
        !           711: ;;;--- i/o functions redefined.
        !           712: ; The common I/O functions are redefined here to do tilde expansion
        !           713: ; if the tilde-expansion symbol is non nil
        !           714: (declare (special tilde-expansion))
        !           715:    
        !           716: ;First, define the current <name> as int:<name>
        !           717: ;
        !           718: (cond ((null (getd 'int:infile))
        !           719:        (putd 'int:infile (getd 'infile))
        !           720:        (putd 'int:outfile (getd 'outfile))
        !           721:        (putd 'int:fileopen (getd 'fileopen))
        !           722:        (putd 'int:cfasl (getd 'cfasl))
        !           723:        (putd 'int:fasl (getd 'fasl))))
        !           724: 
        !           725: ;Second, define the new functions:
        !           726: 
        !           727: (defun infile (filename)
        !           728:    (cond ((not (or (symbolp filename) (stringp filename)))
        !           729:          (error "infile: non symbol or string filename " filename)))
        !           730:    (cond (tilde-expansion (setq filename (tilde-expand filename))))
        !           731:    (int:infile filename))
        !           732: 
        !           733: (defun outfile (filename &optional args)
        !           734:    (cond ((not (or (symbolp filename) (stringp filename)))
        !           735:          (error "outfile: non symbol or string filename " filename)))
        !           736:    (cond (tilde-expansion (setq filename (tilde-expand filename))))
        !           737:    (int:outfile filename args))
        !           738: 
        !           739: ;--- fileopen :: open a file with a non-standard stdio file
        !           740: ;  [this should probably be flushed because it depends on stdio,
        !           741: ;   which we may not use in the future]
        !           742: (defun fileopen (filename mode)
        !           743:    (cond ((not (or (symbolp filename) (stringp filename)))
        !           744:          (error "fileopen: non symbol or string filename " filename)))
        !           745:    (cond (tilde-expansion (setq filename (tilde-expand filename))))
        !           746:    (int:fileopen filename mode))
        !           747: 
        !           748: (defun fasl (filename &rest args)
        !           749:    (cond ((not (or (symbolp filename) (stringp filename)))
        !           750:          (error "fasl: non symbol or string filename " filename)))
        !           751:    (cond (tilde-expansion (setq filename (tilde-expand filename))))
        !           752:    (lexpr-funcall 'int:fasl filename args))
        !           753: 
        !           754: (defun cfasl (filename &rest args)
        !           755:    (cond ((not (or (symbolp filename) (stringp filename)))
        !           756:          (error "cfasl: non symbol or string filename " filename)))
        !           757:    (cond (tilde-expansion (setq filename (tilde-expand filename))))
        !           758:    (lexpr-funcall 'int:cfasl filename args))
        !           759: 
        !           760: 
        !           761: ;--- probef :: test if a file exists
        !           762: ;
        !           763: (defun probef (filename)
        !           764:    (cond ((not (or (symbolp filename) (stringp filename)))
        !           765:          (error "probef: non symbol or string filename " filename)))
        !           766:    (sys:access filename 0))
        !           767: 
        !           768: 
        !           769: 
        !           770: (declare (special user-name-to-dir-cache))
        !           771: (or (boundp 'user-name-to-dir-cache) (setq user-name-to-dir-cache nil))
        !           772: 
        !           773: ;--- username-to-dir
        !           774: ; given a user name, return the home directory name
        !           775: ;
        !           776: (defun username-to-dir (name)
        !           777:    (cond ((symbolp name) (setq name (get_pname name)))
        !           778:         ((stringp name))
        !           779:         (t (error "username-to-dir: Illegal name " name)))
        !           780:    (let ((val (assoc name user-name-to-dir-cache)))
        !           781:       (cond ((null val)
        !           782:             (setq val (sys:getpwnam name))
        !           783:             (cond (val (push (cons name val) user-name-to-dir-cache))))
        !           784:            (t (setq val (cdr val))))
        !           785:       (cond (val (sys:getpwnam-dir val)))))
        !           786:                    
        !           787: ;--- username-to-dir-flush-cache :: clear all memory of where users are
        !           788: ; it is important to call this function upon startup to clear all
        !           789: ; knowledge of pathnames since this object file could have been copied
        !           790: ; from another machine
        !           791: ;
        !           792: (defun username-to-dir-flush-cache ()
        !           793:    (setq user-name-to-dir-cache nil))
        !           794: 
        !           795: ;--- lisp interface to int:franz-call
        !           796: ;
        !           797: (eval-when (compile eval)
        !           798:    (setq fc_getpwnam 1   fc_access 2  fc_chdir 3  fc_unlink 4
        !           799:         fc_time   5     fc_chmod  6  fc_getpid 7 fc_stat  8
        !           800:         fc_gethostname 9 fc_link 10))
        !           801: 
        !           802: ;--- sys:getpwnam
        !           803: ; (sys:getpwnam 'st_username)
        !           804: ; rets vector: (t_name x_uid x_gid t_dir)
        !           805: ;
        !           806: (defun sys:getpwnam (name)
        !           807:    (cond ((or (symbolp name) (stringp name))
        !           808:          (int:franz-call #.fc_getpwnam name))
        !           809:         (t (error "sys:getpwnam : illegal name " name))))
        !           810: 
        !           811: ; return dir portion
        !           812: ;
        !           813: (defun sys:getpwnam-dir (vec) (vref vec 3))
        !           814: 
        !           815: (defun sys:access (name class)
        !           816:    (cond ((and (or (symbolp name) (stringp name))
        !           817:               (fixp class))
        !           818:          (cond (tilde-expansion (setq name (tilde-expand name))))
        !           819:          (zerop (int:franz-call #.fc_access name class)))
        !           820:         (t (error "sys:access : illegal name or class " name class))))
        !           821: 
        !           822: (defun chdir (dir)
        !           823:    (cond ((or (symbolp dir) (stringp dir))
        !           824:          (cond (tilde-expansion (setq dir (tilde-expand dir))))
        !           825:          (cond ((zerop (int:franz-call #.fc_chdir dir)))
        !           826:                (t (error "cd: can't chdir to " dir))))
        !           827:         (t (error "chdir: illegal argument " dir))))
        !           828: 
        !           829: ;--- sys:unlink :: unlink (remove) a file
        !           830: ;
        !           831: (defun sys:unlink (name)
        !           832:    (cond ((or (symbolp name) (stringp name))
        !           833:          (cond (tilde-expansion (setq name (tilde-expand name))))
        !           834:          (cond ((zerop (int:franz-call #.fc_unlink name)))
        !           835:                (t (error "sys:unlink : unlink failed of " name))))
        !           836:         (t (error "sys:unlink : illegal argument " name))))
        !           837: 
        !           838: ;--- sys:link :: make (hard) link to file
        !           839: ;
        !           840: (defun sys:link (oldname newname)
        !           841:    (cond ((or (symbolp oldname) (stringp oldname))
        !           842:          (cond (tilde-expansion (setq oldname (tilde-expand oldname))))
        !           843:          (cond ((or (symbolp newname) (stringp newname))
        !           844:                 (cond (tilde-expansion (setq newname 
        !           845:                                                (tilde-expand newname))))
        !           846:                 (cond ((zerop (int:franz-call #.fc_link oldname newname)))
        !           847:                       (t (error "sys:link : unlink failed of "
        !           848:                                 oldname newname))))
        !           849:                (t (error "sys:unlink : illegal argument " newname))))
        !           850:         (t (error "sys:unlink : illegal argument " oldname))))
        !           851: 
        !           852: ;--- sys:time :: return 'absolute' time in seconds
        !           853: ;
        !           854: (defun sys:time ()
        !           855:    (int:franz-call #.fc_time))
        !           856: 
        !           857: ;--- sys:chmod :: change mode of file
        !           858: ; return t iff it succeeded.
        !           859: ;
        !           860: (defun sys:chmod (name mode)
        !           861:    (cond ((and (or (stringp name) (symbolp name))
        !           862:               (fixp mode))
        !           863:          (cond (tilde-expansion (setq name (tilde-expand name))))
        !           864:          (cond ((zerop (int:franz-call #.fc_chmod name mode)))
        !           865:                (t (error "sys:chmod : chmod failed of " name))))
        !           866:         (t (error "sys:chmod : illegal argument(s): " name mode))))
        !           867:    
        !           868: (defun sys:getpid ()
        !           869:    (int:franz-call #.fc_getpid))
        !           870: 
        !           871: (defun filestat (name)
        !           872:    (let (ret)
        !           873:       (cond ((or (symbolp name) (stringp name))
        !           874:             (cond (tilde-expansion (setq name (tilde-expand name))))
        !           875:             (cond ((null (setq ret (int:franz-call #.fc_stat name)))
        !           876:                    (error "filestat : file doesn't exist " name))
        !           877:                   (t ret)))
        !           878:            (t (error "filestat : illegal argument " name)))))
        !           879: 
        !           880: ;--- sys:gethostname :: retrieve the current host name as a string
        !           881: ;
        !           882: (defun sys:gethostname ()
        !           883:    (int:franz-call #.fc_gethostname))
        !           884: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.