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

16820 {
16821 if (bk_is32a((BANK_HEADER *) event)) {
16822 BANK32A *pbk32a = (BANK32A *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16823 pbk32a->data_size = (DWORD) ((char *) pdata - (char *) (pbk32a + 1));
16824 if (pbk32a->type == TID_STRUCT && pbk32a->data_size == 0)
16825 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]);
16826 ((BANK_HEADER *) event)->data_size += sizeof(BANK32A) + ALIGN8(pbk32a->data_size);
16827 return pbk32a->data_size;
16828 } else if (bk_is32((BANK_HEADER *) event)) {
16829 BANK32 *pbk32 = (BANK32 *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16830 pbk32->data_size = (DWORD) ((char *) pdata - (char *) (pbk32 + 1));
16831 if (pbk32->type == TID_STRUCT && pbk32->data_size == 0)
16832 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]);
16833 ((BANK_HEADER *) event)->data_size += sizeof(BANK32) + ALIGN8(pbk32->data_size);
16834 return pbk32->data_size;
16835 } else {
16836 BANK *pbk = (BANK *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16837 uint32_t size = (uint32_t) ((char *) pdata - (char *) (pbk + 1));
16838 if (size > 0xFFFF) {
16839 printf("Error: Bank size %d exceeds 16-bit limit of 65526, please use bk_init32() to create a 32-bit bank\n", size);
16840 size = 0;
16841 }
16842 pbk->data_size = (WORD) (size);
16843 if (pbk->type == TID_STRUCT && pbk->data_size == 0)
16844 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]);
16845 size = ((BANK_HEADER *) event)->data_size + sizeof(BANK) + ALIGN8(pbk->data_size);
16846 if (size > 0xFFFF) {
16847 printf("Error: Bank size %d exceeds 16-bit limit of 65526, please use bk_init32() to create a 32-bit bank\n", size);
16848 size = 0;
16849 }
16850 ((BANK_HEADER *) event)->data_size = size;
16851 return pbk->data_size;
16852 }
16853}
BOOL bk_is32a(const void *event)
Definition midas.cxx:16477
BOOL bk_is32(const void *event)
Definition midas.cxx:16455
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 16644 of file midas.cxx.

16644 {
16645
16646 INT status;
16647 DWORD bklen, bktype, bksze;
16648 BANK_HEADER *psBkh;
16649 BANK *psbkh;
16650 char *pdest;
16651 void *psdata;
16652
16653 // source pointing on the BANKxx
16654 psBkh = (BANK_HEADER *) ((EVENT_HEADER *) psrce + 1);
16655 // Find requested bank
16656 status = bk_find(psBkh, bkname, &bklen, &bktype, &psdata);
16657 // Return 0 if not found
16658 if (status != SUCCESS) return 0;
16659
16660 // Check bank type...
16661 // You cannot mix BANK and BANK32 so make sure all the FE use either
16662 // bk_init(pevent) or bk_init32(pevent).
16663 if (bk_is32a(psBkh)) {
16664
16665 // pointer to the source bank header
16666 BANK32A *psbkh32a = ((BANK32A *) psdata - 1);
16667 // Data size in the bank
16668 bksze = psbkh32a->data_size;
16669
16670 // Get to the end of the event
16671 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
16672 // Copy from BANK32 to end of Data
16673 memmove(pdest, (char *) psbkh32a, ALIGN8(bksze) + sizeof(BANK32A));
16674 // Bring pointer to the next free location
16675 pdest += ALIGN8(bksze) + sizeof(BANK32A);
16676
16677 } else if (bk_is32(psBkh)) {
16678
16679 // pointer to the source bank header
16680 BANK32 *psbkh32 = ((BANK32 *) psdata - 1);
16681 // Data size in the bank
16682 bksze = psbkh32->data_size;
16683
16684 // Get to the end of the event
16685 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
16686 // Copy from BANK32 to end of Data
16687 memmove(pdest, (char *) psbkh32, ALIGN8(bksze) + sizeof(BANK32));
16688 // Bring pointer to the next free location
16689 pdest += ALIGN8(bksze) + sizeof(BANK32);
16690
16691 } else {
16692
16693 // pointer to the source bank header
16694 psbkh = ((BANK *) psdata - 1);
16695 // Data size in the bank
16696 bksze = psbkh->data_size;
16697
16698 // Get to the end of the event
16699 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
16700 // Copy from BANK to end of Data
16701 memmove(pdest, (char *) psbkh, ALIGN8(bksze) + sizeof(BANK));
16702 // Bring pointer to the next free location
16703 pdest += ALIGN8(bksze) + sizeof(BANK);
16704 }
16705
16706 // Close bank (adjust BANK_HEADER size)
16707 bk_close(pevent, pdest);
16708 // Adjust EVENT_HEADER size
16709 ((EVENT_HEADER *) pevent - 1)->data_size = ((BANK_HEADER *) pevent)->data_size + sizeof(BANK_HEADER);
16710 return SUCCESS;
16711}
INT bk_close(void *event, void *pdata)
Definition midas.cxx:16820
INT bk_find(const BANK_HEADER *pbkh, const char *name, DWORD *bklen, DWORD *bktype, void **pdata)
Definition midas.cxx:16992
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:16446
void bk_create(void *event, const char *name, WORD type, void **pdata)
Definition midas.cxx:16601
#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 16601 of file midas.cxx.

