Diff for /gforth/Attic/engine.c between versions 1.32 and 1.40

version 1.32, 1995/12/10 19:02:07 version 1.40, 1997/02/16 20:51:07
Line 19 Line 19
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */  */
   
   #include "config.h"
 #include <ctype.h>  #include <ctype.h>
 #include <stdio.h>  #include <stdio.h>
 #include <string.h>  #include <string.h>
Line 44 Line 45
   
 #define IOR(flag)       ((flag)? -512-errno : 0)  #define IOR(flag)       ((flag)? -512-errno : 0)
   
 typedef union {  
   struct {  
 #ifdef WORDS_BIGENDIAN  
     Cell high;  
     Cell low;  
 #else  
     Cell low;  
     Cell high;  
 #endif;  
   } cells;  
   DCell dcell;  
 } Double_Store;  
   
 typedef struct F83Name {  typedef struct F83Name {
   struct F83Name        *next;  /* the link field for old hands */    struct F83Name        *next;  /* the link field for old hands */
   char                  countetc;    char                  countetc;
Line 68  typedef struct F83Name { Line 56  typedef struct F83Name {
 #define F83NAME_SMUDGE(np)      (((np)->countetc & 0x40) != 0)  #define F83NAME_SMUDGE(np)      (((np)->countetc & 0x40) != 0)
 #define F83NAME_IMMEDIATE(np)   (((np)->countetc & 0x20) != 0)  #define F83NAME_IMMEDIATE(np)   (((np)->countetc & 0x20) != 0)
   
 #ifdef USE_TOS  
 #define IF_TOS(x) x  
 #else  
 #define IF_TOS(x)  
 #define TOS (sp[0])  
 #endif  
   
 #ifdef USE_FTOS  
 #define IF_FTOS(x) x  
 #else  
 #define IF_FTOS(x)  
 #define FTOS (fp[0])  
 #endif  
   
 Cell *SP;  Cell *SP;
 Float *FP;  Float *FP;
   Address UP=NULL;
   
   #if 0
   /* not used currently */
 int emitcounter;  int emitcounter;
   #endif
 #define NULLC '\0'  #define NULLC '\0'
   
 char *cstr(Char *from, UCell size, int clear)  char *cstr(Char *from, UCell size, int clear)
 /* if clear is true, scratch can be reused, otherwise we want more of  /* return a C-string corresponding to the Forth string ( FROM SIZE ).
    the same */     the C-string lives until the next call of cstr with CLEAR being true */
 {  {
   static char *scratch=NULL;    static struct cstr_buffer {
   static unsigned scratchsize=0;      char *buffer;
   static char *nextscratch;      size_t size;
   char *oldnextscratch;    } *buffers=NULL;
     static int nbuffers=0;
     static int used=0;
     struct cstr_buffer *b;
   
     if (buffers==NULL)
       buffers=malloc(0);
   if (clear)    if (clear)
     nextscratch=scratch;      used=0;
   if (scratch==NULL) {    if (used>=nbuffers) {
     scratch=malloc(size+1);      buffers=realloc(buffers,sizeof(struct cstr_buffer)*(used+1));
     nextscratch=scratch;      buffers[used]=(struct cstr_buffer){malloc(0),0};
     scratchsize=size;      nbuffers=used+1;
   }    }
   else if (nextscratch+size>scratch+scratchsize) {    b=&buffers[used];
     char *oldscratch=scratch;    if (size+1 > b->size) {
     scratch = realloc(scratch, (nextscratch-scratch)+size+1);      b->buffer = realloc(b->buffer,size+1);
     nextscratch=scratch+(nextscratch-oldscratch);      b->size = size+1;
     scratchsize=size;  
   }    }
   memcpy(nextscratch,from,size);    memcpy(b->buffer,from,size);
   nextscratch[size]='\0';    b->buffer[size]='\0';
   oldnextscratch = nextscratch;    used++;
   nextscratch += size+1;    return b->buffer;
   return oldnextscratch;  
 }  }
   
 char *tilde_cstr(Char *from, UCell size, int clear)  char *tilde_cstr(Char *from, UCell size, int clear)
Line 127  char *tilde_cstr(Char *from, UCell size, Line 109  char *tilde_cstr(Char *from, UCell size,
     return cstr(from, size, clear);      return cstr(from, size, clear);
   if (size<2 || from[1]=='/') {    if (size<2 || from[1]=='/') {
     s1 = (char *)getenv ("HOME");      s1 = (char *)getenv ("HOME");
       if(s1 == NULL)
         s1 = "";
     s2 = from+1;      s2 = from+1;
     s2_len = size-1;      s2_len = size-1;
   } else {    } else {
     int i;      UCell i;
     for (i=1; i<size && from[i]!='/'; i++)      for (i=1; i<size && from[i]!='/'; i++)
       ;        ;
     {      {
Line 165  char *tilde_cstr(Char *from, UCell size, Line 149  char *tilde_cstr(Char *from, UCell size,
   
 static char* fileattr[6]={"r","rb","r+","r+b","w","wb"};  static char* fileattr[6]={"r","rb","r+","r+b","w","wb"};
   
 static Address up0=NULL;  #ifndef O_BINARY
   #define O_BINARY 0
   #endif
   #ifndef O_TEXT
   #define O_TEXT 0
   #endif
   
   static int ufileattr[6]= {
     O_RDONLY|O_TEXT, O_RDONLY|O_BINARY,
     O_RDWR  |O_TEXT, O_RDWR  |O_BINARY,
     O_WRONLY|O_TEXT, O_WRONLY|O_BINARY };
   
 /* if machine.h has not defined explicit registers, define them as implicit */  /* if machine.h has not defined explicit registers, define them as implicit */
 #ifndef IPREG  #ifndef IPREG
Line 217  Label *engine(Xt *ip0, Cell *sp0, Cell * Line 211  Label *engine(Xt *ip0, Cell *sp0, Cell *
 #ifdef CFA_NEXT  #ifdef CFA_NEXT
   register Xt cfa CFAREG;    register Xt cfa CFAREG;
 #endif  #endif
   register Address up UPREG = up0;    register Address up UPREG = UP;
   IF_TOS(register Cell TOS TOSREG;)    IF_TOS(register Cell TOS TOSREG;)
   IF_FTOS(register Float FTOS FTOSREG;)    IF_FTOS(register Float FTOS FTOSREG;)
   static Label symbols[]= {    static Label symbols[]= {
Line 236  Label *engine(Xt *ip0, Cell *sp0, Cell * Line 230  Label *engine(Xt *ip0, Cell *sp0, Cell *
     (Label)0,      (Label)0,
 #endif  #endif
 #include "prim_labels.i"  #include "prim_labels.i"
       (Label)0
   };    };
 #ifdef CPU_DEP2  #ifdef CPU_DEP2
   CPU_DEP2    CPU_DEP2

Removed from v.1.32  
changed lines
  Added in v.1.40


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