/* * s e t - o r d e r * SEARCH ( widn ... wid1 n -- ) * Set the search order to the word lists identified by widn ... wid1. * Subsequently, word list wid1 will be searched first, and word list * widn searched last. If n is zero, empty the search order. If n is minus * one, set the search order to the implementation-defined minimum * search order. The minimum search order shall include the words * FORTH-WORDLIST and SET-ORDER. A system shall allow n to * be at least eight. */ static void ficlPrimitiveSetOrder(ficlVm *vm) { int i; int wordlistCount = ficlStackPopInteger(vm->dataStack); ficlDictionary *dictionary = ficlVmGetDictionary(vm); if (wordlistCount > FICL_MAX_WORDLISTS) { ficlVmThrowError(vm, "set-order error: list would be too large"); } ficlDictionaryLock(dictionary, FICL_TRUE); if (wordlistCount >= 0) { dictionary->wordlistCount = wordlistCount; for (i = wordlistCount-1; i >= 0; --i) { dictionary->wordlists[i] = ficlStackPopPointer(vm->dataStack); } } else { ficlDictionaryResetSearchOrder(dictionary); } ficlDictionaryLock(dictionary, FICL_FALSE); }
/* * d i c t E m p t y * Empty the dictionary, reset its hash table, and reset its search order. * Clears and (re-)creates the hash table with the size specified by nHash. */ void ficlDictionaryEmpty(ficlDictionary *dictionary, unsigned bucketCount) { ficlHash *hash; dictionary->here = dictionary->base; ficlDictionaryAlign(dictionary); hash = (ficlHash *)dictionary->here; ficlDictionaryAllot(dictionary, sizeof (ficlHash) + (bucketCount - 1) * sizeof (ficlWord *)); hash->size = bucketCount; ficlHashReset(hash); dictionary->forthWordlist = hash; dictionary->smudge = NULL; ficlDictionaryResetSearchOrder(dictionary); }
FICL_PLATFORM_EXTERN void dictResetSearchOrder(ficlDictionary *dictionary) { ficlDictionaryResetSearchOrder(dictionary); }