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

16780 {
16781 if (bk_is32a((BANK_HEADER *) event)) {
16782 BANK32A *pbk32a = (BANK32A *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16783 pbk32a->data_size = (DWORD) ((char *) pdata - (char *) (pbk32a + 1));
16784 if (pbk32a->type == TID_STRUCT && pbk32a->data_size == 0)
16785 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]);
16786 ((BANK_HEADER *) event)->data_size += sizeof(BANK32A) + ALIGN8(pbk32a->data_size);
16787 return pbk32a->data_size;
16788 } else if (bk_is32((BANK_HEADER *) event)) {
16789 BANK32 *pbk32 = (BANK32 *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16790 pbk32->data_size = (DWORD) ((char *) pdata - (char *) (pbk32 + 1));
16791 if (pbk32->type == TID_STRUCT && pbk32->data_size == 0)
16792 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]);
16793 ((BANK_HEADER *) event)->data_size += sizeof(BANK32) + ALIGN8(pbk32->data_size);
16794 return pbk32->data_size;
16795 } else {
16796 BANK *pbk = (BANK *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16797 uint32_t size = (uint32_t) ((char *) pdata - (char *) (pbk + 1));
16798 if (size > 0xFFFF) {
16799 printf("Error: Bank size %d exceeds 16-bit limit of 65526, please use bk_init32() to create a 32-bit bank\n", size);
16800 size = 0;
16801 }
16802 pbk->data_size = (WORD) (size);
16803 if (pbk->type == TID_STRUCT && pbk->data_size == 0)
16804 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]);
16805 size = ((BANK_HEADER *) event)->data_size + sizeof(BANK) + ALIGN8(pbk->data_size);
16806 if (size > 0xFFFF) {
16807 printf("Error: Bank size %d exceeds 16-bit limit of 65526, please use bk_init32() to create a 32-bit bank\n", size);
16808 size = 0;
16809 }
16810 ((BANK_HEADER *) event)->data_size = size;
16811 return pbk->data_size;
16812 }
16813}
BOOL bk_is32a(const void *event)
Definition midas.cxx:16437
BOOL bk_is32(const void *event)
Definition midas.cxx:16415
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
TH1X EXPRT * h1_book(const char *name, const char *title, int bins, double min, double max)
Definition rmidas.h:24
DWORD data_size
Definition midas.h:1230
DWORD data_size
Definition midas.h:1224
Definition midas.h:1215
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 16604 of file midas.cxx.

16604 {
16605
16606 INT status;
16609 BANK *psbkh;
16610 char *pdest;
16611 void *psdata;
16612
16613 // source pointing on the BANKxx
16614 psBkh = (BANK_HEADER *) ((EVENT_HEADER *) psrce + 1);
16615 // Find requested bank
16617 // Return 0 if not found
16618 if (status != SUCCESS) return 0;
16619
16620 // Check bank type...
16621 // You cannot mix BANK and BANK32 so make sure all the FE use either
16622 // bk_init(pevent) or bk_init32(pevent).
16623 if (bk_is32a(psBkh)) {
16624
16625 // pointer to the source bank header
16626 BANK32A *psbkh32a = ((BANK32A *) psdata - 1);
16627 // Data size in the bank
16629
16630 // Get to the end of the event
16631 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
16632 // Copy from BANK32 to end of Data
16633 memmove(pdest, (char *) psbkh32a, ALIGN8(bksze) + sizeof(BANK32A));
16634 // Bring pointer to the next free location
16635 pdest += ALIGN8(bksze) + sizeof(BANK32A);
16636
16637 } else if (bk_is32(psBkh)) {
16638
16639 // pointer to the source bank header
16640 BANK32 *psbkh32 = ((BANK32 *) psdata - 1);
16641 // Data size in the bank
16643
16644 // Get to the end of the event
16645 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
16646 // Copy from BANK32 to end of Data
16647 memmove(pdest, (char *) psbkh32, ALIGN8(bksze) + sizeof(BANK32));
16648 // Bring pointer to the next free location
16649 pdest += ALIGN8(bksze) + sizeof(BANK32);
16650
16651 } else {
16652
16653 // pointer to the source bank header
16654 psbkh = ((BANK *) psdata - 1);
16655 // Data size in the bank
16656 bksze = psbkh->data_size;
16657
16658 // Get to the end of the event
16659 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
16660 // Copy from BANK to end of Data
16661 memmove(pdest, (char *) psbkh, ALIGN8(bksze) + sizeof(BANK));
16662 // Bring pointer to the next free location
16663 pdest += ALIGN8(bksze) + sizeof(BANK);
16664 }
16665
16666 // Close bank (adjust BANK_HEADER size)
16667 bk_close(pevent, pdest);
16668 // Adjust EVENT_HEADER size
16669 ((EVENT_HEADER *) pevent - 1)->data_size = ((BANK_HEADER *) pevent)->data_size + sizeof(BANK_HEADER);
16670 return SUCCESS;
16671}
INT bk_close(void *event, void *pdata)
Definition midas.cxx:16780
INT bk_find(const BANK_HEADER *pbkh, const char *name, DWORD *bklen, DWORD *bktype, void **pdata)
Definition midas.cxx:16952
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.

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:16406
void bk_create(void *event, const char *name, WORD type, void **pdata)
Definition midas.cxx:16561
#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 16561 of file midas.cxx.

