Diff for /gforth/engine/engine.c between versions 1.2 and 1.6

version 1.2, 1998/03/21 21:37:50 version 1.6, 1998/12/08 22:03:02
Line 1 Line 1
 /* Gforth virtual machine (aka inner interpreter)  /* Gforth virtual machine (aka inner interpreter)
   
   Copyright (C) 1995 Free Software Foundation, Inc.    Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc.
   
   This file is part of Gforth.    This file is part of Gforth.
   
Line 24 Line 24
 #include <stdio.h>  #include <stdio.h>
 #include <string.h>  #include <string.h>
 #include <math.h>  #include <math.h>
   #include <assert.h>
   #include <stdlib.h>
   #include <errno.h>
   #include "forth.h"
   #include "io.h"
   #include "threaded.h"
   #ifndef STANDALONE
 #include <sys/types.h>  #include <sys/types.h>
 #include <sys/stat.h>  #include <sys/stat.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <assert.h>  
 #include <stdlib.h>  
 #include <time.h>  #include <time.h>
 #include <sys/time.h>  #include <sys/time.h>
 #include <unistd.h>  #include <unistd.h>
 #include <errno.h>  
 #include <pwd.h>  #include <pwd.h>
 #include "forth.h"  #else
 #include "io.h"  #include "systypes.h"
 #include "threaded.h"  #endif
   
 #if defined(HAVE_LIBDL) || defined(HAVE_DLOPEN) /* what else? */  #if defined(HAVE_LIBDL) || defined(HAVE_DLOPEN) /* what else? */
 #include <dlfcn.h>  #include <dlfcn.h>
Line 52 Line 56
   
 #define IOR(flag)       ((flag)? -512-errno : 0)  #define IOR(flag)       ((flag)? -512-errno : 0)
   
 typedef struct F83Name {  struct F83Name {
   struct F83Name        *next;  /* the link field for old hands */    struct F83Name *next;  /* the link field for old hands */
   char                  countetc;    char          countetc;
   Char                  name[0];    char          name[0];
 } F83Name;  };
   
 /* are macros for setting necessary? */  /* are macros for setting necessary? */
 #define F83NAME_COUNT(np)       ((np)->countetc & 0x1f)  #define F83NAME_COUNT(np)       ((np)->countetc & 0x1f)
Line 105  char *cstr(Char *from, UCell size, int c Line 109  char *cstr(Char *from, UCell size, int c
   return b->buffer;    return b->buffer;
 }  }
   
   #ifdef STANDALONE
   char *tilde_cstr(Char *from, UCell size, int clear)
   {
     return cstr(from, size, clear);
   }
   #else
 char *tilde_cstr(Char *from, UCell size, int clear)  char *tilde_cstr(Char *from, UCell size, int clear)
 /* like cstr(), but perform tilde expansion on the string */  /* like cstr(), but perform tilde expansion on the string */
 {  {
Line 146  char *tilde_cstr(Char *from, UCell size, Line 156  char *tilde_cstr(Char *from, UCell size,
     return cstr(path,s1_len+s2_len,clear);      return cstr(path,s1_len+s2_len,clear);
   }    }
 }  }
      #endif   
   
 #define NEWLINE '\n'  #define NEWLINE '\n'
   
Line 231  Label *engine(Xt *ip0, Cell *sp0, Cell * Line 241  Label *engine(Xt *ip0, Cell *sp0, Cell *
 #else /* !defined(DOUBLY_INDIRECT) */  #else /* !defined(DOUBLY_INDIRECT) */
   static Label symbols[]= {    static Label symbols[]= {
 #endif /* !defined(DOUBLY_INDIRECT) */  #endif /* !defined(DOUBLY_INDIRECT) */
     &&docol,      (Label)&&docol,
     &&docon,      (Label)&&docon,
     &&dovar,      (Label)&&dovar,
     &&douser,      (Label)&&douser,
     &&dodefer,      (Label)&&dodefer,
     &&dofield,      (Label)&&dofield,
     &&dodoes,      (Label)&&dodoes,
     /* the following entry is normally unused;      /* the following entry is normally unused;
        it's there because its index indicates a does-handler */         it's there because its index indicates a does-handler */
     CPU_DEP1,      (Label)CPU_DEP1,
 #include "prim_lab.i"  #include "prim_lab.i"
     0      (Label)0
   };    };
 #ifdef CPU_DEP2  #ifdef CPU_DEP2
   CPU_DEP2    CPU_DEP2
Line 256  Label *engine(Xt *ip0, Cell *sp0, Cell * Line 266  Label *engine(Xt *ip0, Cell *sp0, Cell *
   
   if (ip == NULL) {    if (ip == NULL) {
 #if defined(DOUBLY_INDIRECT)  #if defined(DOUBLY_INDIRECT)
 #define MAX_SYMBOLS 1000  #define MAX_SYMBOLS (sizeof(routines)/sizeof(routines[0]))
   #define CODE_OFFSET (22*sizeof(Cell))
     int i;      int i;
     Cell code_offset = offset_image? 22*sizeof(Cell) : 0;      Cell code_offset = offset_image? CODE_OFFSET : 0;
       
     symbols = (Label *)(malloc(MAX_SYMBOLS*sizeof(Cell)+code_offset)+code_offset);      symbols = (Label *)(malloc(MAX_SYMBOLS*sizeof(Cell)+CODE_OFFSET)+code_offset);
     for (i=0; i<DOESJUMP+1; i++)      for (i=0; i<DOESJUMP+1; i++)
       symbols[i] = (Label)routines[i];      symbols[i] = routines[i];
     for (; routines[i]!=0; i++) {      for (; routines[i]!=0; i++) {
       if (i>=MAX_SYMBOLS) {        if (i>=MAX_SYMBOLS) {
         fprintf(stderr,"gforth-ditc: more than %d primitives\n",MAX_SYMBOLS);          fprintf(stderr,"gforth-ditc: more than %d primitives\n",MAX_SYMBOLS);
         exit(1);          exit(1);
         }
         symbols[i] = &routines[i];
     }      }
     symbols[i] = &routines[i];  
   }  
 #endif /* defined(DOUBLY_INDIRECT) */  #endif /* defined(DOUBLY_INDIRECT) */
   return symbols;      return symbols;
 }    }
   
   IF_TOS(TOS = sp[0]);    IF_TOS(TOS = sp[0]);
   IF_FTOS(FTOS = fp[0]);    IF_FTOS(FTOS = fp[0]);
 /*  prep_terminal(); */    /*  prep_terminal(); */
   NEXT_P0;    NEXT_P0;
   NEXT;    NEXT;
   

Removed from v.1.2  
changed lines
  Added in v.1.6


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>