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

16747  {
16748  if (bk_is32a((BANK_HEADER *) event)) {
16749  BANK32A *pbk32a = (BANK32A *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16750  pbk32a->data_size = (DWORD) ((char *) pdata - (char *) (pbk32a + 1));
16751  if (pbk32a->type == TID_STRUCT && pbk32a->data_size == 0)
16752  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]);
16753  ((BANK_HEADER *) event)->data_size += sizeof(BANK32A) + ALIGN8(pbk32a->data_size);
16754  return pbk32a->data_size;
16755  } else if (bk_is32((BANK_HEADER *) event)) {
16756  BANK32 *pbk32 = (BANK32 *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16757  pbk32->data_size = (DWORD) ((char *) pdata - (char *) (pbk32 + 1));
16758  if (pbk32->type == TID_STRUCT && pbk32->data_size == 0)
16759  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]);
16760  ((BANK_HEADER *) event)->data_size += sizeof(BANK32) + ALIGN8(pbk32->data_size);
16761  return pbk32->data_size;
16762  } else {
16763  BANK *pbk = (BANK *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16764  uint32_t size = (uint32_t) ((char *) pdata - (char *) (pbk + 1));
16765  if (size > 0xFFFF) {
16766  printf("Error: Bank size %d exceeds 16-bit limit of 65526, please use bk_init32() to create a 32-bit bank\n", size);
16767  size = 0;
16768  }
16769  pbk->data_size = (WORD) (size);
16770  if (pbk->type == TID_STRUCT && pbk->data_size == 0)
16771  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]);
16772  size = ((BANK_HEADER *) event)->data_size + sizeof(BANK) + ALIGN8(pbk->data_size);
16773  if (size > 0xFFFF) {
16774  printf("Error: Bank size %d exceeds 16-bit limit of 65526, please use bk_init32() to create a 32-bit bank\n", size);
16775  size = 0;
16776  }
16777  ((BANK_HEADER *) event)->data_size = size;
16778  return pbk->data_size;
16779  }
16780 }
BOOL bk_is32a(const void *event)
Definition: midas.cxx:16404
BOOL bk_is32(const void *event)
Definition: midas.cxx:16382
unsigned short int WORD
Definition: mcstd.h:49
#define TID_STRUCT
Definition: midas.h:355
#define ALIGN8(x)
Definition: midas.h:528
#define DWORD
Definition: mhdump.cxx:31
char name[4]
Definition: midas.h:1234
DWORD type
Definition: midas.h:1235
DWORD data_size
Definition: midas.h:1236
Definition: midas.h:1227
char name[4]
Definition: midas.h:1228
DWORD data_size
Definition: midas.h:1230
DWORD type
Definition: midas.h:1229
Definition: midas.h:1221
char name[4]
Definition: midas.h:1222
WORD type
Definition: midas.h:1223
WORD data_size
Definition: midas.h:1224
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 16571 of file midas.cxx.

