Initial import.
[debian/pforth] / fth / utils / dump_struct.fth
1 \ @(#) dump_struct.fth 97/12/10 1.1\r
2 \ Dump contents of structure showing values and member names.\r
3 \\r
4 \ Author: Phil Burk\r
5 \ Copyright 1987 Phil Burk\r
6 \ All Rights Reserved.\r
7 \\r
8 \ MOD: PLB 9/4/88 Print size too.\r
9 \ MOD: PLB 9/9/88 Print U/S , add ADST\r
10 \ MOD: PLB 12/6/90 Modified to work with H4th\r
11 \ 941109 PLB Converted to pforth.  Added RP detection.\r
12 \r
13 include? task-member member.fth\r
14 include? task-c_struct c_struct.fth\r
15 \r
16 ANEW TASK-DUMP_STRUCT\r
17 \r
18 : EMIT-TO-COLUMN ( char col -- )\r
19         out @ - 0 max 80 min 0\r
20         DO  dup emit\r
21         LOOP drop\r
22 ;\r
23 \r
24 VARIABLE SN-FENCE\r
25 : STACK.NFAS  ( fencenfa topnfa -- 0 nfa0 nfa1 ... )\r
26 \ Fill stack with nfas of words until fence hit.\r
27     >r sn-fence !\r
28     0 r>  ( set terminator )\r
29     BEGIN ( -- 0 n0 n1 ... top )\r
30       dup sn-fence @ >\r
31     WHILE\r
32 \      dup n>link @   \ JForth\r
33        dup prevname   \ HForth\r
34     REPEAT\r
35     drop\r
36 ;\r
37 \r
38 : DST.DUMP.TYPE  ( +-size -- , dump data type, 941109)\r
39         dup abs 4 =\r
40         IF\r
41                 0<\r
42                 IF ." RP"\r
43                 ELSE ." U4"\r
44                 THEN\r
45         ELSE\r
46                 dup 0<\r
47                 IF ascii U\r
48                 ELSE ascii S\r
49                 THEN emit abs 1 .r\r
50         THEN\r
51 ;\r
52 \r
53 : DUMP.MEMBER ( addr member-pfa -- , dump member of structure)\r
54     ob.stats  ( -- addr offset size )\r
55     >r + r> ( -- addr' size )\r
56     dup ABS 4 >  ( -- addr' size flag )\r
57     IF   cr 2dup swap . . ABS dump\r
58     ELSE tuck @bytes 10 .r ( -- size )\r
59         3 spaces dst.dump.type\r
60     THEN\r
61 ;\r
62 \r
63 VARIABLE DS-ADDR\r
64 : DUMP.STRUCT ( addr-data addr-structure -- )\r
65     >newline swap >r  ( -- as , save addr-data for dumping )\r
66 \    dup cell+ @ over +  \ JForth\r
67         dup code> >name swap cell+ @ over +   \ HForth\r
68         stack.nfas   ( fill stack with nfas of members )\r
69     BEGIN\r
70         dup\r
71     WHILE   ( continue until non-zero )\r
72         dup name> >body r@ swap dump.member\r
73         bl 18 emit-to-column id. cr\r
74         ?pause\r
75     REPEAT drop rdrop\r
76 ;\r
77 \r
78 : DST ( addr <name> -- , dump contents of structure )\r
79     ob.findit\r
80     state @\r
81     IF [compile] literal compile dump.struct\r
82     ELSE dump.struct\r
83     THEN\r
84 ; immediate\r
85 \r
86 : ADST ( absolute_address -- , dump structure )\r
87     >rel [compile] dst\r
88 ; immediate\r
89 \r
90 \ For Testing Purposes\r
91 false .IF\r
92 :STRUCT GOO\r
93     LONG DATAPTR\r
94     SHORT GOO_WIDTH\r
95     USHORT GOO_HEIGHT\r
96 ;STRUCT\r
97 \r
98 :STRUCT FOO\r
99     LONG ALONG1\r
100     STRUCT GOO AGOO\r
101     SHORT ASHORT1\r
102     BYTE ABYTE\r
103     BYTE ABYTE2\r
104 ;STRUCT\r
105 \r
106 FOO AFOO\r
107 : AFOO.INIT\r
108     $ 12345678 afoo ..! along1\r
109     $ -665 afoo ..! ashort1\r
110     $ 21 afoo ..! abyte\r
111     $ 43 afoo ..! abyte2\r
112     -234 afoo .. agoo ..! goo_height\r
113 ;\r
114 afoo.init\r
115 \r
116 : TDS ( afoo -- )\r
117     dst foo\r
118 ;\r
119 \r
120 .THEN\r