rsspice/generated/spicelib/
zzektrsb.rs

1//
2// GENERATED FILE
3//
4
5use super::*;
6use f2rust_std::*;
7
8const MXKIDC: i32 = 63;
9const MXKEYC: i32 = (MXKIDC - 1);
10const MNKIDC: i32 = (((2 * MXKIDC) + 1) / 3);
11const MNKEYC: i32 = (MNKIDC - 1);
12const MXKIDR: i32 = ((2 * (((2 * MXKIDC) - 2) / 3)) + 1);
13const MXKEYR: i32 = (MXKIDR - 1);
14const MNKIDR: i32 = 2;
15const TRTYPE: i32 = 1;
16const TRVERS: i32 = 1;
17const TRNNOD: i32 = (TRTYPE + 1);
18const TRNKEY: i32 = (TRNNOD + 1);
19const TRDPTH: i32 = (TRNKEY + 1);
20const TRNKR: i32 = (TRDPTH + 1);
21const TRKEYR: i32 = TRNKR;
22const TRKIDR: i32 = ((TRKEYR + MXKEYR) + 1);
23const TRDATR: i32 = ((TRKIDR + MXKIDR) + 1);
24const TRSIZR: i32 = ((TRDATR + MXKEYR) + 1);
25const TRNKC: i32 = 1;
26const TRKEYC: i32 = TRNKC;
27const TRKIDC: i32 = ((TRKEYC + MXKEYC) + 1);
28const TRDATC: i32 = ((TRKIDC + MXKIDC) + 1);
29const TRSIZC: i32 = ((TRDATC + MXKEYC) + 1);
30const TRMXDP: i32 = 10;
31
32//$Procedure      ZZEKTRSB ( EK tree, identify siblings )
33pub fn ZZEKTRSB(
34    HANDLE: i32,
35    TREE: i32,
36    KEY: i32,
37    LSIB: &mut i32,
38    LKEY: &mut i32,
39    RSIB: &mut i32,
40    RKEY: &mut i32,
41    ctx: &mut Context,
42) -> f2rust_std::Result<()> {
43    let mut ADDRSS: i32 = 0;
44    let mut BASE: i32 = 0;
45    let mut KEYBAS: i32 = 0;
46    let mut KIDBAS: i32 = 0;
47    let mut LOFFST: i32 = 0;
48    let mut LLPIDX: i32 = 0;
49    let mut LPIDX: i32 = 0;
50    let mut LPKEY: i32 = 0;
51    let mut NKBAS: i32 = 0;
52    let mut PARENT: i32 = 0;
53    let mut PKEY: i32 = 0;
54    let mut POFFST: i32 = 0;
55    let mut ROFFST: i32 = 0;
56    let mut RPIDX: i32 = 0;
57    let mut RPKEY: i32 = 0;
58
59    //
60    // SPICELIB functions
61    //
62
63    //
64    // Other functions
65    //
66
67    //
68    // Local variables
69    //
70
71    //
72    // Start out by looking up the parent node.  We get LSIB
73    // and RSIB for free.
74    //
75    ZZEKTRPI(
76        HANDLE,
77        TREE,
78        KEY,
79        &mut PARENT,
80        &mut PKEY,
81        &mut POFFST,
82        &mut LPIDX,
83        &mut LPKEY,
84        LSIB,
85        &mut RPIDX,
86        &mut RPKEY,
87        RSIB,
88        ctx,
89    )?;
90
91    if FAILED(ctx) {
92        return Ok(());
93    }
94
95    //
96    // Set the base addresses for the child pointers and keys,
97    // based on whether the parent is the root.
98    //
99    if (PARENT == TREE) {
100        KEYBAS = TRKEYR;
101        KIDBAS = TRKIDR;
102        NKBAS = TRNKR;
103    } else {
104        KEYBAS = TRKEYC;
105        KIDBAS = TRKIDC;
106        NKBAS = TRNKC;
107    }
108
109    //
110    // We need to find absolute keys in each sibling that exists.
111    // To do this, we need the node offset of each sibling node.
112    // That offset is the value of the parent key preceding each node,
113    // plus the parent's offset.
114    //
115    if (LPIDX > 1) {
116        //
117        // The left parent key has a predecessor.  This predecessor is
118        // the immediate predecessor of the left sibling node.
119        //
120        LLPIDX = (LPIDX - 1);
121        BASE = ZZEKTRBS(PARENT, ctx)?;
122        ADDRSS = ((BASE + KEYBAS) + LLPIDX);
123
124        DASRDI(
125            HANDLE,
126            ADDRSS,
127            ADDRSS,
128            std::slice::from_mut(&mut LOFFST),
129            ctx,
130        )?;
131
132        LOFFST = (LOFFST + POFFST);
133
134        //
135        // Get the first key from the left sibling.  Convert the key
136        // to an absolute key.
137        //
138        BASE = ZZEKTRBS(*LSIB, ctx)?;
139        ADDRSS = ((BASE + TRKEYC) + 1);
140
141        DASRDI(HANDLE, ADDRSS, ADDRSS, std::slice::from_mut(LKEY), ctx)?;
142
143        *LKEY = (*LKEY + LOFFST);
144    } else if (LPIDX == 1) {
145        //
146        // The left parent key is the first key.  The left sibling has
147        // no predecessor.
148        //
149        // Get the first key from the left sibling.  Convert the key
150        // to an absolute key.
151        //
152        BASE = ZZEKTRBS(*LSIB, ctx)?;
153        ADDRSS = ((BASE + TRKEYC) + 1);
154
155        DASRDI(HANDLE, ADDRSS, ADDRSS, std::slice::from_mut(LKEY), ctx)?;
156
157        *LKEY = (*LKEY + POFFST);
158    } else {
159        //
160        // There's no left sibling.  Set the left sibling's key to a
161        // value that won't be mistaken for a valid one.
162        //
163        *LKEY = 0;
164    }
165
166    //
167    // LKEY is set.  It's time to produce an absolute key for the
168    // right sibling.
169    //
170    if (RPIDX > 0) {
171        //
172        // The right parent key exists.  This key is the
173        // immediate predecessor of the right sibling node.
174        //
175        ROFFST = (RPKEY + POFFST);
176
177        //
178        // Get the first key from the right sibling.  Convert the key
179        // to an absolute key.
180        //
181        BASE = ZZEKTRBS(*RSIB, ctx)?;
182        ADDRSS = ((BASE + TRKEYC) + 1);
183
184        DASRDI(HANDLE, ADDRSS, ADDRSS, std::slice::from_mut(RKEY), ctx)?;
185
186        *RKEY = (*RKEY + ROFFST);
187    } else {
188        //
189        // There's no right sibling.  Set the right sibling's key to a
190        // value that won't be mistaken for a valid one.
191        //
192        *RKEY = 0;
193    }
194    //
195    // All outputs are set.
196    //
197
198    Ok(())
199}