16571  {
16572 
16573  INT status;
16574  DWORD bklen, bktype, bksze;
16575  BANK_HEADER *psBkh;
16576  BANK *psbkh;
16577  char *pdest;
16578  void *psdata;
16579 
16580  // source pointing on the BANKxx
16581  psBkh = (BANK_HEADER *) ((EVENT_HEADER *) psrce + 1);
16582  // Find requested bank
16583  status = bk_find(psBkh, bkname, &bklen, &bktype, &psdata);
16584  // Return 0 if not found
16585  if (status != SUCCESS) return 0;
16586 
16587  // Check bank type...
16588  // You cannot mix BANK and BANK32 so make sure all the FE use either
16589  // bk_init(pevent) or bk_init32(pevent).
16590  if (bk_is32a(psBkh)) {
16591 
16592  // pointer to the source bank header
16593  BANK32A *psbkh32a = ((BANK32A *) psdata - 1);
16594  // Data size in the bank
16595  bksze = psbkh32a->data_size;
16596 
16597  // Get to the end of the event
16598  pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
16599  // Copy from BANK32 to end of Data
16600  memmove(pdest, (char *) psbkh32a, ALIGN8(bksze) + sizeof(BANK32A));
16601  // Bring pointer to the next free location
16602  pdest += ALIGN8(bksze) + sizeof(BANK32A);
16603 
16604  } else if (bk_is32(psBkh)) {
16605 
16606  // pointer to the source bank header
16607  BANK32 *psbkh32 = ((BANK32 *) psdata - 1);
16608  // Data size in the bank
16609  bksze = psbkh32->data_size;
16610 
16611  // Get to the end of the event
16612  pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
16613  // Copy from BANK32 to end of Data
16614  memmove(pdest, (char *) psbkh32, ALIGN8(bksze) + sizeof(BANK32));
16615  // Bring pointer to the next free location
16616  pdest += ALIGN8(bksze) + sizeof(BANK32);
16617 
16618  } else {
16619 
16620  // pointer to the source bank header
16621  psbkh = ((BANK *) psdata - 1);
16622  // Data size in the bank
16623  bksze = psbkh->data_size;
16624 
16625  // Get to the end of the event
16626  pdest = (char *) (((BANK_HEADER *) pevent) + 1) + ((BANK_HEADER *) pevent)->data_size;
16627  // Copy from BANK to end of Data
16628  memmove(pdest, (char *) psbkh, ALIGN8(bksze) + sizeof(BANK));
16629  // Bring pointer to the next free location
16630  pdest += ALIGN8(bksze) + sizeof(BANK);
16631  }
16632 
16633  // Close bank (adjust BANK_HEADER size)
16634  bk_close(pevent, pdest);
16635  // Adjust EVENT_HEADER size
16636  ((EVENT_HEADER *) pevent - 1)->data_size = ((BANK_HEADER *) pevent)->data_size + sizeof(BANK_HEADER);
16637  return SUCCESS;
16638 }
INT bk_close(void *event, void *pdata)
Definition: midas.cxx:16747
INT bk_find(const BANK_HEADER *pbkh, const char *name, DWORD *bklen, DWORD *bktype, void **pdata)
Definition: midas.cxx:16919
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:16373
void bk_create(void *event, const char *name, WORD type, void **pdata)
Definition: midas.cxx:16528
#define TID_INT32
Definition: midas.h:346
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 16528 of file midas.cxx.

