/************************************************************************** h a s h L o o k u p ** Find a name in the hash table given the hashcode and text of the name. ** Returns the address of the corresponding FICL_WORD if found, ** otherwise NULL. ** Note: outer loop on link field supports inheritance in wordlists. ** It's not part of ANS Forth - ficl only. hashReset creates wordlists ** with NULL link fields. **************************************************************************/ FICL_WORD *hashLookup(FICL_HASH *pHash, STRINGINFO si, UNS16 hashCode) { FICL_UNS nCmp = si.count; FICL_WORD *pFW; UNS16 hashIdx; if (nCmp > nFICLNAME) nCmp = nFICLNAME; for (; pHash != NULL; pHash = pHash->link) { if (pHash->size > 1) hashIdx = (UNS16)(hashCode % pHash->size); else /* avoid the modulo op for single threaded lists */ hashIdx = 0; for (pFW = pHash->table[hashIdx]; pFW; pFW = pFW->link) { if ( (pFW->nName == si.count) && (!strincmp(si.cp, pFW->name, nCmp)) ) return pFW; #if FICL_ROBUST assert(pFW != pFW->link); #endif } } return NULL; }
const char* CommandLine::find(int32_t _skip, const char _short, const char* _long, int32_t _numParams) const { for (int32_t ii = 0; ii < m_argc; ++ii) { const char* arg = m_argv[ii]; if ('-' == *arg) { ++arg; if (_short == *arg) { if (1 == strnlen(arg) ) { if (0 == _skip) { if (0 == _numParams) { return ""; } else if (ii+_numParams < m_argc && '-' != *m_argv[ii+1] ) { return m_argv[ii+1]; } return NULL; } --_skip; ii += _numParams; } } else if (NULL != _long && '-' == *arg && 0 == strincmp(arg+1, _long) ) { if (0 == _skip) { if (0 == _numParams) { return ""; } else if (ii+_numParams < m_argc && '-' != *m_argv[ii+1] ) { return m_argv[ii+1]; } return NULL; } --_skip; ii += _numParams; } } } return NULL; }
bool CommandLine::hasArg(bool& _value, const char _short, const char* _long) const { const char* arg = findOption(_short, _long, 1); if (NULL != arg) { if ('0' == *arg || (0 == strincmp(arg, "false") ) ) { _value = false; } else if ('0' != *arg || (0 == strincmp(arg, "true") ) ) { _value = true; } return true; } return false; }
/* mystristr: * Like strstr but ignoring case during comparisons. */ char *mystristr(const char *HAYSTACK, const char *NEEDLE) { const char *end; assert(HAYSTACK); assert(NEEDLE); assert(strlen(NEEDLE) > 0); end = strchr(HAYSTACK, 0) - strlen(NEEDLE); while (HAYSTACK <= end) { if (strincmp(HAYSTACK, NEEDLE) == 0) return (char*)HAYSTACK; HAYSTACK++; } return 0; }
int main() { char ans[] = "apple"; char array[20]; printf("Guess my favorite fruit\n"); while (getline(array,20) > 0 ) if (!strincmp(ans,array)) { printf("The answer is correct\n"); break; } else { printf("%s not the answer\nTry it again\n", array); } return 0; }
/************************************************************************** f i c l P a r s e P r e f i x ** This is the parse step for prefixes - it checks an incoming word ** to see if it starts with a prefix, and if so runs the corrseponding ** code against the remainder of the word and returns true. **************************************************************************/ int ficlParsePrefix(FICL_VM *pVM, STRINGINFO si) { int i; FICL_HASH *pHash; FICL_WORD *pFW = ficlLookup(pVM->pSys, list_name); /* ** Make sure we found the prefix dictionary - otherwise silently fail ** If forth-wordlist is not in the search order, we won't find the prefixes. */ if (!pFW) return FICL_FALSE; pHash = (FICL_HASH *)(pFW->param[0].p); /* ** Walk the list looking for a match with the beginning of the incoming token */ for (i = 0; i < (int)pHash->size; i++) { pFW = pHash->table[i]; while (pFW != NULL) { int n; n = pFW->nName; /* ** If we find a match, adjust the TIB to give back the non-prefix characters ** and execute the prefix word. */ if (!strincmp(SI_PTR(si), pFW->name, (FICL_UNS)n)) { /* (sadler) fixed off-by-one error when the token has no trailing space in the TIB */ vmSetTibIndex(pVM, si.cp + n - pVM->tib.cp ); vmExecute(pVM, pFW); return (int)FICL_TRUE; } pFW = pFW->link; } } return FICL_FALSE; }