[gforth] / gforth / struct.fs  

gforth: gforth/struct.fs


1 : anton 1.8 \ data structures (like C structs)
2 :    
3 :     \ Copyright (C) 1995 Free Software Foundation, Inc.
4 :    
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.1
22 :     \ Usage example:
23 :     \
24 :     \ struct
25 :     \ 1 cells: field search-method
26 :     \ 1 cells: field reveal-method
27 :     \ end-struct wordlist-map
28 :     \
29 :     \ The structure can then be extended in the following way
30 :     \ wordlist-map
31 :     \ 1 cells: field enum-method
32 :     \ end-struct ext-wordlist-map \ with the fields search-method,...,enum-method
33 :    
34 :     : nalign ( addr1 n -- addr2 )
35 :     \ addr2 is the aligned version of addr1 wrt the alignment size n
36 :     1- tuck + swap invert and ;
37 :    
38 : pazsan 1.3 : field ( offset1 align1 size align -- offset2 align2 )
39 : anton 1.1 \ note: this version uses local variables
40 : pazsan 1.10 [IFDEF] (Field) (Field) [ELSE] Header reveal dofield: cfa, [THEN]
41 : anton 1.1 >r rot r@ nalign dup , ( align1 size offset )
42 :     + swap r> nalign ;
43 :    
44 :     : end-struct ( size align -- )
45 :     2constant ;
46 :    
47 :     0 1 chars end-struct struct
48 :    
49 : pazsan 1.3 \ : field ( offset1 align1 size align -- offset2 align2 )
50 :     \ create-field
51 :     \ does> ( addr1 -- addr2 )
52 :     \ @ + ;
53 : anton 1.1
54 :     \ I don't really like the "type:" syntax. Any other ideas? - anton
55 :     \ Also, this seems to be somewhat general. It probably belongs to some
56 :     \ other place
57 :     : cells: ( n -- size align )
58 :     cells cell ;
59 :    
60 :     : doubles: ( n -- size align )
61 :     2* cells cell ;
62 :    
63 :     : chars: ( n -- size align )
64 :     chars 1 chars ;
65 :    
66 :     : floats: ( n -- size align )
67 :     floats 1 floats ;
68 :    
69 : pazsan 1.5 : dfloats: ( n -- size align )
70 :     dfloats 1 dfloats ;
71 : anton 1.2
72 : pazsan 1.5 : sfloats: ( n -- size align )
73 :     sfloats 1 sfloats ;
74 :    
75 : anton 1.2 : struct-align ( size align -- )
76 :     dp @ swap nalign dp !
77 :     drop ;
78 :    
79 :     : struct-allot ( size align -- addr )
80 :     over swap struct-align
81 :     here swap allot ;
82 :    
83 : pazsan 1.5 : struct-allocate ( size align -- addr ior )
84 : anton 1.2 drop allocate ;

CVS Admin

Powered by ViewCVS 1.0-dev
(Powered by ViewCVS)

ViewCVS and CVS Help