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

16802 {
16803 if (bk_is32a((BANK_HEADER *) event)) {
16804 BANK32A *pbk32a = (BANK32A *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16805 pbk32a->data_size = (DWORD) ((char *) pdata - (char *) (pbk32a + 1));
16806 if (pbk32a->type == TID_STRUCT && pbk32a->data_size == 0)
16807 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]);
16808 ((BANK_HEADER *) event)->data_size += sizeof(BANK32A) + ALIGN8(pbk32a->data_size);
16809 return pbk32a->data_size;
16810 } else if (bk_is32((BANK_HEADER *) event)) {
16811 BANK32 *pbk32 = (BANK32 *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16812 pbk32->data_size = (DWORD) ((char *) pdata - (char *) (pbk32 + 1));
16813 if (pbk32->type == TID_STRUCT && pbk32->data_size == 0)
16814 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]);
16815 ((BANK_HEADER *) event)->data_size += sizeof(BANK32) + ALIGN8(pbk32->data_size);
16816 return pbk32->data_size;
16817 } else {
16818 BANK *pbk = (BANK *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16819 uint32_t size = (uint32_t) ((char *) pdata - (char *) (pbk + 1));
16820 if (size > 0xFFFF) {
16821 printf("Error: Bank size %d exceeds 16-bit limit of 65526, please use bk_init32() to create a 32-bit bank\n", size);
16822 size = 0;
16823 }
16824 pbk->data_size = (WORD) (size);
16825 if (pbk->type == TID_STRUCT && pbk->data_size == 0)
16826 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]);
16827 size = ((BANK_HEADER *) event)->data_size + sizeof(BANK) + ALIGN8(pbk->data_size);
16828 if (size > 0xFFFF) {
16829 printf("Error: Bank size %d exceeds 16-bit limit of 65526, please use bk_init32() to create a 32-bit bank\n", size);
16830 size = 0;
16831 }
16832 ((BANK_HEADER *) event)->data_size = size;
16833 return pbk->data_size;
16834 }
16835}
BOOL bk_is32a(const void *event)
Definition midas.cxx:16459
BOOL bk_is32(const void *event)
Definition midas.cxx:16437
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:1228
DWORD data_size
Definition midas.h:1222
Definition midas.h:1213
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 16626 of file midas.cxx.

16626 {
16627
16628 INT status;
16631 BANK *psbkh;
16632 char *pdest;
16633 void *psdata;
16634
16635 // source pointing on the BANKxx
16636 psBkh = (BANK_HEADER *) ((EVENT_HEADER *) psrce + 1);
16637 // Find requested bank
16639 // Return 0 if not found
16640 if (status != SUCCESS) return 0;
16641
16642 // Check bank type...
16643 // You cannot mix BANK and BANK32 so make sure all the FE use either
16644 // bk_init(pevent) or bk_init32(pevent).
16645 if (bk_is32a(psBkh)) {
16646
16647 // pointer to the source bank header
16648 BANK32A *psbkh32a = ((BANK32A *) psdata - 1);
16649 // Data size in the bank
16651
16652 // Get to the end of the event
16653 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
16654 // Copy from BANK32 to end of Data
16655 memmove(pdest, (char *) psbkh32a, ALIGN8(bksze) + sizeof(BANK32A));
16656 // Bring pointer to the next free location
16657 pdest += ALIGN8(bksze) + sizeof(BANK32A);
16658
16659 } else if (bk_is32(psBkh)) {
16660
16661 // pointer to the source bank header
16662 BANK32 *psbkh32 = ((BANK32 *) psdata - 1);
16663 // Data size in the bank
16665
16666 // Get to the end of the event
16667 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
16668 // Copy from BANK32 to end of Data
16669 memmove(pdest, (char *) psbkh32, ALIGN8(bksze) + sizeof(BANK32));
16670 // Bring pointer to the next free location
16671 pdest += ALIGN8(bksze) + sizeof(BANK32);
16672
16673 } else {
16674
16675 // pointer to the source bank header
16676 psbkh = ((BANK *) psdata - 1);
16677 // Data size in the bank
16678 bksze = psbkh->data_size;
16679
16680 // Get to the end of the event
16681 pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
16682 // Copy from BANK to end of Data
16683 memmove(pdest, (char *) psbkh, ALIGN8(bksze) + sizeof(BANK));
16684 // Bring pointer to the next free location
16685 pdest += ALIGN8(bksze) + sizeof(BANK);
16686 }
16687
16688 // Close bank (adjust BANK_HEADER size)
16689 bk_close(pevent, pdest);
16690 // Adjust EVENT_HEADER size
16691 ((EVENT_HEADER *) pevent - 1)->data_size = ((BANK_HEADER *) pevent)->data_size + sizeof(BANK_HEADER);
16692 return SUCCESS;
16693}
INT bk_close(void *event, void *pdata)
Definition midas.cxx:16802
INT bk_find(const BANK_HEADER *pbkh, const char *name, DWORD *bklen, DWORD *bktype, void **pdata)
Definition midas.cxx:16974
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:16428
void bk_create(void *event, const char *name, WORD type, void **pdata)
Definition midas.cxx:16583
#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 16583 of file midas.cxx.

