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

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

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

17965 {
17966 if (bk_is32a((BANK_HEADER *) event)) {
17967 if (((PTYPE) event & 0x07) != 0) {
17968 cm_msg(MERROR, "bk_create", "Bank %s created with unaligned event pointer", name);
17969 return;
17970 }
17971 BANK32A *pbk32a;
17972
17973 pbk32a = (BANK32A *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
17974 copy_bk_name(pbk32a->name, name);
17975 pbk32a->type = type;
17976 pbk32a->data_size = 0;
17977 *pdata = pbk32a + 1;
17978 } else if (bk_is32((BANK_HEADER *) event)) {
17979 BANK32 *pbk32;
17980
17981 pbk32 = (BANK32 *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
17982 copy_bk_name(pbk32->name, name);
17983 pbk32->type = type;
17984 pbk32->data_size = 0;
17985 *pdata = pbk32 + 1;
17986 } else {
17987 BANK *pbk;
17988
17989 pbk = (BANK *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
17990 copy_bk_name(pbk->name, name);
17991 pbk->type = type;
17992 pbk->data_size = 0;
17993 *pdata = pbk + 1;
17994 }
17995}
static void copy_bk_name(char *dst, const char *src)
Definition midas.cxx:17903
#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 18078 of file midas.cxx.

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

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

17810 {
17811 ((BANK_HEADER *) event)->data_size = 0;
17812 ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION;
17813}
#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 17873 of file midas.cxx.

17873 {
17874 ((BANK_HEADER *) event)->data_size = 0;
17875 ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION | BANK_FORMAT_32BIT;
17876}
#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 17886 of file midas.cxx.

17886 {
17887 ((BANK_HEADER *) event)->data_size = 0;
17889}
#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 17819 of file midas.cxx.

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

◆ bk_is32a()

BOOL bk_is32a ( const void *  event)

Definition at line 17841 of file midas.cxx.

17859{
17860 return ((((BANK_HEADER *) event)->flags & BANK_FORMAT_64BIT_ALIGNED) > 0);
17861}
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:18450
#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 18450 of file midas.cxx.

18450 {
18451 if (*pbk == NULL)
18452 *pbk = (BANK *) (((BANK_HEADER *) event) + 1);
18453 else
18454 *pbk = (BANK *) ((char *) (*pbk + 1) + ALIGN8((*pbk)->data_size));
18455
18456 *((void **) pdata) = (*pbk) + 1;
18457
18458 if ((DWORD) ((char *) *pbk - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
18459 *pbk = *((BANK **) pdata) = NULL;
18460 return 0;
18461 }
18462
18463 return (*pbk)->data_size;
18464}
Here is the caller graph for this function:

◆ bk_iterate32()

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

dox

Definition at line 18471 of file midas.cxx.

18490{
18491 if (*pbk == NULL)
18492 *pbk = (BANK32 *) (((BANK_HEADER *) event) + 1);
18493 else
18494 *pbk = (BANK32 *) ((char *) (*pbk + 1) + ALIGN8((*pbk)->data_size));
18495
18496 *((void **) pdata) = (*pbk) + 1;
18497
18498 if ((DWORD) ((char *) *pbk - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
18499 *pbk = NULL;
18500 pdata = NULL;
18501 return 0;
18502 }
18503
18504 return (*pbk)->data_size;
18505}
Here is the caller graph for this function:

◆ bk_iterate32a()

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

Definition at line 18507 of file midas.cxx.

18526{
18527 if (*pbk32a == NULL)
18528 *pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
18529 else
18530 *pbk32a = (BANK32A *) ((char *) (*pbk32a + 1) + ALIGN8((*pbk32a)->data_size));
18531
18532 *((void **) pdata) = (*pbk32a) + 1;
18533
18534 if ((DWORD) ((char *) *pbk32a - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
18535 *pbk32a = NULL;
18536 pdata = NULL;
18537 return 0;
18538 }
18539
18540 return (*pbk32a)->data_size;
18541}
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:18293
INT bk_list(const void *event, char *bklist)
Definition midas.cxx:18244
#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 18244 of file midas.cxx.

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

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

17899 {
17900 return ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER);
17901}
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 18561 of file midas.cxx.

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

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