Annotation of gforth/compat/struct.fs, revision 1.3
1.1 anton 1: \ data structures (like C structs)
2:
1.3 ! anton 3: \ This file is in the public domain. NO WARRANTY.
1.1 anton 4:
1.3 ! anton 5: \ This program uses the following words
! 6: \ from CORE :
! 7: \ : 1- + swap invert and ; DOES> @ immediate drop Create rot dup , >r
! 8: \ r> IF ELSE THEN over chars aligned cells 2* here - allot
! 9: \ from CORE-EXT :
! 10: \ tuck pick nip
! 11: \ from BLOCK-EXT :
! 12: \ \
! 13: \ from DOUBLE :
! 14: \ 2Constant
! 15: \ from EXCEPTION :
! 16: \ throw
! 17: \ from FILE :
! 18: \ (
! 19: \ from FLOAT :
! 20: \ faligned floats
! 21: \ from FLOAT-EXT :
! 22: \ dfaligned dfloats sfaligned sfloats
! 23: \ from MEMORY :
! 24: \ allocate
1.2 anton 25:
1.1 anton 26: : nalign ( addr1 n -- addr2 )
27: \ addr2 is the aligned version of addr1 wrt the alignment size n
28: 1- tuck + swap invert and ;
29:
1.2 anton 30: : dofield ( -- )
31: does> ( name execution: addr1 -- addr2 )
32: @ + ;
33:
34: : dozerofield ( -- )
35: immediate
36: does> ( name execution: -- )
37: drop ;
38:
1.3 ! anton 39: : create-field ( align1 offset1 align size "name" -- align2 offset2 )
! 40: create rot dup , ( align1 align size offset1 )
! 41: + >r nalign r> ;
1.2 anton 42:
1.3 ! anton 43: : field ( align1 offset1 align size "name" -- align2 offset2 )
1.2 anton 44: \ name execution: addr1 -- addr2
1.3 ! anton 45: 2 pick >r \ this uglyness is just for optimizing with dozerofield
1.2 anton 46: create-field
1.3 ! anton 47: r> if \ offset<>0
1.2 anton 48: dofield
49: else
50: dozerofield
51: then ;
1.1 anton 52:
1.3 ! anton 53: : end-struct ( align size "name" -- )
! 54: over nalign \ pad size to full alignment
1.2 anton 55: 2constant ;
1.1 anton 56:
1.3 ! anton 57: \ an empty struct
! 58: 1 chars 0 end-struct struct
1.1 anton 59:
1.3 ! anton 60: \ type descriptors, all ( -- align size )
! 61: 1 aligned 1 cells 2constant cell%
! 62: 1 chars 1 chars 2constant char%
! 63: 1 faligned 1 floats 2constant float%
! 64: 1 dfaligned 1 dfloats 2constant dfloat%
! 65: 1 sfaligned 1 sfloats 2constant sfloat%
! 66: cell% 2* 2constant double%
! 67:
! 68: \ memory allocation words
! 69: : %align ( align size -- )
! 70: drop here swap nalign here - allot ;
1.1 anton 71:
1.3 ! anton 72: : %allot ( align size -- addr )
! 73: tuck %align
1.1 anton 74: here swap allot ;
75:
1.3 ! anton 76: : %allocate ( align size -- addr ior )
! 77: nip allocate ;
1.2 anton 78:
1.3 ! anton 79: : %alloc ( size align -- addr )
! 80: %allocate throw ;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>