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; }
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; } }
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; }
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 {
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 }