MCPcopy Create free account
hub / github.com/CruiserOne/Astrolog / CsCreateTrie

Function CsCreateTrie

express.cpp:2285–2396  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2283// Short 3+: Range of characters storing final substring to compare against.
2284
2285int CsCreateTrie(CONST uchar *rgszIn[], int cszIn, TRIE rgsOut, int csTrieMax,
2286 flag fInsensitive)
2287{
2288 uchar rgchStack[cchSzMax];
2289 int rgisStack[cchSzMax];
2290 long rgchUsed[256], iUsed = 0;
2291 int iStack, csOut = 0, isz, ich, chLo, chHi, chT, is, cch, isT,
2292 isRemember = 0, csz, iszSav;
2293
2294 for (ich = 0; ich < 256; ich++)
2295 rgchUsed[ich] = 0;
2296
2297 for (iStack = 0;; iStack++) {
2298 if (iStack >= cchSzMax) {
2299 Assert(fFalse);
2300 return -1;
2301 }
2302 rgisStack[iStack] = csOut;
2303 chLo = 255, chHi = 0, iUsed++, csz = 0;
2304
2305 // Count how many strings match the current leading substring. Also
2306 // get the low and high character for these strings.
2307 for (isz = 0; isz < cszIn; isz++) {
2308 if (FEqRgch((CONST char *)rgszIn[isz], (CONST char *)rgchStack, iStack,
2309 fInsensitive)) {
2310 chT = rgszIn[isz][iStack];
2311 if (chT != 0) {
2312 if (fInsensitive)
2313 chT = ChCap(chT);
2314 csz++;
2315 iszSav = isz;
2316 rgchUsed[chT] = iUsed;
2317 if (chT < chLo)
2318 chLo = chT;
2319 if (chT > chHi)
2320 chHi = chT;
2321 }
2322 }
2323 }
2324
2325 // If no strings match, back up to an earlier node.
2326 if (csz <= 0) {
2327LPop:
2328 loop {
2329 // Pop the stack to the parent node.
2330 iStack--;
2331 if (iStack < 0)
2332 goto LDone;
2333 is = rgisStack[iStack];
2334 chLo = (word)rgsOut[is + 1] & 255;
2335 chHi = (word)rgsOut[is + 1] >> 8;
2336
2337 // Scan for a pointer that hasn't been filled out yet.
2338 for (ich = chLo + 1; ich <= chHi; ich++) {
2339 if (rgsOut[is + 2 + (ich - chLo)] == 1) {
2340 chT = ich;
2341 goto LPush;
2342 }

Callers 1

FCreateTriesFunction · 0.85

Calls 4

AssertFunction · 0.85
FEqRgchFunction · 0.85
CopyRgbFunction · 0.85
UpperRgchFunction · 0.85

Tested by

no test coverage detected