Ejemplo n.º 1
0
Archivo: typemgr.c Proyecto: xyuan/ug
static int RecursiveRegister (TYPE_DESC *desc,
                              int i, DDD_TYPE typ, char *adr, int argno)
{
  TYPE_DESC *d2 = &(theTypeDefs[typ]);
  char       *errtxt;

  if (CPP_ARRAY(d2))
  {
    errtxt=RegisterError(desc,argno,
                         "cannot include array-like type into array-like type");
    DDD_PrintError('W', 2410, errtxt);
    return(ERROR);
  }

  ConstructEl(&desc->element[i], typ, adr, d2->size, 0);
  if (CheckBounds(desc, &desc->element[i], argno) == ERROR)
    return(ERROR);

  desc->size += d2->size;

  /* inherit other properties */
  desc->nPointers += d2->nPointers;
  if (d2->hasHeader)
  {
    if (!desc->hasHeader)
    {
      desc->hasHeader = TRUE;
      desc->elemHeader = i;
      desc->offsetHeader = d2->offsetHeader;
    }
    else
    {
      errtxt=RegisterError(desc,argno, "only one DDD_HDR allowed");
      DDD_PrintError('E', 2411, errtxt);
      return(ERROR);
    }
  }

  return i+1;
}
Ejemplo n.º 2
0
AnimatePoint AnimateCompile::GetEndingPosition(const ContToken* token) const
{
    auto sheet = curr_sheet + 1;

    while (1) {
        if (sheet == mShow.GetSheetEnd()) {
            RegisterError(ANIMERR_UNDEFINED, token);
            return GetPointPosition();
        }
        if (sheet->IsInAnimation()) {
            return sheet->GetPosition(GetCurrentPoint());
        }
        ++sheet;
    }
}
Ejemplo n.º 3
0
bool AnimateCompile::Append(std::shared_ptr<AnimateCommand> cmd,
    const ContToken* token)
{
    if (mState.beats_rem < cmd->NumBeats()) {
        RegisterError(ANIMERR_OUTOFTIME, token);
        if (mState.beats_rem == 0) {
            return false;
        }
        cmd->ClipBeats(mState.beats_rem);
    }
    mState.cmds.push_back(cmd);
    mState.beats_rem -= cmd->NumBeats();

    cmd->ApplyForward(mState.pt); // Move current point to new position
    SetVarValue(CONTVAR_DOF, cmd->MotionDirection());
    SetVarValue(CONTVAR_DOH, cmd->RealDirection());
    return true;
}
Ejemplo n.º 4
0
Archivo: typemgr.c Proyecto: xyuan/ug
void DDD_Library::TypeDefine (DDD_TYPE typ, ...)
#endif

{
  TYPE_DESC *desc;
  size_t argsize;
  char      *argp;
  int argtyp, argno;
  DDD_TYPE argrefs;
  int i, nPtr;
  char      *errtxt;
  va_list ap;
  char      *adr;
  char      *gbits;
#if defined(CPP_FRONTEND)
  int size;
  int offset;
#endif

  /* TODO: only master should be able to define types, other
          procs should receive the correct definition from master.
          (with the current implementation inconsistencies might occur)
   */

  /* test whether typ is valid */
  if (typ>=nDescr)
  {
    DDD_PrintError('E', 2414,
                   "invalid DDD_TYPE in DDD_TypeDefine");
    HARD_EXIT;             /*return;*/
  }

  /* get object description */
  desc = &(theTypeDefs[typ]);
  desc->currTypeDefCall++;

  if (desc->mode!=DDD_TYPE_DECLARED && desc->mode!=DDD_TYPE_CONTDEF)
  {
    if (desc->mode==DDD_TYPE_DEFINED)
    {
      DDD_PrintError('E', 2415,
                     RegisterError(desc, 0, "DDD_TYPE already defined"));
    }
    else
    {
      DDD_PrintError('E', 2416,
                     RegisterError(desc, 0, "undeclared DDD_TYPE"));
    }
    HARD_EXIT;             /*return;*/
  }


  /* initialize TYPE_DESC struct, only on first call */
  if (desc->currTypeDefCall==1)
    ConstructDesc(desc);


  if (typ==0)        /* i.e. typ==EL_DDDHDR */
  {
    /* DDD_HDR also contains a DDD_HDR (sic!) */
    desc->hasHeader = TRUE;
  }

#       ifdef DebugTypeDefine
  sprintf(cBuffer,"   DDD_TypeDefine(%s/%d)\n",
          desc->name, desc->currTypeDefCall);
  DDD_PrintDebug(cBuffer);
#       endif


  /* start variable arguments after "typ"-parameter */
  va_start(ap, typ);

#ifdef C_FRONTEND
  adr = va_arg(ap, char *);
  argno = 2;
#endif

#ifdef CPP_FRONTEND
  if (CPP_STRUCT(desc))
  {
    adr = va_arg(ap, char *);
    argno = 2;
  }
  else
  {
Ejemplo n.º 5
0
Archivo: typemgr.c Proyecto: xyuan/ug
static void AttachMask (TYPE_DESC *desc)
{
  int i, k;
  ELEM_DESC *e;
  unsigned char  *mp;
  unsigned char mask;

  /* get storage for mask */
  desc->cmask = (unsigned char *)AllocFix(desc->size);
  if (desc->cmask==0)
  {
    DDD_PrintError('E', 2413,
                   RegisterError(desc,0, STR_NOMEM));
    HARD_EXIT;             /*return;*/
  }

  /* set default: EL_LDATA for unspecified regions (gaps) */
  for(i=0; i<desc->size; i++)
  {
    desc->cmask[i] = 0x00;                    /* dont-copy-flag */
  }

  /* create mask from element list */
  for(i=0; i<desc->nElements; i++)
  {
    e = &desc->element[i];
    mp = desc->cmask + e->offset;

    switch (e->type)
    {
    case EL_LDATA :
    case EL_OBJPTR :                        /* OBJPTR are LDATA!!! */
      mask = 0x00;                              /* dont-copy-flag */
      break;

    case EL_GDATA :
    case EL_DATAPTR :
      mask = 0xff;                              /* copy-flag */
      break;
    }

    for(k=0; k<e->size; k++)
    {
      if (e->type==EL_GBITS)
      {
        mp[k] = e->gbits[k];                           /* copy bitwise */
      }
      else
      {
        mp[k] = mask;
      }
    }
  }

#       ifdef DebugCopyMask
  if (me==master)
  {
    char buf[8];

    sprintf(cBuffer, "%4d: AttachMask for %s:", me, desc->name);
    for(i=0; i<desc->size; i++)
    {
      if (i%8==0)
      {
        strcat(cBuffer,"\n");
        DDD_PrintLine(cBuffer);
        sprintf(cBuffer,"  %4d:  ", i);
      }
      sprintf(buf, "%02x ", desc->cmask[i]);
      strcat(cBuffer, buf);
    }
    strcat(cBuffer,"\n");
    DDD_PrintLine(cBuffer);
  }
#       endif
}