int crPackCanHoldBuffer( const CRPackBuffer *src ) { const int num_data = crPackNumData(src); const int num_opcode = crPackNumOpcodes(src); GET_PACKER_CONTEXT(pc); return crPackCanHoldOpcode( pc, num_opcode, num_data ); }
int crPackCanHoldBuffer( const CRPackBuffer *src ) { const int num_data = crPackNumData(src); const int num_opcode = crPackNumOpcodes(src); int res; CR_GET_PACKER_CONTEXT(pc); CR_LOCK_PACKER_CONTEXT(pc); res = crPackCanHoldOpcode( pc, num_opcode, num_data ); CR_UNLOCK_PACKER_CONTEXT(pc); return res; }
void crPackAppendBuffer( const CRPackBuffer *src ) { CR_GET_PACKER_CONTEXT(pc); const int num_data = crPackNumData(src); const int num_opcode = crPackNumOpcodes(src); CRASSERT(num_data >= 0); CRASSERT(num_opcode >= 0); CR_LOCK_PACKER_CONTEXT(pc); /* don't append onto ourself! */ CRASSERT(pc->currentBuffer); CRASSERT(pc->currentBuffer != src); if (!crPackCanHoldBuffer(src)) { if (src->holds_BeginEnd) { crWarning( "crPackAppendBuffer: overflowed the destination!" ); CR_UNLOCK_PACKER_CONTEXT(pc); return; } else { crError( "crPackAppendBuffer: overflowed the destination!" ); CR_UNLOCK_PACKER_CONTEXT(pc); } } /* Copy the buffer data/operands which are at the head of the buffer */ crMemcpy( pc->buffer.data_current, src->data_start, num_data ); pc->buffer.data_current += num_data; /* Copy the buffer opcodes which are at the tail of the buffer */ CRASSERT( pc->buffer.opcode_current - num_opcode >= pc->buffer.opcode_end ); crMemcpy( pc->buffer.opcode_current + 1 - num_opcode, src->opcode_current + 1, num_opcode ); pc->buffer.opcode_current -= num_opcode; pc->buffer.holds_BeginEnd |= src->holds_BeginEnd; pc->buffer.in_BeginEnd = src->in_BeginEnd; pc->buffer.holds_List |= src->holds_List; CR_UNLOCK_PACKER_CONTEXT(pc); }
void crPackAppendBoundedBuffer( const CRPackBuffer *src, const CRrecti *bounds ) { CR_GET_PACKER_CONTEXT(pc); const GLbyte *payload = (const GLbyte *) src->opcode_current + 1; const int num_opcodes = crPackNumOpcodes(src); const int length = src->data_current - src->opcode_current - 1; CRASSERT(pc); CR_LOCK_PACKER_CONTEXT(pc); CRASSERT(pc->currentBuffer); CRASSERT(pc->currentBuffer != src); /* * payload points to the block of opcodes immediately followed by operands. */ if ( !crPackCanHoldBoundedBuffer( src ) ) { if (src->holds_BeginEnd) { crWarning( "crPackAppendBoundedBuffer: overflowed the destination!" ); CR_UNLOCK_PACKER_CONTEXT(pc); return; } else { crError( "crPackAppendBoundedBuffer: overflowed the destination!" ); CR_UNLOCK_PACKER_CONTEXT(pc); } } if (pc->swapping) crPackBoundsInfoCRSWAP( bounds, payload, length, num_opcodes ); else crPackBoundsInfoCR( bounds, payload, length, num_opcodes ); pc->buffer.holds_BeginEnd |= src->holds_BeginEnd; pc->buffer.in_BeginEnd = src->in_BeginEnd; pc->buffer.holds_List |= src->holds_List; CR_UNLOCK_PACKER_CONTEXT(pc); }