18 #include <sys/types.h>
40 #define fgetpos64 fgetpos
42 #define fseeko64 fseek
43 #define fpos64_t fpos_t
50 #define fgetpos64 fgetpos
52 #define fseeko64 fseek
53 #define fpos64_t fpos_t
68 #define OFFSET__ENTRIES 250000
80 struct timespec clock;
88 printf(
"fLmdPutOpen: memory allocation error\n");
98 clock_gettime(CLOCK_REALTIME,&clock);
104 strcpy(pLmdControl->
cFile,Filename);
108 pLmdControl->
pBuffer = (int16_t*) malloc(iBytes);
115 if((pLmdControl->
fFile=(FILE *)fopen64(Filename,
"r") )!=NULL){
116 printf(
"fLmdPutOpen: File exists: %s\n",Filename);
118 fclose(pLmdControl->
fFile);
123 if((pLmdControl->
fFile=(FILE *)fopen64(Filename,
"w+") )== NULL){
124 printf(
"fLmdPutOpen: Error open file %s\n",Filename);
136 pLmdControl->
iBytes+=iReturn;
139 printf(
"fLmdPutOpen: %s. Bytes:%d over:%d table:%d large:%d.\n",
140 Filename,iBytes,iOver,iUseOffset,iLargeFile);
148 uint32_t *ps, *pd, i, elements;
149 int64_t fileleft,used;
155 used=pLmdControl->
iBytes/4;
156 fileleft=0xffffffff - used - (4+elements);
157 if((int64_t)(pHeader->
iWords/2+2) > fileleft){
158 printf(
"fLmdPutElement: File size exceed\n");
169 pLmdControl->
iBytes+=iReturn;
170 if(iReturn != (pHeader->
iWords+4)*2){
171 printf(
"fLmdPutElement: Write error \n");
183 pLmdControl->
iBytes+=iReturn;
188 printf(
"fLmdPutElement: Element too big: %d words\n",pHeader->
iWords+4);
192 ps=(uint32_t *)pHeader;
194 iReturn=(pHeader->
iWords+4)/2;
195 for(i=0;i<iReturn;i++) *pd++ = *ps++;
210 uint32_t Bytes=0,TotalBytes=0,i, elements;
211 int64_t fileleft,used;
218 used=pLmdControl->
iBytes/4;
219 fileleft=0xffffffff - used - (4+elements);
220 for(i=0;i<Items;i++) {
225 if((int64_t)TotalBytes/4 > fileleft){
226 printf(
"fLmdPutElement: File size exceed\n");
244 pLmdControl->
iBytes+=iReturn;
260 pLmdControl->
iBytes+=iReturn;
262 printf(
"fLmdPutClose: Error writing last buffer. Closing file.\n");
264 rewind(pLmdControl->
fFile);
276 rewind(pLmdControl->
fFile);
292 if(iBuffers > 1){printf(
"fLmdInitMbs: Event spanning not supported!\n");
return(
LMD__FAILURE);}
293 if(iStreams > 0){printf(
"fLmdInitMbs: MBS not in DABC mode!\n");
return(
LMD__FAILURE);}
294 pLmdControl->
iPort=iPort;
295 strcpy(pLmdControl->
cFile,Nodename);
296 if(pLmdControl->
pBuffer == NULL) pLmdControl->
pBuffer = (int16_t*) malloc(iMaxBytes);
311 memset(cClose,0,
sizeof(cClose));
312 strcpy(cClose,
"CLOSE");
350 uint32_t *iBytesUsed){
353 uint32_t usedBytes=0,leftBytes=0;
364 printf(
"fLmdGetMbsBuffer: Need buffer to read\n");
368 printf(
"fLmdGetMbsBuffer: %s buffer size %d too small for %d bytes\n", pLmdControl->
cFile, leftBytes,
374 memset(cRequest,0,
sizeof(cRequest));
375 strcpy(cRequest,
"GETEVT");
383 printf(
"fLmdGetMbsBuffer: %s buffer size %d too small for %lu bytes\n",
388 if((pBuf->
iType&0xffff) == 100)
389 iReturn=
f_stc_read((int32_t *)(pBuf+1),usedBytes,pLmdControl->
iTCP,-1);
392 if(pLmdControl->
iSwap)
fLmdSwap4((uint32_t *)(pBuf+1),usedBytes/4);
394 if(iElements != NULL)*iElements =pBuf->
iElements;
395 pLmdControl->
iBytes += usedBytes;
411 uint32_t bufferBytes=0;
424 strcpy(pLmdControl->
cFile,Filename);
425 if((pLmdControl->
fFile=(FILE *)fopen64(Filename,
"r"))== NULL)
427 printf(
"fLmdGetOpen: File not found: %s\n",Filename);
436 printf(
"fLmdGetOpen: LMD format error: no LMD file: %s\n",Filename);
442 if(pLmdControl->
iSwap){
443 printf(
"do swap !!!\n");
448 printf(
"fLmdGetOpen: LMD format error: no LMD file: %s, type is %0x\n",
459 printf(
"fLmdGetOpen: Index format error: %s\n",Filename);
465 pLmdControl->
iBytes+=iReturn;
475 printf(
"fLmdGetOpen: LMD format error: no LMD file: %s\n",Filename);
481 bufferBytes = iBytes;
482 if(bufferBytes < pLmdControl->pMbsFileHeader->iMaxWords*2)
485 pLmdControl->
pBuffer = (int16_t *)malloc(bufferBytes);
489 printf(
"fLmdGetOpen: %s words %u\n", Filename, pLmdControl->
iBufferWords);
497 uint32_t *iBytesUsed)
501 uint32_t elem = 0, leftBytes = 0, used, elem_sz;
504 if (iBytes < pLmdControl->pMbsFileHeader->iMaxWords) {
505 printf(
"fLmdGetBuffer: %s buffer size %d too small for %d bytes\n", pLmdControl->
cFile, iBytes,
509 if (pMbsHeader == NULL) {
510 printf(
"fLmdGetBuffer: Need buffer to read\n");
524 printf(
"fLmdGetBuffer: EOF: %s\n", pLmdControl->
cFile);
527 if (iReturn != used) {
528 printf(
"fLmdGetBuffer: LMD read error: unexpected EOF: %s %u %u\n", pLmdControl->
cFile, iReturn, used);
533 if (pLmdControl->
iSwap)
534 fLmdSwap4((uint32_t *)pMbsHeader, iReturn / 4);
535 pLmdControl->
iBytes += iReturn;
542 if (leftBytes > iBytes) {
543 printf(
"fLmdGetBuffer: stored piece of data (%u) larger than provided buffer (%u)\n",
549 printf(
"fLmdGetBuffer: Internal error pMbsHeader==0\n");
553 memcpy(pMbsHeader, pLmdControl->
pMbsHeader, leftBytes);
555 iReturn =
fLmdReadBuffer(pLmdControl,(
char *)pMbsHeader+leftBytes, iBytes-leftBytes);
557 printf(
"fLmdGetBuffer: EOF: %s\n",pLmdControl->
cFile);
559 printf(
"fLmdGetBuffer: EOF while we have some rest data (%u)\n", leftBytes);
564 if(iReturn > (iBytes-leftBytes)) {
565 printf(
"fLmdGetBuffer: LMD read error %s - too many bytes read %u wants %u",
566 pLmdControl->
cFile, iReturn, iBytes-leftBytes);
570 if(pLmdControl->
iSwap)
fLmdSwap4((uint32_t *)pMbsHeader+leftBytes/4,iReturn/4);
571 pLmdControl->
iBytes += iReturn;
572 leftBytes += iReturn;
575 while(leftBytes >=8){
577 elem_sz = (pm->
iWords+4)*2;
578 if(elem_sz > leftBytes)
break;
580 *iBytesUsed += elem_sz;
584 leftBytes -= elem_sz;
590 printf(
"fLmdGetBuffer: ERROR: internal buffer overflow. Needed:%d available:%d\n",
594 memcpy(pLmdControl->
pBuffer,pm,leftBytes);
633 if(iReturn <= 0) { printf(
"fLmdGetElement: EOF\n");
return(
GETLMD__EOFILE); }
637 pLmdControl->
iBytes += iReturn;
647 printf (
"fLmdGetElement: Error, full element %u does not fit in buffer %u",
666 if(iReturn <= 0) {printf(
"fLmdGetElement: EOF\n");
return(
GETLMD__EOFILE);}
668 printf(
"fLmdGetBuffer: LMD read error: unexpected EOF: %s\n",pLmdControl->
cFile);
674 printf(
"fLmdGetElement: Error Event %d: size from table is %d, header %d\n",
678 pLmdControl->
iBytes+=iReturn;
689 if(fclose(pLmdControl->
fFile)!=0) {
690 pLmdControl->
fFile=NULL;
693 pLmdControl->
fFile=NULL;
699 IObytes=(int32_t)fread(buffer,1,bytes,pLmdControl->
fFile);
706 IObytes=(int32_t)fwrite(buffer,1,bytes,pLmdControl->
fFile);
714 bytes=pLmdControl->
iBytes;
727 if(pLmdControl->
pTCP != NULL)free(pLmdControl->
pTCP);
735 pLmdControl->
pTCP=NULL;
749 if(pLmdControl != NULL)
750 return(pLmdControl->
iSwap);
758 else printf(
"fLmdSetWrittenEndian: No file header allocated!");
765 else printf(
"fLmdGetWrittenEndian: No file header allocated!");
782 uint32_t elem=0,i,*iff1,*iff2;
787 for(i=pLmdControl->
iElements;i<pLmdControl->iOffsetEntries-1;i++){
788 if((*(iff1+1)-*iff2)>bytes/4)
break;
793 *used=(*iff1-*iff2)*4;
799 for(i=pLmdControl->
iElements;i<pLmdControl->iOffsetEntries-1;i++){
800 if((*(off1+1)-*off2)>bytes/4)
break;
805 *used=(*off1-*off2)*4;
819 printf(
"fLmdGetBuffer: LMD read error: unexpected EOF: %s\n",pLmdControl->
cFile);
825 printf(
"fLmdOffsetTable: LMD format error: no index table: %s, type %0x\n",
838 printf(
"fLmdOffsetTable: LMD format error: no index table: %s\n",pLmdControl->
cFile);
842 if(pLmdControl->
iSwap){
865 printf(
"fLmdOffsetWrite: memory allocation error\n");
868 memset(pTableHead,0,16);
873 iReturn=fgetpos64(pLmdControl->
fFile,(fpos64_t *) ¤t);
877 if(pbuf == NULL) pbuf=(
char *)pLmdControl->
pOffset8;
885 printf(
"Table offset mismatch: current:%llu calculated:%llu, cur-cal %llu\n", (
long long unsigned)current / 4,
891 printf(
"Table write error \n");
914 return (*(pLmdControl->
pOffset8 + index));
922 uint32_t oldEntries,newEntries;
938 pLmdControl->
pOffset4=(uint32_t *)
new;
948 pLmdControl->
pOffset4=(uint32_t *)
new;
958 if (pMbsBufferHeader) {
959 printf(
"BfHd: # %d, DataWords:%d Type:%08x Elements:%d sec:%d.%d MaxWords:%d\n", pMbsBufferHeader->
iBuffer,
969 if (pMbsFileHeader) {
970 printf(
"FiHd: DataWords:%d Type:%d.%d Elements:%d sec:%d.%d MaxWords:%d Index: %llx[%d]\n",
982 printf(
"ElHd: words:%d type:%08x\n", pMbsHeader->
iWords, pMbsHeader->
iType);
990 if (pMbsEventHeader) {
991 printf(
"EvHd: words:%6d type:%08x trigger:%2d #:%4d\n", pMbsEventHeader->
iWords, pMbsEventHeader->
iType,
1000 printf(
"Ctrl: file:%s words:%d left:%d bytes read:%llu elements:%d\n", pLmdControl->
cFile,
1011 for (i = 0; i < items; i++) {
1012 *pp = (*pp >> 24) + ((*pp >> 8) & 0x0000ff00) + ((*pp << 8) & 0x00ff0000) + (*pp << 24);
1022 for (i = 0; i < items; i++) {
1023 *pp = (*pp << 32) + (*pp >> 32);
uint32_t fLmdOffsetWrite(sLmdControl *)
#define LMD__STANDARD_HEADER
INTS4 f_stc_close(struct s_tcpcomm *ps_tcp)
INTS4 f_stc_read(void *p_buffer, INTS4 i_buflen, INTS4 i_channel, INTS4 i_timeout)
int32_t fLmdWriteBuffer(sLmdControl *, char *, uint32_t)
#define LMD__ENDIAN_UNKNOWN
#define LMD__NO_OVERWRITE
INTS4 f_stc_write(void *p_buffer, INTS4 i_buflen, INTS4 i_channel)
#define PUTLMD__FILE_EXIST
uint32_t fLmdOffsetSet(sLmdControl *, uint32_t)
uint32_t fLmdCleanup(sLmdControl *)
void fLmdOffsetElements(sLmdControl *, uint32_t, uint32_t *, uint32_t *)
void fLmdPrintFileHeader(uint32_t iVerbose, sMbsFileHeader *pMbsFileHeader)
uint32_t fLmdGetMbsEvent(sLmdControl *pLmdControl, sMbsHeader **event)
uint32_t fLmdGetElement(sLmdControl *pLmdControl, uint32_t iEvent, sMbsHeader **event)
uint32_t fLmdInitMbs(sLmdControl *pLmdControl, char *Nodename, uint32_t iMaxBytes, uint32_t iBuffers, uint32_t iStreams, uint32_t iPort, uint32_t iTimeout)
uint32_t fLmdPutClose(sLmdControl *pLmdControl)
uint32_t fLmdGetClose(sLmdControl *pLmdControl)
#define LMD__TYPE_FILE_INDEX_101_2
void fLmdSwap4(uint32_t *array, uint32_t items)
uint64_t fLmdGetBytesWritten(sLmdControl *pLmdControl)
#define GETLMD__OUTOF_RANGE
void fLmdSetWrittenEndian(sLmdControl *pLmdControl, uint32_t iE)
uint32_t fLmdGetBuffer(sLmdControl *pLmdControl, sMbsHeader *pMbsHeader, uint32_t iBytes, uint32_t *iElements, uint32_t *iBytesUsed)
#define GETLMD__SIZE_ERROR
uint32_t fLmdGetWrittenEndian(sLmdControl *pLmdControl)
void fLmdPrintEvent(uint32_t iVerbose, sMbsEventHeader *pMbsEventHeader)
uint32_t fLmdGetOpen(sLmdControl *pLmdControl, char *Filename, sMbsFileHeader *pBuffHead, uint32_t iBytes, uint32_t iUseOffset)
void fLmdPrintHeader(uint32_t iVerbose, sMbsHeader *pMbsHeader)
int32_t fLmdReadBuffer(sLmdControl *pLmdControl, char *buffer, uint32_t bytes)
uint32_t fLmdCloseMbs(sLmdControl *pLmdControl)
#define GETLMD__NOLMDFILE
void fLmdPrintControl(uint32_t iVerbose, sLmdControl *pLmdControl)
lmdoff_t fLmdOffsetGet(sLmdControl *, uint32_t)
sLmdControl * fLmdAllocateControl()
uint32_t fLmdOffsetRead(sLmdControl *)
void fLmdOffsetResize(sLmdControl *, uint32_t)
uint32_t fLmdPutElement(sLmdControl *pLmdControl, sMbsHeader *pHeader)
#define LMD__TYPE_FILE_HEADER_101_1
uint32_t fLmdGetMbsBuffer(sLmdControl *pLmdControl, sMbsBufferHeader *pBuffer, uint32_t iBytes, uint32_t *iElements, uint32_t *iBytesUsed)
uint32_t fLmdPutOpen(sLmdControl *pLmdControl, char *Filename, sMbsFileHeader *pBuffHead, uint32_t iBytes, uint32_t iOver, uint32_t iUseOffset, uint32_t iLargeFile)
uint32_t fLmdGetSwap(sLmdControl *pLmdControl)
sMbsFileHeader * pMbsFileHeader
#define LMD__INTERNAL_HEADER
uint32_t fLmdPutBuffer(sLmdControl *pLmdControl, sMbsHeader *pHeader, uint32_t Items)
void fLmdPrintBufferHeader(uint32_t iVerbose, sMbsBufferHeader *pMbsBufferHeader)
void fLmdSwap8(uint64_t *array, uint32_t items)