*/ REBINT CT_Typeset(REBVAL *a, REBVAL *b, REBINT mode) /* ***********************************************************************/ { if (mode < 0) return -1; return EQUAL_TYPESET(a, b); }
*/ REBINT Find_Typeset(REBVAL *block) /* ***********************************************************************/ { REBVAL value; REBVAL *val; REBINT n; VAL_SET(&value, REB_TYPESET); Make_Typeset(block, &value, 0); val = VAL_BLK_SKIP(ROOT_TYPESETS, 1); for (n = 1; NOT_END(val); val++, n++) { if (EQUAL_TYPESET(&value, val)){ //Print("FTS: %d", n); return n; } } // Print("Size Typesets: %d", VAL_TAIL(ROOT_TYPESETS)); Append_Value(VAL_SERIES(ROOT_TYPESETS), &value); return n; }
*/ REBCNT Find_Block(REBSER *series, REBCNT index, REBCNT end, REBVAL *target, REBCNT len, REBCNT flags, REBINT skip) /* ** Flags are set according to: ALL_FIND_REFS ** ** Main Parameters: ** start - index to start search ** end - ending position ** len - length of target ** skip - skip factor ** dir - direction ** ** Comparison Parameters: ** case - case sensitivity ** wild - wild cards/keys ** ** Final Parmameters: ** tail - tail position ** match - sequence ** SELECT - (value that follows) ** ***********************************************************************/ { REBVAL *value; REBVAL *val; REBCNT cnt; REBCNT start = index; if (flags & (AM_FIND_REVERSE | AM_FIND_LAST)) { skip = -1; start = 0; if (flags & AM_FIND_LAST) index = end - len; else index--; } // Optimized find word in block: if (ANY_WORD(target)) { for (; index >= start && index < end; index += skip) { value = BLK_SKIP(series, index); if (ANY_WORD(value)) { cnt = (VAL_WORD_SYM(value) == VAL_WORD_SYM(target)); if (flags & AM_FIND_CASE) { // Must be same type and spelling: if (cnt && VAL_TYPE(value) == VAL_TYPE(target)) return index; } else { // Can be different type or alias: if (cnt || VAL_WORD_CANON(value) == VAL_WORD_CANON(target)) return index; } } if (flags & AM_FIND_MATCH) break; } return NOT_FOUND; } // Match a block against a block: else if (ANY_BLOCK(target) && !(flags & AM_FIND_ONLY)) { for (; index >= start && index < end; index += skip) { cnt = 0; value = BLK_SKIP(series, index); for (val = VAL_BLK_DATA(target); NOT_END(val); val++, value++) { if (0 != Cmp_Value(value, val, (REBOOL)(flags & AM_FIND_CASE))) break; if (++cnt >= len) { return index; } } if (flags & AM_FIND_MATCH) break; } return NOT_FOUND; } // Find a datatype in block: else if (IS_DATATYPE(target) || IS_TYPESET(target)) { for (; index >= start && index < end; index += skip) { value = BLK_SKIP(series, index); // Used if's so we can trace it... if (IS_DATATYPE(target)) { if ((REBINT)VAL_TYPE(value) == VAL_DATATYPE(target)) return index; if (IS_DATATYPE(value) && VAL_DATATYPE(value) == VAL_DATATYPE(target)) return index; } if (IS_TYPESET(target)) { if (TYPE_CHECK(target, VAL_TYPE(value))) return index; if (IS_DATATYPE(value) && TYPE_CHECK(target, VAL_DATATYPE(value))) return index; if (IS_TYPESET(value) && EQUAL_TYPESET(value, target)) return index; } if (flags & AM_FIND_MATCH) break; } return NOT_FOUND; } // All other cases: else { for (; index >= start && index < end; index += skip) { value = BLK_SKIP(series, index); if (0 == Cmp_Value(value, target, (REBOOL)(flags & AM_FIND_CASE))) return index; if (flags & AM_FIND_MATCH) break; } return NOT_FOUND; } }
// // CT_Typeset: C // REBINT CT_Typeset(const REBVAL *a, const REBVAL *b, REBINT mode) { if (mode < 0) return -1; return EQUAL_TYPESET(a, b); }