16601 {
16602 if (bk_is32a((BANK_HEADER *) event)) {
16603 if (((PTYPE) event & 0x07) != 0) {
16604 cm_msg(MERROR, "bk_create", "Bank %s created with unaligned event pointer", name);
16605 return;
16606 }
16607 BANK32A *pbk32a;
16608
16609 pbk32a = (BANK32A *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16610 copy_bk_name(pbk32a->name, name);
16611 pbk32a->type = type;
16612 pbk32a->data_size = 0;
16613 *pdata = pbk32a + 1;
16614 } else if (bk_is32((BANK_HEADER *) event)) {
16615 BANK32 *pbk32;
16616
16617 pbk32 = (BANK32 *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16618 copy_bk_name(pbk32->name, name);
16619 pbk32->type = type;
16620 pbk32->data_size = 0;
16621 *pdata = pbk32 + 1;
16622 } else {
16623 BANK *pbk;
16624
16625 pbk = (BANK *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16626 copy_bk_name(pbk->name, name);
16627 pbk->type = type;
16628 pbk->data_size = 0;
16629 *pdata = pbk + 1;
16630 }
16631}
static void copy_bk_name(char *dst, const char *src)
Definition midas.cxx:16539
#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:930
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 16714 of file midas.cxx.

16730{
16731 BANK *pbk;
16732 DWORD dname;
16733 int remaining;
16734
16735 if (bk_is32a((BANK_HEADER *) event)) {
16736 /* locate bank */
16737 BANK32A *pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
16738 copy_bk_name((char *) &dname, name);
16739 do {
16740 if (*((DWORD *) pbk32a->name) == dname) {
16741 /* bank found, delete it */
16742 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
16743 sizeof(BANK_HEADER)) - ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16744
16745 /* reduce total event size */
16746 ((BANK_HEADER *) event)->data_size -= sizeof(BANK32) + ALIGN8(pbk32a->data_size);
16747
16748 /* copy remaining bytes */
16749 if (remaining > 0)
16750 memmove(pbk32a, (char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size), remaining);
16751 return CM_SUCCESS;
16752 }
16753
16754 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16755 } while ((DWORD) ((char *) pbk32a - (char *) event) <
16756 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
16757 } else if (bk_is32((BANK_HEADER *) event)) {
16758 /* locate bank */
16759 BANK32 *pbk32 = (BANK32 *) (((BANK_HEADER *) event) + 1);
16760 copy_bk_name((char *) &dname, name);
16761 do {
16762 if (*((DWORD *) pbk32->name) == dname) {
16763 /* bank found, delete it */
16764 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
16765 sizeof(BANK_HEADER)) - ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16766
16767 /* reduce total event size */
16768 ((BANK_HEADER *) event)->data_size -= sizeof(BANK32) + ALIGN8(pbk32->data_size);
16769
16770 /* copy remaining bytes */
16771 if (remaining > 0)
16772 memmove(pbk32, (char *) (pbk32 + 1) + ALIGN8(pbk32->data_size), remaining);
16773 return CM_SUCCESS;
16774 }
16775
16776 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16777 } while ((DWORD) ((char *) pbk32 - (char *) event) <
16778 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
16779 } else {
16780 /* locate bank */
16781 pbk = (BANK *) (((BANK_HEADER *) event) + 1);
16782 copy_bk_name((char *) &dname, name);
16783 do {
16784 if (*((DWORD *) pbk->name) == dname) {
16785 /* bank found, delete it */
16786 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
16787 sizeof(BANK_HEADER)) - ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
16788
16789 /* reduce total event size */
16790 ((BANK_HEADER *) event)->data_size -= sizeof(BANK) + ALIGN8(pbk->data_size);
16791
16792 /* copy remaining bytes */
16793 if (remaining > 0)
16794 memmove(pbk, (char *) (pbk + 1) + ALIGN8(pbk->data_size), remaining);
16795 return CM_SUCCESS;
16796 }
16797
16798 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
16799 } while ((DWORD) ((char *) pbk - (char *) event) <
16800 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
16801 }
16802
16803 return 0;
16804}
#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 16992 of file midas.cxx.

16992 {
16993 DWORD dname;
16994
16995 if (bk_is32a(pbkh)) {
16996 BANK32A *pbk32a = (BANK32A *) (pbkh + 1);
16997 copy_bk_name((char *) &dname, name);
16998 do {
16999 if (*((DWORD *) pbk32a->name) == dname) {
17000 *((void **) pdata) = pbk32a + 1;
17001 if (tid_size[pbk32a->type & 0xFF] == 0)
17002 *bklen = pbk32a->data_size;
17003 else
17004 *bklen = pbk32a->data_size / tid_size[pbk32a->type & 0xFF];
17005
17006 *bktype = pbk32a->type;
17007 return 1;
17008 }
17009 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
17010 } while ((DWORD) ((char *) pbk32a - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
17011 } else if (bk_is32(pbkh)) {
17012 BANK32 *pbk32 = (BANK32 *) (pbkh + 1);
17013 copy_bk_name((char *) &dname, name);
17014 do {
17015 if (*((DWORD *) pbk32->name) == dname) {
17016 *((void **) pdata) = pbk32 + 1;
17017 if (tid_size[pbk32->type & 0xFF] == 0)
17018 *bklen = pbk32->data_size;
17019 else
17020 *bklen = pbk32->data_size / tid_size[pbk32->type & 0xFF];
17021
17022 *bktype = pbk32->type;
17023 return 1;
17024 }
17025 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
17026 } while ((DWORD) ((char *) pbk32 - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
17027 } else {
17028 BANK *pbk = (BANK *) (pbkh + 1);
17029 copy_bk_name((char *) &dname, name);
17030 do {
17031 if (*((DWORD *) pbk->name) == dname) {
17032 *((void **) pdata) = pbk + 1;
17033 if (tid_size[pbk->type & 0xFF] == 0)
17034 *bklen = pbk->data_size;
17035 else
17036 *bklen = pbk->data_size / tid_size[pbk->type & 0xFF];
17037
17038 *bktype = pbk->type;
17039 return 1;
17040 }
17041 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
17042 } while ((DWORD) ((char *) pbk - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
17043 }
17044
17045 /* bank not found */
17046 *((void **) pdata) = NULL;
17047 return 0;
17048}
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 16446 of file midas.cxx.

16446 {
16447 ((BANK_HEADER *) event)->data_size = 0;
16448 ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION;
16449}
#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 16509 of file midas.cxx.

16509 {
16510 ((BANK_HEADER *) event)->data_size = 0;
16511 ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION | BANK_FORMAT_32BIT;
16512}
#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 16522 of file midas.cxx.

16522 {
16523 ((BANK_HEADER *) event)->data_size = 0;
16525}
#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 16455 of file midas.cxx.

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

◆ bk_is32a()

BOOL bk_is32a ( const void *  event)

Definition at line 16477 of file midas.cxx.

16495{
16496 return ((((BANK_HEADER *) event)->flags & BANK_FORMAT_64BIT_ALIGNED) > 0);
16497}
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:17086
#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 17086 of file midas.cxx.

17086 {
17087 if (*pbk == NULL)
17088 *pbk = (BANK *) (((BANK_HEADER *) event) + 1);
17089 else
17090 *pbk = (BANK *) ((char *) (*pbk + 1) + ALIGN8((*pbk)->data_size));
17091
17092 *((void **) pdata) = (*pbk) + 1;
17093
17094 if ((DWORD) ((char *) *pbk - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
17095 *pbk = *((BANK **) pdata) = NULL;
17096 return 0;
17097 }
17098
17099 return (*pbk)->data_size;
17100}
Here is the caller graph for this function:

◆ bk_iterate32()

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

dox

Definition at line 17107 of file midas.cxx.

17126{
17127 if (*pbk == NULL)
17128 *pbk = (BANK32 *) (((BANK_HEADER *) event) + 1);
17129 else
17130 *pbk = (BANK32 *) ((char *) (*pbk + 1) + ALIGN8((*pbk)->data_size));
17131
17132 *((void **) pdata) = (*pbk) + 1;
17133
17134 if ((DWORD) ((char *) *pbk - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
17135 *pbk = NULL;
17136 pdata = NULL;
17137 return 0;
17138 }
17139
17140 return (*pbk)->data_size;
17141}
Here is the caller graph for this function:

◆ bk_iterate32a()

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

Definition at line 17143 of file midas.cxx.

17162{
17163 if (*pbk32a == NULL)
17164 *pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
17165 else
17166 *pbk32a = (BANK32A *) ((char *) (*pbk32a + 1) + ALIGN8((*pbk32a)->data_size));
17167
17168 *((void **) pdata) = (*pbk32a) + 1;
17169
17170 if ((DWORD) ((char *) *pbk32a - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
17171 *pbk32a = NULL;
17172 pdata = NULL;
17173 return 0;
17174 }
17175
17176 return (*pbk32a)->data_size;
17177}
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:16929
INT bk_list(const void *event, char *bklist)
Definition midas.cxx:16880
#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 16880 of file midas.cxx.

16880 { /* Full event */
16881 INT nbk;
16882 BANK *pmbk = NULL;
16883 BANK32 *pmbk32 = NULL;
16884 BANK32A *pmbk32a = NULL;
16885 char *pdata;
16886
16887 /* compose bank list */
16888 bklist[0] = 0;
16889 nbk = 0;
16890 do {
16891 /* scan all banks for bank name only */
16892 if (bk_is32a(event)) {
16893 bk_iterate32a(event, &pmbk32a, &pdata);
16894 if (pmbk32a == NULL)
16895 break;
16896 } else if (bk_is32(event)) {
16897 bk_iterate32(event, &pmbk32, &pdata);
16898 if (pmbk32 == NULL)
16899 break;
16900 } else {
16901 bk_iterate(event, &pmbk, &pdata);
16902 if (pmbk == NULL)
16903 break;
16904 }
16905 nbk++;
16906
16907 if (nbk > BANKLIST_MAX) {
16908 cm_msg(MINFO, "bk_list", "over %i banks -> truncated", BANKLIST_MAX);
16909 return (nbk - 1);
16910 }
16911 if (bk_is32a(event))
16912 strncat(bklist, (char *) pmbk32a->name, 4);
16913 else if (bk_is32(event))
16914 strncat(bklist, (char *) pmbk32->name, 4);
16915 else
16916 strncat(bklist, (char *) pmbk->name, 4);
16917 } while (1);
16918 return (nbk);
16919}
INT bk_iterate32a(const void *event, BANK32A **pbk32a, void *pdata)
Definition midas.cxx:17143
INT bk_iterate32(const void *event, BANK32 **pbk, void *pdata)
Definition midas.cxx:17107
#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 16929 of file midas.cxx.

16929 {
16930 BANK *pbk;
16931 BANK32 *pbk32;
16932 BANK32A *pbk32a;
16933 DWORD dname;
16934
16935 if (bk_is32a(event)) {
16936 pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
16937 copy_bk_name((char *) &dname, name);
16938 while ((DWORD) ((char *) pbk32a - (char *) event) <
16939 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
16940 if (*((DWORD *) pbk32a->name) == dname) {
16941 *((void **) pdata) = pbk32a + 1;
16942 if (tid_size[pbk32a->type & 0xFF] == 0)
16943 return pbk32a->data_size;
16944 return pbk32a->data_size / tid_size[pbk32a->type & 0xFF];
16945 }
16946 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16947 }
16948 } else if (bk_is32(event)) {
16949 pbk32 = (BANK32 *) (((BANK_HEADER *) event) + 1);
16950 copy_bk_name((char *) &dname, name);
16951 while ((DWORD) ((char *) pbk32 - (char *) event) <
16952 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
16953 if (*((DWORD *) pbk32->name) == dname) {
16954 *((void **) pdata) = pbk32 + 1;
16955 if (tid_size[pbk32->type & 0xFF] == 0)
16956 return pbk32->data_size;
16957 return pbk32->data_size / tid_size[pbk32->type & 0xFF];
16958 }
16959 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16960 }
16961 } else {
16962 pbk = (BANK *) (((BANK_HEADER *) event) + 1);
16963 copy_bk_name((char *) &dname, name);
16964 while ((DWORD) ((char *) pbk - (char *) event) <
16965 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
16966 if (*((DWORD *) pbk->name) == dname) {
16967 *((void **) pdata) = pbk + 1;
16968 if (tid_size[pbk->type & 0xFF] == 0)
16969 return pbk->data_size;
16970 return pbk->data_size / tid_size[pbk->type & 0xFF];
16971 }
16972 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
16973 }
16974
16975 }
16976
16977 /* bank not found */
16978 *((void **) pdata) = NULL;
16979 return 0;
16980}
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 16535 of file midas.cxx.

16535 {
16536 return ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER);
16537}
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 17197 of file midas.cxx.

17197 {
17198 BANK_HEADER *pbh;
17199 BANK *pbk;
17200 BANK32 *pbk32;
17201 BANK32A *pbk32a;
17202 void *pdata;
17203 WORD type;
17204
17205 pbh = (BANK_HEADER *) event;
17206
17207 /* only swap if flags in high 16-bit */
17208 if (pbh->flags < 0x10000 && !force)
17209 return 0;
17210
17211 /* swap bank header */
17212 DWORD_SWAP(&pbh->data_size);
17213 DWORD_SWAP(&pbh->flags);
17214
17215 pbk = (BANK *) (pbh + 1);
17216 pbk32 = (BANK32 *) pbk;
17217 pbk32a = (BANK32A *) pbk;
17218
17219 /* scan event */
17220 while ((char *) pbk - (char *) pbh < (INT) pbh->data_size + (INT) sizeof(BANK_HEADER)) {
17221 /* swap bank header */
17222 if (bk_is32a(event)) {
17223 DWORD_SWAP(&pbk32a->type);
17224 DWORD_SWAP(&pbk32a->data_size);
17225 pdata = pbk32a + 1;
17226 type = (WORD) pbk32a->type;
17227 } else if (bk_is32(event)) {
17228 DWORD_SWAP(&pbk32->type);
17229 DWORD_SWAP(&pbk32->data_size);
17230 pdata = pbk32 + 1;
17231 type = (WORD) pbk32->type;
17232 } else {
17233 WORD_SWAP(&pbk->type);
17234 WORD_SWAP(&pbk->data_size);
17235 pdata = pbk + 1;
17236 type = pbk->type;
17237 }
17238
17239 /* pbk points to next bank */
17240 if (bk_is32a(event)) {
17241 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
17242 pbk = (BANK *) pbk32a;
17243 } else if (bk_is32(event)) {
17244 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
17245 pbk = (BANK *) pbk32;
17246 } else {
17247 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
17248 pbk32 = (BANK32 *) pbk;
17249 }
17250
17251 switch (type) {
17252 case TID_UINT16:
17253 case TID_INT16:
17254 while ((char *) pdata < (char *) pbk) {
17255 WORD_SWAP(pdata);
17256 pdata = (void *) (((WORD *) pdata) + 1);
17257 }
17258 break;
17259
17260 case TID_UINT32:
17261 case TID_INT32:
17262 case TID_BOOL:
17263 case TID_FLOAT:
17264 while ((char *) pdata < (char *) pbk) {
17265 DWORD_SWAP(pdata);
17266 pdata = (void *) (((DWORD *) pdata) + 1);
17267 }
17268 break;
17269
17270 case TID_DOUBLE:
17271 case TID_INT64:
17272 case TID_UINT64:
17273 while ((char *) pdata < (char *) pbk) {
17274 QWORD_SWAP(pdata);
17275 pdata = (void *) (((double *) pdata) + 1);
17276 }
17277 break;
17278 }
17279 }
17280
17281 return CM_SUCCESS;
17282}
#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 16539 of file midas.cxx.

16540{
16541 // copy 4 byte bank name from "src" to "dst", set unused bytes of "dst" to NUL.
16542
16543 if (src[0] == 0) {
16544 // invalid empty name
16545 dst[0] = 0;
16546 dst[1] = 0;
16547 dst[2] = 0;
16548 dst[3] = 0;
16549 return;
16550 }
16551
16552 dst[0] = src[0];
16553
16554 if (src[1] == 0) {
16555 dst[1] = 0;
16556 dst[2] = 0;
16557 dst[3] = 0;
16558 return;
16559 }
16560
16561 dst[1] = src[1];
16562
16563 if (src[2] == 0) {
16564 dst[2] = 0;
16565 dst[3] = 0;
16566 return;
16567 }
16568
16569 dst[2] = src[2];
16570
16571 if (src[3] == 0) {
16572 dst[3] = 0;
16573 return;
16574 }
16575
16576 dst[3] = src[3];
16577}
Here is the caller graph for this function: