MIDAS
Loading...
Searching...
No Matches
Data Bank Functions (bk_xxx)

Functions

void bk_init (void *event)
 
BOOL bk_is32 (const void *event)
 
BOOL bk_is32a (const void *event)
 
void bk_init32 (void *event)
 
void bk_init32a (void *event)
 
INT bk_size (const void *event)
 
static void copy_bk_name (char *dst, const char *src)
 
void bk_create (void *event, const char *name, WORD type, void **pdata)
 
INT bk_copy (char *pevent, char *psrce, const char *bkname)
 
int bk_delete (void *event, const char *name)
 
INT bk_close (void *event, void *pdata)
 
INT bk_list (const void *event, char *bklist)
 
INT bk_locate (const void *event, const char *name, void *pdata)
 
INT bk_find (const BANK_HEADER *pbkh, const char *name, DWORD *bklen, DWORD *bktype, void **pdata)
 
INT bk_iterate (const void *event, BANK **pbk, void *pdata)
 
INT bk_iterate32 (const void *event, BANK32 **pbk, void *pdata)
 
INT bk_iterate32a (const void *event, BANK32A **pbk32a, void *pdata)
 
INT bk_swap (void *event, BOOL force)
 

Detailed Description

dox


Function Documentation

◆ bk_close()

INT bk_close ( void *  event,
void *  pdata 
)

dox Close the Midas bank priviously created by bk_create(). The data pointer pdata must be obtained by bk_create() and used as an address to fill a bank. It is incremented with every value written to the bank and finally points to a location just after the last byte of the bank. It is then passed to bk_close() to finish the bank creation

Parameters
eventpointer to current composed event
pdatapointer to the data
Returns
number of bytes contained in bank

Definition at line 18297 of file midas.cxx.

