40#define fgetpos64 fgetpos
43#define fpos64_t fpos_t
50#define fgetpos64 fgetpos
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);
147 uint32_t *ps, *pd, i, elements;
148 int64_t fileleft,used;
154 used=pLmdControl->
iBytes/4;
155 fileleft=0xffffffff - used - (4+elements);
156 if((int64_t)(pHeader->
iWords/2+2) > fileleft){
157 printf(
"fLmdPutElement: File size exceed\n");
167 iReturn=
fLmdWriteBuffer(pLmdControl,(
char *)pHeader,(pHeader->iWords+4)*2);
168 pLmdControl->
iBytes+=iReturn;
169 if((uint32_t) iReturn != (pHeader->iWords+4)*2){
170 printf(
"fLmdPutElement: Write error \n");
182 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++;
208 uint32_t Bytes=0,TotalBytes=0,i, elements;
209 int64_t fileleft,used;
216 used=pLmdControl->
iBytes/4;
217 fileleft=0xffffffff - used - (4+elements);
218 for(i=0;i<Items;i++) {
223 if((int64_t)TotalBytes/4 > fileleft){
224 printf(
"fLmdPutElement: File size exceed\n");
242 pLmdControl->
iBytes+=iReturn;
243 if((uint32_t) iReturn != TotalBytes)
258 pLmdControl->
iBytes+=iReturn;
260 printf(
"fLmdPutClose: Error writing last buffer. Closing file.\n");
262 rewind(pLmdControl->
fFile);
274 rewind(pLmdControl->
fFile);
290 if(iBuffers > 1){printf(
"fLmdInitMbs: Event spanning not supported!\n");
return(
LMD__FAILURE);}
291 if(iStreams > 0){printf(
"fLmdInitMbs: MBS not in DABC mode!\n");
return(
LMD__FAILURE);}
292 pLmdControl->
iPort=iPort;
293 strcpy(pLmdControl->
cFile,Nodename);
294 if(pLmdControl->
pBuffer == NULL) pLmdControl->
pBuffer = (int16_t*) malloc(iMaxBytes);
310 memset(cClose,0,
sizeof(cClose));
311 strcpy(cClose,
"CLOSE");
348 uint32_t usedBytes = 0, leftBytes = 0;
359 printf(
"fLmdGetMbsBuffer: Need buffer to read\n");
363 printf(
"fLmdGetMbsBuffer: %s buffer size %d too small for %d bytes\n", pLmdControl->
cFile, leftBytes,
369 memset(cRequest,0,
sizeof(cRequest));
370 strcpy(cRequest,
"GETEVT");
378 printf(
"fLmdGetMbsBuffer: %s buffer size %d too small for %lu bytes\n",
383 if((pBuf->
iType & 0xffff) == 100)
384 iReturn=
f_stc_read((int32_t *)(pBuf+1),usedBytes,pLmdControl->
iTCP,-1);
387 if(pLmdControl->
iSwap)
fLmdSwap4((uint32_t *)(pBuf+1),usedBytes/4);
389 if(iElements != NULL)*iElements =pBuf->
iElements;
390 pLmdControl->
iBytes += usedBytes;
405 uint32_t bufferBytes=0;
418 strcpy(pLmdControl->
cFile,Filename);
419 if((pLmdControl->
fFile=(FILE *)fopen64(Filename,
"r"))== NULL)
421 printf(
"fLmdGetOpen: File not found: %s\n",Filename);
430 printf(
"fLmdGetOpen: LMD format error: no LMD file: %s\n",Filename);
436 if(pLmdControl->
iSwap){
437 printf(
"do swap !!!\n");
442 printf(
"fLmdGetOpen: LMD format error: no LMD file: %s, type is %0x\n",
453 printf(
"fLmdGetOpen: Index format error: %s\n",Filename);
459 pLmdControl->
iBytes+=iReturn;
469 printf(
"fLmdGetOpen: LMD format error: no LMD file: %s\n",Filename);
475 bufferBytes = iBytes;
476 if(bufferBytes < pLmdControl->pMbsFileHeader->iMaxWords*2)
479 pLmdControl->
pBuffer = (int16_t *)malloc(bufferBytes);
483 printf(
"fLmdGetOpen: %s words %u\n", Filename, pLmdControl->
iBufferWords);
492 uint32_t *iBytesUsed)
496 uint32_t elem = 0, leftBytes = 0, used, elem_sz;
499 if (iBytes < pLmdControl->pMbsFileHeader->iMaxWords) {
500 printf(
"fLmdGetBuffer: %s buffer size %d too small for %d bytes\n", pLmdControl->
cFile, iBytes,
504 if (pMbsHeader == NULL) {
505 printf(
"fLmdGetBuffer: Need buffer to read\n");
519 printf(
"fLmdGetBuffer: EOF: %s\n", pLmdControl->
cFile);
522 if ((uint32_t) iReturn != used) {
523 printf(
"fLmdGetBuffer: LMD read error: unexpected EOF: %s %u %u\n", pLmdControl->
cFile, iReturn, used);
528 if (pLmdControl->
iSwap)
529 fLmdSwap4((uint32_t *)pMbsHeader, iReturn / 4);
530 pLmdControl->
iBytes += iReturn;
537 if (leftBytes > iBytes) {
538 printf(
"fLmdGetBuffer: stored piece of data (%u) larger than provided buffer (%u)\n",
544 printf(
"fLmdGetBuffer: Internal error pMbsHeader==0\n");
548 memcpy(pMbsHeader, pLmdControl->
pMbsHeader, leftBytes);
550 iReturn =
fLmdReadBuffer(pLmdControl,(
char *)pMbsHeader+leftBytes, iBytes-leftBytes);
552 printf(
"fLmdGetBuffer: EOF: %s\n",pLmdControl->
cFile);
554 printf(
"fLmdGetBuffer: EOF while we have some rest data (%u)\n", leftBytes);
559 if(iReturn > (iBytes-leftBytes)) {
560 printf(
"fLmdGetBuffer: LMD read error %s - too many bytes read %u wants %u",
561 pLmdControl->
cFile, iReturn, iBytes-leftBytes);
565 if(pLmdControl->
iSwap)
fLmdSwap4((uint32_t *)pMbsHeader+leftBytes/4,iReturn/4);
566 pLmdControl->
iBytes += iReturn;
567 leftBytes += iReturn;
570 while(leftBytes >=8){
572 elem_sz = (pm->
iWords+4)*2;
573 if(elem_sz > leftBytes)
break;
575 *iBytesUsed += elem_sz;
579 leftBytes -= elem_sz;
585 printf(
"fLmdGetBuffer: ERROR: internal buffer overflow. Needed:%d available:%d\n",
589 memcpy(pLmdControl->
pBuffer,pm,leftBytes);
628 if(iReturn <= 0) { printf(
"fLmdGetElement: EOF\n");
return(
GETLMD__EOFILE); }
632 pLmdControl->
iBytes += iReturn;
642 printf (
"fLmdGetElement: Error, full element %u does not fit in buffer %u",
662 printf(
"fLmdGetElement: EOF\n");
665 if((uint32_t) iReturn != (i*4)) {
666 printf(
"fLmdGetBuffer: LMD read error: unexpected EOF: %s\n",pLmdControl->
cFile);
672 printf(
"fLmdGetElement: Error Event %d: size from table is %d, header %d\n",
676 pLmdControl->
iBytes+=iReturn;
687 if(fclose(pLmdControl->
fFile) != 0) {
688 pLmdControl->
fFile=NULL;
691 pLmdControl->
fFile=NULL;
697 IObytes=(int32_t)fread(buffer,1,bytes,pLmdControl->
fFile);
704 IObytes=(int32_t)fwrite(buffer,1,bytes,pLmdControl->
fFile);
713 bytes=pLmdControl->
iBytes;
726 if(pLmdControl->
pTCP != NULL)free(pLmdControl->
pTCP);
734 pLmdControl->
pTCP=NULL;
749 if(pLmdControl != NULL)
750 return pLmdControl->
iSwap;
751 return (uint32_t) -1;
760 printf(
"fLmdSetWrittenEndian: No file header allocated!\n");
769 printf(
"fLmdGetWrittenEndian: No file header allocated!\n");
784 uint32_t elem=0,i,*iff1,*iff2;
789 for(i=pLmdControl->
iElements;i<pLmdControl->iOffsetEntries-1;i++){
790 if((*(iff1+1)-*iff2)>bytes/4)
break;
795 *used=(*iff1-*iff2)*4;
801 for(i=pLmdControl->
iElements;i<pLmdControl->iOffsetEntries-1;i++){
802 if((*(off1+1)-*off2)>bytes/4)
break;
807 *used=(*off1-*off2)*4;
821 printf(
"fLmdGetBuffer: LMD read error: unexpected EOF: %s\n",pLmdControl->
cFile);
827 printf(
"fLmdOffsetTable: LMD format error: no index table: %s, type %0x\n",
840 printf(
"fLmdOffsetTable: LMD format error: no index table: %s\n",pLmdControl->
cFile);
844 if(pLmdControl->
iSwap){
867 printf(
"fLmdOffsetWrite: memory allocation error\n");
870 memset(pTableHead,0,16);
875 iReturn = fgetpos64(pLmdControl->
fFile,(fpos64_t *) ¤t);
879 if(pbuf == NULL) pbuf=(
char *)pLmdControl->
pOffset8;
887 printf(
"Table offset mismatch: current:%llu calculated:%llu, cur-cal %llu\n", (
long long unsigned)current / 4,
893 printf(
"Table write error \n");
916 return (*(pLmdControl->
pOffset8 + index));
924 uint32_t oldEntries,newEntries;
929 memset(newOffset,0,newEntries*pLmdControl->
iOffsetSize);
940 pLmdControl->
pOffset4 = (uint32_t *)newOffset;
950 pLmdControl->
pOffset4 = (uint32_t *)newOffset;
951 *pLmdControl->
pOffset4 = firstValue;
960 if (pMbsBufferHeader) {
961 printf(
"BfHd: # %d, DataWords:%d Type:%08x Elements:%d sec:%d.%d MaxWords:%d\n", pMbsBufferHeader->
iBuffer,
971 if (pMbsFileHeader) {
972 printf(
"FiHd: DataWords:%d Type:%d.%d Elements:%d sec:%d.%d MaxWords:%d Index: %llx[%d]\n",
984 printf(
"ElHd: words:%d type:%08x\n", pMbsHeader->
iWords, pMbsHeader->
iType);
992 if (pMbsEventHeader) {
993 printf(
"EvHd: words:%6d type:%08x trigger:%2d #:%4d\n", pMbsEventHeader->
iWords, pMbsEventHeader->
iType,
1002 printf(
"Ctrl: file:%s words:%d left:%d bytes read:%llu elements:%d\n", pLmdControl->
cFile,
1013 for (i = 0; i < items; i++) {
1014 *pp = (*pp >> 24) + ((*pp >> 8) & 0x0000ff00) + ((*pp << 8) & 0x00ff0000) + (*pp << 24);
1024 for (i = 0; i < items; i++) {
1025 *pp = (*pp << 32) + (*pp >> 32);
void fLmdSwap4(uint32_t *array, uint32_t items)
void fLmdPrintEvent(uint32_t iVerbose, sMbsEventHeader *pMbsEventHeader)
lmdoff_t fLmdOffsetGet(sLmdControl *, uint32_t)
uint32_t fLmdOffsetWrite(sLmdControl *)
uint32_t fLmdGetWrittenEndian(sLmdControl *pLmdControl)
void fLmdPrintControl(uint32_t iVerbose, sLmdControl *pLmdControl)
uint64_t fLmdGetBytesWritten(sLmdControl *pLmdControl)
uint32_t fLmdGetOpen(sLmdControl *pLmdControl, char *Filename, sMbsFileHeader *pBuffHead, uint32_t iBytes, uint32_t iUseOffset)
int32_t fLmdReadBuffer(sLmdControl *pLmdControl, char *buffer, uint32_t bytes)
void fLmdPrintBufferHeader(uint32_t iVerbose, sMbsBufferHeader *pMbsBufferHeader)
void fLmdOffsetResize(sLmdControl *, uint32_t)
void fLmdSwap8(uint64_t *array, uint32_t items)
uint32_t fLmdPutBuffer(sLmdControl *pLmdControl, sMbsHeader *pHeader, uint32_t Items)
uint32_t fLmdOffsetRead(sLmdControl *)
uint32_t fLmdOffsetSet(sLmdControl *, uint32_t)
uint32_t fLmdGetClose(sLmdControl *pLmdControl)
sLmdControl * fLmdAllocateControl(void)
uint32_t fLmdGetMbsEvent(sLmdControl *pLmdControl, sMbsHeader **event)
void fLmdPrintHeader(uint32_t iVerbose, sMbsHeader *pMbsHeader)
void fLmdPrintFileHeader(uint32_t iVerbose, sMbsFileHeader *pMbsFileHeader)
uint32_t fLmdCloseMbs(sLmdControl *pLmdControl)
uint32_t fLmdGetElement(sLmdControl *pLmdControl, uint32_t iEvent, sMbsHeader **event)
uint32_t fLmdPutElement(sLmdControl *pLmdControl, sMbsHeader *pHeader)
uint32_t fLmdGetSwap(sLmdControl *pLmdControl)
int32_t fLmdWriteBuffer(sLmdControl *, char *, uint32_t)
uint32_t fLmdGetBuffer(sLmdControl *pLmdControl, sMbsHeader *pMbsHeader, uint32_t iBytes, uint32_t *iElements, uint32_t *iBytesUsed)
void fLmdOffsetElements(sLmdControl *, uint32_t, uint32_t *, uint32_t *)
void fLmdSetWrittenEndian(sLmdControl *pLmdControl, uint32_t iE)
uint32_t fLmdPutClose(sLmdControl *pLmdControl)
uint32_t fLmdGetMbsBuffer(sLmdControl *pLmdControl, sMbsBufferHeader *pBuffer, uint32_t iBytes, uint32_t *iElements, uint32_t *iBytesUsed)
uint32_t fLmdCleanup(sLmdControl *)
uint32_t fLmdPutOpen(sLmdControl *pLmdControl, char *Filename, sMbsFileHeader *pBuffHead, uint32_t iBytes, uint32_t iOver, uint32_t iUseOffset, uint32_t iLargeFile)
uint32_t fLmdInitMbs(sLmdControl *pLmdControl, char *Nodename, uint32_t iMaxBytes, uint32_t iBuffers, uint32_t iStreams, uint32_t iPort, uint32_t iTimeout)
#define GETLMD__OUTOF_RANGE
#define PUTLMD__FILE_EXIST
#define GETLMD__SIZE_ERROR
#define GETLMD__NOLMDFILE
INTS4 f_stc_write(void *p_buffer, INTS4 i_buflen, INTS4 i_channel)
INTS4 f_stc_read(void *p_buffer, INTS4 i_buflen, INTS4 i_channel, INTS4 i_timeout)
INTS4 f_stc_close(struct s_tcpcomm *ps_tcp)
#define LMD__ENDIAN_UNKNOWN
#define LMD__INTERNAL_HEADER
#define LMD__TYPE_FILE_HEADER_101_1
#define LMD__STANDARD_HEADER
#define LMD__NO_OVERWRITE
#define LMD__TYPE_FILE_INDEX_101_2
sMbsFileHeader * pMbsFileHeader