16583 {
16584 if (bk_is32a((BANK_HEADER *) event)) {
16585 if (((PTYPE) event & 0x07) != 0) {
16586 cm_msg(MERROR, "bk_create", "Bank %s created with unaligned event pointer", name);
16587 return;
16588 }
16589 BANK32A *pbk32a;
16590
16591 pbk32a = (BANK32A *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16592 copy_bk_name(pbk32a->name, name);
16593 pbk32a->type = type;
16594 pbk32a->data_size = 0;
16595 *pdata = pbk32a + 1;
16596 } else if (bk_is32((BANK_HEADER *) event)) {
16597 BANK32 *pbk32;
16598
16599 pbk32 = (BANK32 *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16600 copy_bk_name(pbk32->name, name);
16601 pbk32->type = type;
16602 pbk32->data_size = 0;
16603 *pdata = pbk32 + 1;
16604 } else {
16605 BANK *pbk;
16606
16607 pbk = (BANK *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16608 copy_bk_name(pbk->name, name);
16609 pbk->type = type;
16610 pbk->data_size = 0;
16611 *pdata = pbk + 1;
16612 }
16613}
static void copy_bk_name(char *dst, const char *src)
Definition midas.cxx:16521
#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:929
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 16696 of file midas.cxx.

16712{
16713 BANK *pbk;
16714 DWORD dname;
16715 int remaining;
16716
16717 if (bk_is32a((BANK_HEADER *) event)) {
16718 /* locate bank */
16719 BANK32A *pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
16720 copy_bk_name((char *) &dname, name);
16721 do {
16722 if (*((DWORD *) pbk32a->name) == dname) {
16723 /* bank found, delete it */
16724 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
16725 sizeof(BANK_HEADER)) - ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16726
16727 /* reduce total event size */
16728 ((BANK_HEADER *) event)->data_size -= sizeof(BANK32) + ALIGN8(pbk32a->data_size);
16729
16730 /* copy remaining bytes */
16731 if (remaining > 0)
16732 memmove(pbk32a, (char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size), remaining);
16733 return CM_SUCCESS;
16734 }
16735
16736 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16737 } while ((DWORD) ((char *) pbk32a - (char *) event) <
16738 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
16739 } else if (bk_is32((BANK_HEADER *) event)) {
16740 /* locate bank */
16741 BANK32 *pbk32 = (BANK32 *) (((BANK_HEADER *) event) + 1);
16742 copy_bk_name((char *) &dname, name);
16743 do {
16744 if (*((DWORD *) pbk32->name) == dname) {
16745 /* bank found, delete it */
16746 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
16747 sizeof(BANK_HEADER)) - ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16748
16749 /* reduce total event size */
16750 ((BANK_HEADER *) event)->data_size -= sizeof(BANK32) + ALIGN8(pbk32->data_size);
16751
16752 /* copy remaining bytes */
16753 if (remaining > 0)
16754 memmove(pbk32, (char *) (pbk32 + 1) + ALIGN8(pbk32->data_size), remaining);
16755 return CM_SUCCESS;
16756 }
16757
16758 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16759 } while ((DWORD) ((char *) pbk32 - (char *) event) <
16760 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
16761 } else {
16762 /* locate bank */
16763 pbk = (BANK *) (((BANK_HEADER *) event) + 1);
16764 copy_bk_name((char *) &dname, name);
16765 do {
16766 if (*((DWORD *) pbk->name) == dname) {
16767 /* bank found, delete it */
16768 remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
16769 sizeof(BANK_HEADER)) - ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
16770
16771 /* reduce total event size */
16772 ((BANK_HEADER *) event)->data_size -= sizeof(BANK) + ALIGN8(pbk->data_size);
16773
16774 /* copy remaining bytes */
16775 if (remaining > 0)
16776 memmove(pbk, (char *) (pbk + 1) + ALIGN8(pbk->data_size), remaining);
16777 return CM_SUCCESS;
16778 }
16779
16780 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
16781 } while ((DWORD) ((char *) pbk - (char *) event) <
16782 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
16783 }
16784
16785 return 0;
16786}
#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 16974 of file midas.cxx.

16974 {
16975 DWORD dname;
16976
16977 if (bk_is32a(pbkh)) {
16978 BANK32A *pbk32a = (BANK32A *) (pbkh + 1);
16979 copy_bk_name((char *) &dname, name);
16980 do {
16981 if (*((DWORD *) pbk32a->name) == dname) {
16982 *((void **) pdata) = pbk32a + 1;
16983 if (tid_size[pbk32a->type & 0xFF] == 0)
16984 *bklen = pbk32a->data_size;
16985 else
16986 *bklen = pbk32a->data_size / tid_size[pbk32a->type & 0xFF];
16987
16988 *bktype = pbk32a->type;
16989 return 1;
16990 }
16991 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16992 } while ((DWORD) ((char *) pbk32a - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
16993 } else if (bk_is32(pbkh)) {
16994 BANK32 *pbk32 = (BANK32 *) (pbkh + 1);
16995 copy_bk_name((char *) &dname, name);
16996 do {
16997 if (*((DWORD *) pbk32->name) == dname) {
16998 *((void **) pdata) = pbk32 + 1;
16999 if (tid_size[pbk32->type & 0xFF] == 0)
17000 *bklen = pbk32->data_size;
17001 else
17002 *bklen = pbk32->data_size / tid_size[pbk32->type & 0xFF];
17003
17004 *bktype = pbk32->type;
17005 return 1;
17006 }
17007 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
17008 } while ((DWORD) ((char *) pbk32 - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
17009 } else {
17010 BANK *pbk = (BANK *) (pbkh + 1);
17011 copy_bk_name((char *) &dname, name);
17012 do {
17013 if (*((DWORD *) pbk->name) == dname) {
17014 *((void **) pdata) = pbk + 1;
17015 if (tid_size[pbk->type & 0xFF] == 0)
17016 *bklen = pbk->data_size;
17017 else
17018 *bklen = pbk->data_size / tid_size[pbk->type & 0xFF];
17019
17020 *bktype = pbk->type;
17021 return 1;
17022 }
17023 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
17024 } while ((DWORD) ((char *) pbk - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
17025 }
17026
17027 /* bank not found */
17028 *((void **) pdata) = NULL;
17029 return 0;
17030}
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 16428 of file midas.cxx.

16428 {
16429 ((BANK_HEADER *) event)->data_size = 0;
16430 ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION;
16431}
#define BANK_FORMAT_VERSION
Definition midas.h:1201
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 16491 of file midas.cxx.

16491 {
16492 ((BANK_HEADER *) event)->data_size = 0;
16493 ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION | BANK_FORMAT_32BIT;
16494}
#define BANK_FORMAT_32BIT
Definition midas.h:1202
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 16504 of file midas.cxx.

16504 {
16505 ((BANK_HEADER *) event)->data_size = 0;
16507}
#define BANK_FORMAT_64BIT_ALIGNED
Definition midas.h:1203
Here is the caller graph for this function:

◆ bk_is32()

BOOL bk_is32 ( const void event)

dox

Definition at line 16437 of file midas.cxx.

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

◆ bk_is32a()

BOOL bk_is32a ( const void event)

Definition at line 16459 of file midas.cxx.

16477{
16478 return ((((BANK_HEADER *) event)->flags & BANK_FORMAT_64BIT_ALIGNED) > 0);
16479}
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:17068
#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 17068 of file midas.cxx.

17068 {
17069 if (*pbk == NULL)
17070 *pbk = (BANK *) (((BANK_HEADER *) event) + 1);
17071 else
17072 *pbk = (BANK *) ((char *) (*pbk + 1) + ALIGN8((*pbk)->data_size));
17073
17074 *((void **) pdata) = (*pbk) + 1;
17075
17076 if ((DWORD) ((char *) *pbk - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
17077 *pbk = *((BANK **) pdata) = NULL;
17078 return 0;
17079 }
17080
17081 return (*pbk)->data_size;
17082}
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 17089 of file midas.cxx.

17108{
17109 if (*pbk == NULL)
17110 *pbk = (BANK32 *) (((BANK_HEADER *) event) + 1);
17111 else
17112 *pbk = (BANK32 *) ((char *) (*pbk + 1) + ALIGN8((*pbk)->data_size));
17113
17114 *((void **) pdata) = (*pbk) + 1;
17115
17116 if ((DWORD) ((char *) *pbk - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
17117 *pbk = NULL;
17118 pdata = NULL;
17119 return 0;
17120 }
17121
17122 return (*pbk)->data_size;
17123}
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 17125 of file midas.cxx.

17144{
17145 if (*pbk32a == NULL)
17146 *pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
17147 else
17148 *pbk32a = (BANK32A *) ((char *) (*pbk32a + 1) + ALIGN8((*pbk32a)->data_size));
17149
17150 *((void **) pdata) = (*pbk32a) + 1;
17151
17152 if ((DWORD) ((char *) *pbk32a - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
17153 *pbk32a = NULL;
17154 pdata = NULL;
17155 return 0;
17156 }
17157
17158 return (*pbk32a)->data_size;
17159}
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:16911
INT bk_list(const void *event, char *bklist)
Definition midas.cxx:16862
#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 16862 of file midas.cxx.

16862 { /* Full event */
16863 INT nbk;
16864 BANK *pmbk = NULL;
16865 BANK32 *pmbk32 = NULL;
16866 BANK32A *pmbk32a = NULL;
16867 char *pdata;
16868
16869 /* compose bank list */
16870 bklist[0] = 0;
16871 nbk = 0;
16872 do {
16873 /* scan all banks for bank name only */
16874 if (bk_is32a(event)) {
16875 bk_iterate32a(event, &pmbk32a, &pdata);
16876 if (pmbk32a == NULL)
16877 break;
16878 } else if (bk_is32(event)) {
16879 bk_iterate32(event, &pmbk32, &pdata);
16880 if (pmbk32 == NULL)
16881 break;
16882 } else {
16883 bk_iterate(event, &pmbk, &pdata);
16884 if (pmbk == NULL)
16885 break;
16886 }
16887 nbk++;
16888
16889 if (nbk > BANKLIST_MAX) {
16890 cm_msg(MINFO, "bk_list", "over %i banks -> truncated", BANKLIST_MAX);
16891 return (nbk - 1);
16892 }
16893 if (bk_is32a(event))
16894 strncat(bklist, (char *) pmbk32a->name, 4);
16895 else if (bk_is32(event))
16896 strncat(bklist, (char *) pmbk32->name, 4);
16897 else
16898 strncat(bklist, (char *) pmbk->name, 4);
16899 } while (1);
16900 return (nbk);
16901}
INT bk_iterate32a(const void *event, BANK32A **pbk32a, void *pdata)
Definition midas.cxx:17125
INT bk_iterate32(const void *event, BANK32 **pbk, void *pdata)
Definition midas.cxx:17089
#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 16911 of file midas.cxx.

16911 {
16912 BANK *pbk;
16913 BANK32 *pbk32;
16914 BANK32A *pbk32a;
16915 DWORD dname;
16916
16917 if (bk_is32a(event)) {
16918 pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
16919 copy_bk_name((char *) &dname, name);
16920 while ((DWORD) ((char *) pbk32a - (char *) event) <
16921 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
16922 if (*((DWORD *) pbk32a->name) == dname) {
16923 *((void **) pdata) = pbk32a + 1;
16924 if (tid_size[pbk32a->type & 0xFF] == 0)
16925 return pbk32a->data_size;
16926 return pbk32a->data_size / tid_size[pbk32a->type & 0xFF];
16927 }
16928 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16929 }
16930 } else if (bk_is32(event)) {
16931 pbk32 = (BANK32 *) (((BANK_HEADER *) event) + 1);
16932 copy_bk_name((char *) &dname, name);
16933 while ((DWORD) ((char *) pbk32 - (char *) event) <
16934 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
16935 if (*((DWORD *) pbk32->name) == dname) {
16936 *((void **) pdata) = pbk32 + 1;
16937 if (tid_size[pbk32->type & 0xFF] == 0)
16938 return pbk32->data_size;
16939 return pbk32->data_size / tid_size[pbk32->type & 0xFF];
16940 }
16941 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16942 }
16943 } else {
16944 pbk = (BANK *) (((BANK_HEADER *) event) + 1);
16945 copy_bk_name((char *) &dname, name);
16946 while ((DWORD) ((char *) pbk - (char *) event) <
16947 ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
16948 if (*((DWORD *) pbk->name) == dname) {
16949 *((void **) pdata) = pbk + 1;
16950 if (tid_size[pbk->type & 0xFF] == 0)
16951 return pbk->data_size;
16952 return pbk->data_size / tid_size[pbk->type & 0xFF];
16953 }
16954 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
16955 }
16956
16957 }
16958
16959 /* bank not found */
16960 *((void **) pdata) = NULL;
16961 return 0;
16962}
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 16517 of file midas.cxx.

16517 {
16518 return ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER);
16519}
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 17179 of file midas.cxx.

17179 {
17181 BANK *pbk;
17182 BANK32 *pbk32;
17183 BANK32A *pbk32a;
17184 void *pdata;
17185 WORD type;
17186
17187 pbh = (BANK_HEADER *) event;
17188
17189 /* only swap if flags in high 16-bit */
17190 if (pbh->flags < 0x10000 && !force)
17191 return 0;
17192
17193 /* swap bank header */
17194 DWORD_SWAP(&pbh->data_size);
17195 DWORD_SWAP(&pbh->flags);
17196
17197 pbk = (BANK *) (pbh + 1);
17198 pbk32 = (BANK32 *) pbk;
17199 pbk32a = (BANK32A *) pbk;
17200
17201 /* scan event */
17202 while ((char *) pbk - (char *) pbh < (INT) pbh->data_size + (INT) sizeof(BANK_HEADER)) {
17203 /* swap bank header */
17204 if (bk_is32a(event)) {
17205 DWORD_SWAP(&pbk32a->type);
17206 DWORD_SWAP(&pbk32a->data_size);
17207 pdata = pbk32a + 1;
17208 type = (WORD) pbk32a->type;
17209 } else if (bk_is32(event)) {
17210 DWORD_SWAP(&pbk32->type);
17211 DWORD_SWAP(&pbk32->data_size);
17212 pdata = pbk32 + 1;
17213 type = (WORD) pbk32->type;
17214 } else {
17215 WORD_SWAP(&pbk->type);
17216 WORD_SWAP(&pbk->data_size);
17217 pdata = pbk + 1;
17218 type = pbk->type;
17219 }
17220
17221 /* pbk points to next bank */
17222 if (bk_is32a(event)) {
17223 pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
17224 pbk = (BANK *) pbk32a;
17225 } else if (bk_is32(event)) {
17226 pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
17227 pbk = (BANK *) pbk32;
17228 } else {
17229 pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
17230 pbk32 = (BANK32 *) pbk;
17231 }
17232
17233 switch (type) {
17234 case TID_UINT16:
17235 case TID_INT16:
17236 while ((char *) pdata < (char *) pbk) {
17238 pdata = (void *) (((WORD *) pdata) + 1);
17239 }
17240 break;
17241
17242 case TID_UINT32:
17243 case TID_INT32:
17244 case TID_BOOL:
17245 case TID_FLOAT:
17246 while ((char *) pdata < (char *) pbk) {
17248 pdata = (void *) (((DWORD *) pdata) + 1);
17249 }
17250 break;
17251
17252 case TID_DOUBLE:
17253 case TID_INT64:
17254 case TID_UINT64:
17255 while ((char *) pdata < (char *) pbk) {
17257 pdata = (void *) (((double *) pdata) + 1);
17258 }
17259 break;
17260 }
17261 }
17262
17263 return CM_SUCCESS;
17264}
#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 16521 of file midas.cxx.

16522{
16523 // copy 4 byte bank name from "src" to "dst", set unused bytes of "dst" to NUL.
16524
16525 if (src[0] == 0) {
16526 // invalid empty name
16527 dst[0] = 0;
16528 dst[1] = 0;
16529 dst[2] = 0;
16530 dst[3] = 0;
16531 return;
16532 }
16533
16534 dst[0] = src[0];
16535
16536 if (src[1] == 0) {
16537 dst[1] = 0;
16538 dst[2] = 0;
16539 dst[3] = 0;
16540 return;
16541 }
16542
16543 dst[1] = src[1];
16544
16545 if (src[2] == 0) {
16546 dst[2] = 0;
16547 dst[3] = 0;
16548 return;
16549 }
16550
16551 dst[2] = src[2];
16552
16553 if (src[3] == 0) {
16554 dst[3] = 0;
16555 return;
16556 }
16557
16558 dst[3] = src[3];
16559}
Here is the caller graph for this function: