| 2283 | // Short 3+: Range of characters storing final substring to compare against. |
| 2284 | |
| 2285 | int 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) { |
| 2327 | LPop: |
| 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 | } |
no test coverage detected