00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <stdio.h>
00034 #include <assert.h>
00035 #include <sys/types.h>
00036
00037 #include "RecHeaderFormats.hh"
00038 #include "CRC.hh"
00039 #include "swaps.hh"
00040 #include <string.h>
00041
00042 #define NOCRCCHECKING
00043
00044
00045 using namespace OLDEVP;
00046
00047 char* OLDEVP::name2str(char* type)
00048 {
00049 static char name[9] = {0} ;
00050 memcpy(name,type,8) ;
00051 name[8] = 0 ;
00052 return(name) ;
00053 };
00054
00055
00056 void dump_data(char* buffer,int size,int width )
00057 {
00058 uint* data_base = (uint*)buffer ;
00059 uint* data ;
00060 char* data_char ;
00061
00062 if(!size) return ;
00063 fflush(stdout) ;
00064 data = data_base;
00065 data_char = (char*) data ;
00066 for(int w = 0 ; w < size ; w++)
00067 {
00068 if((w > 0) && (!(w%width)))
00069 {
00070 printf(" || ");
00071 data_char = (char*)(&data[w - width]);
00072 for(int l = 0 ; l < width*4 ; l++)
00073 {
00074 if(((uint)data_char[l]) < 0x21 || ((uint)data_char[l]) > 0x176)
00075 printf(" ") ;
00076 else
00077 printf("%c",data_char[l]) ;
00078 }
00079 printf("\n") ;
00080 }
00081 printf("0X%08X ",data[w]) ;
00082 }
00083 int left_over =size%width ;
00084 if(!left_over)
00085 {
00086 printf(" || ") ;
00087 data_char = (char*)(&data[size - width ] ) ;
00088 for(int l = 0 ; l < width*4 ; l++)
00089 {
00090 if(((uint)data_char[l]) < 0x21 || ((uint)data_char[l]) > 0x176)
00091 printf(" ") ;
00092 else
00093 printf("%c",data_char[l]) ;
00094 }
00095 printf("\n") ;
00096 }
00097 if(left_over)
00098 {
00099
00100
00101 for(int ll = 0 ; ll < (width - left_over) ; ll++) printf(" ") ;
00102 printf(" || ") ;
00103 data_char = (char*)(&data[size - left_over ] ) ;
00104 for(int l = 0 ; l < left_over*4 ; l++)
00105 {
00106 if(((uint)data_char[l]) < 0x21 || ((uint)data_char[l]) > 0x176)
00107 printf(" ") ;
00108 else
00109 printf("%c",data_char[l]) ;
00110 }
00111 printf("\n") ;
00112 }
00113 fflush(stdout);
00114 }
00115
00116
00117
00118 int Logical_Record_Header::swap()
00119 {
00120
00121 int iret = swap_raw(ByteOrder,&BankLength,
00122 ((sizeof(Logical_Record_Header))/4 - 2));
00123 return(iret) ;
00124 };
00125
00126 void Logical_Record_Header::print()
00127 {
00128 if(ByteOrder != 0x04030201)
00129 {
00130 Logical_Record_Header lbh ;
00131 memcpy(&lbh , this ,sizeof(lbh)) ;
00132 int iret = lbh.swap() ;
00133 if(iret < 0 ) printf("swapping failed %s %d\n",__FILE__,__LINE__) ;
00134 lbh.print() ;
00135 return ;
00136 }
00137 printf("Logical Record Header:\n");
00138 printf("BankType Length RunNum FormatVersion ByteOrder RES1 RES2 RES3 CRC\n") ;
00139 printf("%-8s %06d %03d %04d.%04d 0X%08X %04d %05d 0X%08X 0X%08X\n",
00140 name2str(BankType),BankLength,RunNumber,FormatVersion >> 16 ,
00141 FormatVersion & 0x0000FFFF, ByteOrder, reserved1,
00142 reserved2, reserved3 , CRC) ;
00143
00144 };
00145
00146
00147 int Logical_Record::swap()
00148 {
00149
00150 int words = header.BankLength ;
00151 int iret = swap_raw(header.ByteOrder,&words,1) ;
00152
00153
00154 if(!iret) return(0);
00155
00156
00157 if(iret < 0 ) return(iret) ;
00158
00159
00160
00161 iret = swap_raw(header.ByteOrder,&RecordLength,2);
00162 assert(iret > 0);
00163 iret = swap_raw(header.ByteOrder,&CRC,1);
00164 assert(iret > 0);
00165
00166
00167 header.swap();
00168
00169 return(iret) ;
00170 };
00171
00172
00173 void Logical_Record::set_CRC()
00174 {
00175 header.CRC = 0 ;
00176 header.CRC = compute_crc_bank((Bank *)this) ;
00177 };
00178
00179 int Logical_Record::test_CRC()
00180 {
00181 #ifdef NOCRCCHECKING
00182 return -1;
00183 #endif
00184
00185 if(header.CRC == 0) return(-1) ;
00186 unsigned int old_crc = header.CRC ;
00187 unsigned int test = compute_crc_bank((Bank *)this) ;
00188 header.CRC = old_crc ;
00189 swap_raw(header.ByteOrder ,(int*)&old_crc, 1);
00190 if(old_crc != test) return(0) ;
00191 return(-1) ;
00192 };
00193
00194 void Logical_Record::print(int level)
00195 {
00196 header.print();
00197
00198 int words = header.BankLength ;
00199 swap_raw(header.ByteOrder,&words,1);
00200
00201 dump_data(((char *)this) + sizeof(header),words - sizeof(header)/4);
00202 }
00203
00204
00205 int Bank_Header::swap()
00206 {
00207
00208 int iret = swap_raw(ByteOrder,&BankLength,((sizeof(Bank_Header))/4 - 2));
00209 return(iret) ;
00210 };
00211
00212 void Bank_Header::print()
00213 {
00214 if(ByteOrder != 0x04030201)
00215 {
00216 Bank_Header lbh ;
00217 memcpy(&lbh , this ,sizeof(lbh)) ;
00218 int iret = lbh.swap() ;
00219 if(iret < 0 )printf("swapping failed %s %d\n",__FILE__,__LINE__) ;
00220 lbh.print() ;
00221 return ;
00222 }
00223 printf("Bank Header:\n");
00224 printf("BankType Length BankId FormatVersion ByteOrder FormatNumber Token RES CRC\n") ;
00225 printf("%-8s %06d %03d %04d.%04d 0X%08X %04d %05d 0X%08X 0X%08X\n",
00226 name2str(BankType),BankLength,BankId,FormatVersion >> 16 ,
00227 FormatVersion & 0x0000FFFF, ByteOrder, FormatNumber,
00228 Token, reserved1 , CRC) ;
00229
00230 };
00231
00232
00233
00234
00235
00236
00237 int Bank::swap()
00238 {
00239
00240 int words = header.BankLength ;
00241 int iret = swap_raw(header.ByteOrder,&words,1) ;
00242
00243
00244 if(!iret) return(0);
00245
00246
00247 if(iret < 0 ) return(iret) ;
00248
00249
00250 words -= (sizeof(header)/4) ;
00251 int* start = (int*)this + (sizeof(header)/4) ;
00252 iret = swap_raw(header.ByteOrder,start,words) ;
00253 assert(iret > 0);
00254
00255
00256 header.swap();
00257
00258 return(iret) ;
00259 };
00260
00261 void Bank::set_CRC()
00262 {
00263 header.CRC = 0 ;
00264 header.CRC = compute_crc_bank(this) ;
00265 };
00266
00267 int Bank::test_CRC()
00268 {
00269 #ifdef NOCRCCHECKING
00270 return -1;
00271 #endif
00272
00273 if(!header.CRC)return(-1) ;
00274 unsigned int old_crc = header.CRC ;
00275 unsigned int test = compute_crc_bank(this) ;
00276 header.CRC = old_crc ;
00277
00278 swap_raw(header.ByteOrder ,(int*)&old_crc, 1);
00279 if(old_crc != test) return(0) ;
00280 return(-1) ;
00281 };
00282
00283 void Bank::print(int level)
00284 {
00285 header.print();
00286
00287 int words = header.BankLength ;
00288 swap_raw(header.ByteOrder,&words,1);
00289
00290 printf( "XXXXXX: length= %d, %d\n", words, words*4);
00291 dump_data(((char *)this) + sizeof(header),words - sizeof(header)/4);
00292 }
00293
00294
00295
00296
00297