16561 {
16562 if (bk_is32a((BANK_HEADER *) event)) {
16563 if (((PTYPE) event & 0x07) != 0) {
16564 cm_msg(MERROR, "bk_create", "Bank %s created with unaligned event pointer", name);
16565 return;
16566 }
16567 BANK32A *pbk32a;
16568
16569 pbk32a = (BANK32A *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16570 copy_bk_name(pbk32a->name, name);
16571 pbk32a->type = type;
16572 pbk32a->data_size = 0;
16573 *pdata = pbk32a + 1;
16574 } else if (bk_is32((BANK_HEADER *) event)) {
16575 BANK32 *pbk32;
16576
16577 pbk32 = (BANK32 *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16578 copy_bk_name(pbk32->name, name);
16579 pbk32->type = type;
16580 pbk32->data_size = 0;
16581 *pdata = pbk32 + 1;
16582 } else {
16583 BANK *pbk;
16584
16585 pbk = (BANK *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16586 copy_bk_name(pbk->name, name);
16587 pbk->type = type;
16588 pbk->data_size = 0;
16589 *pdata = pbk + 1;
16590 }
16591}
static void copy_bk_name(char *dst, const char *src)
Definition midas.cxx:16499
#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:915
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 16674 of file midas.cxx.

16690{
16691 BANK *pbk;
16692 DWORD dname;
16693 int remaining;
16694
16695 if (bk_is32a((BANK_HEADER *) event)) {
16696 /* locate bank */
16697 BANK32A *pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
16698 copy_bk_name((char *) &dname, name);
16699 do {
16700 if (*((DWORD *) pbk32a->name) == dname) {
16701 /* bank found, delete it */
16702 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
16703 sizeof(BANK_HEADER)) - ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16704
16705 /* reduce total event size */
16706 ((BANK_HEADER *) event)->data_size -= sizeof(BANK32) + ALIGN8(pbk32a->data_size);
16707
16708 /* copy remaining bytes */
16709 if (remaining > 0)
16710 memmove(pbk32a, (char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size), remaining);
16711 return CM_SUCCESS;
16712 }
16713
16714 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16715 } while ((DWORD) ((char *) pbk32a - (char *) event) <
16716 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
16717 } else if (bk_is32((BANK_HEADER *) event)) {
16718 /* locate bank */
16719 BANK32 *pbk32 = (BANK32 *) (((BANK_HEADER *) event) + 1);
16720 copy_bk_name((char *) &dname, name);
16721 do {
16722 if (*((DWORD *) pbk32->name) == dname) {
16723 /* bank found, delete it */
16724 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
16725 sizeof(BANK_HEADER)) - ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16726
16727 /* reduce total event size */
16728 ((BANK_HEADER *) event)->data_size -= sizeof(BANK32) + ALIGN8(pbk32->data_size);
16729
16730 /* copy remaining bytes */
16731 if (remaining > 0)
16732 memmove(pbk32, (char *) (pbk32 + 1) + ALIGN8(pbk32->data_size), remaining);
16733 return CM_SUCCESS;
16734 }
16735
16736 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16737 } while ((DWORD) ((char *) pbk32 - (char *) event) <
16738 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
16739 } else {
16740 /* locate bank */
16741 pbk = (BANK *) (((BANK_HEADER *) event) + 1);
16742 copy_bk_name((char *) &dname, name);
16743 do {
16744 if (*((DWORD *) pbk->name) == dname) {
16745 /* bank found, delete it */
16746 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
16747 sizeof(BANK_HEADER)) - ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
16748
16749 /* reduce total event size */
16750 ((BANK_HEADER *) event)->data_size -= sizeof(BANK) + ALIGN8(pbk->data_size);
16751
16752 /* copy remaining bytes */
16753 if (remaining > 0)
16754 memmove(pbk, (char *) (pbk + 1) + ALIGN8(pbk->data_size), remaining);
16755 return CM_SUCCESS;
16756 }
16757
16758 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
16759 } while ((DWORD) ((char *) pbk - (char *) event) <
16760 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
16761 }
16762
16763 return 0;
16764}
#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 16952 of file midas.cxx.

16952 {
16953 DWORD dname;
16954
16955 if (bk_is32a(pbkh)) {
16956 BANK32A *pbk32a = (BANK32A *) (pbkh + 1);
16957 copy_bk_name((char *) &dname, name);
16958 do {
16959 if (*((DWORD *) pbk32a->name) == dname) {
16960 *((void **) pdata) = pbk32a + 1;
16961 if (tid_size[pbk32a->type & 0xFF] == 0)
16962 *bklen = pbk32a->data_size;
16963 else
16964 *bklen = pbk32a->data_size / tid_size[pbk32a->type & 0xFF];
16965
16966 *bktype = pbk32a->type;
16967 return 1;
16968 }
16969 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16970 } while ((DWORD) ((char *) pbk32a - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
16971 } else if (bk_is32(pbkh)) {
16972 BANK32 *pbk32 = (BANK32 *) (pbkh + 1);
16973 copy_bk_name((char *) &dname, name);
16974 do {
16975 if (*((DWORD *) pbk32->name) == dname) {
16976 *((void **) pdata) = pbk32 + 1;
16977 if (tid_size[pbk32->type & 0xFF] == 0)
16978 *bklen = pbk32->data_size;
16979 else
16980 *bklen = pbk32->data_size / tid_size[pbk32->type & 0xFF];
16981
16982 *bktype = pbk32->type;
16983 return 1;
16984 }
16985 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16986 } while ((DWORD) ((char *) pbk32 - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
16987 } else {
16988 BANK *pbk = (BANK *) (pbkh + 1);
16989 copy_bk_name((char *) &dname, name);
16990 do {
16991 if (*((DWORD *) pbk->name) == dname) {
16992 *((void **) pdata) = pbk + 1;
16993 if (tid_size[pbk->type & 0xFF] == 0)
16994 *bklen = pbk->data_size;
16995 else
16996 *bklen = pbk->data_size / tid_size[pbk->type & 0xFF];
16997
16998 *bktype = pbk->type;
16999 return 1;
17000 }
17001 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
17002 } while ((DWORD) ((char *) pbk - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
17003 }
17004
17005 /* bank not found */
17006 *((void **) pdata) = NULL;
17007 return 0;
17008}
static const int tid_size[]
Definition midas.cxx:66
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 16406 of file midas.cxx.

16406 {
16407 ((BANK_HEADER *) event)->data_size = 0;
16408 ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION;
16409}
#define BANK_FORMAT_VERSION
Definition midas.h:1203
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 16469 of file midas.cxx.

16469 {
16470 ((BANK_HEADER *) event)->data_size = 0;
16471 ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION | BANK_FORMAT_32BIT;
16472}
#define BANK_FORMAT_32BIT
Definition midas.h:1204
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 16482 of file midas.cxx.

16482 {
16483 ((BANK_HEADER *) event)->data_size = 0;
16485}
#define BANK_FORMAT_64BIT_ALIGNED
Definition midas.h:1205
Here is the caller graph for this function:

◆ bk_is32()

BOOL bk_is32 ( const void event)

dox

Definition at line 16415 of file midas.cxx.

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

◆ bk_is32a()

BOOL bk_is32a ( const void event)

Definition at line 16437 of file midas.cxx.

16455{
16456 return ((((BANK_HEADER *) event)->flags & BANK_FORMAT_64BIT_ALIGNED) > 0);
16457}
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.

INT size;
void *pdata;
char name[5];
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:17046
#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 17046 of file midas.cxx.

17046 {
17047 if (*pbk == NULL)
17048 *pbk = (BANK *) (((BANK_HEADER *) event) + 1);
17049 else
17050 *pbk = (BANK *) ((char *) (*pbk + 1) + ALIGN8((*pbk)->data_size));
17051
17052 *((void **) pdata) = (*pbk) + 1;
17053
17054 if ((DWORD) ((char *) *pbk - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
17055 *pbk = *((BANK **) pdata) = NULL;
17056 return 0;
17057 }
17058
17059 return (*pbk)->data_size;
17060}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ bk_iterate32()

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

dox

Definition at line 17067 of file midas.cxx.

17086{
17087 if (*pbk == NULL)
17088 *pbk = (BANK32 *) (((BANK_HEADER *) event) + 1);
17089 else
17090 *pbk = (BANK32 *) ((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 = NULL;
17096 pdata = NULL;
17097 return 0;
17098 }
17099
17100 return (*pbk)->data_size;
17101}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ bk_iterate32a()

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

Definition at line 17103 of file midas.cxx.

17122{
17123 if (*pbk32a == NULL)
17124 *pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
17125 else
17126 *pbk32a = (BANK32A *) ((char *) (*pbk32a + 1) + ALIGN8((*pbk32a)->data_size));
17127
17128 *((void **) pdata) = (*pbk32a) + 1;
17129
17130 if ((DWORD) ((char *) *pbk32a - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
17131 *pbk32a = NULL;
17132 pdata = NULL;
17133 return 0;
17134 }
17135
17136 return (*pbk32a)->data_size;
17137}
Here is the call graph for this function:
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)
{
// 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:16889
INT bk_list(const void *event, char *bklist)
Definition midas.cxx:16840
#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 16840 of file midas.cxx.

16840 { /* Full event */
16841 INT nbk;
16842 BANK *pmbk = NULL;
16843 BANK32 *pmbk32 = NULL;
16844 BANK32A *pmbk32a = NULL;
16845 char *pdata;
16846
16847 /* compose bank list */
16848 bklist[0] = 0;
16849 nbk = 0;
16850 do {
16851 /* scan all banks for bank name only */
16852 if (bk_is32a(event)) {
16853 bk_iterate32a(event, &pmbk32a, &pdata);
16854 if (pmbk32a == NULL)
16855 break;
16856 } else if (bk_is32(event)) {
16857 bk_iterate32(event, &pmbk32, &pdata);
16858 if (pmbk32 == NULL)
16859 break;
16860 } else {
16861 bk_iterate(event, &pmbk, &pdata);
16862 if (pmbk == NULL)
16863 break;
16864 }
16865 nbk++;
16866
16867 if (nbk > BANKLIST_MAX) {
16868 cm_msg(MINFO, "bk_list", "over %i banks -> truncated", BANKLIST_MAX);
16869 return (nbk - 1);
16870 }
16871 if (bk_is32a(event))
16872 strncat(bklist, (char *) pmbk32a->name, 4);
16873 else if (bk_is32(event))
16874 strncat(bklist, (char *) pmbk32->name, 4);
16875 else
16876 strncat(bklist, (char *) pmbk->name, 4);
16877 } while (1);
16878 return (nbk);
16879}
INT bk_iterate32a(const void *event, BANK32A **pbk32a, void *pdata)
Definition midas.cxx:17103
INT bk_iterate32(const void *event, BANK32 **pbk, void *pdata)
Definition midas.cxx:17067
#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 16889 of file midas.cxx.

16889 {
16890 BANK *pbk;
16891 BANK32 *pbk32;
16892 BANK32A *pbk32a;
16893 DWORD dname;
16894
16895 if (bk_is32a(event)) {
16896 pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
16897 copy_bk_name((char *) &dname, name);
16898 while ((DWORD) ((char *) pbk32a - (char *) event) <
16899 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
16900 if (*((DWORD *) pbk32a->name) == dname) {
16901 *((void **) pdata) = pbk32a + 1;
16902 if (tid_size[pbk32a->type & 0xFF] == 0)
16903 return pbk32a->data_size;
16904 return pbk32a->data_size / tid_size[pbk32a->type & 0xFF];
16905 }
16906 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16907 }
16908 } else if (bk_is32(event)) {
16909 pbk32 = (BANK32 *) (((BANK_HEADER *) event) + 1);
16910 copy_bk_name((char *) &dname, name);
16911 while ((DWORD) ((char *) pbk32 - (char *) event) <
16912 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
16913 if (*((DWORD *) pbk32->name) == dname) {
16914 *((void **) pdata) = pbk32 + 1;
16915 if (tid_size[pbk32->type & 0xFF] == 0)
16916 return pbk32->data_size;
16917 return pbk32->data_size / tid_size[pbk32->type & 0xFF];
16918 }
16919 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16920 }
16921 } else {
16922 pbk = (BANK *) (((BANK_HEADER *) event) + 1);
16923 copy_bk_name((char *) &dname, name);
16924 while ((DWORD) ((char *) pbk - (char *) event) <
16925 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
16926 if (*((DWORD *) pbk->name) == dname) {
16927 *((void **) pdata) = pbk + 1;
16928 if (tid_size[pbk->type & 0xFF] == 0)
16929 return pbk->data_size;
16930 return pbk->data_size / tid_size[pbk->type & 0xFF];
16931 }
16932 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
16933 }
16934
16935 }
16936
16937 /* bank not found */
16938 *((void **) pdata) = NULL;
16939 return 0;
16940}
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 16495 of file midas.cxx.

16495 {
16496 return ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER);
16497}
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 17157 of file midas.cxx.

17157 {
17159 BANK *pbk;
17160 BANK32 *pbk32;
17161 BANK32A *pbk32a;
17162 void *pdata;
17163 WORD type;
17164
17165 pbh = (BANK_HEADER *) event;
17166
17167 /* only swap if flags in high 16-bit */
17168 if (pbh->flags < 0x10000 && !force)
17169 return 0;
17170
17171 /* swap bank header */
17172 DWORD_SWAP(&pbh->data_size);
17173 DWORD_SWAP(&pbh->flags);
17174
17175 pbk = (BANK *) (pbh + 1);
17176 pbk32 = (BANK32 *) pbk;
17177 pbk32a = (BANK32A *) pbk;
17178
17179 /* scan event */
17180 while ((char *) pbk - (char *) pbh < (INT) pbh->data_size + (INT) sizeof(BANK_HEADER)) {
17181 /* swap bank header */
17182 if (bk_is32a(event)) {
17183 DWORD_SWAP(&pbk32a->type);
17184 DWORD_SWAP(&pbk32a->data_size);
17185 pdata = pbk32a + 1;
17186 type = (WORD) pbk32a->type;
17187 } else if (bk_is32(event)) {
17188 DWORD_SWAP(&pbk32->type);
17189 DWORD_SWAP(&pbk32->data_size);
17190 pdata = pbk32 + 1;
17191 type = (WORD) pbk32->type;
17192 } else {
17193 WORD_SWAP(&pbk->type);
17194 WORD_SWAP(&pbk->data_size);
17195 pdata = pbk + 1;
17196 type = pbk->type;
17197 }
17198
17199 /* pbk points to next bank */
17200 if (bk_is32a(event)) {
17201 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
17202 pbk = (BANK *) pbk32a;
17203 } else if (bk_is32(event)) {
17204 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
17205 pbk = (BANK *) pbk32;
17206 } else {
17207 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
17208 pbk32 = (BANK32 *) pbk;
17209 }
17210
17211 switch (type) {
17212 case TID_UINT16:
17213 case TID_INT16:
17214 while ((char *) pdata < (char *) pbk) {
17216 pdata = (void *) (((WORD *) pdata) + 1);
17217 }
17218 break;
17219
17220 case TID_UINT32:
17221 case TID_INT32:
17222 case TID_BOOL:
17223 case TID_FLOAT:
17224 while ((char *) pdata < (char *) pbk) {
17226 pdata = (void *) (((DWORD *) pdata) + 1);
17227 }
17228 break;
17229
17230 case TID_DOUBLE:
17231 case TID_INT64:
17232 case TID_UINT64:
17233 while ((char *) pdata < (char *) pbk) {
17235 pdata = (void *) (((double *) pdata) + 1);
17236 }
17237 break;
17238 }
17239 }
17240
17241 return CM_SUCCESS;
17242}
#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
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 16499 of file midas.cxx.

16500{
16501 // copy 4 byte bank name from "src" to "dst", set unused bytes of "dst" to NUL.
16502
16503 if (src[0] == 0) {
16504 // invalid empty name
16505 dst[0] = 0;
16506 dst[1] = 0;
16507 dst[2] = 0;
16508 dst[3] = 0;
16509 return;
16510 }
16511
16512 dst[0] = src[0];
16513
16514 if (src[1] == 0) {
16515 dst[1] = 0;
16516 dst[2] = 0;
16517 dst[3] = 0;
16518 return;
16519 }
16520
16521 dst[1] = src[1];
16522
16523 if (src[2] == 0) {
16524 dst[2] = 0;
16525 dst[3] = 0;
16526 return;
16527 }
16528
16529 dst[2] = src[2];
16530
16531 if (src[3] == 0) {
16532 dst[3] = 0;
16533 return;
16534 }
16535
16536 dst[3] = src[3];
16537}
Here is the caller graph for this function: