[gforth] / gforth / struct.fs  

gforth: gforth/struct.fs


1 : anton 1.8 \ data structures (like C structs)
2 :    
3 : anton 1.11 \ Copyright (C) 1995, 1997 Free Software Foundation, Inc.
4 : anton 1.8
5 :     \ This file is part of Gforth.
6 :    
7 :     \ Gforth is free software; you can redistribute it and/or
8 :     \ modify it under the terms of the GNU General Public License
9 :     \ as published by the Free Software Foundation; either version 2
10 :     \ of the License, or (at your option) any later version.
11 :    
12 :     \ This program is distributed in the hope that it will be useful,
13 :     \ but WITHOUT ANY WARRANTY; without even the implied warranty of
14 :     \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 :     \ GNU General Public License for more details.
16 :    
17 :     \ You should have received a copy of the GNU General Public License
18 :     \ along with this program; if not, write to the Free Software
19 :     \ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 :    
21 : anton 1.14 : naligned ( addr1 n -- addr2 ) \ gforth
22 : crook 1.15 \g @var{addr2} is the aligned version of @var{addr1} with respect to the
23 :     \g alignment @var{n}.
24 : anton 1.1 1- tuck + swap invert and ;
25 : anton 1.14
26 :     ' naligned alias nalign \ old name, obsolete
27 : anton 1.1
28 : anton 1.11 : dozerofield ( -- )
29 :     \ a field that makes no change
30 :     \ to enable accessing the offset with "['] <field> >body @" this
31 :     \ is not implemented with "['] noop alias"
32 :     last @
33 :     if
34 :     immediate
35 :     then
36 : anton 1.12 does> ( name execution: -- )
37 : anton 1.11 drop ;
38 :    
39 : anton 1.12 : field, ( align1 offset1 align size -- align2 offset2 )
40 : anton 1.13 swap rot over nalign dup , ( align1 size align offset )
41 :     rot + >r nalign r> ;
42 : anton 1.12
43 :     : create-field ( align1 offset1 align size -- align2 offset2 )
44 :     create field, ;
45 :    
46 :     : field ( align1 offset1 align size "name" -- align2 offset2 ) \ gforth
47 : crook 1.15 \G @code{name} execution: @var{addr1} -- @var{addr2}.
48 : anton 1.12 2 pick
49 : anton 1.11 if \ field offset <> 0
50 :     [IFDEF] (Field)
51 :     (Field)
52 :     [ELSE]
53 :     Header reveal dofield: cfa,
54 :     [THEN]
55 :     else
56 :     create dozerofield
57 : anton 1.12 then
58 :     field, ;
59 : anton 1.1
60 : anton 1.12 : end-struct ( align size "name" -- ) \ gforth
61 : crook 1.15 \g @code{name} execution: @var{addr1} -- @var{addr1+offset1}@*
62 :     \g Create a field @var{name} with offset @var{offset1}, and the type
63 :     \g given by @var{size align}. @var{offset2} is the offset of the
64 :     \g next field, and @var{align2} is the alignment of all fields.
65 : anton 1.12 over nalign \ pad size to full alignment
66 :     2constant ;
67 :    
68 :     1 chars 0 end-struct struct ( -- align size ) \ gforth
69 : crook 1.15 \g An empty structure, used to start a structure definition.
70 : anton 1.12
71 :     \ type descriptors
72 :     1 aligned 1 cells 2constant cell% ( -- align size ) \ gforth
73 :     1 chars 1 chars 2constant char% ( -- align size ) \ gforth
74 :     1 faligned 1 floats 2constant float% ( -- align size ) \ gforth
75 :     1 dfaligned 1 dfloats 2constant dfloat% ( -- align size ) \ gforth
76 :     1 sfaligned 1 sfloats 2constant sfloat% ( -- align size ) \ gforth
77 :     cell% 2* 2constant double% ( -- align size ) \ gforth
78 :    
79 :     \ memory allocation words
80 :     ' drop alias %alignment ( align size -- align ) \ gforth
81 : crook 1.15 \g The alignment of the structure.
82 : anton 1.12 ' nip alias %size ( align size -- size ) \ gforth
83 : crook 1.15 \g The size of the structure.
84 : anton 1.12
85 :     : %align ( align size -- ) \ gforth
86 : crook 1.15 \G Align the data space pointer to the alignment @var{align}.
87 : anton 1.12 drop here swap nalign here - allot ;
88 :    
89 :     : %allot ( align size -- addr ) \ gforth
90 : crook 1.15 \g Allot @var{size} address units of data space with alignment
91 :     \g @var{align}; the resulting block of data is found at
92 :     \g @var{addr}.
93 : anton 1.12 tuck %align
94 : anton 1.2 here swap allot ;
95 :    
96 : anton 1.12 : %allocate ( align size -- addr ior ) \ gforth
97 : crook 1.15 \g Allocate @var{size} address units with alignment @var{align},
98 : anton 1.12 \g similar to @code{allocate}.
99 :     nip allocate ;
100 :    
101 :     : %alloc ( size align -- addr ) \ gforth
102 : crook 1.15 \g Allocate @var{size} address units with alignment @var{align},
103 :     \g giving a data block at @var{addr}; @code{throw} an ior code
104 : anton 1.12 \g if not successful.
105 :     %allocate throw ;

CVS Admin

Powered by ViewCVS 1.0-dev
(Powered by ViewCVS)

ViewCVS and CVS Help