diff options
Diffstat (limited to 'word.c')
-rw-r--r-- | word.c | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/word.c b/word.c new file mode 100644 index 000000000000..ae24717a9013 --- /dev/null +++ b/word.c @@ -0,0 +1,144 @@ +#include "ficl.h" + + +/************************************************************************** + w o r d I s I m m e d i a t e +** +**************************************************************************/ +int ficlWordIsImmediate(ficlWord *word) +{ + return ((word != NULL) && (word->flags & FICL_WORD_IMMEDIATE)); +} + + +/************************************************************************** + w o r d I s C o m p i l e O n l y +** +**************************************************************************/ +int ficlWordIsCompileOnly(ficlWord *word) +{ + return ((word != NULL) && (word->flags & FICL_WORD_COMPILE_ONLY)); +} + + +/************************************************************************** + f i c l W o r d C l a s s i f y +** This public function helps to classify word types for SEE +** and the debugger in tools.c. Given an pointer to a word, it returns +** a member of WOR +**************************************************************************/ +ficlWordKind ficlWordClassify(ficlWord *word) +{ + ficlPrimitive code; + ficlInstruction i; + ficlWordKind iType; + + if ( (((ficlInstruction)word) > ficlInstructionInvalid) + && (((ficlInstruction)word) < ficlInstructionLast) ) + { + i = (ficlInstruction)word; + iType = FICL_WORDKIND_INSTRUCTION; + goto IS_INSTRUCTION; + } + + code = word->code; + + if ((ficlInstruction)code < ficlInstructionLast) + { + i = (ficlInstruction)code; + iType = FICL_WORDKIND_INSTRUCTION_WORD; + goto IS_INSTRUCTION; + } + + return FICL_WORDKIND_PRIMITIVE; + +IS_INSTRUCTION: + + switch (i) + { + case ficlInstructionConstantParen: +#if FICL_WANT_FLOAT + case ficlInstructionFConstantParen: +#endif /* FICL_WANT_FLOAT */ + return FICL_WORDKIND_CONSTANT; + + case ficlInstruction2ConstantParen: +#if FICL_WANT_FLOAT + case ficlInstructionF2ConstantParen: +#endif /* FICL_WANT_FLOAT */ + return FICL_WORDKIND_2CONSTANT; + +#if FICL_WANT_LOCALS + case ficlInstructionToLocalParen: + case ficlInstructionTo2LocalParen: +#if FICL_WANT_FLOAT + case ficlInstructionToFLocalParen: + case ficlInstructionToF2LocalParen: +#endif /* FICL_WANT_FLOAT */ + return FICL_WORDKIND_INSTRUCTION_WITH_ARGUMENT; +#endif /* FICL_WANT_LOCALS */ + +#if FICL_WANT_USER + case ficlInstructionUserParen: + return FICL_WORDKIND_USER; +#endif + + case ficlInstruction2LiteralParen: + return FICL_WORDKIND_2LITERAL; + +#if FICL_WANT_FLOAT + case ficlInstructionFLiteralParen: + return FICL_WORDKIND_FLITERAL; +#endif + + case ficlInstructionCreateParen: + return FICL_WORDKIND_CREATE; + + case ficlInstructionCStringLiteralParen: + return FICL_WORDKIND_CSTRING_LITERAL; + + case ficlInstructionStringLiteralParen: + return FICL_WORDKIND_STRING_LITERAL; + + case ficlInstructionColonParen: + return FICL_WORDKIND_COLON; + + case ficlInstructionDoDoes: + return FICL_WORDKIND_DOES; + + case ficlInstructionDoParen: + return FICL_WORDKIND_DO; + + case ficlInstructionQDoParen: + return FICL_WORDKIND_QDO; + + case ficlInstructionVariableParen: + return FICL_WORDKIND_VARIABLE; + + case ficlInstructionBranchParenWithCheck: + case ficlInstructionBranchParen: + return FICL_WORDKIND_BRANCH; + + case ficlInstructionBranch0ParenWithCheck: + case ficlInstructionBranch0Paren: + return FICL_WORDKIND_BRANCH0; + + case ficlInstructionLiteralParen: + return FICL_WORDKIND_LITERAL; + + case ficlInstructionLoopParen: + return FICL_WORDKIND_LOOP; + + case ficlInstructionOfParen: + return FICL_WORDKIND_OF; + + case ficlInstructionPlusLoopParen: + return FICL_WORDKIND_PLOOP; + + default: + return iType; + } +} + + + |