| 1 | /** @file testio.c | 
|---|
| 2 | @short Test program for eventio data format. | 
|---|
| 3 |  | 
|---|
| 4 | @author  Konrad Bernloehr | 
|---|
| 5 | @date    1994, 1997, 2000 | 
|---|
| 6 | @date    CVS $Date: 2002-07-25 17:57:05 $ | 
|---|
| 7 | @version CVS $Revision: 1.1 $ | 
|---|
| 8 | */ | 
|---|
| 9 |  | 
|---|
| 10 | /*  Copyright (C) 1994, 1997, 2000 Konrad Bernloehr. All rights reserved.   */ | 
|---|
| 11 |  | 
|---|
| 12 | #include "initial.h" | 
|---|
| 13 | #include "warning.h" | 
|---|
| 14 | #include "io_basic.h" | 
|---|
| 15 |  | 
|---|
| 16 | struct test_struct | 
|---|
| 17 | { | 
|---|
| 18 | long lvar[2]; | 
|---|
| 19 | int ilvar[2]; | 
|---|
| 20 | int isvar[2]; | 
|---|
| 21 | short svar[3]; | 
|---|
| 22 | double fvar[2]; | 
|---|
| 23 | double dvar[2]; | 
|---|
| 24 | int8_t i8var[2]; | 
|---|
| 25 | uint8_t u8var[2]; | 
|---|
| 26 | int16_t i16var[2]; | 
|---|
| 27 | uint16_t u16var[2]; | 
|---|
| 28 | int32_t i32var[2]; | 
|---|
| 29 | uint32_t u32var[2]; | 
|---|
| 30 | #ifdef HAVE_64BIT_INT | 
|---|
| 31 | int64_t i64var[2]; | 
|---|
| 32 | uint64_t u64var[2]; | 
|---|
| 33 | #endif | 
|---|
| 34 | }; | 
|---|
| 35 |  | 
|---|
| 36 | typedef struct test_struct TEST_DATA; | 
|---|
| 37 |  | 
|---|
| 38 | static int care_long, care_int, care_short; | 
|---|
| 39 |  | 
|---|
| 40 | int datacmp ARGLIST((TEST_DATA *data1, TEST_DATA *data2)); | 
|---|
| 41 | int write_test1 ARGLIST((TEST_DATA *data, IO_BUFFER *iobuf)); | 
|---|
| 42 | int read_test1 ARGLIST((TEST_DATA *data, IO_BUFFER *iobuf)); | 
|---|
| 43 | int write_test2 ARGLIST((TEST_DATA *data, IO_BUFFER *iobuf)); | 
|---|
| 44 | int read_test2 ARGLIST((TEST_DATA *data, IO_BUFFER *iiobuf)); | 
|---|
| 45 |  | 
|---|
| 46 | /* ------------------------ datacmp ---------------------- */ | 
|---|
| 47 | /** | 
|---|
| 48 | *  @short Compare elements of test data structures. | 
|---|
| 49 | *  Compare elements of test data structures with the accuracy | 
|---|
| 50 | *  relevant to the I/O package. | 
|---|
| 51 | * | 
|---|
| 52 | *  @param data1 first data structure | 
|---|
| 53 | *  @param data2 second data structure | 
|---|
| 54 | * | 
|---|
| 55 | *  @return 0 (something did not match), 1 (O.K.) | 
|---|
| 56 | * | 
|---|
| 57 | */ | 
|---|
| 58 |  | 
|---|
| 59 | int datacmp(data1,data2) | 
|---|
| 60 | TEST_DATA *data1; | 
|---|
| 61 | TEST_DATA *data2; | 
|---|
| 62 | { | 
|---|
| 63 | int i, ok; | 
|---|
| 64 |  | 
|---|
| 65 | ok = 1; | 
|---|
| 66 |  | 
|---|
| 67 | for (i=0; i<2; i++) | 
|---|
| 68 | if ( (int32_t)data1->lvar[i] != (int32_t)data2->lvar[i] ) | 
|---|
| 69 | { | 
|---|
| 70 | fprintf(stderr,"Long variable %d does not match: %08lx <--> %08lx\n", | 
|---|
| 71 | i+1,data1->lvar[i],data2->lvar[i]); | 
|---|
| 72 | ok = 0; | 
|---|
| 73 | } | 
|---|
| 74 | else if ( data1->lvar[i] != data2->lvar[i] ) | 
|---|
| 75 | care_long = 1; | 
|---|
| 76 |  | 
|---|
| 77 | for (i=0; i<2; i++) | 
|---|
| 78 | if ( (int32_t)data1->ilvar[i] != (int32_t)data2->ilvar[i] ) | 
|---|
| 79 | { | 
|---|
| 80 | fprintf(stderr,"Int 'l' variable %d does not match: %08x <--> %08x\n", | 
|---|
| 81 | i+1,data1->ilvar[i],data2->ilvar[i]); | 
|---|
| 82 | ok = 0; | 
|---|
| 83 | } | 
|---|
| 84 |  | 
|---|
| 85 | for (i=0; i<2; i++) | 
|---|
| 86 | if ( (int16_t)data1->isvar[i] != (int16_t)data2->isvar[i] ) | 
|---|
| 87 | { | 
|---|
| 88 | fprintf(stderr,"Int 's' variable %d does not match: %04x <--> %04x\n", | 
|---|
| 89 | i+1,data1->isvar[i],data2->isvar[i]); | 
|---|
| 90 | ok = 0; | 
|---|
| 91 | } | 
|---|
| 92 | else if ( data1->isvar[i] != data2->isvar[i] ) | 
|---|
| 93 | care_short = 1; | 
|---|
| 94 |  | 
|---|
| 95 | for (i=0; i<3; i++) | 
|---|
| 96 | if ( data1->svar[i] != data2->svar[i] ) | 
|---|
| 97 | { | 
|---|
| 98 | fprintf(stderr,"Short variable %d does not match: %04x <--> %04x\n", | 
|---|
| 99 | i+1,data1->svar[i],data2->svar[i]); | 
|---|
| 100 | ok = 0; | 
|---|
| 101 | } | 
|---|
| 102 |  | 
|---|
| 103 | for (i=0; i<2; i++) | 
|---|
| 104 | { | 
|---|
| 105 | float f1, f2; | 
|---|
| 106 | f1 = (float) data1->fvar[i]; | 
|---|
| 107 | f2 = (float) data2->fvar[i]; | 
|---|
| 108 | if ( f1 != f2 ) | 
|---|
| 109 | { | 
|---|
| 110 | fprintf(stderr,"Float variable %d does not match: %08x <--> %08x\n", | 
|---|
| 111 | i+1,*((int *)(&f1)),*((int *)(&f2))); | 
|---|
| 112 | ok = 0; | 
|---|
| 113 | } | 
|---|
| 114 | } | 
|---|
| 115 |  | 
|---|
| 116 | for (i=0; i<2; i++) | 
|---|
| 117 | if ( data1->dvar[i] != data2->dvar[i] ) | 
|---|
| 118 | { | 
|---|
| 119 | double f1, f2; | 
|---|
| 120 | f1 = data1->dvar[i]; | 
|---|
| 121 | f2 = data2->dvar[i]; | 
|---|
| 122 | fprintf(stderr, | 
|---|
| 123 | "Double variable %d does not match: %08x%08x <--> %08x%08x\n", | 
|---|
| 124 | i+1,*((int *)(&f1)),*((int *)((char *)(&f1)+4)), | 
|---|
| 125 | *((int *)(&f2)),*((int *)((char *)(&f2)+4))); | 
|---|
| 126 | ok = 0; | 
|---|
| 127 | } | 
|---|
| 128 |  | 
|---|
| 129 | for (i=0; i<2; i++) | 
|---|
| 130 | if ( data1->i8var[i] != data2->i8var[i] ) | 
|---|
| 131 | { | 
|---|
| 132 | fprintf(stderr,"Int8 variable %d does not match: %08x <--> %08x\n", | 
|---|
| 133 | i+1,data1->i8var[i],data2->i8var[i]); | 
|---|
| 134 | ok = 0; | 
|---|
| 135 | } | 
|---|
| 136 |  | 
|---|
| 137 | for (i=0; i<2; i++) | 
|---|
| 138 | if ( data1->u8var[i] != data2->u8var[i] ) | 
|---|
| 139 | { | 
|---|
| 140 | fprintf(stderr,"UInt8 variable %d does not match: %08x <--> %08x\n", | 
|---|
| 141 | i+1,data1->u8var[i],data2->u8var[i]); | 
|---|
| 142 | ok = 0; | 
|---|
| 143 | } | 
|---|
| 144 |  | 
|---|
| 145 | for (i=0; i<2; i++) | 
|---|
| 146 | if ( data1->i16var[i] != data2->i16var[i] ) | 
|---|
| 147 | { | 
|---|
| 148 | fprintf(stderr,"Int16 variable %d does not match: %08x <--> %08x\n", | 
|---|
| 149 | i+1,data1->i16var[i],data2->i16var[i]); | 
|---|
| 150 | ok = 0; | 
|---|
| 151 | } | 
|---|
| 152 |  | 
|---|
| 153 | for (i=0; i<2; i++) | 
|---|
| 154 | if ( data1->u16var[i] != data2->u16var[i] ) | 
|---|
| 155 | { | 
|---|
| 156 | fprintf(stderr,"UInt16 variable %d does not match: %08x <--> %08x\n", | 
|---|
| 157 | i+1,data1->u16var[i],data2->u16var[i]); | 
|---|
| 158 | ok = 0; | 
|---|
| 159 | } | 
|---|
| 160 |  | 
|---|
| 161 | for (i=0; i<2; i++) | 
|---|
| 162 | if ( data1->i32var[i] != data2->i32var[i] ) | 
|---|
| 163 | { | 
|---|
| 164 | fprintf(stderr,"Int32 variable %d does not match: %08x <--> %08x\n", | 
|---|
| 165 | i+1,data1->i32var[i],data2->i32var[i]); | 
|---|
| 166 | ok = 0; | 
|---|
| 167 | } | 
|---|
| 168 |  | 
|---|
| 169 | for (i=0; i<2; i++) | 
|---|
| 170 | if ( data1->u32var[i] != data2->u32var[i] ) | 
|---|
| 171 | { | 
|---|
| 172 | fprintf(stderr,"UInt32 variable %d does not match: %08x <--> %08x\n", | 
|---|
| 173 | i+1,data1->u32var[i],data2->u32var[i]); | 
|---|
| 174 | ok = 0; | 
|---|
| 175 | } | 
|---|
| 176 |  | 
|---|
| 177 | #ifdef HAVE_64BIT_INT | 
|---|
| 178 | for (i=0; i<2; i++) | 
|---|
| 179 | if ( data1->i64var[i] != data2->i64var[i] ) | 
|---|
| 180 | { | 
|---|
| 181 | #ifdef SIXTY_FOUR_BITS | 
|---|
| 182 | fprintf(stderr,"Int64 variable %d does not match: %016lx <--> %016lx\n", | 
|---|
| 183 | i+1,data1->i64var[i],data2->i64var[i]); | 
|---|
| 184 | #else | 
|---|
| 185 | fprintf(stderr,"Int64 variable %d does not match: %016llx <--> %016llx\n", | 
|---|
| 186 | i+1,data1->i64var[i],data2->i64var[i]); | 
|---|
| 187 | #endif | 
|---|
| 188 | ok = 0; | 
|---|
| 189 | } | 
|---|
| 190 |  | 
|---|
| 191 | for (i=0; i<2; i++) | 
|---|
| 192 | if ( data1->u64var[i] != data2->u64var[i] ) | 
|---|
| 193 | { | 
|---|
| 194 | #ifdef SIXTY_FOUR_BITS | 
|---|
| 195 | fprintf(stderr,"UInt64 variable %d does not match: %016lx <--> %016lx\n", | 
|---|
| 196 | i+1,data1->u64var[i],data2->u64var[i]); | 
|---|
| 197 | #else | 
|---|
| 198 | fprintf(stderr,"UInt64 variable %d does not match: %016llx <--> %016llx\n", | 
|---|
| 199 | i+1,data1->u64var[i],data2->u64var[i]); | 
|---|
| 200 | #endif | 
|---|
| 201 | ok = 0; | 
|---|
| 202 | } | 
|---|
| 203 | #endif | 
|---|
| 204 |  | 
|---|
| 205 | return ok; | 
|---|
| 206 | } | 
|---|
| 207 |  | 
|---|
| 208 | /* --------------------- write_test1 ---------------------- */ | 
|---|
| 209 | /** | 
|---|
| 210 | *  @short Write test data with single-element functions | 
|---|
| 211 | * | 
|---|
| 212 | *  @param    data   Pointer to test data structure | 
|---|
| 213 | *  @param    iobuf  Pointer to I/O buffer | 
|---|
| 214 | * | 
|---|
| 215 | *  @return  0 (O.K.), <0 (error as for put_item_end()) | 
|---|
| 216 | * | 
|---|
| 217 | */ | 
|---|
| 218 |  | 
|---|
| 219 | int write_test1(data,iobuf) | 
|---|
| 220 | TEST_DATA *data; | 
|---|
| 221 | IO_BUFFER *iobuf; | 
|---|
| 222 | { | 
|---|
| 223 | IO_ITEM_HEADER item_header; | 
|---|
| 224 |  | 
|---|
| 225 | item_header.type = 99;             /* test data */ | 
|---|
| 226 | item_header.version = 0;          /* Version 0 (test) */ | 
|---|
| 227 | item_header.ident = 123; | 
|---|
| 228 |  | 
|---|
| 229 | put_item_begin(iobuf,&item_header); | 
|---|
| 230 |  | 
|---|
| 231 | put_long(data->lvar[0],iobuf); | 
|---|
| 232 | put_long(data->lvar[1],iobuf); | 
|---|
| 233 | put_long((long)data->ilvar[0],iobuf); | 
|---|
| 234 | put_long((long)data->ilvar[1],iobuf); | 
|---|
| 235 | put_short(data->isvar[0],iobuf); | 
|---|
| 236 | put_short(data->isvar[1],iobuf); | 
|---|
| 237 | put_short(data->svar[0],iobuf); | 
|---|
| 238 | put_short(data->svar[1],iobuf); | 
|---|
| 239 | put_short(data->svar[2],iobuf); | 
|---|
| 240 | put_real(data->fvar[0],iobuf); | 
|---|
| 241 | put_real(data->fvar[1],iobuf); | 
|---|
| 242 | put_double(data->dvar[0],iobuf); | 
|---|
| 243 | put_double(data->dvar[1],iobuf); | 
|---|
| 244 | put_byte(data->i8var[0],iobuf); | 
|---|
| 245 | put_byte(data->i8var[1],iobuf); | 
|---|
| 246 | put_byte(data->u8var[0],iobuf); | 
|---|
| 247 | put_byte(data->u8var[1],iobuf); | 
|---|
| 248 | put_short(data->i16var[0],iobuf); | 
|---|
| 249 | put_short(data->i16var[1],iobuf); | 
|---|
| 250 | put_short(data->u16var[0],iobuf); | 
|---|
| 251 | put_short(data->u16var[1],iobuf); | 
|---|
| 252 | put_int32(data->i32var[0],iobuf); | 
|---|
| 253 | put_int32(data->i32var[1],iobuf); | 
|---|
| 254 | put_uint32(data->u32var[0],iobuf); | 
|---|
| 255 | put_uint32(data->u32var[1],iobuf); | 
|---|
| 256 | #ifdef HAVE_64BIT_INT | 
|---|
| 257 | put_vector_of_int64(&data->i64var[0],1,iobuf); | 
|---|
| 258 | put_vector_of_int64(&data->i64var[1],1,iobuf); | 
|---|
| 259 | put_vector_of_uint64(&data->u64var[0],1,iobuf); | 
|---|
| 260 | put_vector_of_uint64(&data->u64var[1],1,iobuf); | 
|---|
| 261 | #endif | 
|---|
| 262 | return(put_item_end(iobuf,&item_header)); | 
|---|
| 263 | } | 
|---|
| 264 |  | 
|---|
| 265 | /* ---------------------- read_test1 ---------------------- */ | 
|---|
| 266 | /** | 
|---|
| 267 | *  @short Read test data with single-element functions | 
|---|
| 268 | * | 
|---|
| 269 | *  @param   data   Pointer to test data structure | 
|---|
| 270 | *  @param   iobuf  Pointer to I/O buffer | 
|---|
| 271 | * | 
|---|
| 272 | *  @return  0 (ok), <0 (error as for get_item_end()) | 
|---|
| 273 | * | 
|---|
| 274 | */ | 
|---|
| 275 |  | 
|---|
| 276 | int read_test1(data,iobuf) | 
|---|
| 277 | TEST_DATA *data; | 
|---|
| 278 | IO_BUFFER *iobuf; | 
|---|
| 279 | { | 
|---|
| 280 | IO_ITEM_HEADER item_header; | 
|---|
| 281 |  | 
|---|
| 282 | item_header.type = 99;             /* test data */ | 
|---|
| 283 | if ( get_item_begin(iobuf,&item_header) < 0 ) | 
|---|
| 284 | { | 
|---|
| 285 | Warning("Missing or invalid test data block."); | 
|---|
| 286 | return -4; | 
|---|
| 287 | } | 
|---|
| 288 |  | 
|---|
| 289 | data->lvar[0]  = get_long(iobuf); | 
|---|
| 290 | data->lvar[1]  = get_long(iobuf); | 
|---|
| 291 | data->ilvar[0] = get_long(iobuf); | 
|---|
| 292 | data->ilvar[1] = get_long(iobuf); | 
|---|
| 293 | data->isvar[0] = get_short(iobuf); | 
|---|
| 294 | data->isvar[1] = get_short(iobuf); | 
|---|
| 295 | data->svar[0]  = get_short(iobuf); | 
|---|
| 296 | data->svar[1]  = get_short(iobuf); | 
|---|
| 297 | data->svar[2]  = get_short(iobuf); | 
|---|
| 298 | data->fvar[0]  = get_real(iobuf); | 
|---|
| 299 | data->fvar[1]  = get_real(iobuf); | 
|---|
| 300 | data->dvar[0]  = get_double(iobuf); | 
|---|
| 301 | data->dvar[1]  = get_double(iobuf); | 
|---|
| 302 | data->i8var[0] = get_byte(iobuf); | 
|---|
| 303 | data->i8var[1] = get_byte(iobuf); | 
|---|
| 304 | data->u8var[0] = get_byte(iobuf); | 
|---|
| 305 | data->u8var[1] = get_byte(iobuf); | 
|---|
| 306 | data->i16var[0] = get_short(iobuf); | 
|---|
| 307 | data->i16var[1] = get_short(iobuf); | 
|---|
| 308 | data->u16var[0] = get_short(iobuf); | 
|---|
| 309 | data->u16var[1] = get_short(iobuf); | 
|---|
| 310 | data->i32var[0] = get_int32(iobuf); | 
|---|
| 311 | data->i32var[1] = get_int32(iobuf); | 
|---|
| 312 | data->u32var[0] = get_uint32(iobuf); | 
|---|
| 313 | data->u32var[1] = get_uint32(iobuf); | 
|---|
| 314 | #ifdef HAVE_64BIT_INT | 
|---|
| 315 | get_vector_of_int64(&data->i64var[0],1,iobuf); | 
|---|
| 316 | get_vector_of_int64(&data->i64var[1],1,iobuf); | 
|---|
| 317 | get_vector_of_uint64(&data->u64var[0],1,iobuf); | 
|---|
| 318 | get_vector_of_uint64(&data->u64var[1],1,iobuf); | 
|---|
| 319 | #endif | 
|---|
| 320 |  | 
|---|
| 321 | return(get_item_end(iobuf,&item_header)); | 
|---|
| 322 | } | 
|---|
| 323 |  | 
|---|
| 324 | /* --------------------- write_test2 ---------------------- */ | 
|---|
| 325 | /** | 
|---|
| 326 | *  @short Write test data with vector functions as far as possible | 
|---|
| 327 | * | 
|---|
| 328 | *  @param    data    Pointer to test data structure | 
|---|
| 329 | *  @param    iobuf   Pointer to I/O buffer | 
|---|
| 330 | * | 
|---|
| 331 | *  @return  0 (ok), <0 (error as for put_item_end()) | 
|---|
| 332 | * | 
|---|
| 333 | */ | 
|---|
| 334 |  | 
|---|
| 335 | int write_test2(data,iobuf) | 
|---|
| 336 | TEST_DATA *data; | 
|---|
| 337 | IO_BUFFER *iobuf; | 
|---|
| 338 | { | 
|---|
| 339 | IO_ITEM_HEADER item_header; | 
|---|
| 340 |  | 
|---|
| 341 | item_header.type = 99;             /* test data */ | 
|---|
| 342 | item_header.version = 0;          /* Version 0 (test) */ | 
|---|
| 343 | item_header.ident = 123; | 
|---|
| 344 |  | 
|---|
| 345 | put_item_begin(iobuf,&item_header); | 
|---|
| 346 |  | 
|---|
| 347 | put_vector_of_long(data->lvar,2,iobuf); | 
|---|
| 348 | put_long((long)data->ilvar[0],iobuf); | 
|---|
| 349 | put_long((long)data->ilvar[1],iobuf); | 
|---|
| 350 | put_vector_of_int(data->isvar,2,iobuf); | 
|---|
| 351 | put_vector_of_short(data->svar,3,iobuf); | 
|---|
| 352 | put_vector_of_real(data->fvar,2,iobuf); | 
|---|
| 353 | put_vector_of_double(data->dvar,2,iobuf); | 
|---|
| 354 | put_vector_of_byte((uint8_t *)data->i8var,2,iobuf); | 
|---|
| 355 | put_vector_of_byte(data->u8var,2,iobuf); | 
|---|
| 356 | put_vector_of_short(data->i16var,2,iobuf); | 
|---|
| 357 | put_vector_of_short((int16_t *)data->u16var,2,iobuf); | 
|---|
| 358 | put_vector_of_int32(data->i32var,2,iobuf); | 
|---|
| 359 | put_vector_of_uint32(data->u32var,2,iobuf); | 
|---|
| 360 | #ifdef HAVE_64BIT_INT | 
|---|
| 361 | put_vector_of_int64(data->i64var,2,iobuf); | 
|---|
| 362 | put_vector_of_uint64(data->u64var,2,iobuf); | 
|---|
| 363 | #endif | 
|---|
| 364 |  | 
|---|
| 365 | return(put_item_end(iobuf,&item_header)); | 
|---|
| 366 | } | 
|---|
| 367 |  | 
|---|
| 368 | /* ---------------------- read_test2 ---------------------- */ | 
|---|
| 369 | /** | 
|---|
| 370 | *  @short Read test data with vector functions as far as possible | 
|---|
| 371 | * | 
|---|
| 372 | *  @param   data   Pointer to test data structure | 
|---|
| 373 | *  @param   iobuf  Pointer to I/O buffer | 
|---|
| 374 | * | 
|---|
| 375 | *  @return  0 (ok), <0 (error as for get_item_end()) | 
|---|
| 376 | * | 
|---|
| 377 | */ | 
|---|
| 378 |  | 
|---|
| 379 | int read_test2(data,iobuf) | 
|---|
| 380 | TEST_DATA *data; | 
|---|
| 381 | IO_BUFFER *iobuf; | 
|---|
| 382 | { | 
|---|
| 383 | IO_ITEM_HEADER item_header; | 
|---|
| 384 |  | 
|---|
| 385 | item_header.type = 99;             /* test data */ | 
|---|
| 386 | if ( get_item_begin(iobuf,&item_header) < 0 ) | 
|---|
| 387 | { | 
|---|
| 388 | Warning("Missing or invalid test data block."); | 
|---|
| 389 | return -4; | 
|---|
| 390 | } | 
|---|
| 391 |  | 
|---|
| 392 | get_vector_of_long(data->lvar,2,iobuf); | 
|---|
| 393 | data->ilvar[0] = get_long(iobuf); | 
|---|
| 394 | data->ilvar[1] = get_long(iobuf); | 
|---|
| 395 | get_vector_of_int(data->isvar,2,iobuf); | 
|---|
| 396 | get_vector_of_short(data->svar,3,iobuf); | 
|---|
| 397 | get_vector_of_real(data->fvar,2,iobuf); | 
|---|
| 398 | get_vector_of_double(data->dvar,2,iobuf); | 
|---|
| 399 | get_vector_of_byte((uint8_t *)data->i8var,2,iobuf); | 
|---|
| 400 | get_vector_of_byte(data->u8var,2,iobuf); | 
|---|
| 401 | get_vector_of_short(data->i16var,2,iobuf); | 
|---|
| 402 | get_vector_of_short((int16_t *)data->u16var,2,iobuf); | 
|---|
| 403 | get_vector_of_int32(data->i32var,2,iobuf); | 
|---|
| 404 | get_vector_of_uint32(data->u32var,2,iobuf); | 
|---|
| 405 | #ifdef HAVE_64BIT_INT | 
|---|
| 406 | get_vector_of_int64(data->i64var,2,iobuf); | 
|---|
| 407 | get_vector_of_uint64(data->u64var,2,iobuf); | 
|---|
| 408 | #endif | 
|---|
| 409 |  | 
|---|
| 410 | return(get_item_end(iobuf,&item_header)); | 
|---|
| 411 | } | 
|---|
| 412 |  | 
|---|
| 413 | /* ---------------------- perror ------------------------- */ | 
|---|
| 414 | /** | 
|---|
| 415 | *  @short Replacement for function missing on OS-9 | 
|---|
| 416 | */ | 
|---|
| 417 |  | 
|---|
| 418 | #ifdef OS_OS9 | 
|---|
| 419 | int perror(text) | 
|---|
| 420 | char *text; | 
|---|
| 421 | { | 
|---|
| 422 | fprintf(stderr,"%s: Error\n",text); | 
|---|
| 423 | return 0; | 
|---|
| 424 | } | 
|---|
| 425 | #endif | 
|---|
| 426 |  | 
|---|
| 427 | /* ------------------------ main ------------------------- */ | 
|---|
| 428 | /** | 
|---|
| 429 | *  @short Main function for I/O test program. | 
|---|
| 430 | *  First writes a test data structure with the vector | 
|---|
| 431 | *  functions, then the same data structure with the | 
|---|
| 432 | *  single-element functions. The output file is then | 
|---|
| 433 | *  closed and reopened for reading. The first structure | 
|---|
| 434 | *  is then read with the single-element functions and | 
|---|
| 435 | *  the second with the vector functions (i.e. the other | 
|---|
| 436 | *  way as done for writing). | 
|---|
| 437 | *  The data from the file is compared with the original | 
|---|
| 438 | *  data, taking the relevant accuracy into account. | 
|---|
| 439 | *  Note that if an 'int' variable is written via 'put_short()' | 
|---|
| 440 | *  and then read again via 'get_short()' not only the | 
|---|
| 441 | *  upper two bytes (on a 32-bit machine) are lost but | 
|---|
| 442 | *  also the sign bit is propagated from bit 15 to the | 
|---|
| 443 | *  upper 16 bits. Similarly, if a 'long' variable is written | 
|---|
| 444 | *  via 'put_long()' and later read via 'get_long()' on a | 
|---|
| 445 | *  64-bit-machine, not only the upper 4 bytes are lost but | 
|---|
| 446 | *  also the sign in bit 31 is propagated to the upper 32 bits. | 
|---|
| 447 | */ | 
|---|
| 448 |  | 
|---|
| 449 | #ifdef ANSI_C | 
|---|
| 450 | int main (int argc, char **argv) | 
|---|
| 451 | #else | 
|---|
| 452 | int main (argc, argv) | 
|---|
| 453 | int argc; | 
|---|
| 454 | char **argv; | 
|---|
| 455 | #endif | 
|---|
| 456 | { | 
|---|
| 457 | IO_BUFFER *iobuf; | 
|---|
| 458 | IO_ITEM_HEADER item_header; | 
|---|
| 459 | FILE *output = NULL, *input; | 
|---|
| 460 | TEST_DATA tdata, cdata1, cdata2; | 
|---|
| 461 | int ok; | 
|---|
| 462 |  | 
|---|
| 463 | tdata.lvar[0]   = 0x01020304L;  tdata.lvar[1]  = 0xf1f2f3f4L; | 
|---|
| 464 | tdata.ilvar[0]  = 0x01020304;   tdata.ilvar[1] = 0xf1f2f3f4; | 
|---|
| 465 | tdata.isvar[0]  = 0x0102;       tdata.isvar[1] = 0xf1f2; | 
|---|
| 466 | tdata.svar[0]   = 0x0102; | 
|---|
| 467 | tdata.svar[1]   = (short) 0xf1f2; | 
|---|
| 468 | tdata.svar[2]   = 0x0a0b; | 
|---|
| 469 | tdata.fvar[0]   = 2.38793926059e-38; | 
|---|
| 470 | tdata.fvar[1]   = -2.40608939547e+30; | 
|---|
| 471 | tdata.dvar[0]   = 2.38793926059674673672e-140; | 
|---|
| 472 | tdata.dvar[1]   = -2.40608939547354636548e+180; | 
|---|
| 473 | tdata.i8var[0]  = 0x1e;         tdata.i8var[1]  = 0xe1; | 
|---|
| 474 | tdata.u8var[0]  = 0x1e;         tdata.u8var[1]  = 0xe1; | 
|---|
| 475 | tdata.i16var[0] = 0x1e2e;       tdata.i16var[1] = 0xe2e1; | 
|---|
| 476 | tdata.u16var[0] = 0x1e2e;       tdata.u16var[1] = 0xe2e1; | 
|---|
| 477 | tdata.i32var[0] = 0x1e2e3e4e;   tdata.i32var[1] = 0xe4e3e2e1; | 
|---|
| 478 | tdata.u32var[0] = 0x1e2e3e4e;   tdata.u32var[1] = 0xe4e3e2e1; | 
|---|
| 479 | #ifdef HAVE_64BIT_INT | 
|---|
| 480 | tdata.i64var[0] = 0x1a2a3a4a5a6a7a8a; | 
|---|
| 481 | tdata.i64var[1] = 0xa8a7a6a5a4a3a2a1; | 
|---|
| 482 | tdata.u64var[0] = 0x1b2b3b4b5b6b7b8b; | 
|---|
| 483 | tdata.u64var[1] = 0xb8b7b6b5b4b3b2b1; | 
|---|
| 484 | #endif | 
|---|
| 485 |  | 
|---|
| 486 | if ( (iobuf = allocate_io_buffer((size_t)1000)) == (IO_BUFFER *) NULL ) | 
|---|
| 487 | exit(1); | 
|---|
| 488 | if ( argc > 1 ) | 
|---|
| 489 | { | 
|---|
| 490 | if ( (output = fopen(argv[1],WRITE_BINARY)) == (FILE *) NULL ) | 
|---|
| 491 | { | 
|---|
| 492 | perror(argv[1]); | 
|---|
| 493 | exit(1); | 
|---|
| 494 | } | 
|---|
| 495 | iobuf->output_file = output; | 
|---|
| 496 | } | 
|---|
| 497 | else | 
|---|
| 498 | { | 
|---|
| 499 | fprintf(stderr,"Syntax: %s filename\n",argv[0]); | 
|---|
| 500 | exit(1); | 
|---|
| 501 | } | 
|---|
| 502 |  | 
|---|
| 503 | fprintf(stderr,"\nWrite test data to file '%s'.\n",argv[1]); | 
|---|
| 504 | fprintf(stderr,"Default byte order, using mainly vector functions.\n"); | 
|---|
| 505 | write_test2(&tdata,iobuf); | 
|---|
| 506 | fprintf(stderr,"Default byte order, using single-element functions.\n"); | 
|---|
| 507 | write_test1(&tdata,iobuf); | 
|---|
| 508 | iobuf->byte_order = 1; | 
|---|
| 509 | fprintf(stderr,"Reversed byte order, using single-element functions.\n"); | 
|---|
| 510 | write_test1(&tdata,iobuf); | 
|---|
| 511 | iobuf->byte_order = 0; | 
|---|
| 512 | fprintf(stderr,"Normal byte order, using single-element functions.\n"); | 
|---|
| 513 | write_test1(&tdata,iobuf); | 
|---|
| 514 | fprintf(stderr,"Write tests done.\n\n"); | 
|---|
| 515 |  | 
|---|
| 516 | fclose(output); | 
|---|
| 517 | iobuf->output_file = output = NULL; | 
|---|
| 518 | if ( (input = fopen(argv[1],READ_BINARY)) == (FILE *) NULL ) | 
|---|
| 519 | { | 
|---|
| 520 | perror(argv[1]); | 
|---|
| 521 | exit(1); | 
|---|
| 522 | } | 
|---|
| 523 | iobuf->input_file = input; | 
|---|
| 524 | ok = 1; | 
|---|
| 525 |  | 
|---|
| 526 | fprintf(stderr,"Read test data from file '%s'.\n",argv[1]); | 
|---|
| 527 |  | 
|---|
| 528 | fprintf(stderr,"Default byte order, using single-element functions.\n"); | 
|---|
| 529 | if ( find_io_block(iobuf,&item_header) < 0 ) | 
|---|
| 530 | { | 
|---|
| 531 | Error("*** Finding I/O block 1 failed"); | 
|---|
| 532 | exit(1); | 
|---|
| 533 | } | 
|---|
| 534 | if ( read_io_block(iobuf,&item_header) < 0 ) | 
|---|
| 535 | { | 
|---|
| 536 | Error("*** Reading I/O block 1 failed"); | 
|---|
| 537 | exit(1); | 
|---|
| 538 | } | 
|---|
| 539 | if ( read_test1(&cdata1,iobuf) < 0 ) | 
|---|
| 540 | { | 
|---|
| 541 | Error("*** Read test 1 failed"); | 
|---|
| 542 | exit(1); | 
|---|
| 543 | } | 
|---|
| 544 | if ( datacmp(&tdata,&cdata1) != 1 ) | 
|---|
| 545 | { | 
|---|
| 546 | Error("*** Data from read test 1 does not match."); | 
|---|
| 547 | ok = 0; | 
|---|
| 548 | } | 
|---|
| 549 |  | 
|---|
| 550 | fprintf(stderr,"Default byte order, using mainly vector functions.\n"); | 
|---|
| 551 | if ( find_io_block(iobuf,&item_header) < 0 ) | 
|---|
| 552 | { | 
|---|
| 553 | Error("*** Finding I/O block 1 failed"); | 
|---|
| 554 | exit(1); | 
|---|
| 555 | } | 
|---|
| 556 | if ( read_io_block(iobuf,&item_header) < 0 ) | 
|---|
| 557 | { | 
|---|
| 558 | Error("*** Reading I/O block 1 failed"); | 
|---|
| 559 | exit(1); | 
|---|
| 560 | } | 
|---|
| 561 | if ( read_test2(&cdata2,iobuf) < 0 ) | 
|---|
| 562 | { | 
|---|
| 563 | Error("*** Read test 2 failed"); | 
|---|
| 564 | exit(1); | 
|---|
| 565 | } | 
|---|
| 566 | if ( datacmp(&tdata,&cdata2) != 1 ) | 
|---|
| 567 | { | 
|---|
| 568 | Error("*** Data from read test 2 does not match"); | 
|---|
| 569 | ok = 0; | 
|---|
| 570 | } | 
|---|
| 571 | fprintf(stderr,"Reversed byte order, using single-element functions.\n"); | 
|---|
| 572 | if ( find_io_block(iobuf,&item_header) < 0 ) | 
|---|
| 573 | { | 
|---|
| 574 | Error("*** Finding I/O block 3 failed"); | 
|---|
| 575 | exit(1); | 
|---|
| 576 | } | 
|---|
| 577 | if ( read_io_block(iobuf,&item_header) < 0 ) | 
|---|
| 578 | { | 
|---|
| 579 | Error("*** Reading I/O block 3 failed"); | 
|---|
| 580 | exit(1); | 
|---|
| 581 | } | 
|---|
| 582 | if ( read_test1(&cdata1,iobuf) < 0 ) | 
|---|
| 583 | { | 
|---|
| 584 | Error("*** Read test 3 failed"); | 
|---|
| 585 | exit(1); | 
|---|
| 586 | } | 
|---|
| 587 | if ( datacmp(&tdata,&cdata1) != 1 ) | 
|---|
| 588 | { | 
|---|
| 589 | Error("*** Data from read test 3 does not match."); | 
|---|
| 590 | ok = 0; | 
|---|
| 591 | } | 
|---|
| 592 |  | 
|---|
| 593 | fprintf(stderr,"Normal byte order, using single-element functions.\n"); | 
|---|
| 594 | if ( find_io_block(iobuf,&item_header) < 0 ) | 
|---|
| 595 | { | 
|---|
| 596 | Error("*** Finding I/O block 4 failed"); | 
|---|
| 597 | exit(1); | 
|---|
| 598 | } | 
|---|
| 599 | if ( read_io_block(iobuf,&item_header) < 0 ) | 
|---|
| 600 | { | 
|---|
| 601 | Error("*** Reading I/O block 4 failed"); | 
|---|
| 602 | exit(1); | 
|---|
| 603 | } | 
|---|
| 604 | if ( read_test1(&cdata2,iobuf) < 0 ) | 
|---|
| 605 | { | 
|---|
| 606 | Error("*** Read test 4 failed"); | 
|---|
| 607 | exit(1); | 
|---|
| 608 | } | 
|---|
| 609 | if ( datacmp(&tdata,&cdata2) != 1 ) | 
|---|
| 610 | { | 
|---|
| 611 | Error("*** Data from read test 4 does not match"); | 
|---|
| 612 | ok = 0; | 
|---|
| 613 | } | 
|---|
| 614 |  | 
|---|
| 615 | Information("Read tests done\n"); | 
|---|
| 616 |  | 
|---|
| 617 | if ( ok ) | 
|---|
| 618 | Information("Everthing is ok. Congratulations!\n"); | 
|---|
| 619 |  | 
|---|
| 620 | if ( care_long ) | 
|---|
| 621 | { | 
|---|
| 622 | Information("Note: on this machine you should care about the sign propagation"); | 
|---|
| 623 | Information("of 'LONG' (INT32) data elements to long integer variables.\n"); | 
|---|
| 624 | } | 
|---|
| 625 |  | 
|---|
| 626 | if ( care_int ) | 
|---|
| 627 | { | 
|---|
| 628 | Information("Note: on this machine you should care about the sign propagation"); | 
|---|
| 629 | Information("of 'LONG' (INT32) data elements to 32 bit integer variables.\n"); | 
|---|
| 630 | } | 
|---|
| 631 |  | 
|---|
| 632 | if ( care_short ) | 
|---|
| 633 | { | 
|---|
| 634 | Information("Note: on this machine you should care about the sign propagation"); | 
|---|
| 635 | Information("of 'SHORT' data elements to integer or long integer variables.\n"); | 
|---|
| 636 | } | 
|---|
| 637 |  | 
|---|
| 638 | #ifdef HAVE_64BIT_INT | 
|---|
| 639 | Information("On this machine you can read and write 64-bit integers but you should"); | 
|---|
| 640 | Information("be aware that this feature is not available on all systems otherwise"); | 
|---|
| 641 | Information("supported by eventio."); | 
|---|
| 642 | #ifdef SIXTY_FOUR_BITS | 
|---|
| 643 | Information("These 64-bit integers are native types.\n"); | 
|---|
| 644 | #else | 
|---|
| 645 | Information("These 64-bit integers are implemented through the C compiler.\n"); | 
|---|
| 646 | #endif | 
|---|
| 647 | #else | 
|---|
| 648 | Information("On this system no 64-bit integers are supported.\n"); | 
|---|
| 649 | #endif | 
|---|
| 650 |  | 
|---|
| 651 | return 0; | 
|---|
| 652 | } | 
|---|
| 653 |  | 
|---|