16528  {
16529  if (bk_is32a((BANK_HEADER *) event)) {
16530  if (((PTYPE) event & 0x07) != 0) {
16531  cm_msg(MERROR, "bk_create", "Bank %s created with unaligned event pointer", name);
16532  return;
16533  }
16534  BANK32A *pbk32a;
16535 
16536  pbk32a = (BANK32A *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16537  copy_bk_name(pbk32a->name, name);
16538  pbk32a->type = type;
16539  pbk32a->data_size = 0;
16540  *pdata = pbk32a + 1;
16541  } else if (bk_is32((BANK_HEADER *) event)) {
16542  BANK32 *pbk32;
16543 
16544  pbk32 = (BANK32 *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16545  copy_bk_name(pbk32->name, name);
16546  pbk32->type = type;
16547  pbk32->data_size = 0;
16548  *pdata = pbk32 + 1;
16549  } else {
16550  BANK *pbk;
16551 
16552  pbk = (BANK *) ((char *) (((BANK_HEADER *) event) + 1) + ((BANK_HEADER *) event)->data_size);
16553  copy_bk_name(pbk->name, name);
16554  pbk->type = type;
16555  pbk->data_size = 0;
16556  *pdata = pbk + 1;
16557  }
16558 }
static void copy_bk_name(char *dst, const char *src)
Definition: midas.cxx:16466
#define MERROR
Definition: midas.h:565
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
Definition: midas.cxx:917
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 16641 of file midas.cxx.

16657 {
16658  BANK *pbk;
16659  DWORD dname;
16660  int remaining;
16661 
16662  if (bk_is32a((BANK_HEADER *) event)) {
16663  /* locate bank */
16664  BANK32A *pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
16665  copy_bk_name((char *) &dname, name);
16666  do {
16667  if (*((DWORD *) pbk32a->name) == dname) {
16668  /* bank found, delete it */
16669  remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
16670  sizeof(BANK_HEADER)) - ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16671 
16672  /* reduce total event size */
16673  ((BANK_HEADER *) event)->data_size -= sizeof(BANK32) + ALIGN8(pbk32a->data_size);
16674 
16675  /* copy remaining bytes */
16676  if (remaining > 0)
16677  memmove(pbk32a, (char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size), remaining);
16678  return CM_SUCCESS;
16679  }
16680 
16681  pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16682  } while ((DWORD) ((char *) pbk32a - (char *) event) <
16683  ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
16684  } else if (bk_is32((BANK_HEADER *) event)) {
16685  /* locate bank */
16686  BANK32 *pbk32 = (BANK32 *) (((BANK_HEADER *) event) + 1);
16687  copy_bk_name((char *) &dname, name);
16688  do {
16689  if (*((DWORD *) pbk32->name) == dname) {
16690  /* bank found, delete it */
16691  remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
16692  sizeof(BANK_HEADER)) - ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16693 
16694  /* reduce total event size */
16695  ((BANK_HEADER *) event)->data_size -= sizeof(BANK32) + ALIGN8(pbk32->data_size);
16696 
16697  /* copy remaining bytes */
16698  if (remaining > 0)
16699  memmove(pbk32, (char *) (pbk32 + 1) + ALIGN8(pbk32->data_size), remaining);
16700  return CM_SUCCESS;
16701  }
16702 
16703  pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16704  } while ((DWORD) ((char *) pbk32 - (char *) event) <
16705  ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
16706  } else {
16707  /* locate bank */
16708  pbk = (BANK *) (((BANK_HEADER *) event) + 1);
16709  copy_bk_name((char *) &dname, name);
16710  do {
16711  if (*((DWORD *) pbk->name) == dname) {
16712  /* bank found, delete it */
16713  remaining = ((char *) event + ((BANK_HEADER *) event)->data_size +
16714  sizeof(BANK_HEADER)) - ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
16715 
16716  /* reduce total event size */
16717  ((BANK_HEADER *) event)->data_size -= sizeof(BANK) + ALIGN8(pbk->data_size);
16718 
16719  /* copy remaining bytes */
16720  if (remaining > 0)
16721  memmove(pbk, (char *) (pbk + 1) + ALIGN8(pbk->data_size), remaining);
16722  return CM_SUCCESS;
16723  }
16724 
16725  pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
16726  } while ((DWORD) ((char *) pbk - (char *) event) <
16727  ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER));
16728  }
16729 
16730  return 0;
16731 }
#define CM_SUCCESS
Definition: midas.h:588
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 16919 of file midas.cxx.

16919  {
16920  DWORD dname;
16921 
16922  if (bk_is32a(pbkh)) {
16923  BANK32A *pbk32a = (BANK32A *) (pbkh + 1);
16924  copy_bk_name((char *) &dname, name);
16925  do {
16926  if (*((DWORD *) pbk32a->name) == dname) {
16927  *((void **) pdata) = pbk32a + 1;
16928  if (tid_size[pbk32a->type & 0xFF] == 0)
16929  *bklen = pbk32a->data_size;
16930  else
16931  *bklen = pbk32a->data_size / tid_size[pbk32a->type & 0xFF];
16932 
16933  *bktype = pbk32a->type;
16934  return 1;
16935  }
16936  pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16937  } while ((DWORD) ((char *) pbk32a - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
16938  } else if (bk_is32(pbkh)) {
16939  BANK32 *pbk32 = (BANK32 *) (pbkh + 1);
16940  copy_bk_name((char *) &dname, name);
16941  do {
16942  if (*((DWORD *) pbk32->name) == dname) {
16943  *((void **) pdata) = pbk32 + 1;
16944  if (tid_size[pbk32->type & 0xFF] == 0)
16945  *bklen = pbk32->data_size;
16946  else
16947  *bklen = pbk32->data_size / tid_size[pbk32->type & 0xFF];
16948 
16949  *bktype = pbk32->type;
16950  return 1;
16951  }
16952  pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16953  } while ((DWORD) ((char *) pbk32 - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
16954  } else {
16955  BANK *pbk = (BANK *) (pbkh + 1);
16956  copy_bk_name((char *) &dname, name);
16957  do {
16958  if (*((DWORD *) pbk->name) == dname) {
16959  *((void **) pdata) = pbk + 1;
16960  if (tid_size[pbk->type & 0xFF] == 0)
16961  *bklen = pbk->data_size;
16962  else
16963  *bklen = pbk->data_size / tid_size[pbk->type & 0xFF];
16964 
16965  *bktype = pbk->type;
16966  return 1;
16967  }
16968  pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
16969  } while ((DWORD) ((char *) pbk - (char *) pbkh) < pbkh->data_size + sizeof(BANK_HEADER));
16970  }
16971 
16972  /* bank not found */
16973  *((void **) pdata) = NULL;
16974  return 0;
16975 }
static const int tid_size[]
Definition: midas.cxx:68
DWORD data_size
Definition: midas.h:1217
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 16373 of file midas.cxx.

16373  {
16374  ((BANK_HEADER *) event)->data_size = 0;
16375  ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION;
16376 }
#define BANK_FORMAT_VERSION
Definition: midas.h:1209
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 16436 of file midas.cxx.

16436  {
16437  ((BANK_HEADER *) event)->data_size = 0;
16438  ((BANK_HEADER *) event)->flags = BANK_FORMAT_VERSION | BANK_FORMAT_32BIT;
16439 }
#define BANK_FORMAT_32BIT
Definition: midas.h:1210
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 16449 of file midas.cxx.

16449  {
16450  ((BANK_HEADER *) event)->data_size = 0;
16452 }
#define BANK_FORMAT_64BIT_ALIGNED
Definition: midas.h:1211
Here is the caller graph for this function:

◆ bk_is32()

BOOL bk_is32 ( const void *  event)

dox

Definition at line 16382 of file midas.cxx.

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

◆ bk_is32a()

BOOL bk_is32a ( const void *  event)

Definition at line 16404 of file midas.cxx.

16422 {
16423  return ((((BANK_HEADER *) event)->flags & BANK_FORMAT_64BIT_ALIGNED) > 0);
16424 }
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:17013
#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 17013 of file midas.cxx.

17013  {
17014  if (*pbk == NULL)
17015  *pbk = (BANK *) (((BANK_HEADER *) event) + 1);
17016  else
17017  *pbk = (BANK *) ((char *) (*pbk + 1) + ALIGN8((*pbk)->data_size));
17018 
17019  *((void **) pdata) = (*pbk) + 1;
17020 
17021  if ((DWORD) ((char *) *pbk - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
17022  *pbk = *((BANK **) pdata) = NULL;
17023  return 0;
17024  }
17025 
17026  return (*pbk)->data_size;
17027 }
Here is the caller graph for this function:

◆ bk_iterate32()

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

dox

Definition at line 17034 of file midas.cxx.

17053 {
17054  if (*pbk == NULL)
17055  *pbk = (BANK32 *) (((BANK_HEADER *) event) + 1);
17056  else
17057  *pbk = (BANK32 *) ((char *) (*pbk + 1) + ALIGN8((*pbk)->data_size));
17058 
17059  *((void **) pdata) = (*pbk) + 1;
17060 
17061  if ((DWORD) ((char *) *pbk - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
17062  *pbk = NULL;
17063  pdata = NULL;
17064  return 0;
17065  }
17066 
17067  return (*pbk)->data_size;
17068 }
Here is the caller graph for this function:

◆ bk_iterate32a()

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

Definition at line 17070 of file midas.cxx.

17089 {
17090  if (*pbk32a == NULL)
17091  *pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
17092  else
17093  *pbk32a = (BANK32A *) ((char *) (*pbk32a + 1) + ALIGN8((*pbk32a)->data_size));
17094 
17095  *((void **) pdata) = (*pbk32a) + 1;
17096 
17097  if ((DWORD) ((char *) *pbk32a - (char *) event) >= ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
17098  *pbk32a = NULL;
17099  pdata = NULL;
17100  return 0;
17101  }
17102 
17103  return (*pbk32a)->data_size;
17104 }
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:16856
INT bk_list(const void *event, char *bklist)
Definition: midas.cxx:16807
#define STRING_BANKLIST_MAX
Definition: midas.h:286
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 16807 of file midas.cxx.

16807  { /* Full event */
16808  INT nbk;
16809  BANK *pmbk = NULL;
16810  BANK32 *pmbk32 = NULL;
16811  BANK32A *pmbk32a = NULL;
16812  char *pdata;
16813 
16814  /* compose bank list */
16815  bklist[0] = 0;
16816  nbk = 0;
16817  do {
16818  /* scan all banks for bank name only */
16819  if (bk_is32a(event)) {
16820  bk_iterate32a(event, &pmbk32a, &pdata);
16821  if (pmbk32a == NULL)
16822  break;
16823  } else if (bk_is32(event)) {
16824  bk_iterate32(event, &pmbk32, &pdata);
16825  if (pmbk32 == NULL)
16826  break;
16827  } else {
16828  bk_iterate(event, &pmbk, &pdata);
16829  if (pmbk == NULL)
16830  break;
16831  }
16832  nbk++;
16833 
16834  if (nbk > BANKLIST_MAX) {
16835  cm_msg(MINFO, "bk_list", "over %i banks -> truncated", BANKLIST_MAX);
16836  return (nbk - 1);
16837  }
16838  if (bk_is32a(event))
16839  strncat(bklist, (char *) pmbk32a->name, 4);
16840  else if (bk_is32(event))
16841  strncat(bklist, (char *) pmbk32->name, 4);
16842  else
16843  strncat(bklist, (char *) pmbk->name, 4);
16844  } while (1);
16845  return (nbk);
16846 }
INT bk_iterate32a(const void *event, BANK32A **pbk32a, void *pdata)
Definition: midas.cxx:17070
INT bk_iterate32(const void *event, BANK32 **pbk, void *pdata)
Definition: midas.cxx:17034
#define MINFO
Definition: midas.h:566
#define BANKLIST_MAX
Definition: midas.h:285
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 16856 of file midas.cxx.

16856  {
16857  BANK *pbk;
16858  BANK32 *pbk32;
16859  BANK32A *pbk32a;
16860  DWORD dname;
16861 
16862  if (bk_is32a(event)) {
16863  pbk32a = (BANK32A *) (((BANK_HEADER *) event) + 1);
16864  copy_bk_name((char *) &dname, name);
16865  while ((DWORD) ((char *) pbk32a - (char *) event) <
16866  ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
16867  if (*((DWORD *) pbk32a->name) == dname) {
16868  *((void **) pdata) = pbk32a + 1;
16869  if (tid_size[pbk32a->type & 0xFF] == 0)
16870  return pbk32a->data_size;
16871  return pbk32a->data_size / tid_size[pbk32a->type & 0xFF];
16872  }
16873  pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
16874  }
16875  } else if (bk_is32(event)) {
16876  pbk32 = (BANK32 *) (((BANK_HEADER *) event) + 1);
16877  copy_bk_name((char *) &dname, name);
16878  while ((DWORD) ((char *) pbk32 - (char *) event) <
16879  ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
16880  if (*((DWORD *) pbk32->name) == dname) {
16881  *((void **) pdata) = pbk32 + 1;
16882  if (tid_size[pbk32->type & 0xFF] == 0)
16883  return pbk32->data_size;
16884  return pbk32->data_size / tid_size[pbk32->type & 0xFF];
16885  }
16886  pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
16887  }
16888  } else {
16889  pbk = (BANK *) (((BANK_HEADER *) event) + 1);
16890  copy_bk_name((char *) &dname, name);
16891  while ((DWORD) ((char *) pbk - (char *) event) <
16892  ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER)) {
16893  if (*((DWORD *) pbk->name) == dname) {
16894  *((void **) pdata) = pbk + 1;
16895  if (tid_size[pbk->type & 0xFF] == 0)
16896  return pbk->data_size;
16897  return pbk->data_size / tid_size[pbk->type & 0xFF];
16898  }
16899  pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
16900  }
16901 
16902  }
16903 
16904  /* bank not found */
16905  *((void **) pdata) = NULL;
16906  return 0;
16907 }
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 16462 of file midas.cxx.

16462  {
16463  return ((BANK_HEADER *) event)->data_size + sizeof(BANK_HEADER);
16464 }
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 17124 of file midas.cxx.

17124  {
17125  BANK_HEADER *pbh;
17126  BANK *pbk;
17127  BANK32 *pbk32;
17128  BANK32A *pbk32a;
17129  void *pdata;
17130  WORD type;
17131 
17132  pbh = (BANK_HEADER *) event;
17133 
17134  /* only swap if flags in high 16-bit */
17135  if (pbh->flags < 0x10000 && !force)
17136  return 0;
17137 
17138  /* swap bank header */
17139  DWORD_SWAP(&pbh->data_size);
17140  DWORD_SWAP(&pbh->flags);
17141 
17142  pbk = (BANK *) (pbh + 1);
17143  pbk32 = (BANK32 *) pbk;
17144  pbk32a = (BANK32A *) pbk;
17145 
17146  /* scan event */
17147  while ((char *) pbk - (char *) pbh < (INT) pbh->data_size + (INT) sizeof(BANK_HEADER)) {
17148  /* swap bank header */
17149  if (bk_is32a(event)) {
17150  DWORD_SWAP(&pbk32a->type);
17151  DWORD_SWAP(&pbk32a->data_size);
17152  pdata = pbk32a + 1;
17153  type = (WORD) pbk32a->type;
17154  } else if (bk_is32(event)) {
17155  DWORD_SWAP(&pbk32->type);
17156  DWORD_SWAP(&pbk32->data_size);
17157  pdata = pbk32 + 1;
17158  type = (WORD) pbk32->type;
17159  } else {
17160  WORD_SWAP(&pbk->type);
17161  WORD_SWAP(&pbk->data_size);
17162  pdata = pbk + 1;
17163  type = pbk->type;
17164  }
17165 
17166  /* pbk points to next bank */
17167  if (bk_is32a(event)) {
17168  pbk32a = (BANK32A *) ((char *) (pbk32a + 1) + ALIGN8(pbk32a->data_size));
17169  pbk = (BANK *) pbk32a;
17170  } else if (bk_is32(event)) {
17171  pbk32 = (BANK32 *) ((char *) (pbk32 + 1) + ALIGN8(pbk32->data_size));
17172  pbk = (BANK *) pbk32;
17173  } else {
17174  pbk = (BANK *) ((char *) (pbk + 1) + ALIGN8(pbk->data_size));
17175  pbk32 = (BANK32 *) pbk;
17176  }
17177 
17178  switch (type) {
17179  case TID_UINT16:
17180  case TID_INT16:
17181  while ((char *) pdata < (char *) pbk) {
17182  WORD_SWAP(pdata);
17183  pdata = (void *) (((WORD *) pdata) + 1);
17184  }
17185  break;
17186 
17187  case TID_UINT32:
17188  case TID_INT32:
17189  case TID_BOOL:
17190  case TID_FLOAT:
17191  while ((char *) pdata < (char *) pbk) {
17192  DWORD_SWAP(pdata);
17193  pdata = (void *) (((DWORD *) pdata) + 1);
17194  }
17195  break;
17196 
17197  case TID_DOUBLE:
17198  case TID_INT64:
17199  case TID_UINT64:
17200  while ((char *) pdata < (char *) pbk) {
17201  QWORD_SWAP(pdata);
17202  pdata = (void *) (((double *) pdata) + 1);
17203  }
17204  break;
17205  }
17206  }
17207 
17208  return CM_SUCCESS;
17209 }
#define TID_DOUBLE
Definition: midas.h:350
#define TID_BOOL
Definition: midas.h:347
#define TID_UINT64
Definition: midas.h:359
#define TID_INT64
Definition: midas.h:358
#define TID_UINT32
Definition: midas.h:344
#define TID_UINT16
Definition: midas.h:340
#define TID_INT16
Definition: midas.h:342
#define TID_FLOAT
Definition: midas.h:348
#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:1218
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 16466 of file midas.cxx.

16467 {
16468  // copy 4 byte bank name from "src" to "dst", set unused bytes of "dst" to NUL.
16469 
16470  if (src[0] == 0) {
16471  // invalid empty name
16472  dst[0] = 0;
16473  dst[1] = 0;
16474  dst[2] = 0;
16475  dst[3] = 0;
16476  return;
16477  }
16478 
16479  dst[0] = src[0];
16480 
16481  if (src[1] == 0) {
16482  dst[1] = 0;
16483  dst[2] = 0;
16484  dst[3] = 0;
16485  return;
16486  }
16487 
16488  dst[1] = src[1];
16489 
16490  if (src[2] == 0) {
16491  dst[2] = 0;
16492  dst[3] = 0;
16493  return;
16494  }
16495 
16496  dst[2] = src[2];
16497 
16498  if (src[3] == 0) {
16499  dst[3] = 0;
16500  return;
16501  }
16502 
16503  dst[3] = src[3];
16504 }
Here is the caller graph for this function: