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 18193 of file midas.cxx.

18193 {
18194 if (bk_is32a((BANK_HEADER *) event)) {
18195 BANK32A *pbk32a = (BANK32A *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
18196 pbk32a->data_size = (DWORD) ((char *) pdata - (char *) (pbk32a + 1));
18197 if (pbk32a->type == TID_STRUCT && pbk32a->data_size == 0)
18198 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]);
18199 ((BANK_HEADER *) event)->data_size += sizeof(BANK32A) + ALIGN8(pbk32a->data_size);
18200 return pbk32a->data_size;
18201 } else if (bk_is32((BANK_HEADER *) event)) {
18202 BANK32 *pbk32 = (BANK32 *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
18203 pbk32->data_size = (DWORD) ((char *) pdata - (char *) (pbk32 + 1));
18204 if (pbk32->type == TID_STRUCT && pbk32->data_size == 0)
18205 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]);
18206 ((BANK_HEADER *) event)->data_size += sizeof(BANK32) + ALIGN8(pbk32->data_size);
18207 return pbk32->data_size;
18208 } else {
18209 BANK *pbk = (BANK *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
18210 uint32_t size = (uint32_t) ((char *) pdata - (char *) (pbk + 1));
18211 if (size > 0xFFFF) {
18212 printf("Error: Bank size %d exceeds 16-bit limit of 65526, please use bk_init32() to create a 32-bit bank\n", size);
18213 size = 0;
18214 }
18215 pbk->data_size = (WORD) (size);
18216 if (pbk->type == TID_STRUCT && pbk->data_size == 0)
18217 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]);
18218 size = ((BANK_HEADER *) event)->data_size + sizeof(BANK) + ALIGN8(pbk->data_size);
18219 if (size > 0xFFFF) {
18220 printf("Error: Bank size %d exceeds 16-bit limit of 65526, please use bk_init32() to create a 32-bit bank\n", size);
18221 size = 0;
18222 }
18223 ((BANK_HEADER *) event)->data_size = size;
18224 return pbk->data_size;
18225 }
18226}
BOOL bk_is32a(const void *event)
Definition midas.cxx:17850
BOOL bk_is32(const void *event)
Definition midas.cxx:17828
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 18017 of file midas.cxx.

18017 {
18018
18019 INT status;
18020 DWORD bklen, bktype, bksze;
18021 BANK_HEADER *psBkh;
18022 BANK *psbkh;
18023 char *pdest;
18024 void *psdata;
18025
18026 // source pointing on the BANKxx
18027 psBkh = (BANK_HEADER *) ((EVENT_HEADER *) psrce + 1);
18028 // Find requested bank
18029 status = bk_find(psBkh, bkname, &bklen, &bktype, &psdata);
18030 // Return 0 if not found
18031 if (status != SUCCESS) return 0;
18032
18033 // Check bank type...
18034 // You cannot mix BANK and BANK32 so make sure all the FE use either
18035 // bk_init(pevent) or bk_init32(pevent).
18036 if (bk_is32a(psBkh)) {
18037
18038 // pointer to the source bank header
18039 BANK32A *psbkh32a = ((BANK32A *) psdata - 1);
18040 // Data size in the bank
18041 bksze = psbkh32a->data_size;
18042
18043 // Get to the end of the event
18044 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
18045 // Copy from BANK32 to end of Data
18046 memmove(pdest, (char *) psbkh32a, ALIGN8(bksze) + sizeof(BANK32A));
18047 // Bring pointer to the next free location
18048 pdest += ALIGN8(bksze) + sizeof(BANK32A);
18049
18050 } else if (bk_is32(psBkh)) {
18051
18052 // pointer to the source bank header
18053 BANK32 *psbkh32 = ((BANK32 *) psdata - 1);
18054 // Data size in the bank
18055 bksze = psbkh32->data_size;
18056
18057 // Get to the end of the event
18058 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
18059 // Copy from BANK32 to end of Data
18060 memmove(pdest, (char *) psbkh32, ALIGN8(bksze) + sizeof(BANK32));
18061 // Bring pointer to the next free location
18062 pdest += ALIGN8(bksze) + sizeof(BANK32);
18063
18064 } else {
18065
18066 // pointer to the source bank header
18067 psbkh = ((BANK *) psdata - 1);
18068 // Data size in the bank
18069 bksze = psbkh->data_size;
18070
18071 // Get to the end of the event
18072 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
18073 // Copy from BANK to end of Data
18074 memmove(pdest, (char *) psbkh, ALIGN8(bksze) + sizeof(BANK));
18075 // Bring pointer to the next free location
18076 pdest += ALIGN8(bksze) + sizeof(BANK);
18077 }
18078
18079 // Close bank (adjust BANK_HEADER size)
18080 bk_close(pevent, pdest);
18081 // Adjust EVENT_HEADER size
18082 ((EVENT_HEADER *) pevent - 1)->data_size = ((BANK_HEADER *) pevent)->data_size + sizeof(BANK_HEADER);
18083 return SUCCESS;
18084}
INT bk_close(void *event, void *pdata)
Definition midas.cxx:18193
INT bk_find(const BANK_HEADER *pbkh, const char *name, DWORD *bklen, DWORD *bktype, void **pdata)
Definition midas.cxx:18365
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:17819
void bk_create(void *event, const char *name, WORD type, void **pdata)
Definition midas.cxx:17974
#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 17974 of file midas.cxx.

