Hex Artifact Content
Not logged in

Artifact 78fb417fba0fc577d95d2632602b0186ab9b5bd6:


0000: 0a 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20  .(define-syntax 
0010: 63 61 73 74 0a 20 20 28 73 79 6e 74 61 78 2d 72  cast.  (syntax-r
0020: 75 6c 65 73 20 28 29 0a 20 20 20 20 5b 28 5f 20  ules ().    [(_ 
0030: 74 79 70 65 20 70 74 72 29 0a 20 20 20 20 20 28  type ptr).     (
0040: 6d 61 6b 65 2d 66 74 79 70 65 2d 70 6f 69 6e 74  make-ftype-point
0050: 65 72 20 74 79 70 65 20 28 69 66 20 28 66 74 79  er type (if (fty
0060: 70 65 2d 70 6f 69 6e 74 65 72 3f 20 70 74 72 29  pe-pointer? ptr)
0070: 20 28 66 74 79 70 65 2d 70 6f 69 6e 74 65 72 2d   (ftype-pointer-
0080: 61 64 64 72 65 73 73 20 70 74 72 29 0a 09 09 09  address ptr)....
0090: 09 20 20 70 74 72 29 29 5d 29 29 0a 0a 28 64 65  .  ptr))]))..(de
00a0: 66 69 6e 65 2d 73 79 6e 74 61 78 20 64 65 66 69  fine-syntax defi
00b0: 6e 65 2d 6d 64 62 2d 61 6c 6c 6f 63 61 74 6f 72  ne-mdb-allocator
00c0: 20 0a 20 20 20 28 6c 61 6d 62 64 61 20 28 78 29   .   (lambda (x)
00d0: 0a 20 20 20 20 20 28 73 79 6e 74 61 78 2d 63 61  .     (syntax-ca
00e0: 73 65 20 78 20 28 29 20 0a 20 20 20 20 20 20 20  se x () .       
00f0: 5b 28 5f 20 6e 61 6d 65 20 74 79 70 65 29 20 0a  [(_ name type) .
0100: 09 28 62 65 67 69 6e 20 0a 09 20 20 23 60 28 62  .(begin ..  #`(b
0110: 65 67 69 6e 0a 09 20 20 20 20 20 20 28 64 65 66  egin..      (def
0120: 69 6e 65 20 28 6e 61 6d 65 29 20 0a 09 09 28 6d  ine (name) ...(m
0130: 64 62 2d 67 75 61 72 64 2d 70 6f 69 6e 74 65 72  db-guard-pointer
0140: 20 28 6d 61 6b 65 2d 66 74 79 70 65 2d 70 6f 69   (make-ftype-poi
0150: 6e 74 65 72 20 74 79 70 65 20 28 66 6f 72 65 69  nter type (forei
0160: 67 6e 2d 61 6c 6c 6f 63 20 28 66 74 79 70 65 2d  gn-alloc (ftype-
0170: 73 69 7a 65 6f 66 20 74 79 70 65 29 29 29 29 29  sizeof type)))))
0180: 0a 09 20 20 20 20 20 20 29 29 5d 29 29 29 0a 20  ..      ))]))). 
0190: 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 64  (define-syntax d
01a0: 65 66 69 6e 65 2d 6d 64 62 2d 61 72 72 61 79 2d  efine-mdb-array-
01b0: 61 6c 6c 6f 63 61 74 6f 72 20 0a 20 20 20 28 6c  allocator .   (l
01c0: 61 6d 62 64 61 20 28 78 29 0a 20 20 20 20 20 28  ambda (x).     (
01d0: 73 79 6e 74 61 78 2d 63 61 73 65 20 78 20 28 29  syntax-case x ()
01e0: 20 0a 20 20 20 20 20 20 20 5b 28 5f 20 6e 61 6d   .       [(_ nam
01f0: 65 20 74 79 70 65 20 65 6c 65 6d 65 6e 74 2d 74  e type element-t
0200: 79 70 65 29 20 0a 09 28 62 65 67 69 6e 0a 09 20  ype) ..(begin.. 
0210: 20 23 27 28 64 65 66 69 6e 65 20 28 6e 61 6d 65   #'(define (name
0220: 20 73 69 7a 65 29 20 0a 09 20 20 20 20 20 20 28   size) ..      (
0230: 6d 64 62 2d 67 75 61 72 64 2d 70 6f 69 6e 74 65  mdb-guard-pointe
0240: 72 20 28 6d 61 6b 65 2d 66 74 79 70 65 2d 70 6f  r (make-ftype-po
0250: 69 6e 74 65 72 20 74 79 70 65 20 28 66 6f 72 65  inter type (fore
0260: 69 67 6e 2d 61 6c 6c 6f 63 20 28 2a 20 28 66 74  ign-alloc (* (ft
0270: 79 70 65 2d 73 69 7a 65 6f 66 20 65 6c 65 6d 65  ype-sizeof eleme
0280: 6e 74 2d 74 79 70 65 29 20 73 69 7a 65 29 29 29  nt-type) size)))
0290: 29 29 29 5d 29 29 29 0a 0a 20 28 64 65 66 69 6e  )))]))).. (defin
02a0: 65 2d 73 79 6e 74 61 78 20 64 65 66 69 6e 65 2d  e-syntax define-
02b0: 6c 6d 64 62 2d 66 75 6e 63 0a 20 20 20 28 6c 61  lmdb-func.   (la
02c0: 6d 62 64 61 20 28 78 29 0a 20 20 20 20 20 28 73  mbda (x).     (s
02d0: 79 6e 74 61 78 2d 63 61 73 65 20 78 20 28 29 0a  yntax-case x ().
02e0: 20 20 20 20 20 20 20 5b 28 5f 20 72 65 74 2d 74         [(_ ret-t
02f0: 79 70 65 20 6e 61 6d 65 20 28 28 61 72 67 2d 6e  ype name ((arg-n
0300: 61 6d 65 20 61 72 67 2d 74 79 70 65 29 20 2e 2e  ame arg-type) ..
0310: 2e 29 20 63 2d 6e 61 6d 65 29 20 0a 09 28 77 69  .) c-name) ..(wi
0320: 74 68 2d 73 79 6e 74 61 78 20 0a 09 20 28 5b 66  th-syntax .. ([f
0330: 75 6e 63 74 69 6f 6e 2d 66 74 79 70 65 20 0a 09  unction-ftype ..
0340: 20 20 20 28 64 61 74 75 6d 2d 3e 73 79 6e 74 61     (datum->synta
0350: 78 20 23 27 6e 61 6d 65 20 0a 09 09 09 20 20 28  x #'name ....  (
0360: 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 0a  string->symbol .
0370: 09 09 09 20 20 20 28 73 74 72 69 6e 67 2d 61 70  ...   (string-ap
0380: 70 65 6e 64 20 0a 09 09 09 20 20 20 20 28 73 79  pend ....    (sy
0390: 6d 62 6f 6c 2d 3e 73 74 72 69 6e 67 20 0a 09 09  mbol->string ...
03a0: 09 20 20 20 20 20 28 73 79 6e 74 61 78 2d 3e 64  .     (syntax->d
03b0: 61 74 75 6d 20 23 27 6e 61 6d 65 29 29 20 22 2d  atum #'name)) "-
03c0: 66 74 22 29 29 29 5d 29 0a 09 20 23 60 28 62 65  ft")))]).. #`(be
03d0: 67 69 6e 0a 09 20 20 20 20 20 28 64 65 66 69 6e  gin..     (defin
03e0: 65 20 6e 61 6d 65 20 28 6c 61 6d 62 64 61 20 28  e name (lambda (
03f0: 61 72 67 2d 6e 61 6d 65 20 2e 2e 2e 29 0a 09 20  arg-name ...).. 
0400: 20 20 20 20 20 20 28 64 65 66 69 6e 65 2d 66 74        (define-ft
0410: 79 70 65 20 66 75 6e 63 74 69 6f 6e 2d 66 74 79  ype function-fty
0420: 70 65 20 28 66 75 6e 63 74 69 6f 6e 20 28 61 72  pe (function (ar
0430: 67 2d 74 79 70 65 20 2e 2e 2e 29 20 72 65 74 2d  g-type ...) ret-
0440: 74 79 70 65 29 29 0a 09 20 20 20 20 20 20 20 28  type))..       (
0450: 6c 65 74 2a 20 28 5b 66 75 6e 63 74 69 6f 6e 2d  let* ([function-
0460: 66 70 74 72 20 20 28 6d 61 6b 65 2d 66 74 79 70  fptr  (make-ftyp
0470: 65 2d 70 6f 69 6e 74 65 72 20 66 75 6e 63 74 69  e-pointer functi
0480: 6f 6e 2d 66 74 79 70 65 20 63 2d 6e 61 6d 65 29  on-ftype c-name)
0490: 5d 0a 09 09 20 20 20 20 20 20 5b 66 75 6e 63 74  ]...      [funct
04a0: 69 6f 6e 20 20 20 20 20 20 20 28 66 74 79 70 65  ion       (ftype
04b0: 2d 72 65 66 20 66 75 6e 63 74 69 6f 6e 2d 66 74  -ref function-ft
04c0: 79 70 65 20 28 29 20 66 75 6e 63 74 69 6f 6e 2d  ype () function-
04d0: 66 70 74 72 29 5d 29 0a 09 09 20 28 6c 65 74 20  fptr)])... (let 
04e0: 28 5b 72 65 73 75 6c 74 20 28 66 75 6e 63 74 69  ([result (functi
04f0: 6f 6e 20 61 72 67 2d 6e 61 6d 65 20 2e 2e 2e 29  on arg-name ...)
0500: 5d 29 0a 09 09 20 20 20 23 2c 28 63 61 73 65 20  ])...   #,(case 
0510: 28 64 61 74 75 6d 20 23 27 72 65 74 2d 74 79 70  (datum #'ret-typ
0520: 65 29 0a 09 09 20 20 20 20 20 20 20 5b 28 23 27  e)...       [(#'
0530: 69 6e 74 29 20 23 60 28 69 66 20 28 6e 6f 74 20  int) #`(if (not 
0540: 28 3d 20 72 65 73 75 6c 74 20 30 29 29 0a 09 09  (= result 0))...
0550: 09 09 20 20 20 20 28 72 61 69 73 65 20 3b 28 63  ..    (raise ;(c
0560: 6f 6e 64 69 74 69 6f 6e 20 0a 09 09 09 09 09 20  ondition ...... 
0570: 20 20 20 3b 28 6d 61 6b 65 2d 65 72 72 6f 72 29     ;(make-error)
0580: 20 0a 09 09 09 09 09 20 20 20 20 3b 28 6d 61 6b   ......    ;(mak
0590: 65 2d 6d 65 73 73 61 67 65 2d 63 6f 6e 64 69 74  e-message-condit
05a0: 69 6f 6e 20 22 72 65 74 75 72 6e 65 64 20 65 72  ion "returned er
05b0: 72 6f 72 20 7e 64 3a 20 7e 64 22 29 20 0a 09 09  ror ~d: ~d") ...
05c0: 09 09 09 20 20 20 20 3b 28 6d 61 6b 65 2d 69 72  ...    ;(make-ir
05d0: 72 69 74 61 6e 74 73 2d 63 6f 6e 64 69 74 69 6f  ritants-conditio
05e0: 6e 20 72 65 73 75 6c 74 20 28 6d 64 62 2d 73 74  n result (mdb-st
05f0: 72 65 72 72 6f 72 20 72 65 73 75 6c 74 29 29 0a  rerror result)).
0600: 09 09 09 09 09 20 20 20 20 28 6d 61 6b 65 2d 6d  .....    (make-m
0610: 64 62 2d 63 6f 6e 64 20 72 65 73 75 6c 74 20 28  db-cond result (
0620: 6d 64 62 2d 73 74 72 65 72 72 6f 72 20 72 65 73  mdb-strerror res
0630: 75 6c 74 29 29 29 0a 09 09 09 09 09 20 20 20 0a  ult)))......   .
0640: 09 09 09 09 20 20 20 20 23 2c 28 63 61 73 65 20  ....    #,(case 
0650: 28 64 61 74 75 6d 20 23 27 6e 61 6d 65 29 0a 09  (datum #'name)..
0660: 09 09 09 09 5b 65 6c 73 65 20 23 27 72 65 73 75  ....[else #'resu
0670: 6c 74 5d 29 29 5d 0a 09 09 20 20 20 20 20 20 20  lt]))]...       
0680: 5b 65 6c 73 65 20 28 70 72 69 6e 74 66 20 22 65  [else (printf "e
0690: 6c 73 65 20 7e 64 7e 6e 22 20 28 64 61 74 75 6d  lse ~d~n" (datum
06a0: 20 23 27 72 65 74 2d 74 79 70 65 29 29 20 23 27   #'ret-type)) #'
06b0: 72 65 73 75 6c 74 5d 29 29 29 29 29 29 29 5d 29  result])))))))])
06c0: 29 29 0a                                         )).