/* $Header: /iraux2/gildas/new/nic/main/nic_read_nmb.c,v 1.13 1996/04/01 18: * $Log: nic_read_nmb.c,v $ * Revision 1.18 1999/11/30 19:09:17 broguier * minor modifications to remove some warnings on WIN32 * * Revision 1.17 98/03/04 14:28:20 14:28:20 perrigou (Alain Perrigouard) * WIN32 * * Revision 1.13 1996/04/01 18:41:06 broguier * Correction for OSF1 * * Revision 1.11 96/03/19 15:19:07 15:19:07 gildas (Gildas manager) * F2C and MAC compatibility. 1st pass. GD * * Revision 1.10 1996/02/29 19:54:55 broguier * add routine writerecord * * Revision 1.7 96/02/29 13:51:07 13:51:07 broguier (Dominique Broguiere) * add subroutine open_new_stream * * Revision 1.6 95/05/02 16:29:43 16:29:43 broguier (Dominique Broguiere) * test ErrorStatus to detect end of file * * Revision 1.5 95/01/23 17:09:41 17:09:41 perrigou (Alain Perrigouard) * include for f2c * * */ /************************************************************************/ /* */ /* Program: read_nmb Version: 1.0 */ /* */ /* Function: open,read a NMB File */ /* */ /* List of functions: open_stream */ /* rewind_stream */ /* close_stream */ /* GetSubScanInformation */ /* ChainSubScans */ /* CopySubScanInformation */ /* */ /* Author: R. Lemke (Mogli) MPIfR Bonn */ /* D. Broguiere */ /* */ /* Created: 16. February 1993 Version: 1.0 */ /* Updated: <06-09-93 15:58> */ /* */ /************************************************************************/ /*----------------------------------------------------------------------*/ #include #include #include #include #include #include #ifdef vms #include #else #ifdef MAC #include #else #include #endif #endif #include "nmb.h" #define pi acos(-1.0) #define rad2deg 180.0 / pi #ifdef WIN32 #define getsubscaninformation _stdcall GETSUBSCANINFORMATION #define copysubscaninformation _stdcall COPYSUBSCANINFORMATION #define open_stream _stdcall OPEN_STREAM #define open_new_stream _stdcall OPEN_NEW_STREAM #define close_stream _stdcall CLOSE_STREAM #define writesub _stdcall WRITESUB #define writerecord _stdcall WRITERECORD #endif #ifdef underscore #define getsubscaninformation getsubscaninformation_ #define copysubscaninformation copysubscaninformation_ #define open_stream open_stream_ #define open_new_stream open_new_stream_ #define close_stream close_stream_ #define writesub writesub_ #define writerecord writerecord_ #endif #ifdef f2c #define getsubscaninformation getsubscaninformation_ #define copysubscaninformation copysubscaninformation_ #define open_stream open_stream__ #define open_new_stream open_new_stream__ #define close_stream close_stream__ #define writesub writesub_ #define writerecord writerecord_ #endif /*--------------------------------------------------------------------*/ FILE *InputStream, *ASCIIout; char *FileNameInput, *FileNameASCII; int ActualMultiByteMode = 2; int interactive; int NoOfChannels, NoOfDumps; size_t ltime; struct subscans *last = 0; struct nmbdata NMBRecordIn; void ChainSubScans(); /*************************************************************************/ /* open_stream */ /*************************************************************************/ #ifdef WIN32 void open_stream(Filename, length, pstream) int length; #else void open_stream(Filename,pstream) #endif char *Filename; size_t *pstream; { FileNameInput = Filename; InputStream = fopen (FileNameInput, "rb"); /* printf ("%d",errno); */ *pstream =(size_t)InputStream; } /*************************************************************************/ /* open_new_stream */ /*************************************************************************/ #ifdef WIN32 void open_new_stream(Filename,length,pstream) int length; #else void open_new_stream(Filename,pstream) #endif char *Filename; size_t *pstream; { FileNameInput = Filename; InputStream = fopen (FileNameInput, "wb"); *pstream =(size_t)InputStream; } /*************************************************************************/ /* rewind_stream */ /*************************************************************************/ void rewind_stream(InputStream) FILE *InputStream; /* Input File Stream */ { rewind(InputStream); } /*************************************************************************/ /* close_stream */ /*************************************************************************/ void close_stream(pstream) size_t *pstream; /*FILE *InputStream; Input File Stream */ { fclose ((FILE *)*pstream); /* printf ("%d",errno); */ } /*************************************************************************/ /* GetSubScanInformation: */ /*************************************************************************/ #ifdef WIN32 void GetSubScanInformation (MultiByteMode, MultiByteNum, MultiByteText, length, InputStream, ErrorStatus, StartTime,SubScans_top) int length; #else void GetSubScanInformation (MultiByteMode, MultiByteNum, MultiByteText, InputStream, ErrorStatus, StartTime,SubScans_top) #endif int *MultiByteMode, /* the actual Multi Byte Mode */ *ErrorStatus; /* Error Status */ float *MultiByteNum, /* on return the deocded NMB Value */ *StartTime; /* Start Time of first SubScan */ char *MultiByteText; /* on return the decode NMB String */ FILE *InputStream; /* Input File Stream */ size_t *SubScans_top; { static int First = 1; char *EndOfSubScans = "-88888"; int LengthOfEndOfSubScans = (int)(strlen(EndOfSubScans)); struct subscans *new; void MultiByteInput(); if (*ErrorStatus==-1) { *SubScans_top = (size_t)NULL; return; } new = (struct subscans *) malloc(sizeof(struct subscans)); if (new == NULL) printf("**** a NEW SubScan could not be allocated\n"); *SubScans_top = (size_t)new; /*** MultiByteInput is already done in GetHeaderInformation MultiByteInput(MultiByteMode, MultiByteNum, MultiByteText, InputStream, ErrorStatus); ***/ new->Number = (int)(*MultiByteNum); while (strncmp(MultiByteText, EndOfSubScans, LengthOfEndOfSubScans)!=0 && *ErrorStatus!=-1) { MultiByteInput(MultiByteMode, MultiByteNum, MultiByteText, InputStream, ErrorStatus); new->Epoch = *MultiByteNum; MultiByteInput(MultiByteMode, MultiByteNum, MultiByteText, InputStream, ErrorStatus); new->Epoch = new->Epoch + *MultiByteNum/ 10000.0; MultiByteInput(MultiByteMode, MultiByteNum, MultiByteText, InputStream, ErrorStatus); new->Time = *MultiByteNum / 30.0; if (First == 1) { *StartTime = *MultiByteNum / 30.0; First = 0; } ChainSubScans(new); new = (struct subscans *) malloc(sizeof(struct subscans)); MultiByteInput(MultiByteMode, MultiByteNum, MultiByteText, InputStream, ErrorStatus); new->Number = (int)*MultiByteNum; } free(new); last = 0; } /*************************************************************************/ /* ChainSubScans: */ /*************************************************************************/ void ChainSubScans(i) struct subscans *i; { if (last != 0) last->next = i; i->next = 0; last = i; } /*************************************************************************/ /* CopySubScanInformation: */ /*************************************************************************/ void CopySubScanInformation(top,subscan_number,subscan_epoch, subscan_time) struct subscans *top; int *subscan_number; float *subscan_epoch; float *subscan_time; { int i = 0; int *ptr; while(top) { *(subscan_number+i) = top->Number; *(subscan_epoch+i) = top->Epoch; *(subscan_time+i) = top->Time; i++; ptr = (int *)top; top = top->next; free(ptr); } } /*************************************************************************/ /* writesub: */ /* interface between Fortran write_nmb() and C routine WriteSubscan */ /*************************************************************************/ void writesub(subscan_number,subscan_epoch,subscan_time,ilast,Stream) int *subscan_number; float *subscan_epoch; float *subscan_time; int *ilast; FILE *Stream; { int Number; float Epoch,Starttime; int ActualMultiByteMode; void WriteSubScan(); void WriteMultiByte(); Number = *subscan_number; Epoch = *subscan_epoch; Starttime = *subscan_time; WriteSubScan(Number,Epoch,Starttime,&ActualMultiByteMode,Stream); if (*ilast==1) { WriteMultiByte(29,Stream); fprintf(Stream,"-88888\n"); } } /*************************************************************************/ /* writerecord: */ /* interface between Fortran write_nmb() and C routine WriteRawData */ /*************************************************************************/ void writerecord(NMBrecord,nchan,ilast,Stream) int *NMBrecord; int *nchan; int *ilast; FILE *Stream; { int NoOfChannels; int ActualMultiByteMode; void WriteRawData(); void DataFileClose(); NoOfChannels = *nchan; WriteRawData(NMBrecord,NoOfChannels,&ActualMultiByteMode,Stream); if (*ilast==1) { DataFileClose(Stream); } }