rsspice/generated/spicelib/
zzeklltc.rs1use super::*;
6use f2rust_std::*;
7
8const ITRUE: i32 = 1;
9const IFALSE: i32 = -1;
10const CTRUE: &[u8] = b"T";
11const CFALSE: &[u8] = b"F";
12const CNAMSZ: i32 = 32;
13const CDOFF: i32 = 24;
14const CDSCSZ: i32 = 11;
15const CLSIDX: i32 = 1;
16const TYPIDX: i32 = (CLSIDX + 1);
17const LENIDX: i32 = (TYPIDX + 1);
18const SIZIDX: i32 = (LENIDX + 1);
19const NAMIDX: i32 = (SIZIDX + 1);
20const IXTIDX: i32 = (NAMIDX + 1);
21const IXPIDX: i32 = (IXTIDX + 1);
22const NFLIDX: i32 = (IXPIDX + 1);
23const ORDIDX: i32 = (NFLIDX + 1);
24const METIDX: i32 = (ORDIDX + 1);
25const EQ: i32 = 1;
26const GE: i32 = (EQ + 1);
27const GT: i32 = (GE + 1);
28const LE: i32 = (GT + 1);
29const LT: i32 = (LE + 1);
30const NE: i32 = (LT + 1);
31const LIKE: i32 = (NE + 1);
32const UNLIKE: i32 = (LIKE + 1);
33const ISNULL: i32 = (UNLIKE + 1);
34const NOTNUL: i32 = (ISNULL + 1);
35const SDSCSZ: i32 = 24;
36const EKTIDX: i32 = 1;
37const SNOIDX: i32 = (EKTIDX + 1);
38const IMDIDX: i32 = (SNOIDX + 1);
39const TNMIDX: i32 = (IMDIDX + 1);
40const NCIDX: i32 = (TNMIDX + 1);
41const NRIDX: i32 = (NCIDX + 1);
42const RTIDX: i32 = (NRIDX + 1);
43const CPTIDX: i32 = (RTIDX + 1);
44const DPTIDX: i32 = (CPTIDX + 1);
45const IPTIDX: i32 = (DPTIDX + 1);
46const MFLIDX: i32 = (IPTIDX + 1);
47const IFLIDX: i32 = (MFLIDX + 1);
48const SHDIDX: i32 = (IFLIDX + 1);
49const CFHIDX: i32 = (SHDIDX + 1);
50const CSNIDX: i32 = (CFHIDX + 1);
51const LCPIDX: i32 = (CSNIDX + 1);
52const LDPIDX: i32 = (LCPIDX + 1);
53const LIPIDX: i32 = (LDPIDX + 1);
54const LCWIDX: i32 = (LIPIDX + 1);
55const LDWIDX: i32 = (LCWIDX + 1);
56const LIWIDX: i32 = (LDWIDX + 1);
57const NMLIDX: i32 = (LIWIDX + 1);
58const CHR: i32 = 1;
59const DP: i32 = 2;
60const INT: i32 = 3;
61const TIME: i32 = 4;
62
63pub fn ZZEKLLTC(
65    HANDLE: i32,
66    SEGDSC: &[i32],
67    COLDSC: &[i32],
68    CKEY: &[u8],
69    PRVLOC: &mut i32,
70    PRVPTR: &mut i32,
71    ctx: &mut Context,
72) -> f2rust_std::Result<()> {
73    let SEGDSC = DummyArray::new(SEGDSC, 1..=SDSCSZ);
74    let COLDSC = DummyArray::new(COLDSC, 1..=CDSCSZ);
75    let mut COLUMN = [b' '; CNAMSZ as usize];
76    let mut BEGIN: i32 = 0;
77    let mut BEGPTR: i32 = 0;
78    let mut DTYPE: i32 = 0;
79    let mut END: i32 = 0;
80    let mut ENDPTR: i32 = 0;
81    let mut MIDDLE: i32 = 0;
82    let mut MIDPTR: i32 = 0;
83    let mut NROWS: i32 = 0;
84    let mut INDEXD: bool = false;
85
86    INDEXD = (COLDSC[IXTIDX] != IFALSE);
101
102    if !INDEXD {
103        ZZEKCNAM(HANDLE, COLDSC.as_slice(), &mut COLUMN, ctx)?;
104
105        CHKIN(b"ZZEKLLTC", ctx)?;
106        SETMSG(b"Column # is not indexed.", ctx);
107        ERRCH(b"#", &COLUMN, ctx);
108        SIGERR(b"SPICE(NOTINDEXED)", ctx)?;
109        CHKOUT(b"ZZEKLLTC", ctx)?;
110        return Ok(());
111    }
112
113    DTYPE = COLDSC[TYPIDX];
117
118    if (DTYPE != CHR) {
119        ZZEKCNAM(HANDLE, COLDSC.as_slice(), &mut COLUMN, ctx)?;
120
121        CHKIN(b"ZZEKLLTC", ctx)?;
122        SETMSG(b"Column # should be CHR but has type #.", ctx);
123        ERRCH(b"#", &COLUMN, ctx);
124        ERRINT(b"#", DTYPE, ctx);
125        SIGERR(b"SPICE(INVALIDTYPE)", ctx)?;
126        CHKOUT(b"ZZEKLLTC", ctx)?;
127        return Ok(());
128    }
129
130    NROWS = SEGDSC[NRIDX];
134
135    if (NROWS == 0) {
136        *PRVLOC = 0;
137        *PRVPTR = 0;
138
139        return Ok(());
140    }
141
142    BEGIN = 1;
146    END = NROWS;
147
148    ZZEKIXLK(HANDLE, COLDSC.as_slice(), BEGIN, &mut BEGPTR, ctx)?;
153    ZZEKIXLK(HANDLE, COLDSC.as_slice(), END, &mut ENDPTR, ctx)?;
154
155    if ZZEKSCMP(
156        GE,
157        HANDLE,
158        SEGDSC.as_slice(),
159        COLDSC.as_slice(),
160        BEGPTR,
161        1,
162        CHR,
163        CKEY,
164        0.0,
165        0,
166        false,
167        ctx,
168    )? {
169        *PRVLOC = 0;
175        *PRVPTR = 0;
176    } else if ZZEKSCMP(
177        LT,
178        HANDLE,
179        SEGDSC.as_slice(),
180        COLDSC.as_slice(),
181        ENDPTR,
182        1,
183        CHR,
184        CKEY,
185        0.0,
186        0,
187        false,
188        ctx,
189    )? {
190        *PRVLOC = NROWS;
196
197        ZZEKIXLK(HANDLE, COLDSC.as_slice(), *PRVLOC, PRVPTR, ctx)?;
198    } else {
199        while (END > (BEGIN + 1)) {
205            MIDDLE = ((BEGIN + END) / 2);
210
211            ZZEKIXLK(HANDLE, COLDSC.as_slice(), MIDDLE, &mut MIDPTR, ctx)?;
212
213            if ZZEKSCMP(
214                LT,
215                HANDLE,
216                SEGDSC.as_slice(),
217                COLDSC.as_slice(),
218                MIDPTR,
219                1,
220                CHR,
221                CKEY,
222                0.0,
223                0,
224                false,
225                ctx,
226            )? {
227                BEGIN = MIDDLE;
232            } else {
233                END = MIDDLE;
234            }
235            }
241
242        *PRVLOC = BEGIN;
243        ZZEKIXLK(HANDLE, COLDSC.as_slice(), *PRVLOC, PRVPTR, ctx)?;
244    }
245
246    Ok(())
247}