Пример #1
0
/*     10.1.15                                                             */
boolean Vchunk_Copy      (tokentype    *Vtoken0,   tokentype    *Vtoken1, 
                          ft F,lt Z,zz *Status)
{
vchunktkntype Vchunk0;
vchunktkntype Vchunk1;
vchunkstruc   VchunkStruc0;
vchunkstruc   VchunkStruc1;
addrtype      VchunkAddr0   = NullPtr;
addrtype      VchunkAddr1   = NullPtr;

  if (DbmInvokeVchunk    (Vtoken0,         McStat,    &Vchunk0))
  if (MemGetChunkStruc   (Vchunk0.InCore,  McStat,    &VchunkStruc0))
  if (MemGetChunkAddr    (Vchunk0.InCore,  McStat,    &VchunkAddr0))

  if (DbmInvokeVchunk    (Vtoken1,         McStat,    &Vchunk1))
  if (MemGetChunkStruc   (Vchunk1.InCore,  McStat,    &VchunkStruc1))
  if (MemGetChunkAddr    (Vchunk1.InCore,  McStat,    &VchunkAddr1))

  if (VchunkStruc0.UnitSize == VchunkStruc1.UnitSize)
  {
     if (MemPutStackPtr  (Vchunk1.InCore,  VchunkStruc1.StackPtr,    McStat))
         MoveBytes       (VchunkAddr0,     VchunkAddr1, 
                          VchunkStruc0.UnitSize * VchunkStruc0.UnitCount);
  } else
    *Status = Vchunk_NotSameUnitSize;

TRACK(TrackBak,"Vchunk_Copy\n");
return (STAT);
}
Пример #2
0
trap_retval ReqWrite_mem( void )
{
    bool            int_tbl;
    write_mem_req   *acc;
    write_mem_ret   *ret;
    trap_elen       len;
    void            *data;

    acc = GetInPtr(0);
    ret = GetOutPtr(0);
    data = GetInPtr(sizeof(*acc));
    len = GetTotalSize() - sizeof(*acc);

    acc->mem_addr.offset &= 0xffff;
    int_tbl = IsInterrupt( acc->mem_addr, len );
    if( int_tbl )
        SetIntVecs();
    if( ( acc->mem_addr.offset + len ) > 0xffff ) {
        len = 0x10000 - acc->mem_addr.offset;
    }
    MoveBytes( FP_SEG( data ), FP_OFF( data ),
               acc->mem_addr.segment, acc->mem_addr.offset, len );
    if( int_tbl )
        ClrIntVecs();
    ret->len = len;
    return( sizeof( *ret ) );
}
Пример #3
0
trap_retval ReqRead_mem( void )
{
    bool            int_tbl;
    read_mem_req    *acc;
    void            *data;
    trap_elen       len;

    acc = GetInPtr(0);
    data = GetOutPtr( 0 );
    acc->mem_addr.offset &= 0xffff;
    int_tbl = IsInterrupt( acc->mem_addr, acc->len );
    if( int_tbl )
        SetIntVecs();
    len = acc->len;
    if( ( acc->mem_addr.offset + len ) > 0xffff ) {
        len = 0x10000 - acc->mem_addr.offset;
    }
    MoveBytes( acc->mem_addr.segment, acc->mem_addr.offset,
               FP_SEG( data ), FP_OFF( data ), len );
    if( int_tbl )
        ClrIntVecs();
    return( len );
}
Пример #4
0
Файл: ogrp.c Проект: palmerc/lab
/*     12.0.4                                                              */
boolean Grp_DeleteObject (dbheader     *CoreDb,    objheader    *ObjHdr,
                          indextype     Index,     ft F,lt Z,zz *Status)
{
numtype         DeleteRgn    = 0;
numtype         RgnNum       = 0;
numtype         Chunk        = 0;
addrtype        ChunkAddr    = NullPtr;
indextype       LocalIndex   = 0;
addrtype        DeleteEntry  = NullPtr;
indextype       LastIndex    = 0;
addrtype        LastEntry    = NullPtr;
numtype         MemLoc       = 0;
handletype      Handle       = 0;
boolean         TempGrpBug   = GrpBug;

  if (Index   < ObjHdr->BaseIndex)
  {
     DeleteRgn               = 0;
     LocalIndex              = Index;
     if (ObjHdr->BaseRegion == 0)
        GrpGetRegion     (CoreDb,     (grpheader *)ObjHdr,  0,     
                          McStat,    &ObjHdr->BaseRegion,  &ChunkAddr);
     else
        MemGetChunkAddr  (ObjHdr->BaseRegion,  McStat,     &ChunkAddr);

     Chunk      = ObjHdr->BaseRegion;

  } else {
     DeleteRgn      = (Index - ObjHdr->BaseIndex) / ObjHdr->RegionObjects;
     if (ObjHdr->BaseIndex)
        RgnNum++;
     LocalIndex     = (Index - ObjHdr->BaseIndex) % ObjHdr->RegionObjects;
     if (GrpGetRegion    (CoreDb,     (grpheader *)ObjHdr,  DeleteRgn,     
                          McStat,    &Chunk,               &ChunkAddr))
       ++ObjHdr->FrozenRgns[DeleteRgn];
  }
  DeleteEntry   =  (addrtype )((char *)ChunkAddr 
                                     + (ObjHdr->ObjSize * LocalIndex));

--ObjHdr->ObjectCount;

  LastIndex             = ObjHdr->ObjectCount;

  if (GrpBug || DbmBug || DeBug)
  if (sprintf (Msg, 
               " Rgn =%4u; Chunk=%4u;                  LocalIndex=%4u;\n",
               DeleteRgn, Chunk, LocalIndex))
  if (TraceMsg (0, Msg))
  if (sprintf (Msg, 
               "                                         LastIndex=%4u\n", 
               ObjHdr->ObjectCount))
     TraceMsg (0, Msg);

  if (Normal(*Status)) 
  if (ObjHdr->ObjectCount == 0)
  {
     memset     (DeleteEntry,    0,            ObjHdr->ObjSize);
     Grp_CleanRgnChunks (CoreDb,  (grpheader *)ObjHdr,  DeleteRgn,  Chunk, 
                         McStat);

  } else if (LastIndex    == Index) {

     memset     (DeleteEntry,    0,            ObjHdr->ObjSize);
     if (DeleteRgn)
      --ObjHdr->FrozenRgns[DeleteRgn];

   ++ObjHdr->RgnStats[DeleteRgn];

     if (LocalIndex  == 0)
         Grp_CleanRgnChunks (CoreDb,  (grpheader *)ObjHdr,  DeleteRgn, Chunk,
                             McStat);
     else
         MemPutStackPtr     (Chunk,        LocalIndex+1,    McStat);

  } else {
     /*  Get Position of Last Object Entry of Last Grp Rgn.                */
     if (LastIndex         < ObjHdr->BaseIndex)
     {
        RgnNum     = 0;
        LocalIndex = LastIndex;
        if (ObjHdr->BaseRegion == 0)
           GrpGetRegion     (CoreDb,     (grpheader *)ObjHdr,  0,     
                             McStat,    &ObjHdr->BaseRegion,  &ChunkAddr);
        else
           MemGetChunkAddr  (ObjHdr->BaseRegion,  McStat,     &ChunkAddr);

        Chunk      = ObjHdr->BaseRegion;

     } else {
        RgnNum     = (LastIndex - ObjHdr->BaseIndex) / ObjHdr->RegionObjects;
        if (ObjHdr->BaseIndex)
           RgnNum++;
        LocalIndex = (LastIndex - ObjHdr->BaseIndex) % ObjHdr->RegionObjects;
        GrpGetRegion    (CoreDb,     (grpheader *)ObjHdr,  RgnNum,     
                         McStat,    &Chunk,               &ChunkAddr);
     }
     LastEntry     =  (addrtype )((char *)ChunkAddr 
                                        + (ObjHdr->ObjSize * LocalIndex));

     Handle        = *(handletype *)((char *)LastEntry 
                                        + ObjHdr->HandleOffset);

     if (GrpBug || DbmBug || DeBug)
     if (sprintf (Msg,
         " LAST Rgn =%4u; Chunk=%4u; Local=%4u;      Index=%4u; Handle=%6u\n",
                  RgnNum, Chunk, LocalIndex, LastIndex,  Handle))
        TraceMsg (0, Msg);

     /*  Copy Last Object Entry  to position of deleted.                  */
     if (Normal(*Status)) 
     if (HmPutObjectIndex   (CoreDb,  Handle,  Index,         McStat))
     if (HmGetObjectMemLoc  (CoreDb,  Handle,  McStat,       &MemLoc))
     if (MemLoc  ==0)
         HmPutObjectAddr    (CoreDb,  Handle,  DeleteEntry,   McStat);

     if (Normal(*Status)) 
     {
      ++ObjHdr->RgnStats[RgnNum];
      ++ObjHdr->RgnStats[DeleteRgn];

        MoveBytes  (LastEntry,  DeleteEntry,  ObjHdr->ObjSize);
        memset     (LastEntry,  0,            ObjHdr->ObjSize);

        if (LocalIndex  == 0)
           Grp_CleanRgnChunks (CoreDb,  (grpheader *)ObjHdr,  RgnNum,  Chunk,
                               McStat);
        else
           MemPutStackPtr     (Chunk,        LocalIndex+1,    McStat);
     }

     if (DeleteRgn)
       --ObjHdr->FrozenRgns[DeleteRgn];
  }
  GrpBug  = TempGrpBug;

TRACK(TrackBak,"Grp_DeleteObject\n");
return (STAT);
}
Пример #5
0
Файл: ifm.c Проект: palmerc/lab
/* C; C++                                                                 */      
boolean ImagePutFieldValue 
                          (tokentype    *Token,    fieldstruc   *FS,
                           addrtype      Value,    ft F,lt Z,zz *Status)
{
dbheader     *CoreDb       = NullPtr;
numtype       MemLoc       = 0;
tokentype     AttrTkn      = NullToken;
attrdesctype *AttrDesc     = NullPtr;
tokentype     BldDescTkn   = NullToken;
objdesctype  *BldDesc      = NullPtr;
sizetype      Offset       = 0;
tokentype     RefTkn       = NullToken;
addrtype      BytePtr      = NullPtr;
char         *StrPtr       = NullPtr;
numtype       AttrId       = FS->FieldTkns[FS->SubLevel-1].AttrId;

  AttrTkn.DbId   = RenvId;
  if (ClassBug || DeBug || OaBug)
  if (sprintf (Msg, 
              " Image::PutFieldValue Object[%2u:%4u]    AttrId= %2u @%x\n",
               Token->DbId, Token->Handle, AttrId, Value))
     TraceMsg (0, Msg);

  if (Token->DbId)
  if (TmFetchCoreDb      (Token,       McStat,                &CoreDb))
  if (CoreDb)
  if (HmGetObjectMemLoc  (CoreDb,      Token->Handle,
                          McStat,                             &MemLoc))

  if (EnvFetchAttrHandle (AttrId,      McStat,                &AttrTkn.Handle))
  if (OaGetObject        (&AttrTkn,    McStat,    (addrtype *)&AttrDesc))

  if (AttrDesc->AttrType        == aChunkAttr
  ||  AttrDesc->AttrType        == aArrayAttr
  ||  AttrDesc->AttrType        == aVarrayAttr
  ||  AttrDesc->AttrType        == aDblPtrAttr)
  {
    *Status = Image_AttrNotPutArrayType;

     TraceMsg (0, " Image_PutFieldValue:: Invalid Attribute Type for PutValue.\n");
     TraceMsg (0, "    Arrays Must be instantiated with Array Methods.\n");
     sprintf (Msg, "     for Token[%2u:%4u] AttrId= %4u.\n",
              Token->DbId, Token->Handle, AttrId);
     TraceMsg (0, Msg);

  }

  if (Normal(*Status))
  if (AttrDesc->AttrType        == aStrHndlAttr)
  {
     StrPtr                      = (char *)Value;
     if (sprintf (Msg, " Image::PutValue [%2u:%4u] String @%x := <%s>)\n",
                  Token->DbId, Token->Handle, Value,   StrPtr))
        TraceMsg (0, Msg);

     KernelPutField       (Token,   FS,     Value,     McStat);

  } else if (AttrDesc->AttrType == aObjRefAttr) {
     if (MemLoc                 == 0)
        KernelPutField    (Token,   FS,  (addrtype )&Value,     McStat);

     else {
        BldDescTkn.DbId          =  RenvId;
        BldDescTkn.Handle        =  AttrDesc->BuildDesc;
        if (OaGetObject  (&BldDescTkn,  McStat,  (addrtype *)&BldDesc))
        if (Env_FetchObjAttrOffset
                         (MemLoc,      BldDesc->ObjNum,      Token_Attr,
                          McStat,              &Offset))
        {
           BytePtr     = (addrtype )((char *)Value     + Offset);
           MoveBytes     (BytePtr,  (addrtype )&RefTkn,   sizeof (tokentype));
           if (RefTkn.DbId
           &&  RefTkn.Handle)
              KernelPutField
                         (Token,   FS,     (addrtype )&RefTkn, McStat);
        }
        if (ClassBug || DeBug || OaBug)
        if (sprintf (Msg, 
         " Image::PutFieldValue Reference[%2u:%4u]  @%x)\n",
                     RefTkn.DbId, RefTkn.Handle, *(addrtype **)Value))
           TraceMsg (0, Msg);
     }

  } else
     KernelPutField       (Token,   FS,     Value,     McStat);


TRACK(TrackBak,"ImagePutFieldValue\n");
return (STAT);
}
Пример #6
0
Файл: ifm.c Проект: palmerc/lab
/* C; C++                                                                 */      
boolean ImageGetFieldValue (tokentype    *Token,    fieldstruc   *FS,
                           ft F,lt Z,zz *Status,   addrtype      Value)
{
dbheader     *CoreDb       = NullPtr;
numtype       MemLoc       = 0;
tokentype     AttrTkn      = NullToken;
attrdesctype *AttrDesc     = NullPtr;
tokentype     VchunkTkn    = NullToken;
vchunktype   *Vstruc       =  (vchunktype *)Value;
sizetype      Vsize        = 0;
addrtype      Image        = NullPtr;
addrtype      BytePtr      = NullPtr;
int           i            = 0;
handletype   *Handles      = NullPtr;
handletype   *ArrayPtrs    = NullPtr;
RefObj       *RefObjVal    = NullPtr;
numtype       AttrId       = FS->FieldTkns[FS->SubLevel-1].AttrId;

  AttrTkn.DbId   = RenvId;

  if (Token->DbId)
  if (TmFetchCoreDb     (Token,        McStat,                &CoreDb))
  if (CoreDb)
  if (HmGetObjectMemLoc (CoreDb,       Token->Handle,
                         McStat,                              &MemLoc))

  if (EnvFetchAttrHandle (AttrId,      McStat,                &AttrTkn.Handle))
  if (OaGetObject        (&AttrTkn,    McStat,    (addrtype *)&AttrDesc))

  if (AttrDesc->AttrType == aObjRefAttr
  &&  MemLoc             == 0)
     KernelGetField      (Token,       FS,      
                         McStat,                   (addrtype )&VchunkTkn);
  else                                 
     KernelGetField      (Token,       FS,      McStat,        Value);

  if (Normal(*Status))
  if (MemLoc                    == 0)
  if (AttrDesc->AttrType        == aArrayAttr
  ||  AttrDesc->AttrType        == aVarrayAttr
  ||  AttrDesc->AttrType        == aChunkAttr)
  {
  /* move internally stored Vchunk (Handle / Token) to Vstruc       */
     VchunkTkn.DbId              = Token->DbId;
     VchunkTkn.CoreDbId          = 0;
     MoveBytes   (Value, (addrtype )&VchunkTkn.Handle, sizeof (handletype));

     if (AttrDesc->AttrType     == aArrayAttr)
     {
        if (VchunkTkn.Handle     > 0)
            Vchunk_GetAddress  (&VchunkTkn,  McStat,  (addrtype *)Value);
        else
            MoveBytes   (&Image, Value,      sizeof (addrtype));

     } else {
        Vstruc->VchunkTkn        = VchunkTkn;
        if (Vchunk_GetAddress  (&VchunkTkn,  McStat,         &Vstruc->Varray))
        if (Vchunk_GetStackPtr (&VchunkTkn,  McStat,         &Vstruc->Vsize))

        if (AttrDesc->AttrType  == aChunkAttr)
        {
           Vstruc->VstackPtr     = Vstruc->Vsize;
           Vchunk_GetChunkSize (&VchunkTkn,  McStat, &Vstruc->Vsize, &Vsize);
        }
     }

  } else if (AttrDesc->AttrType == aDblPtrAttr) {
  /* move internally stored Vchunk (Handle / Token) to Vstruc       */
     VchunkTkn.DbId              = Token->DbId;
     VchunkTkn.CoreDbId          = 0;
     MoveBytes   (Value, (addrtype )&VchunkTkn.Handle, sizeof (handletype));

     if (VchunkTkn.Handle        > 0)
     {
        if (Vchunk_GetAddress  (&VchunkTkn,  McStat, (addrtype *)&ArrayPtrs))
        if (Vchunk_GetStackPtr (&VchunkTkn,  McStat,             &Vsize))
        {
            Vsize               /= 2;
            Handles              = (handletype *)&ArrayPtrs[Vsize];
        }

        for (i = -1; ++i < Vsize && Normal(*Status); )
        {
          if ((VchunkTkn.Handle  = Handles[i]) > 0)
          {
             Vchunk_GetAddress (&VchunkTkn,  
                                McStat,           (addrtype *)&ArrayPtrs[i]);
          } else
             ArrayPtrs[i]         = NullPtr;
        }
        if (Normal(*Status))
          MoveBytes (&ArrayPtrs, Value,      sizeof (addrtype));

     } else
        MoveBytes   (&Image,     Value,      sizeof (addrtype));

  } else if (AttrDesc->AttrType == aObjRefAttr) {

     if (VchunkTkn.DbId
     &&  VchunkTkn.Handle)
        ImageGetObject         (&VchunkTkn,  McStat,         &Image);

     MoveBytes      (&Image,     Value,      sizeof (addrtype));

     if (ClassBug || DeBug || OaBug)
     if (sprintf (Msg, 
      " Image::GetValue Object[%2u:%4u] Reference @%x (Value := @%x)\n",
                  VchunkTkn.DbId, VchunkTkn.Handle,
                  Image,         *(addrtype **)Value))
        TraceMsg (0, Msg);

  } else if (AttrDesc->AttrType == aTknRefAttr) {

     BytePtr    = (addrtype )((char *)Value     + sizeof (addrtype));

     MoveBytes   (Value,  (addrtype )&VchunkTkn,  sizeof (tokentype));

     if (sprintf (Msg, "  Get TknRef[%4u:%6u]Attr  Value @%8x; BytePtr @%8x\n",
                 VchunkTkn.DbId, VchunkTkn.Handle, Value, BytePtr))
         TraceMsg (0, Msg);

     MoveBytes   (&Image,                Value,   sizeof (addrtype));
     MoveBytes   ((addrtype )&VchunkTkn, BytePtr, sizeof (tokentype));

  }

  if (Normal(*Status))
  if (MemLoc                    == 1)
  if (AttrDesc->AttrType        == aTknRefAttr)
  {
     if ((RefObjVal = *(RefObj **)Value) != NULL)
     if (sprintf (Msg, "  Get TknRef[%4u:%6u]Attr  ObjAddr @%8x;\n",
                 RefObjVal->ObjTkn.DbId, RefObjVal->ObjTkn.Handle,
                 RefObjVal->ObjAddr))
         TraceMsg (0, Msg);
  }


TRACK(TrackBak,"ImageGetFieldValue\n");
return (STAT);
}