17974 {
17975 if (bk_is32a((BANK_HEADER *) event)) {
17976 if (((PTYPE) event & 0x07) != 0) {
17977 cm_msg(MERROR, "bk_create", "Bank %s created with unaligned event pointer", name);
17978 return;
17979 }
17980 BANK32A *pbk32a;
17981
17982 pbk32a = (BANK32A *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
17983 copy_bk_name(pbk32a->name, name);
17984 pbk32a->type = type;
17985 pbk32a->data_size = 0;
17986 *pdata = pbk32a + 1;
17987 } else if (bk_is32((BANK_HEADER *) event)) {
17988 BANK32 *pbk32;
17989
17990 pbk32 = (BANK32 *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
17991 copy_bk_name(pbk32->name, name);
17992 pbk32->type = type;
17993 pbk32->data_size = 0;
17994 *pdata = pbk32 + 1;
17995 } else {
17996 BANK *pbk;
17997
17998 pbk = (BANK *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
17999 copy_bk_name(pbk->name, name);
18000 pbk->type = type;
18001 pbk->data_size = 0;
18002 *pdata = pbk + 1;
18003 }
18004}
static void copy_bk_name(char *dst, const char *src)
Definition midas.cxx:17912
#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:931
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 18087 of file midas.cxx.

18103{
18104 BANK *pbk;
18105 DWORD dname;
18106 int remaining;
18107
18108 if (bk_is32a((BANK_HEADER *) event)) {
18109 /* locate bank */
18110 BANK32A *pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
18111 copy_bk_name((char *) &dname, name);
18112 do {
18113 if (*((DWORD *) pbk32a->name) == dname) {
18114 /* bank found, delete it */
18115 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
18116 sizeof(BANK_HEADER)) - ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
18117
18118 /* reduce total event size */
18119 ((BANK_HEADER *) event)->data_size -= sizeof(BANK32) + ALIGN8(pbk32a->data_size);
18120
18121 /* copy remaining bytes */
18122 if (remaining > 0)
18123 memmove(pbk32a, (char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size), remaining);
18124 return CM_SUCCESS;
18125 }
18126
18127 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
18128 } while ((DWORD) ((char *) pbk32a - (char *) event) <
18129 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
18130 } else if (bk_is32((BANK_HEADER *) event)) {
18131 /* locate bank */
18132 BANK32 *pbk32 = (BANK32 *) (((BANK_HEADER *) event) + 1);
18133 copy_bk_name((char *) &dname, name);
18134 do {
18135 if (*((DWORD *) pbk32->name) == dname) {
18136 /* bank found, delete it */
18137 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
18138 sizeof(BANK_HEADER)) - ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
18139
18140 /* reduce total event size */
18141 ((BANK_HEADER *) event)->data_size -= sizeof(BANK32) + ALIGN8(pbk32->data_size);
18142
18143 /* copy remaining bytes */
18144 if (remaining > 0)
18145 memmove(pbk32, (char *) (pbk32 + 1) + ALIGN8(pbk32->data_size), remaining);
18146 return CM_SUCCESS;
18147 }
18148
18149 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
18150 } while ((DWORD) ((char *) pbk32 - (char *) event) <
18151 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
18152 } else {
18153 /* locate bank */
18154 pbk = (BANK *) (((BANK_HEADER *) event) + 1);
18155 copy_bk_name((char *) &dname, name);
18156 do {
18157 if (*((DWORD *) pbk->name) == dname) {
18158 /* bank found, delete it */
18159 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
18160 sizeof(BANK_HEADER)) - ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
18161
18162 /* reduce total event size */
18163 ((BANK_HEADER *) event)->data_size -= sizeof(BANK) + ALIGN8(pbk->data_size);
18164
18165 /* copy remaining bytes */
18166 if (remaining > 0)
18167 memmove(pbk, (char *) (pbk + 1) + ALIGN8(pbk->data_size), remaining);
18168 return CM_SUCCESS;
18169 }
18170
18171 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
18172 } while ((DWORD) ((char *) pbk - (char *) event) <
18173 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
18174 }
18175
18176 return 0;
18177}
#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 18365 of file midas.cxx.

18365 {
18366 DWORD dname;
18367
18368 if (bk_is32a(pbkh)) {
18369 BANK32A *pbk32a = (BANK32A *) (pbkh + 1);
18370 copy_bk_name((char *) &dname, name);
18371 do {
18372 if (*((DWORD *) pbk32a->name) == dname) {
18373 *((void **) pdata) = pbk32a + 1;
18374 if (tid_size[pbk32a->type & 0xFF] == 0)
18375 *bklen = pbk32a->data_size;
18376 else
18377 *bklen = pbk32a->data_size / tid_size[pbk32a->type & 0xFF];
18378
18379 *bktype = pbk32a->type;
18380 return 1;
18381 }
18382 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
18383 } while ((DWORD) ((char *) pbk32a - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
18384 } else if (bk_is32(pbkh)) {
18385 BANK32 *pbk32 = (BANK32 *) (pbkh + 1);
18386 copy_bk_name((char *) &dname, name);
18387 do {
18388 if (*((DWORD *) pbk32->name) == dname) {
18389 *((void **) pdata) = pbk32 + 1;
18390 if (tid_size[pbk32->type & 0xFF] == 0)
18391 *bklen = pbk32->data_size;
18392 else
18393 *bklen = pbk32->data_size / tid_size[pbk32->type & 0xFF];
18394
18395 *bktype = pbk32->type;
18396 return 1;
18397 }
18398 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
18399 } while ((DWORD) ((char *) pbk32 - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
18400 } else {
18401 BANK *pbk = (BANK *) (pbkh + 1);
18402 copy_bk_name((char *) &dname, name);
18403 do {
18404 if (*((DWORD *) pbk->name) == dname) {
18405 *((void **) pdata) = pbk + 1;
18406 if (tid_size[pbk->type & 0xFF] == 0)
18407 *bklen = pbk->data_size;
18408 else
18409 *bklen = pbk->data_size / tid_size[pbk->type & 0xFF];
18410
18411 *bktype = pbk->type;
18412 return 1;
18413 }
18414 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
18415 } while ((DWORD) ((char *) pbk - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
18416 }
18417
18418 /* bank not found */
18419 *((void **) pdata) = NULL;
18420 return 0;
18421}
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 17819 of file midas.cxx.

17819 {
17820 ((BANK_HEADER *) event)->data_size = 0;
17821 ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION;
17822}
#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 17882 of file midas.cxx.

17882 {
17883 ((BANK_HEADER *) event)->data_size = 0;
17884 ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION | BANK_FORMAT_32BIT;
17885}
#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 17895 of file midas.cxx.

17895 {
17896 ((BANK_HEADER *) event)->data_size = 0;
17898}
#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 17828 of file midas.cxx.

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

◆ bk_is32a()

BOOL bk_is32a ( const void *  event)

Definition at line 17850 of file midas.cxx.

17868{
17869 return ((((BANK_HEADER *) event)->flags & BANK_FORMAT_64BIT_ALIGNED) > 0);
17870}
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:18459
#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 18459 of file midas.cxx.

18459 {
18460 if (*pbk == NULL)
18461 *pbk = (BANK *) (((BANK_HEADER *) event) + 1);
18462 else
18463 *pbk = (BANK *) ((char *) (*pbk + 1) + ALIGN8((*pbk)->data_size));
18464
18465 *((void **) pdata) = (*pbk) + 1;
18466
18467 if ((DWORD) ((char *) *pbk - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
18468 *pbk = *((BANK **) pdata) = NULL;
18469 return 0;
18470 }
18471
18472 return (*pbk)->data_size;
18473}
Here is the caller graph for this function:

◆ bk_iterate32()

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

dox

Definition at line 18480 of file midas.cxx.

18499{
18500 if (*pbk == NULL)
18501 *pbk = (BANK32 *) (((BANK_HEADER *) event) + 1);
18502 else
18503 *pbk = (BANK32 *) ((char *) (*pbk + 1) + ALIGN8((*pbk)->data_size));
18504
18505 *((void **) pdata) = (*pbk) + 1;
18506
18507 if ((DWORD) ((char *) *pbk - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
18508 *pbk = NULL;
18509 pdata = NULL;
18510 return 0;
18511 }
18512
18513 return (*pbk)->data_size;
18514}
Here is the caller graph for this function:

◆ bk_iterate32a()

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

Definition at line 18516 of file midas.cxx.

18535{
18536 if (*pbk32a == NULL)
18537 *pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
18538 else
18539 *pbk32a = (BANK32A *) ((char *) (*pbk32a + 1) + ALIGN8((*pbk32a)->data_size));
18540
18541 *((void **) pdata) = (*pbk32a) + 1;
18542
18543 if ((DWORD) ((char *) *pbk32a - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
18544 *pbk32a = NULL;
18545 pdata = NULL;
18546 return 0;
18547 }
18548
18549 return (*pbk32a)->data_size;
18550}
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:18302
INT bk_list(const void *event, char *bklist)
Definition midas.cxx:18253
#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 18253 of file midas.cxx.

18253 { /* Full event */
18254 INT nbk;
18255 BANK *pmbk = NULL;
18256 BANK32 *pmbk32 = NULL;
18257 BANK32A *pmbk32a = NULL;
18258 char *pdata;
18259
18260 /* compose bank list */
18261 bklist[0] = 0;
18262 nbk = 0;
18263 do {
18264 /* scan all banks for bank name only */
18265 if (bk_is32a(event)) {
18266 bk_iterate32a(event, &pmbk32a, &pdata);
18267 if (pmbk32a == NULL)
18268 break;
18269 } else if (bk_is32(event)) {
18270 bk_iterate32(event, &pmbk32, &pdata);
18271 if (pmbk32 == NULL)
18272 break;
18273 } else {
18274 bk_iterate(event, &pmbk, &pdata);
18275 if (pmbk == NULL)
18276 break;
18277 }
18278 nbk++;
18279
18280 if (nbk > BANKLIST_MAX) {
18281 cm_msg(MINFO, "bk_list", "over %i banks -> truncated", BANKLIST_MAX);
18282 return (nbk - 1);
18283 }
18284 if (bk_is32a(event))
18285 strncat(bklist, (char *) pmbk32a->name, 4);
18286 else if (bk_is32(event))
18287 strncat(bklist, (char *) pmbk32->name, 4);
18288 else
18289 strncat(bklist, (char *) pmbk->name, 4);
18290 } while (1);
18291 return (nbk);
18292}
INT bk_iterate32a(const void *event, BANK32A **pbk32a, void *pdata)
Definition midas.cxx:18516
INT bk_iterate32(const void *event, BANK32 **pbk, void *pdata)
Definition midas.cxx:18480
#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 18302 of file midas.cxx.

18302 {
18303 BANK *pbk;
18304 BANK32 *pbk32;
18305 BANK32A *pbk32a;
18306 DWORD dname;
18307
18308 if (bk_is32a(event)) {
18309 pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
18310 copy_bk_name((char *) &dname, name);
18311 while ((DWORD) ((char *) pbk32a - (char *) event) <
18312 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
18313 if (*((DWORD *) pbk32a->name) == dname) {
18314 *((void **) pdata) = pbk32a + 1;
18315 if (tid_size[pbk32a->type & 0xFF] == 0)
18316 return pbk32a->data_size;
18317 return pbk32a->data_size / tid_size[pbk32a->type & 0xFF];
18318 }
18319 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
18320 }
18321 } else if (bk_is32(event)) {
18322 pbk32 = (BANK32 *) (((BANK_HEADER *) event) + 1);
18323 copy_bk_name((char *) &dname, name);
18324 while ((DWORD) ((char *) pbk32 - (char *) event) <
18325 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
18326 if (*((DWORD *) pbk32->name) == dname) {
18327 *((void **) pdata) = pbk32 + 1;
18328 if (tid_size[pbk32->type & 0xFF] == 0)
18329 return pbk32->data_size;
18330 return pbk32->data_size / tid_size[pbk32->type & 0xFF];
18331 }
18332 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
18333 }
18334 } else {
18335 pbk = (BANK *) (((BANK_HEADER *) event) + 1);
18336 copy_bk_name((char *) &dname, name);
18337 while ((DWORD) ((char *) pbk - (char *) event) <
18338 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
18339 if (*((DWORD *) pbk->name) == dname) {
18340 *((void **) pdata) = pbk + 1;
18341 if (tid_size[pbk->type & 0xFF] == 0)
18342 return pbk->data_size;
18343 return pbk->data_size / tid_size[pbk->type & 0xFF];
18344 }
18345 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
18346 }
18347
18348 }
18349
18350 /* bank not found */
18351 *((void **) pdata) = NULL;
18352 return 0;
18353}
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 17908 of file midas.cxx.

17908 {
17909 return ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER);
17910}
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 18570 of file midas.cxx.

18570 {
18571 BANK_HEADER *pbh;
18572 BANK *pbk;
18573 BANK32 *pbk32;
18574 BANK32A *pbk32a;
18575 void *pdata;
18576 WORD type;
18577
18578 pbh = (BANK_HEADER *) event;
18579
18580 /* only swap if flags in high 16-bit */
18581 if (pbh->flags < 0x10000 && !force)
18582 return 0;
18583
18584 /* swap bank header */
18585 DWORD_SWAP(&pbh->data_size);
18586 DWORD_SWAP(&pbh->flags);
18587
18588 pbk = (BANK *) (pbh + 1);
18589 pbk32 = (BANK32 *) pbk;
18590 pbk32a = (BANK32A *) pbk;
18591
18592 /* scan event */
18593 while ((char *) pbk - (char *) pbh < (INT) pbh->data_size + (INT) sizeof(BANK_HEADER)) {
18594 /* swap bank header */
18595 if (bk_is32a(event)) {
18596 DWORD_SWAP(&pbk32a->type);
18597 DWORD_SWAP(&pbk32a->data_size);
18598 pdata = pbk32a + 1;
18599 type = (WORD) pbk32a->type;
18600 } else if (bk_is32(event)) {
18601 DWORD_SWAP(&pbk32->type);
18602 DWORD_SWAP(&pbk32->data_size);
18603 pdata = pbk32 + 1;
18604 type = (WORD) pbk32->type;
18605 } else {
18606 WORD_SWAP(&pbk->type);
18607 WORD_SWAP(&pbk->data_size);
18608 pdata = pbk + 1;
18609 type = pbk->type;
18610 }
18611
18612 /* pbk points to next bank */
18613 if (bk_is32a(event)) {
18614 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
18615 pbk = (BANK *) pbk32a;
18616 } else if (bk_is32(event)) {
18617 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
18618 pbk = (BANK *) pbk32;
18619 } else {
18620 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
18621 pbk32 = (BANK32 *) pbk;
18622 }
18623
18624 switch (type) {
18625 case TID_UINT16:
18626 case TID_INT16:
18627 while ((char *) pdata < (char *) pbk) {
18628 WORD_SWAP(pdata);
18629 pdata = (void *) (((WORD *) pdata) + 1);
18630 }
18631 break;
18632
18633 case TID_UINT32:
18634 case TID_INT32:
18635 case TID_BOOL:
18636 case TID_FLOAT:
18637 while ((char *) pdata < (char *) pbk) {
18638 DWORD_SWAP(pdata);
18639 pdata = (void *) (((DWORD *) pdata) + 1);
18640 }
18641 break;
18642
18643 case TID_DOUBLE:
18644 case TID_INT64:
18645 case TID_UINT64:
18646 while ((char *) pdata < (char *) pbk) {
18647 QWORD_SWAP(pdata);
18648 pdata = (void *) (((double *) pdata) + 1);
18649 }
18650 break;
18651 }
18652 }
18653
18654 return CM_SUCCESS;
18655}
#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 17912 of file midas.cxx.

17913{
17914 // copy 4 byte bank name from "src" to "dst", set unused bytes of "dst" to NUL.
17915
17916 if (src[0] == 0) {
17917 // invalid empty name
17918 dst[0] = 0;
17919 dst[1] = 0;
17920 dst[2] = 0;
17921 dst[3] = 0;
17922 return;
17923 }
17924
17925 dst[0] = src[0];
17926
17927 if (src[1] == 0) {
17928 dst[1] = 0;
17929 dst[2] = 0;
17930 dst[3] = 0;
17931 return;
17932 }
17933
17934 dst[1] = src[1];
17935
17936 if (src[2] == 0) {
17937 dst[2] = 0;
17938 dst[3] = 0;
17939 return;
17940 }
17941
17942 dst[2] = src[2];
17943
17944 if (src[3] == 0) {
17945 dst[3] = 0;
17946 return;
17947 }
17948
17949 dst[3] = src[3];
17950}
Here is the caller graph for this function: