void CeosUpdateHeaderFromBuffer(CeosRecord_t *record) { if(record && record->Buffer) { CeosToNative( &( record->Length ), record->Buffer+__LENGTH_OFF, sizeof(record->Length ), sizeof( record->Length ) ); memcpy(&(record->TypeCode.Int32Code),record->Buffer+__TYPE_OFF,sizeof(record->TypeCode.Int32Code)); CeosToNative(&(record->Sequence),record->Buffer+__SEQUENCE_OFF,sizeof(record->Sequence ), sizeof( record->Sequence ) ); } record->Subsequence = 0; }
static void ExtractInt(CeosRecord_t *record, int type, unsigned int offset, unsigned int length, int *value) { void *buffer; char format[32]; buffer = HMalloc( length + 1 ); switch(type) { case __CEOS_REC_TYP_A: sprintf( format, "A%u", length ); GetCeosField( record, offset, format, buffer ); *value = atoi( buffer ); break; case __CEOS_REC_TYP_B: sprintf( format, "B%u", length ); #ifdef notdef GetCeosField( record, offset, format, buffer ); if( length <= 4 ) CeosToNative( value, buffer, length, length ); else *value = 0; #else GetCeosField( record, offset, format, value ); #endif break; case __CEOS_REC_TYP_I: sprintf( format, "I%u", length ); GetCeosField( record, offset, format, value ); break; } HFree( buffer ); }
void InitCeosRecordWithHeader(CeosRecord_t *record, uchar *header, uchar *buffer) { if(record && buffer && header) { if( record->Length != 0 ) record->Length = DetermineCeosRecordBodyLength( header ); if(record->Length < CEOS_HEADER_LENGTH || (record->Buffer = HMalloc(record->Length)) == NULL) { record->Length = 0; return; } /* First copy the header then the buffer */ memcpy(record->Buffer,header,CEOS_HEADER_LENGTH); /* Now we copy the rest */ if( record->Length > CEOS_HEADER_LENGTH ) memcpy(record->Buffer+CEOS_HEADER_LENGTH,buffer,record->Length-CEOS_HEADER_LENGTH); /* Now we fill in the rest of the structure! */ memcpy(&(record->TypeCode.Int32Code),header+TYPE_OFF,sizeof(record->TypeCode.Int32Code)); CeosToNative(&(record->Sequence),header+SEQUENCE_OFF,sizeof(record->Sequence), sizeof( record->Sequence ) ); } }
void PutCeosRecordStruct(CeosRecord_t *record,const void *struct_ptr) { int Length; if(record && struct_ptr) { CeosToNative( &Length, struct_ptr, sizeof( Length ), sizeof( Length ) ); memcpy(record->Buffer,struct_ptr,Length); CeosUpdateHeaderFromBuffer(record); } }
int DetermineCeosRecordBodyLength(const uchar *header) { int i; if(header) { CeosToNative(&i,header+__LENGTH_OFF,sizeof( i ), sizeof( i ) ); return i; } return -1; }
void GetCeosField(CeosRecord_t *record, int32 start_byte, const char *format, void *value) { int field_size; char *d_ptr; char *mod_buf = NULL; field_size = atoi(format+1); if(field_size < 1) { return; } /* Check for out of bounds */ if(start_byte + field_size - 1 > record->Length) { return; } if((mod_buf = (char *) HMalloc(field_size + 1)) == NULL) { return; } memcpy(mod_buf,record->Buffer+(start_byte-1), field_size); mod_buf[field_size] = '\0'; /* Switch on format type */ switch(format[0]) { case 'b': case 'B': /* Binary data type */ if(field_size > 1) { CeosToNative( value, mod_buf, field_size, field_size ); } else { memcpy( value, mod_buf, field_size ); } break; case 'i': case 'I': /* Integer type */ *( (int *)value) = atoi(mod_buf); break; case 'f': case 'F': case 'e': case 'E': /* Double precision float data type */ /* Change the 'D' exponent separators to 'e' */ if( ( d_ptr = strchr(mod_buf, 'd') ) != NULL) { *d_ptr = 'e'; } if( ( d_ptr = strchr(mod_buf, 'D') ) != NULL) { *d_ptr = 'e'; } *( (double *)value) = strtod(mod_buf,NULL); break; case 'a': case 'A': /* ASCII.. We just easily extract it */ ( (char *)value)[field_size] = '\0'; memcpy( value, mod_buf, field_size ); break; default: /* Unknown format */ return; } HFree(mod_buf); }