18297 {
18298 if (bk_is32a((BANK_HEADER *) event)) {
18299 BANK32A *pbk32a = (BANK32A *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
18300 pbk32a->data_size = (DWORD) ((char *) pdata - (char *) (pbk32a + 1));
18301 if (pbk32a->type == TID_STRUCT && pbk32a->data_size == 0)
18302 printf("Warning: TID_STRUCT bank %c%c%c%c has zero size\n", pbk32a->name[0], pbk32a->name[1], pbk32a->name[2], pbk32a->name[3]);
18303 ((BANK_HEADER *) event)->data_size += sizeof(BANK32A) + ALIGN8(pbk32a->data_size);
18304 return pbk32a->data_size;
18305 } else if (bk_is32((BANK_HEADER *) event)) {
18306 BANK32 *pbk32 = (BANK32 *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
18307 pbk32->data_size = (DWORD) ((char *) pdata - (char *) (pbk32 + 1));
18308 if (pbk32->type == TID_STRUCT && pbk32->data_size == 0)
18309 printf("Warning: TID_STRUCT bank %c%c%c%c has zero size\n", pbk32->name[0], pbk32->name[1], pbk32->name[2], pbk32->name[3]);
18310 ((BANK_HEADER *) event)->data_size += sizeof(BANK32) + ALIGN8(pbk32->data_size);
18311 return pbk32->data_size;
18312 } else {
18313 BANK *pbk = (BANK *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
18314 uint32_t size = (uint32_t) ((char *) pdata - (char *) (pbk + 1));
18315 if (size > 0xFFFF) {
18316 printf("Error: Bank size %d exceeds 16-bit limit of 65526, please use bk_init32() to create a 32-bit bank\n", size);
18317 size = 0;
18318 }
18319 pbk->data_size = (WORD) (size);
18320 if (pbk->type == TID_STRUCT && pbk->data_size == 0)
18321 printf("Warning: TID_STRUCT bank %c%c%c%c has zero size\n", pbk->name[0], pbk->name[1], pbk->name[2], pbk->name[3]);
18322 size = ((BANK_HEADER *) event)->data_size + sizeof(BANK) + ALIGN8(pbk->data_size);
18323 if (size > 0xFFFF) {
18324 printf("Error: Bank size %d exceeds 16-bit limit of 65526, please use bk_init32() to create a 32-bit bank\n", size);
18325 size = 0;
18326 }
18327 ((BANK_HEADER *) event)->data_size = size;
18328 return pbk->data_size;
18329 }
18330}
BOOL bk_is32a(const void *event)
Definition midas.cxx:17954
BOOL bk_is32(const void *event)
Definition midas.cxx:17932
unsigned short int WORD
Definition mcstd.h:49
#define TID_STRUCT
Definition midas.h:348
#define ALIGN8(x)
Definition midas.h:522
#define DWORD
Definition mhdump.cxx:31
char name[4]
Definition midas.h:1227
DWORD type
Definition midas.h:1228
DWORD data_size
Definition midas.h:1229
char name[4]
Definition midas.h:1221
DWORD data_size
Definition midas.h:1223
DWORD type
Definition midas.h:1222
Definition midas.h:1214
char name[4]
Definition midas.h:1215
WORD type
Definition midas.h:1216
WORD data_size
Definition midas.h:1217
Here is the call graph for this function:
Here is the caller graph for this function:

◆ bk_copy()

INT bk_copy ( char *  pevent,
char *  psrce,
const char *  bkname 
)

dox Copy a bank given by name if found from a buffer source to a destination buffer.

Parameters
*pevent pointing after the EVENT_HEADER (as in FE)
*psrce pointing to EVENT_HEADER in this case (for ebch[i].pfragment)
bknameBank to be found and copied from psrce to pevent
Returns
EB_SUCCESS if bank found, 0 if not found (pdest untouched)

Definition at line 18121 of file midas.cxx.

18121 {
18122
18123 INT status;
18124 DWORD bklen, bktype, bksze;
18125 BANK_HEADER *psBkh;
18126 BANK *psbkh;
18127 char *pdest;
18128 void *psdata;
18129
18130 // source pointing on the BANKxx
18131 psBkh = (BANK_HEADER *) ((EVENT_HEADER *) psrce + 1);
18132 // Find requested bank
18133 status = bk_find(psBkh, bkname, &bklen, &bktype, &psdata);
18134 // Return 0 if not found
18135 if (status != SUCCESS) return 0;
18136
18137 // Check bank type...
18138 // You cannot mix BANK and BANK32 so make sure all the FE use either
18139 // bk_init(pevent) or bk_init32(pevent).
18140 if (bk_is32a(psBkh)) {
18141
18142 // pointer to the source bank header
18143 BANK32A *psbkh32a = ((BANK32A *) psdata - 1);
18144 // Data size in the bank
18145 bksze = psbkh32a->data_size;
18146
18147 // Get to the end of the event
18148 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
18149 // Copy from BANK32 to end of Data
18150 memmove(pdest, (char *) psbkh32a, ALIGN8(bksze) + sizeof(BANK32A));
18151 // Bring pointer to the next free location
18152 pdest += ALIGN8(bksze) + sizeof(BANK32A);
18153
18154 } else if (bk_is32(psBkh)) {
18155
18156 // pointer to the source bank header
18157 BANK32 *psbkh32 = ((BANK32 *) psdata - 1);
18158 // Data size in the bank
18159 bksze = psbkh32->data_size;
18160
18161 // Get to the end of the event
18162 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
18163 // Copy from BANK32 to end of Data
18164 memmove(pdest, (char *) psbkh32, ALIGN8(bksze) + sizeof(BANK32));
18165 // Bring pointer to the next free location
18166 pdest += ALIGN8(bksze) + sizeof(BANK32);
18167
18168 } else {
18169
18170 // pointer to the source bank header
18171 psbkh = ((BANK *) psdata - 1);
18172 // Data size in the bank
18173 bksze = psbkh->data_size;
18174
18175 // Get to the end of the event
18176 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
18177 // Copy from BANK to end of Data
18178 memmove(pdest, (char *) psbkh, ALIGN8(bksze) + sizeof(BANK));
18179 // Bring pointer to the next free location
18180 pdest += ALIGN8(bksze) + sizeof(BANK);
18181 }
18182
18183 // Close bank (adjust BANK_HEADER size)
18184 bk_close(pevent, pdest);
18185 // Adjust EVENT_HEADER size
18186 ((EVENT_HEADER *) pevent - 1)->data_size = ((BANK_HEADER *) pevent)->data_size + sizeof(BANK_HEADER);
18187 return SUCCESS;
18188}
INT bk_close(void *event, void *pdata)
Definition midas.cxx:18297
INT bk_find(const BANK_HEADER *pbkh, const char *name, DWORD *bklen, DWORD *bktype, void **pdata)
Definition midas.cxx:18509
unsigned int DWORD
Definition mcstd.h:51
#define SUCCESS
Definition mcstd.h:54
int INT
Definition midas.h:129
DWORD status
Definition odbhist.cxx:39
Here is the call graph for this function:
Here is the caller graph for this function:

◆ bk_create()

void bk_create ( void *  event,
const char *  name,
WORD  type,
void **  pdata 
)

Create a Midas bank. The data pointer pdata must be used as an address to fill a bank. It is incremented with every value written to the bank and finally points to a location just after the last byte of the bank. It is then passed to the function bk_close() to finish the bank creation.

INT *pdata;
bk_init(pevent);
bk_create(pevent, "ADC0", TID_INT32, &pdata);
*pdata++ = 123
*pdata++ = 456
bk_close(pevent, pdata);
void bk_init(void *event)
Definition midas.cxx:17923
void bk_create(void *event, const char *name, WORD type, void **pdata)
Definition midas.cxx:18078
#define TID_INT32
Definition midas.h:339
Parameters
eventpointer to the data area
nameof the bank, must be exactly 4 charaters
typetype of bank, one of the Midas_Data_Types values defined in midas.h
pdatapointer to the data area of the newly created bank
Returns
void

Definition at line 18078 of file midas.cxx.

18078 {
18079 if (bk_is32a((BANK_HEADER *) event)) {
18080 if (((PTYPE) event & 0x07) != 0) {
18081 cm_msg(MERROR, "bk_create", "Bank %s created with unaligned event pointer", name);
18082 return;
18083 }
18084 BANK32A *pbk32a;
18085
18086 pbk32a = (BANK32A *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
18087 copy_bk_name(pbk32a->name, name);
18088 pbk32a->type = type;
18089 pbk32a->data_size = 0;
18090 *pdata = pbk32a + 1;
18091 } else if (bk_is32((BANK_HEADER *) event)) {
18092 BANK32 *pbk32;
18093
18094 pbk32 = (BANK32 *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
18095 copy_bk_name(pbk32->name, name);
18096 pbk32->type = type;
18097 pbk32->data_size = 0;
18098 *pdata = pbk32 + 1;
18099 } else {
18100 BANK *pbk;
18101
18102 pbk = (BANK *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
18103 copy_bk_name(pbk->name, name);
18104 pbk->type = type;
18105 pbk->data_size = 0;
18106 *pdata = pbk + 1;
18107 }
18108}
static void copy_bk_name(char *dst, const char *src)
Definition midas.cxx:18016
#define MERROR
Definition midas.h:559
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
Definition midas.cxx:939
INT type
Definition mana.cxx:269
#define PTYPE
Definition midas.h:170
#define name(x)
Definition midas_macro.h:24
Here is the call graph for this function:
Here is the caller graph for this function:

◆ bk_delete()

int bk_delete ( void *  event,
const char *  name 
)

Definition at line 18191 of file midas.cxx.

18207{
18208 BANK *pbk;
18209 DWORD dname;
18210 int remaining;
18211
18212 if (bk_is32a((BANK_HEADER *) event)) {
18213 /* locate bank */
18214 BANK32A *pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
18215 copy_bk_name((char *) &dname, name);
18216 do {
18217 if (*((DWORD *) pbk32a->name) == dname) {
18218 /* bank found, delete it */
18219 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
18220 sizeof(BANK_HEADER)) - ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
18221
18222 /* reduce total event size */
18223 ((BANK_HEADER *) event)->data_size -= sizeof(BANK32) + ALIGN8(pbk32a->data_size);
18224
18225 /* copy remaining bytes */
18226 if (remaining > 0)
18227 memmove(pbk32a, (char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size), remaining);
18228 return CM_SUCCESS;
18229 }
18230
18231 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
18232 } while ((DWORD) ((char *) pbk32a - (char *) event) <
18233 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
18234 } else if (bk_is32((BANK_HEADER *) event)) {
18235 /* locate bank */
18236 BANK32 *pbk32 = (BANK32 *) (((BANK_HEADER *) event) + 1);
18237 copy_bk_name((char *) &dname, name);
18238 do {
18239 if (*((DWORD *) pbk32->name) == dname) {
18240 /* bank found, delete it */
18241 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
18242 sizeof(BANK_HEADER)) - ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
18243
18244 /* reduce total event size */
18245 ((BANK_HEADER *) event)->data_size -= sizeof(BANK32) + ALIGN8(pbk32->data_size);
18246
18247 /* copy remaining bytes */
18248 if (remaining > 0)
18249 memmove(pbk32, (char *) (pbk32 + 1) + ALIGN8(pbk32->data_size), remaining);
18250 return CM_SUCCESS;
18251 }
18252
18253 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
18254 } while ((DWORD) ((char *) pbk32 - (char *) event) <
18255 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
18256 } else {
18257 /* locate bank */
18258 pbk = (BANK *) (((BANK_HEADER *) event) + 1);
18259 copy_bk_name((char *) &dname, name);
18260 do {
18261 if (*((DWORD *) pbk->name) == dname) {
18262 /* bank found, delete it */
18263 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
18264 sizeof(BANK_HEADER)) - ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
18265
18266 /* reduce total event size */
18267 ((BANK_HEADER *) event)->data_size -= sizeof(BANK) + ALIGN8(pbk->data_size);
18268
18269 /* copy remaining bytes */
18270 if (remaining > 0)
18271 memmove(pbk, (char *) (pbk + 1) + ALIGN8(pbk->data_size), remaining);
18272 return CM_SUCCESS;
18273 }
18274
18275 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
18276 } while ((DWORD) ((char *) pbk - (char *) event) <
18277 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
18278 }
18279
18280 return 0;
18281}
#define CM_SUCCESS
Definition midas.h:582
Here is the call graph for this function:

◆ bk_find()

INT bk_find ( const BANK_HEADER pbkh,
const char *  name,
DWORD bklen,
DWORD bktype,
void **  pdata 
)

Finds a MIDAS bank of given name inside an event.

Parameters
pbkhpointer to current composed event
namebank name to look for
bklennumber of elemtents in bank
bktypebank type, one of TID_xxx
pdatapointer to data area of bank, NULL if bank not found
Returns
1 if bank found, 0 otherwise

Definition at line 18509 of file midas.cxx.

18509 {
18510 DWORD dname;
18511
18512 if (bk_is32a(pbkh)) {
18513 BANK32A *pbk32a = (BANK32A *) (pbkh + 1);
18514 copy_bk_name((char *) &dname, name);
18515 do {
18516 if (*((DWORD *) pbk32a->name) == dname) {
18517 int tid = pbk32a->type & 0xFF;
18518 if (tid >= TID_LAST) {
18519 *((void **) pdata) = NULL;
18520 return 0;
18521 }
18522 *((void **) pdata) = pbk32a + 1;
18523 if (tid_size[tid] == 0)
18524 *bklen = pbk32a->data_size;
18525 else
18526 *bklen = pbk32a->data_size / tid_size[tid];
18527
18528 *bktype = pbk32a->type;
18529 return 1;
18530 }
18531 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
18532 } while ((DWORD) ((char *) pbk32a - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
18533 } else if (bk_is32(pbkh)) {
18534 BANK32 *pbk32 = (BANK32 *) (pbkh + 1);
18535 copy_bk_name((char *) &dname, name);
18536 do {
18537 if (*((DWORD *) pbk32->name) == dname) {
18538 int tid = pbk32->type & 0xFF;
18539 if (tid >= TID_LAST) {
18540 *((void **) pdata) = NULL;
18541 return 0;
18542 }
18543 *((void **) pdata) = pbk32 + 1;
18544 if (tid_size[tid] == 0)
18545 *bklen = pbk32->data_size;
18546 else
18547 *bklen = pbk32->data_size / tid_size[tid];
18548
18549 *bktype = pbk32->type;
18550 return 1;
18551 }
18552 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
18553 } while ((DWORD) ((char *) pbk32 - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
18554 } else {
18555 BANK *pbk = (BANK *) (pbkh + 1);
18556 copy_bk_name((char *) &dname, name);
18557 do {
18558 if (*((DWORD *) pbk->name) == dname) {
18559 int tid = pbk->type & 0xFF;
18560 if (tid >= TID_LAST) {
18561 *((void **) pdata) = NULL;
18562 return 0;
18563 }
18564 *((void **) pdata) = pbk + 1;
18565 if (tid_size[tid] == 0)
18566 *bklen = pbk->data_size;
18567 else
18568 *bklen = pbk->data_size / tid_size[tid];
18569
18570 *bktype = pbk->type;
18571 return 1;
18572 }
18573 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
18574 } while ((DWORD) ((char *) pbk - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
18575 }
18576
18577 /* bank not found */
18578 *((void **) pdata) = NULL;
18579 return 0;
18580}
#define TID_LAST
Definition midas.h:354
static const int tid_size[]
Definition midas.cxx:66
DWORD data_size
Definition midas.h:1210
Here is the call graph for this function:
Here is the caller graph for this function:

◆ bk_init()

void bk_init ( void *  event)

Initializes an event for Midas banks structure. Before banks can be created in an event, bk_init() has to be called first.

Parameters
eventpointer to the area of event

Definition at line 17923 of file midas.cxx.

17923 {
17924 ((BANK_HEADER *) event)->data_size = 0;
17925 ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION;
17926}
#define BANK_FORMAT_VERSION
Definition midas.h:1202
Here is the caller graph for this function:

◆ bk_init32()

void bk_init32 ( void *  event)

dox Initializes an event for Midas banks structure for large bank size (> 32KBytes) Before banks can be created in an event, bk_init32() has to be called first.

Parameters
eventpointer to the area of event
Returns
void

Definition at line 17986 of file midas.cxx.

17986 {
17987 ((BANK_HEADER *) event)->data_size = 0;
17988 ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION | BANK_FORMAT_32BIT;
17989}
#define BANK_FORMAT_32BIT
Definition midas.h:1203
Here is the caller graph for this function:

◆ bk_init32a()

void bk_init32a ( void *  event)

Initializes an event for Midas banks structure for large bank size (> 32KBytes) which are aligned on 64-bit boundaries. Before banks can be created in an event, bk_init32a() has to be called first.

Parameters
eventpointer to the area of event
Returns
void

Definition at line 17999 of file midas.cxx.

17999 {
18000 ((BANK_HEADER *) event)->data_size = 0;
18002}
#define BANK_FORMAT_64BIT_ALIGNED
Definition midas.h:1204
Here is the caller graph for this function:

◆ bk_is32()

BOOL bk_is32 ( const void *  event)

dox

Definition at line 17932 of file midas.cxx.

17949{
17950 return ((((BANK_HEADER *) event)->flags & BANK_FORMAT_32BIT) > 0);
17951}
Here is the caller graph for this function:

◆ bk_is32a()

BOOL bk_is32a ( const void *  event)

Definition at line 17954 of file midas.cxx.

17972{
17973 return ((((BANK_HEADER *) event)->flags & BANK_FORMAT_64BIT_ALIGNED) > 0);
17974}
Here is the caller graph for this function:

◆ bk_iterate()

INT bk_iterate ( const void *  event,
BANK **  pbk,
void *  pdata 
)

Iterates through banks inside an event. The function can be used to enumerate all banks of an event. The returned pointer to the bank header has following structure:

typedef struct {
char name[4];
WORD data_size;
} BANK;

where type is a TID_xxx value and data_size the size of the bank in bytes.

BANK *pbk;
INT size;
void *pdata;
char name[5];
pbk = NULL;
do
{
size = bk_iterate(event, &pbk, &pdata);
if (pbk == NULL)
break;
*((DWORD *)name) = *((DWORD *)(pbk)->name);
name[4] = 0;
printf("bank %s found\n", name);
} while(TRUE);
INT bk_iterate(const void *event, BANK **pbk, void *pdata)
Definition midas.cxx:18618
#define TRUE
Definition midas.h:182
Parameters
eventPointer to data area of event.
pbkpointer to the bank header, must be NULL for the first call to this function.
pdataPointer to the bank header, must be NULL for the first call to this function
Returns
Size of bank in bytes

Definition at line 18618 of file midas.cxx.

18618 {
18619 if (*pbk == NULL)
18620 *pbk = (BANK *) (((BANK_HEADER *) event) + 1);
18621 else
18622 *pbk = (BANK *) ((char *) (*pbk + 1) + ALIGN8((*pbk)->data_size));
18623
18624 *((void **) pdata) = (*pbk) + 1;
18625
18626 if ((DWORD) ((char *) *pbk - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
18627 *pbk = *((BANK **) pdata) = NULL;
18628 return 0;
18629 }
18630
18631 return (*pbk)->data_size;
18632}
Here is the caller graph for this function:

◆ bk_iterate32()

INT bk_iterate32 ( const void *  event,
BANK32 **  pbk,
void *  pdata 
)

dox

Definition at line 18639 of file midas.cxx.

18658{
18659 if (*pbk == NULL)
18660 *pbk = (BANK32 *) (((BANK_HEADER *) event) + 1);
18661 else
18662 *pbk = (BANK32 *) ((char *) (*pbk + 1) + ALIGN8((*pbk)->data_size));
18663
18664 *((void **) pdata) = (*pbk) + 1;
18665
18666 if ((DWORD) ((char *) *pbk - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
18667 *pbk = NULL;
18668 pdata = NULL;
18669 return 0;
18670 }
18671
18672 return (*pbk)->data_size;
18673}
Here is the caller graph for this function:

◆ bk_iterate32a()

INT bk_iterate32a ( const void *  event,
BANK32A **  pbk32a,
void *  pdata 
)

Definition at line 18675 of file midas.cxx.

18694{
18695 if (*pbk32a == NULL)
18696 *pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
18697 else
18698 *pbk32a = (BANK32A *) ((char *) (*pbk32a + 1) + ALIGN8((*pbk32a)->data_size));
18699
18700 *((void **) pdata) = (*pbk32a) + 1;
18701
18702 if ((DWORD) ((char *) *pbk32a - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
18703 *pbk32a = NULL;
18704 pdata = NULL;
18705 return 0;
18706 }
18707
18708 return (*pbk32a)->data_size;
18709}
Here is the caller graph for this function:

◆ bk_list()

INT bk_list ( const void *  event,
char *  bklist 
)

Extract the MIDAS bank name listing of an event. The bklist should be dimensioned with STRING_BANKLIST_MAX which corresponds to a max of BANKLIST_MAX banks (midas.h: 32 banks max).

INT adc_calib(EVENT_HEADER *pheader, void *pevent)
{
INT n_adc, nbanks;
WORD *pdata;
char banklist[STRING_BANKLIST_MAX];
// Display # of banks and list of banks in the event
nbanks = bk_list(pevent, banklist);
printf("#banks:%d List:%s\n", nbanks, banklist);
// look for ADC0 bank, return if not present
n_adc = bk_locate(pevent, "ADC0", &pdata);
...
}
INT adc_calib(EVENT_HEADER *, void *)
Definition adccalib.cxx:107
INT bk_locate(const void *event, const char *name, void *pdata)
Definition midas.cxx:18406
INT bk_list(const void *event, char *bklist)
Definition midas.cxx:18357
#define STRING_BANKLIST_MAX
Definition midas.h:279
Parameters
eventpointer to current composed event
bklistreturned ASCII string, has to be booked with STRING_BANKLIST_MAX.
Returns
number of bank found in this event.

Definition at line 18357 of file midas.cxx.

18357 { /* Full event */
18358 INT nbk;
18359 BANK *pmbk = NULL;
18360 BANK32 *pmbk32 = NULL;
18361 BANK32A *pmbk32a = NULL;
18362 char *pdata;
18363
18364 /* compose bank list */
18365 bklist[0] = 0;
18366 nbk = 0;
18367 do {
18368 /* scan all banks for bank name only */
18369 if (bk_is32a(event)) {
18370 bk_iterate32a(event, &pmbk32a, &pdata);
18371 if (pmbk32a == NULL)
18372 break;
18373 } else if (bk_is32(event)) {
18374 bk_iterate32(event, &pmbk32, &pdata);
18375 if (pmbk32 == NULL)
18376 break;
18377 } else {
18378 bk_iterate(event, &pmbk, &pdata);
18379 if (pmbk == NULL)
18380 break;
18381 }
18382 nbk++;
18383
18384 if (nbk > BANKLIST_MAX) {
18385 cm_msg(MINFO, "bk_list", "over %i banks -> truncated", BANKLIST_MAX);
18386 return (nbk - 1);
18387 }
18388 if (bk_is32a(event))
18389 strncat(bklist, (char *) pmbk32a->name, 4);
18390 else if (bk_is32(event))
18391 strncat(bklist, (char *) pmbk32->name, 4);
18392 else
18393 strncat(bklist, (char *) pmbk->name, 4);
18394 } while (1);
18395 return (nbk);
18396}
INT bk_iterate32a(const void *event, BANK32A **pbk32a, void *pdata)
Definition midas.cxx:18675
INT bk_iterate32(const void *event, BANK32 **pbk, void *pdata)
Definition midas.cxx:18639
#define MINFO
Definition midas.h:560
#define BANKLIST_MAX
Definition midas.h:278
Here is the call graph for this function:
Here is the caller graph for this function:

◆ bk_locate()

INT bk_locate ( const void *  event,
const char *  name,
void *  pdata 
)

Locates a MIDAS bank of given name inside an event.

Parameters
eventpointer to current composed event
namebank name to look for
pdatapointer to data area of bank, NULL if bank not found
Returns
number of values inside the bank

Definition at line 18406 of file midas.cxx.

18406 {
18407 BANK *pbk;
18408 BANK32 *pbk32;
18409 BANK32A *pbk32a;
18410 DWORD dname;
18411 const BANK_HEADER *pbh = (const BANK_HEADER *) event;
18412 const size_t event_size = (size_t) pbh->data_size + sizeof(BANK_HEADER);
18413
18414 auto range_fits = [event, event_size](const void *ptr, size_t size) {
18415 ptrdiff_t offset = (const char *) ptr - (const char *) event;
18416 return offset >= 0 && (size_t) offset <= event_size && size <= event_size - (size_t) offset;
18417 };
18418
18419 auto report_corrupt_bank = [pdata]() {
18420 cm_msg(MERROR, "bk_locate", "corrupted bank in event");
18421 *((void **) pdata) = NULL;
18422 return 0;
18423 };
18424
18425 if (bk_is32a(event)) {
18426 pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
18427 copy_bk_name((char *) &dname, name);
18428 while (range_fits(pbk32a, 1)) {
18429 if (!range_fits(pbk32a, sizeof(BANK32A)))
18430 return report_corrupt_bank();
18431 size_t remaining = event_size - ((char *) pbk32a - (char *) event) - sizeof(BANK32A);
18432 size_t bank_size = pbk32a->data_size;
18433 size_t padding = (8 - bank_size % 8) % 8;
18434 if (bank_size > remaining || padding > remaining - bank_size)
18435 return report_corrupt_bank();
18436 if (*((DWORD *) pbk32a->name) == dname) {
18437 int tid = pbk32a->type & 0xFF;
18438 if (tid >= TID_LAST)
18439 return report_corrupt_bank();
18440 *((void **) pdata) = pbk32a + 1;
18441 if (tid_size[tid] == 0)
18442 return pbk32a->data_size;
18443 return pbk32a->data_size / tid_size[tid];
18444 }
18445 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + bank_size + padding);
18446 }
18447 } else if (bk_is32(event)) {
18448 pbk32 = (BANK32 *) (((BANK_HEADER *) event) + 1);
18449 copy_bk_name((char *) &dname, name);
18450 while (range_fits(pbk32, 1)) {
18451 if (!range_fits(pbk32, sizeof(BANK32)))
18452 return report_corrupt_bank();
18453 size_t remaining = event_size - ((char *) pbk32 - (char *) event) - sizeof(BANK32);
18454 size_t bank_size = pbk32->data_size;
18455 size_t padding = (8 - bank_size % 8) % 8;
18456 if (bank_size > remaining || padding > remaining - bank_size)
18457 return report_corrupt_bank();
18458 if (*((DWORD *) pbk32->name) == dname) {
18459 int tid = pbk32->type & 0xFF;
18460 if (tid >= TID_LAST)
18461 return report_corrupt_bank();
18462 *((void **) pdata) = pbk32 + 1;
18463 if (tid_size[tid] == 0)
18464 return pbk32->data_size;
18465 return pbk32->data_size / tid_size[tid];
18466 }
18467 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + bank_size + padding);
18468 }
18469 } else {
18470 pbk = (BANK *) (((BANK_HEADER *) event) + 1);
18471 copy_bk_name((char *) &dname, name);
18472 while (range_fits(pbk, 1)) {
18473 if (!range_fits(pbk, sizeof(BANK)))
18474 return report_corrupt_bank();
18475 size_t remaining = event_size - ((char *) pbk - (char *) event) - sizeof(BANK);
18476 size_t bank_size = pbk->data_size;
18477 size_t padding = (8 - bank_size % 8) % 8;
18478 if (bank_size > remaining || padding > remaining - bank_size)
18479 return report_corrupt_bank();
18480 if (*((DWORD *) pbk->name) == dname) {
18481 int tid = pbk->type & 0xFF;
18482 if (tid >= TID_LAST)
18483 return report_corrupt_bank();
18484 *((void **) pdata) = pbk + 1;
18485 if (tid_size[tid] == 0)
18486 return pbk->data_size;
18487 return pbk->data_size / tid_size[tid];
18488 }
18489 pbk = (BANK *) ((char *) (pbk + 1) + bank_size + padding);
18490 }
18491
18492 }
18493
18494 /* bank not found */
18495 *((void **) pdata) = NULL;
18496 return 0;
18497}
static int offset
Definition mgd.cxx:1500
int event_size
Definition msysmon.cxx:527
Here is the call graph for this function:
Here is the caller graph for this function:

◆ bk_size()

INT bk_size ( const void *  event)

Returns the size of an event containing banks. The total size of an event is the value returned by bk_size() plus the size of the event header (sizeof(EVENT_HEADER)).

Parameters
eventpointer to the area of event
Returns
number of bytes contained in data area of event

Definition at line 18012 of file midas.cxx.

18012 {
18013 return ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER);
18014}
Here is the caller graph for this function:

◆ bk_swap()

INT bk_swap ( void *  event,
BOOL  force 
)

dox Swaps bytes from little endian to big endian or vice versa for a whole event.

An event contains a flag which is set by bk_init() to identify the endian format of an event. If force is FALSE, this flag is evaluated and the event is only swapped if it is in the "wrong" format for this system. An event can be swapped to the "wrong" format on purpose for example by a front-end which wants to produce events in a "right" format for a back-end analyzer which has different byte ordering.

Parameters
eventpointer to data area of event
forceIf TRUE, the event is always swapped, if FALSE, the event is only swapped if it is in the wrong format.
Returns
1==event has been swap, 0==event has not been swapped.

Definition at line 18729 of file midas.cxx.

18729 {
18730 BANK_HEADER *pbh;
18731 BANK *pbk;
18732 BANK32 *pbk32;
18733 BANK32A *pbk32a;
18734 void *pdata;
18735 WORD type;
18736
18737 pbh = (BANK_HEADER *) event;
18738
18739 /* only swap if flags in high 16-bit */
18740 if (pbh->flags < 0x10000 && !force)
18741 return 0;
18742
18743 /* swap bank header */
18744 DWORD_SWAP(&pbh->data_size);
18745 DWORD_SWAP(&pbh->flags);
18746
18747 pbk = (BANK *) (pbh + 1);
18748 pbk32 = (BANK32 *) pbk;
18749 pbk32a = (BANK32A *) pbk;
18750
18751 /* scan event */
18752 while ((char *) pbk - (char *) pbh < (INT) pbh->data_size + (INT) sizeof(BANK_HEADER)) {
18753 /* swap bank header */
18754 if (bk_is32a(event)) {
18755 DWORD_SWAP(&pbk32a->type);
18756 DWORD_SWAP(&pbk32a->data_size);
18757 pdata = pbk32a + 1;
18758 type = (WORD) pbk32a->type;
18759 } else if (bk_is32(event)) {
18760 DWORD_SWAP(&pbk32->type);
18761 DWORD_SWAP(&pbk32->data_size);
18762 pdata = pbk32 + 1;
18763 type = (WORD) pbk32->type;
18764 } else {
18765 WORD_SWAP(&pbk->type);
18766 WORD_SWAP(&pbk->data_size);
18767 pdata = pbk + 1;
18768 type = pbk->type;
18769 }
18770
18771 /* pbk points to next bank */
18772 if (bk_is32a(event)) {
18773 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
18774 pbk = (BANK *) pbk32a;
18775 } else if (bk_is32(event)) {
18776 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
18777 pbk = (BANK *) pbk32;
18778 } else {
18779 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
18780 pbk32 = (BANK32 *) pbk;
18781 }
18782
18783 switch (type) {
18784 case TID_UINT16:
18785 case TID_INT16:
18786 while ((char *) pdata < (char *) pbk) {
18787 WORD_SWAP(pdata);
18788 pdata = (void *) (((WORD *) pdata) + 1);
18789 }
18790 break;
18791
18792 case TID_UINT32:
18793 case TID_INT32:
18794 case TID_BOOL:
18795 case TID_FLOAT:
18796 while ((char *) pdata < (char *) pbk) {
18797 DWORD_SWAP(pdata);
18798 pdata = (void *) (((DWORD *) pdata) + 1);
18799 }
18800 break;
18801
18802 case TID_DOUBLE:
18803 case TID_INT64:
18804 case TID_UINT64:
18805 while ((char *) pdata < (char *) pbk) {
18806 QWORD_SWAP(pdata);
18807 pdata = (void *) (((double *) pdata) + 1);
18808 }
18809 break;
18810 }
18811 }
18812
18813 return CM_SUCCESS;
18814}
#define TID_DOUBLE
Definition midas.h:343
#define TID_BOOL
Definition midas.h:340
#define TID_UINT64
Definition midas.h:352
#define TID_INT64
Definition midas.h:351
#define TID_UINT32
Definition midas.h:337
#define TID_UINT16
Definition midas.h:333
#define TID_INT16
Definition midas.h:335
#define TID_FLOAT
Definition midas.h:341
#define WORD_SWAP(x)
Definition msystem.h:65
#define QWORD_SWAP(x)
Definition msystem.h:86
#define DWORD_SWAP(x)
Definition msystem.h:74
DWORD flags
Definition midas.h:1211
Here is the call graph for this function:
Here is the caller graph for this function:

◆ copy_bk_name()

static void copy_bk_name ( char *  dst,
const char *  src 
)
static

Definition at line 18016 of file midas.cxx.

18017{
18018 // copy 4 byte bank name from "src" to "dst", set unused bytes of "dst" to NUL.
18019
18020 if (src[0] == 0) {
18021 // invalid empty name
18022 dst[0] = 0;
18023 dst[1] = 0;
18024 dst[2] = 0;
18025 dst[3] = 0;
18026 return;
18027 }
18028
18029 dst[0] = src[0];
18030
18031 if (src[1] == 0) {
18032 dst[1] = 0;
18033 dst[2] = 0;
18034 dst[3] = 0;
18035 return;
18036 }
18037
18038 dst[1] = src[1];
18039
18040 if (src[2] == 0) {
18041 dst[2] = 0;
18042 dst[3] = 0;
18043 return;
18044 }
18045
18046 dst[2] = src[2];
18047
18048 if (src[3] == 0) {
18049 dst[3] = 0;
18050 return;
18051 }
18052
18053 dst[3] = src[3];
18054}
Here is the caller graph for this function: