Annotation of 43BSD/ucb/lisp/lisplib/common2.l, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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