ref: 1ecc984e97566569a88c1bd670192fd550e4b789
parent: 9626ec0e5545ea993c954d6faa25a5fb95b0bb4c
author: jsadler <jsadler@ficl.sf.net>
date: Wed Apr 25 13:58:13 CDT 2001
<>
--- a/ficlstring.c
+++ /dev/null
@@ -1,23 +1,0 @@
-/*******************************************************************
-** f i c l s t r i n g . c
-** Forth Inspired Command Language
-** ANS STRING words plus ficl extras for c-string class
-** Author: John Sadler (john_sadler@alum.mit.edu)
-** Created: 2 June 2000
-**
-*******************************************************************/
-
-#include <string.h>
-#include <ctype.h>
-#include "ficl.h"
-
-
-/**************************************************************************
- f o r m a t
-** ( params... fmt-addr fmt-u dest-addr dest-u -- dest-addr dest-u )
-**************************************************************************/
-
-void ficlStrFormat(FICL_VM *pVM)
-{
- return;
-}
\ No newline at end of file
--- a/tools.c.bak
+++ /dev/null
@@ -1,519 +1,0 @@
-/*******************************************************************
-** t o o l s . c
-** Forth Inspired Command Language - programming tools
-** Author: John Sadler (john_sadler@alum.mit.edu)
-** Created: 20 June 2000
-** $Id: tools.c.bak,v 1.0 2000/07/12 06:44:17 jsadler Exp $
-*******************************************************************/
-/*
-** NOTES:
-** SEE needs information about the addresses of functions that
-** are the CFAs of colon definitions, constants, variables, DOES>
-** words, and so on. It gets this information from a table and supporting
-** functions in words.c.
-** colonParen doDoes createParen variableParen userParen constantParen
-**
-** Step and break debugger for Ficl
-** The debugger requies real implementations of KEY and ACCEPT
-** because it bypasses the normal VM return mechanism for getting
-** text??
-** debug ( xt -- ) Start debugging an xt
-** Set a breakpoint
-** Specify breakpoint default action
-*/
-
-#include <stdlib.h>
-#include <stdio.h> /* sprintf */
-#include <string.h>
-#include <ctype.h>
-#include "ficl.h"
-
-
-/*
-** nBREAKPOINTS sizes the breakpoint array. One breakpoint (bp 0) is reserved
-** for the STEP command. The rest are user programmable.
-*/
-#define nBREAKPOINTS 10
-
-/*
-** BREAKPOINT record.
-** origXT - if NULL, this breakpoint is unused. Otherwise it stores the xt
-** that the breakpoint overwrote. This is restored to the dictionary when the
-** BP executes or gets cleared
-*/
-typedef struct breakpoint
-{
- FICL_WORD *origXT;
- FICL_WORD *onBreak;
-} BREAKPOINT;
-
-static BREAKPOINT bpTable[nBREAKPOINTS];
-static FICL_WORD *pBreak = NULL;
-
-/**************************************************************************
- i n i t T o o l s
-** Initializes static variables of this file, including:
-** 1. The lookup table of control structure XTs used by isDebuggable and
-** see
-** 2. The breakpoint table
-** This routine MUST execute AFTER the core dictionary is successfully
-** built, and AFTER debug words are inserted into the dictionary, but
-** BEFORE any use of the debugger.
-**************************************************************************/
-static void initTools(FICL_VM *pVM)
-{
- FICL_DICT *dp = ficlGetDict();
- &pVM;
-
- return;
-}
-
-
-
-/**************************************************************************
- s e e
-** TOOLS ( "<spaces>name" -- )
-** Display a human-readable representation of the named word's definition.
-** The source of the representation (object-code decompilation, source
-** block, etc.) and the particular form of the display is implementation
-** defined.
-** NOTE: these funcs come late in the file because they reference all
-** of the word-builder funcs without declaring them again. Call me lazy.
-**************************************************************************/
-/*
-** isAFiclWord
-** Vet a candidate pointer carefully to make sure
-** it's not some chunk o' inline data...
-** It has to have a name, and it has to look
-** like it's in the dictionary address range.
-** NOTE: this excludes :noname words!
-*/
-static int isAFiclWord(FICL_WORD *pFW)
-{
- FICL_DICT *pd = ficlGetDict();
-
- if (!dictIncludes(pd, pFW))
- return 0;
-
- if (!dictIncludes(pd, pFW->name))
- return 0;
-
- return ((pFW->nName > 0) && (pFW->name[pFW->nName] == '\0'));
-}
-
-/*
-** seeColon (for proctologists only)
-** Walks a colon definition, decompiling
-** on the fly. Knows about primitive control structures.
-*/
-static void seeColon(FICL_VM *pVM, CELL *pc)
-{
- static FICL_WORD *pSemiParen = NULL;
-
- if (!pSemiParen)
- pSemiParen = ficlLookup("(;)");
- assert(pSemiParen);
-
- for (; pc->p != pSemiParen; pc++)
- {
- FICL_WORD *pFW = (FICL_WORD *)(pc->p);
-
- if (isAFiclWord(pFW))
- {
- WORDKIND kind = ficlWordClassify(pFW);
- CELL c;
-
- switch (kind)
- {
- case LITERAL:
- c = *++pc;
- if (isAFiclWord(c.p))
- {
- FICL_WORD *pLit = (FICL_WORD *)c.p;
- sprintf(pVM->pad, " literal %.*s (%#lx)",
- pLit->nName, pLit->name, c.u);
- }
- else
- sprintf(pVM->pad, " literal %ld (%#lx)", c.i, c.u);
- break;
- case STRINGLIT:
- {
- FICL_STRING *sp = (FICL_STRING *)(void *)++pc;
- pc = (CELL *)alignPtr(sp->text + sp->count + 1) - 1;
- sprintf(pVM->pad, " s\" %.*s\"", sp->count, sp->text);
- }
- break;
- case IF:
- c = *++pc;
- if (c.i > 0)
- sprintf(pVM->pad, " if / while (branch rel %ld)", c.i);
- else
- sprintf(pVM->pad, " until (branch rel %ld)", c.i);
- break;
- case BRANCH:
- c = *++pc;
- if (c.i > 0)
- sprintf(pVM->pad, " else (branch rel %ld)", c.i);
- else
- sprintf(pVM->pad, " repeat (branch rel %ld)", c.i);
- break;
-
- case QDO:
- c = *++pc;
- sprintf(pVM->pad, " ?do (leave abs %#lx)", c.u);
- break;
- case DO:
- c = *++pc;
- sprintf(pVM->pad, " do (leave abs %#lx)", c.u);
- break;
- case LOOP:
- c = *++pc;
- sprintf(pVM->pad, " loop (branch rel %#ld)", c.i);
- break;
- case PLOOP:
- c = *++pc;
- sprintf(pVM->pad, " +loop (branch rel %#ld)", c.i);
- break;
- default:
- sprintf(pVM->pad, " %.*s", pFW->nName, pFW->name);
- break;
- }
-
- vmTextOut(pVM, pVM->pad, 1);
- }
- else /* probably not a word - punt and print value */
- {
- sprintf(pVM->pad, " %ld (%#lx)", pc->i, pc->u);
- vmTextOut(pVM, pVM->pad, 1);
- }
- }
-
- vmTextOut(pVM, ";", 1);
-}
-
-/*
-** Here's the outer part of the decompiler. It's
-** just a big nested conditional that checks the
-** CFA of the word to decompile for each kind of
-** known word-builder code, and tries to do
-** something appropriate. If the CFA is not recognized,
-** just indicate that it is a primitive.
-*/
-static void seeXT(FICL_VM *pVM)
-{
- FICL_WORD *pFW;
- WORDKIND kind;
-
- pFW = (FICL_WORD *)stackPopPtr(pVM->pStack);
- kind = ficlWordClassify(pFW);
-
- switch (kind)
- {
- case COLON:
- sprintf(pVM->pad, ": %.*s", pFW->nName, pFW->name);
- vmTextOut(pVM, pVM->pad, 1);
- seeColon(pVM, pFW->param);
- break;
-
- case DOES:
- vmTextOut(pVM, "does>", 1);
- seeColon(pVM, (CELL *)pFW->param->p);
- break;
-
- case CREATE:
- vmTextOut(pVM, "create", 1);
- break;
-
- case VARIABLE:
- sprintf(pVM->pad, "variable = %ld (%#lx)", pFW->param->i, pFW->param->u);
- vmTextOut(pVM, pVM->pad, 1);
- break;
-
- case USER:
- sprintf(pVM->pad, "user variable %ld (%#lx)", pFW->param->i, pFW->param->u);
- vmTextOut(pVM, pVM->pad, 1);
- break;
-
- case CONSTANT:
- sprintf(pVM->pad, "constant = %ld (%#lx)", pFW->param->i, pFW->param->u);
- vmTextOut(pVM, pVM->pad, 1);
-
- default:
- vmTextOut(pVM, "primitive", 1);
- break;
- }
-
- if (pFW->flags & FW_IMMEDIATE)
- {
- vmTextOut(pVM, "immediate", 1);
- }
-
- if (pFW->flags & FW_COMPILE)
- {
- vmTextOut(pVM, "compile-only", 1);
- }
-
- return;
-}
-
-
-static void see(FICL_VM *pVM)
-{
- ficlTick(pVM);
- seeXT(pVM);
- return;
-}
-
-
-/**************************************************************************
- f i c l D e b u g
-** debug ( xt -- )
-** Given an xt of a colon definition or a word defined by DOES>, set the
-** VM up to debug the word: push IP, set the xt as the next thing to execute,
-** set a breakpoint at its first instruction, and run to the breakpoint.
-**************************************************************************/
-void ficlDebug(FICL_VM *pVM)
-{
- int ret;
- FICL_WORD *xt = stackPopPtr(pVM->pStack);
- assert(pBreak);
-
- if (ficlWordIsDebuggable(xt))
- {
- stackPushPtr(pVM, xt);
- seeXT(pVM);
- /*
- ** Set a breakpoint at the first instruction and run the word
- */
-
- ret = ficlExecXT(pVM, xt);
- }
- else
- {
- ficlTextOut(pVM, "primitive - cannot debug", 1);
- }
-
- return;
-}
-
-
-
-/**************************************************************************
- d e b u g - b r e a k
-** FICL
-** Throws a breakpoint exception - used by DEBUG to step and break.
-**************************************************************************/
-void debugBreak(FICL_VM *pVM)
-{
- vmThrow(pVM, VM_BREAK);
- return;
-}
-
-
-/**************************************************************************
- b y e
-** TOOLS
-** Signal the system to shut down - this causes ficlExec to return
-** VM_USEREXIT. The rest is up to you.
-**************************************************************************/
-
-static void bye(FICL_VM *pVM)
-{
- vmThrow(pVM, VM_USEREXIT);
- return;
-}
-
-
-/**************************************************************************
- d i s p l a y S t a c k
-** TOOLS
-** Display the parameter stack (code for ".s")
-**************************************************************************/
-
-static void displayStack(FICL_VM *pVM)
-{
- int d = stackDepth(pVM->pStack);
- int i;
- CELL *pCell;
-
- vmCheckStack(pVM, 0, 0);
-
- if (d == 0)
- vmTextOut(pVM, "(Stack Empty) ", 0);
- else
- {
- pCell = pVM->pStack->base;
- for (i = 0; i < d; i++)
- {
- vmTextOut(pVM, ltoa((*pCell++).i, pVM->pad, pVM->base), 0);
- vmTextOut(pVM, " ", 0);
- }
- }
-}
-
-
-/**************************************************************************
- f o r g e t
-** TOOLS EXT ( "<spaces>name" -- )
-** Skip leading space delimiters. Parse name delimited by a space.
-** Find name, then delete name from the dictionary along with all
-** words added to the dictionary after name. An ambiguous
-** condition exists if name cannot be found.
-**
-** If the Search-Order word set is present, FORGET searches the
-** compilation word list. An ambiguous condition exists if the
-** compilation word list is deleted.
-**************************************************************************/
-static void forgetWid(FICL_VM *pVM)
-{
- FICL_DICT *pDict = ficlGetDict();
- FICL_HASH *pHash;
-
- pHash = (FICL_HASH *)stackPopPtr(pVM->pStack);
- hashForget(pHash, pDict->here);
-
- return;
-}
-
-
-static void forget(FICL_VM *pVM)
-{
- void *where;
- FICL_DICT *pDict = ficlGetDict();
- FICL_HASH *pHash = pDict->pCompile;
-
- ficlTick(pVM);
- where = ((FICL_WORD *)stackPopPtr(pVM->pStack))->name;
- hashForget(pHash, where);
- pDict->here = PTRtoCELL where;
-
- return;
-}
-
-
-/**************************************************************************
- l i s t W o r d s
-**
-**************************************************************************/
-#define nCOLWIDTH 8
-static void listWords(FICL_VM *pVM)
-{
- FICL_DICT *dp = ficlGetDict();
- FICL_HASH *pHash = dp->pSearch[dp->nLists - 1];
- FICL_WORD *wp;
- int nChars = 0;
- int len;
- unsigned i;
- int nWords = 0;
- char *cp;
- char *pPad = pVM->pad;
-
- for (i = 0; i < pHash->size; i++)
- {
- for (wp = pHash->table[i]; wp != NULL; wp = wp->link, nWords++)
- {
- if (wp->nName == 0) /* ignore :noname defs */
- continue;
-
- cp = wp->name;
- nChars += sprintf(pPad + nChars, "%s", cp);
-
- if (nChars > 70)
- {
- pPad[nChars] = '\0';
- nChars = 0;
- vmTextOut(pVM, pPad, 1);
- }
- else
- {
- len = nCOLWIDTH - nChars % nCOLWIDTH;
- while (len-- > 0)
- pPad[nChars++] = ' ';
- }
-
- if (nChars > 70)
- {
- pPad[nChars] = '\0';
- nChars = 0;
- vmTextOut(pVM, pPad, 1);
- }
- }
- }
-
- if (nChars > 0)
- {
- pPad[nChars] = '\0';
- nChars = 0;
- vmTextOut(pVM, pPad, 1);
- }
-
- sprintf(pVM->pad, "Dictionary: %d words, %ld cells used of %u total",
- nWords, (long) (dp->here - dp->dict), dp->size);
- vmTextOut(pVM, pVM->pad, 1);
- return;
-}
-
-
-/**************************************************************************
- l i s t E n v
-**
-**************************************************************************/
-static void listEnv(FICL_VM *pVM)
-{
- FICL_DICT *dp = ficlGetEnv();
- FICL_HASH *pHash = dp->pForthWords;
- FICL_WORD *wp;
- unsigned i;
- int nWords = 0;
-
- for (i = 0; i < pHash->size; i++)
- {
- for (wp = pHash->table[i]; wp != NULL; wp = wp->link, nWords++)
- {
- vmTextOut(pVM, wp->name, 1);
- }
- }
-
- sprintf(pVM->pad, "Environment: %d words, %ld cells used of %u total",
- nWords, (long) (dp->here - dp->dict), dp->size);
- vmTextOut(pVM, pVM->pad, 1);
- return;
-}
-
-
-/**************************************************************************
- f i c l C o m p i l e T o o l s
-** Builds wordset for debugger and TOOLS optional word set
-**************************************************************************/
-
-void ficlCompileTools(FICL_DICT *dp)
-{
- assert (dp);
-
- /*
- ** TOOLS and TOOLS EXT
- */
- dictAppendWord(dp, ".s", displayStack, FW_DEFAULT);
- dictAppendWord(dp, "bye", bye, FW_DEFAULT);
- dictAppendWord(dp, "forget", forget, FW_DEFAULT);
- dictAppendWord(dp, "see", see, FW_DEFAULT);
- dictAppendWord(dp, "words", listWords, FW_DEFAULT);
-
- /*
- ** Set TOOLS environment query values
- */
- ficlSetEnv("tools", FICL_TRUE);
- ficlSetEnv("tools-ext", FICL_FALSE);
-
- /*
- ** Ficl extras
- */
- dictAppendWord(dp, ".env", listEnv, FW_DEFAULT);
- dictAppendWord(dp, "debug", ficlDebug, FW_DEFAULT);
- pBreak =
- dictAppendWord(dp, "debug-break",debugBreak, FW_DEFAULT);
- dictAppendWord(dp, "forget-wid",forgetWid, FW_DEFAULT);
- dictAppendWord(dp, "see-xt", seeXT, FW_DEFAULT);
- return;
-}
-