summaryrefslogtreecommitdiff
path: root/usr/src/common/ficl/word.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/common/ficl/word.c')
-rw-r--r--usr/src/common/ficl/word.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/usr/src/common/ficl/word.c b/usr/src/common/ficl/word.c
new file mode 100644
index 0000000000..3d4da1b25a
--- /dev/null
+++ b/usr/src/common/ficl/word.c
@@ -0,0 +1,136 @@
+#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) > ficlInstructionInvalid) &&
+ (((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);
+ }
+}