1 | /*******************************************************************************
|
---|
2 | * *
|
---|
3 | * mcf_evt_xdr.c -- XDR Utility routines for the McFast Monte-Carlo *
|
---|
4 | * *
|
---|
5 | * Copyright (c) 1994 Universities Research Association, Inc. *
|
---|
6 | * All rights reserved. *
|
---|
7 | * *
|
---|
8 | * This material resulted from work developed under a Government Contract and *
|
---|
9 | * is subject to the following license: The Government retains a paid-up, *
|
---|
10 | * nonexclusive, irrevocable worldwide license to reproduce, prepare derivative *
|
---|
11 | * works, perform publicly and display publicly by or for the Government, *
|
---|
12 | * including the right to distribute to other Government contractors. Neither *
|
---|
13 | * the United States nor the United States Department of Energy, nor any of *
|
---|
14 | * their employees, makes any warranty, express or implied, or assumes any *
|
---|
15 | * legal liability or responsibility for the accuracy, completeness, or *
|
---|
16 | * usefulness of any information, apparatus, product, or process disclosed, or *
|
---|
17 | * represents that its use would not infringe privately owned rights. *
|
---|
18 | * *
|
---|
19 | * *
|
---|
20 | * Written by Paul Lebrun *
|
---|
21 | * *
|
---|
22 | * *
|
---|
23 | *******************************************************************************/
|
---|
24 | #include <stdio.h>
|
---|
25 | #include <string.h>
|
---|
26 | #include <sys/param.h>
|
---|
27 | #include <rpc/types.h>
|
---|
28 | #include <sys/types.h>
|
---|
29 | #include <rpc/xdr.h>
|
---|
30 | #include <limits.h>
|
---|
31 | #ifdef SUNOS
|
---|
32 | #include <floatingpoint.h>
|
---|
33 | #else /* SUNOS */
|
---|
34 | #include <float.h>
|
---|
35 | #endif /* SUNOS */
|
---|
36 | #include <stdlib.h>
|
---|
37 | #include <time.h>
|
---|
38 | #include "mcf_nTupleDescript.h"
|
---|
39 | #include "mcf_xdr.h"
|
---|
40 | #include "mcf_xdr_Ntuple.h"
|
---|
41 | #include "mcf_NTuIOFiles.h"
|
---|
42 | #include "mcf_NTuIOUtils.h"
|
---|
43 | #include "mcfio_Util1.h"
|
---|
44 | #ifndef FALSE
|
---|
45 | #define FALSE 0
|
---|
46 | #endif
|
---|
47 | #ifndef TRUE
|
---|
48 | #define TRUE 1
|
---|
49 | #endif
|
---|
50 |
|
---|
51 |
|
---|
52 | static bool_t xdr_mcfast_NTuDDL(XDR *xdrs, char *version, nTuDDL *ddl);
|
---|
53 | static bool_t xdr_mcfast_descrNTU(XDR *xdrs, char *version,
|
---|
54 | descrGenNtuple *dNTu);
|
---|
55 | static bool_t xdr_mcfast_varDescrNTU(XDR *xdrs, char *version,
|
---|
56 | varGenNtuple *var);
|
---|
57 |
|
---|
58 | extern nTuDDL **NTuDDLList;
|
---|
59 | extern int NumOfNTuples;
|
---|
60 |
|
---|
61 | bool_t xdr_mcfast_generic(XDR *xdrs, int *blockid,
|
---|
62 | int *ntot, char** version, char** data)
|
---|
63 | {
|
---|
64 | /* Translate a Generic mcfFast block. This module will allocate memory
|
---|
65 | for the data. */
|
---|
66 |
|
---|
67 | unsigned int nn;
|
---|
68 |
|
---|
69 | if (xdrs->x_op == XDR_ENCODE) {
|
---|
70 | nn = strlen(*data);
|
---|
71 | *ntot = 12+nn;
|
---|
72 | strcpy(*version, "0.00");
|
---|
73 | } else if (xdrs->x_op == XDR_FREE) {
|
---|
74 | free(*data);
|
---|
75 | return 1;
|
---|
76 | }
|
---|
77 |
|
---|
78 | if (( xdr_int(xdrs, blockid) &&
|
---|
79 | xdr_int(xdrs, ntot) &&
|
---|
80 | xdr_string(xdrs, version, MCF_XDR_VERSION_LENGTH))
|
---|
81 | == FALSE) return FALSE;
|
---|
82 | nn = *ntot - 12;
|
---|
83 | if (xdrs->x_op == XDR_DECODE) *data = NULL;
|
---|
84 | return (xdr_string(xdrs, data, nn));
|
---|
85 | }
|
---|
86 |
|
---|
87 |
|
---|
88 | bool_t xdr_mcfast_headerBlock(XDR *xdrs, int *blockid,
|
---|
89 | int *ntot, char** version)
|
---|
90 | {
|
---|
91 | /* Translate a Generic mcfFast block. This module will allocate memory
|
---|
92 | for the data. */
|
---|
93 |
|
---|
94 | if (xdrs->x_op == XDR_ENCODE) {
|
---|
95 | printf ("xdr_mcfast_headerBlock: Internal error \n");
|
---|
96 | return FALSE;
|
---|
97 | }
|
---|
98 |
|
---|
99 | return ( xdr_int(xdrs, blockid) &&
|
---|
100 | xdr_int(xdrs, ntot) &&
|
---|
101 | xdr_string(xdrs, version, MCF_XDR_VERSION_LENGTH));
|
---|
102 | }
|
---|
103 | bool_t xdr_mcfast_fileheader(XDR *xdrs, int *blockid,
|
---|
104 | int *ntot, char** version, mcfxdrFileHeader **mcf,
|
---|
105 | int streamId)
|
---|
106 | {
|
---|
107 | /* Translate a mcf FileHeader block. This subroutine will allocate
|
---|
108 | the memory needed if the stream is DECODE */
|
---|
109 |
|
---|
110 | int i;
|
---|
111 | unsigned int nn, oldNumOfNTuples;
|
---|
112 | char **ctmp;
|
---|
113 | char *atmp, *btmp, *dtmp;
|
---|
114 | int *itmp;
|
---|
115 | mcfxdrFileHeader *mcftmp;
|
---|
116 | nTuDDL *ddl;
|
---|
117 | float fv;
|
---|
118 |
|
---|
119 |
|
---|
120 | mcftmp = *mcf;
|
---|
121 | if (xdrs->x_op == XDR_ENCODE) {
|
---|
122 | *ntot = sizeof(mcfxdrFileHeader) - sizeof(int *) - sizeof(char **)
|
---|
123 | + 2 * sizeof(int) * mcftmp->nBlocks
|
---|
124 | - sizeof(char) * MCF_XDR_F_TITLE_LENGTH
|
---|
125 | + sizeof(char) * strlen(mcftmp->title) +
|
---|
126 | + sizeof(char) * strlen(mcftmp->comment) ;
|
---|
127 | for (i=0, ctmp = mcftmp->blockNames;
|
---|
128 | i< mcftmp->nBlocks; i++, ctmp++) *ntot += strlen(*ctmp);
|
---|
129 | strcpy(*version, "2.01");
|
---|
130 | } else if (xdrs->x_op == XDR_FREE) {
|
---|
131 | mcfioC_Free_FileHeader(mcf);
|
---|
132 | return 1;
|
---|
133 | } else if((xdrs->x_op == XDR_DECODE) && (*mcf == NULL)) {
|
---|
134 | mcftmp = (mcfxdrFileHeader *) malloc(sizeof(mcfxdrFileHeader));
|
---|
135 | *mcf = mcftmp;
|
---|
136 | }
|
---|
137 |
|
---|
138 |
|
---|
139 |
|
---|
140 | if (( xdr_int(xdrs, blockid) &&
|
---|
141 | xdr_int(xdrs, ntot) &&
|
---|
142 | xdr_string(xdrs, version, MCF_XDR_VERSION_LENGTH))
|
---|
143 | == FALSE) return FALSE;
|
---|
144 |
|
---|
145 | /*
|
---|
146 | ** Code valid for version 1.00
|
---|
147 | */
|
---|
148 | if (strcmp(*version, "1.00") == 0) {
|
---|
149 | atmp = &(mcftmp->title[0]);
|
---|
150 | btmp = &(mcftmp->comment[0]);
|
---|
151 | dtmp = &(mcftmp->date[0]);
|
---|
152 |
|
---|
153 | if ((xdr_string(xdrs, &atmp, MCF_XDR_F_TITLE_LENGTH) &&
|
---|
154 | xdr_string(xdrs,&btmp, MCF_XDR_F_TITLE_LENGTH) &&
|
---|
155 | xdr_string(xdrs,&dtmp, 30)) == FALSE) return FALSE;
|
---|
156 |
|
---|
157 | if ((xdr_u_int(xdrs,&(mcftmp->numevts_expect)) &&
|
---|
158 | xdr_u_int(xdrs,&(mcftmp->numevts)) &&
|
---|
159 | xdr_u_int(xdrs,&(mcftmp->firstTable)) &&
|
---|
160 | xdr_u_int(xdrs,&(mcftmp->dimTable)) &&
|
---|
161 | xdr_u_int(xdrs,&(mcftmp->nBlocks))) == FALSE) return FALSE;
|
---|
162 | if(xdrs->x_op == XDR_DECODE) {
|
---|
163 | mcftmp->blockIds = (int *) malloc(sizeof(int) * mcftmp->nBlocks);
|
---|
164 | mcftmp->blockNames =
|
---|
165 | (char**) malloc(sizeof(char *) * mcftmp->nBlocks);
|
---|
166 | for (i=0; i<mcftmp->nBlocks; i++)
|
---|
167 | mcftmp->blockNames[i] =
|
---|
168 | (char *) malloc(sizeof(char) * (MCF_XDR_B_TITLE_LENGTH +1));
|
---|
169 | }
|
---|
170 | itmp = mcftmp->blockIds;
|
---|
171 | if (xdrs->x_op == XDR_ENCODE) nn = mcftmp->nBlocks;
|
---|
172 | if (xdr_array(xdrs, (char **) &itmp, &nn,
|
---|
173 | mcftmp->nBlocks, sizeof(int), (void *) xdr_int) == FALSE)
|
---|
174 | return FALSE;
|
---|
175 | for (i=0; i<mcftmp->nBlocks; i++) {
|
---|
176 | if (xdr_string(xdrs, &(mcftmp->blockNames[i]),
|
---|
177 | MCF_XDR_B_TITLE_LENGTH) == FALSE) return FALSE;
|
---|
178 | }
|
---|
179 | mcftmp->nNTuples = 0;
|
---|
180 | } else if (strncmp(*version, "2.",2) == 0){
|
---|
181 | sscanf(*version, "%f", &fv);
|
---|
182 | /*
|
---|
183 | ** Code valid for version 2.xx, adding the NTuples
|
---|
184 | */
|
---|
185 | atmp = &(mcftmp->title[0]);
|
---|
186 | btmp = &(mcftmp->comment[0]);
|
---|
187 | dtmp = &(mcftmp->date[0]);
|
---|
188 |
|
---|
189 | if ((xdr_string(xdrs, &atmp, MCF_XDR_F_TITLE_LENGTH) &&
|
---|
190 | xdr_string(xdrs,&btmp, MCF_XDR_F_TITLE_LENGTH) &&
|
---|
191 | xdr_string(xdrs,&dtmp, 30)) == FALSE) return FALSE;
|
---|
192 |
|
---|
193 | if (fv == 2.) strcpy(mcftmp->closingDate, mcftmp->date);
|
---|
194 | else {
|
---|
195 | atmp = &(mcftmp->closingDate[0]);
|
---|
196 | if (xdr_string(xdrs, &atmp, 30) == FALSE) return FALSE;
|
---|
197 | }
|
---|
198 | if ((xdr_u_int(xdrs,&(mcftmp->numevts_expect)) &&
|
---|
199 | xdr_u_int(xdrs,&(mcftmp->numevts)) &&
|
---|
200 | xdr_u_int(xdrs,&(mcftmp->firstTable)) &&
|
---|
201 | xdr_u_int(xdrs,&(mcftmp->dimTable)) &&
|
---|
202 | xdr_u_int(xdrs,&(mcftmp->nBlocks)) &&
|
---|
203 | xdr_u_int(xdrs,&(mcftmp->nNTuples))) == FALSE) return FALSE;
|
---|
204 | if((xdrs->x_op == XDR_DECODE) && (mcftmp->nBlocks > 0)) {
|
---|
205 | mcftmp->blockIds = (int *) malloc(sizeof(int) * mcftmp->nBlocks);
|
---|
206 | mcftmp->blockNames =
|
---|
207 | (char**) malloc(sizeof(char *) * mcftmp->nBlocks);
|
---|
208 | for (i=0; i<mcftmp->nBlocks; i++)
|
---|
209 | mcftmp->blockNames[i] =
|
---|
210 | (char *) malloc(sizeof(char) * (MCF_XDR_B_TITLE_LENGTH +1));
|
---|
211 | }
|
---|
212 | itmp = mcftmp->blockIds;
|
---|
213 | if (xdrs->x_op == XDR_ENCODE) nn = mcftmp->nBlocks;
|
---|
214 | if (mcftmp->nBlocks > 0) {
|
---|
215 | if (xdr_array(xdrs, (char **) &itmp, &nn,
|
---|
216 | mcftmp->nBlocks, sizeof(int), (void *) xdr_int) == FALSE)
|
---|
217 | return FALSE;
|
---|
218 | for (i=0; i<mcftmp->nBlocks; i++) {
|
---|
219 | if (xdr_string(xdrs, &(mcftmp->blockNames[i]),
|
---|
220 | MCF_XDR_B_TITLE_LENGTH) == FALSE) return FALSE;
|
---|
221 | }
|
---|
222 | } else {
|
---|
223 | mcftmp->blockNames = NULL;
|
---|
224 | mcftmp->blockIds = NULL;
|
---|
225 | }
|
---|
226 | /*
|
---|
227 | ** Now take care of the Ntuples
|
---|
228 | */
|
---|
229 | if((xdrs->x_op == XDR_DECODE) && (mcftmp->nNTuples > 0)) {
|
---|
230 | oldNumOfNTuples = NumOfNTuples;
|
---|
231 | for (i=0; i<mcftmp->nNTuples; i++) {
|
---|
232 | ddl = (nTuDDL * ) malloc(sizeof(nTuDDL));
|
---|
233 | AddNTuDDLtoList(ddl);
|
---|
234 | if (xdr_mcfast_NTuDDL(xdrs, *version, ddl) == FALSE)
|
---|
235 | return FALSE;
|
---|
236 | }
|
---|
237 | } else if ((xdrs->x_op == XDR_ENCODE) && (mcftmp->nNTuples > 0)) {
|
---|
238 | for (i=0; i<NumOfNTuples; i++) {
|
---|
239 | ddl =mcf_GetNTuByPtrID(i+1);
|
---|
240 | if ((ddl->streamId == streamId) &&
|
---|
241 | (xdr_mcfast_NTuDDL(xdrs, *version, ddl) == FALSE))
|
---|
242 | return FALSE;
|
---|
243 | }
|
---|
244 | }
|
---|
245 |
|
---|
246 | } else return FALSE; /* Other Futur version encoded here. */
|
---|
247 | return TRUE;
|
---|
248 |
|
---|
249 | }
|
---|
250 |
|
---|
251 | bool_t xdr_mcfast_eventtable(XDR *xdrs, int *blockid,
|
---|
252 | int *ntot, char** version, mcfxdrEventTable **mcf)
|
---|
253 | {
|
---|
254 | /* Translate a mcf EventTable block. This subroutine will allocate
|
---|
255 | the memory needed if the stream is DECODE */
|
---|
256 |
|
---|
257 | int *idat;
|
---|
258 | unsigned int nn, nnold, *uidat;
|
---|
259 | mcfxdrEventTable *mcftmp;
|
---|
260 |
|
---|
261 |
|
---|
262 | mcftmp = *mcf;
|
---|
263 | if (xdrs->x_op == XDR_ENCODE) {
|
---|
264 | *ntot = sizeof(mcfxdrEventTable) + 4 * sizeof(int)* mcftmp->dim
|
---|
265 | + sizeof(unsigned int)* mcftmp->dim - 2 * sizeof(int)
|
---|
266 | - 4 * sizeof(int *) - sizeof(u_int *);
|
---|
267 | strcpy(*version, "1.00");
|
---|
268 | } else if (xdrs->x_op == XDR_FREE) {
|
---|
269 | mcfioC_Free_EventTable(mcf);
|
---|
270 | return 1;
|
---|
271 | } else if((xdrs->x_op == XDR_DECODE) && ( mcftmp == NULL)) {
|
---|
272 | mcftmp = (mcfxdrEventTable *) malloc(sizeof(mcfxdrEventTable));
|
---|
273 | *mcf = mcftmp;
|
---|
274 | }
|
---|
275 |
|
---|
276 |
|
---|
277 |
|
---|
278 | if (( xdr_int(xdrs, blockid) &&
|
---|
279 | xdr_int(xdrs, ntot) &&
|
---|
280 | xdr_string(xdrs, version, MCF_XDR_VERSION_LENGTH))
|
---|
281 | == FALSE) return FALSE;
|
---|
282 |
|
---|
283 | /*
|
---|
284 | ** Code valid for version 1.00
|
---|
285 | */
|
---|
286 | if (strcmp(*version, "1.00") == 0) {
|
---|
287 |
|
---|
288 | if((xdrs->x_op == XDR_DECODE) && (mcftmp->evtnums != NULL))
|
---|
289 | nnold = mcftmp->previousnumevts;
|
---|
290 | else nnold = 0;
|
---|
291 | idat = &mcftmp->nextLocator;
|
---|
292 | uidat = (u_int *) &mcftmp->numevts;
|
---|
293 | if ((xdr_int(xdrs,idat) && xdr_u_int(xdrs,uidat )) == FALSE)
|
---|
294 | return FALSE;
|
---|
295 | if(xdrs->x_op == XDR_DECODE) {
|
---|
296 | if ((mcftmp->evtnums == NULL) || (mcftmp->numevts > nnold)) {
|
---|
297 | if (mcftmp->evtnums != NULL) {
|
---|
298 | /*
|
---|
299 | ** I don't trust realloc.. just alloc again..
|
---|
300 | */
|
---|
301 | free(mcftmp->evtnums); free(mcftmp->storenums);
|
---|
302 | free(mcftmp->runnums); free(mcftmp->trigMasks);
|
---|
303 | free(mcftmp->ptrEvents);
|
---|
304 | }
|
---|
305 | mcftmp->evtnums = (int *) malloc(sizeof(int) * mcftmp->dim);
|
---|
306 | mcftmp->storenums = (int *) malloc(sizeof(int) * mcftmp->dim);
|
---|
307 | mcftmp->runnums = (int *) malloc(sizeof(int) * mcftmp->dim);
|
---|
308 | mcftmp->trigMasks = (int *) malloc(sizeof(int) * mcftmp->dim);
|
---|
309 | mcftmp->ptrEvents =
|
---|
310 | (unsigned int *) malloc(sizeof(unsigned int) * mcftmp->dim);
|
---|
311 | mcftmp->previousnumevts = mcftmp->dim;
|
---|
312 | }
|
---|
313 | }
|
---|
314 | if (xdrs->x_op == XDR_ENCODE) nn = mcftmp->dim;
|
---|
315 | idat = mcftmp->evtnums;
|
---|
316 | if (xdr_array(xdrs, (char **) &idat, &nn,
|
---|
317 | mcftmp->dim, sizeof(int), (void *) xdr_int) == FALSE)
|
---|
318 | return FALSE;
|
---|
319 | idat = mcftmp->storenums;
|
---|
320 | if (xdr_array(xdrs, (char **) &idat, &nn,
|
---|
321 | mcftmp->dim, sizeof(int), (void *) xdr_int) == FALSE)
|
---|
322 | return FALSE;
|
---|
323 | idat = mcftmp->runnums;
|
---|
324 | if (xdr_array(xdrs, (char **) &idat, &nn,
|
---|
325 | mcftmp->dim, sizeof(int), (void *) xdr_int) == FALSE)
|
---|
326 | return FALSE;
|
---|
327 | idat = mcftmp->trigMasks;
|
---|
328 | if (xdr_array(xdrs, (char **) &idat, &nn,
|
---|
329 | mcftmp->dim, sizeof(int), (void *) xdr_int) == FALSE)
|
---|
330 | return FALSE;
|
---|
331 | uidat = mcftmp->ptrEvents;
|
---|
332 | if (xdr_array(xdrs, (char **) &uidat, &nn,
|
---|
333 | mcftmp->dim, sizeof(int), (void *) xdr_u_int) == FALSE)
|
---|
334 | return FALSE;
|
---|
335 | } else return FALSE; /* Future version encoded here. */
|
---|
336 | return TRUE;
|
---|
337 |
|
---|
338 | }
|
---|
339 |
|
---|
340 | bool_t xdr_mcfast_seqheader(XDR *xdrs, int *blockid,
|
---|
341 | int *ntot, char** version, mcfxdrSequentialHeader **mcf)
|
---|
342 | {
|
---|
343 | /* Translate a mcf EventTable block. This subroutine will allocate
|
---|
344 | the memory needed if the stream is DECODE */
|
---|
345 |
|
---|
346 | mcfxdrSequentialHeader *mcftmp;
|
---|
347 |
|
---|
348 |
|
---|
349 | if (xdrs->x_op == XDR_ENCODE) {
|
---|
350 | mcftmp = *mcf;
|
---|
351 | *ntot = sizeof(mcfxdrSequentialHeader);
|
---|
352 | strcpy(*version, "1.00");
|
---|
353 | } else if (xdrs->x_op == XDR_FREE) {
|
---|
354 | mcfioC_Free_SeqHeader(mcf);
|
---|
355 | return 1;
|
---|
356 | } else if(xdrs->x_op == XDR_DECODE) {
|
---|
357 | if (*mcf == NULL) {
|
---|
358 | mcftmp = (mcfxdrSequentialHeader *)
|
---|
359 | malloc(sizeof(mcfxdrSequentialHeader));
|
---|
360 | *mcf = mcftmp;
|
---|
361 | } else mcftmp = *mcf;
|
---|
362 |
|
---|
363 | }
|
---|
364 |
|
---|
365 |
|
---|
366 |
|
---|
367 | /* if (( xdr_int(xdrs, blockid) &&
|
---|
368 | xdr_int(xdrs, ntot) &&
|
---|
369 | xdr_string(xdrs, version, MCF_XDR_VERSION_LENGTH))
|
---|
370 | == FALSE) return FALSE;
|
---|
371 | */
|
---|
372 | if (xdr_int(xdrs,blockid) == FALSE) return FALSE;
|
---|
373 | if (xdr_int(xdrs,ntot) == FALSE) return FALSE;
|
---|
374 | if (xdr_string(xdrs, version, MCF_XDR_VERSION_LENGTH)
|
---|
375 | == FALSE) return FALSE;
|
---|
376 | /*
|
---|
377 | ** Code valid for version 1.00
|
---|
378 | */
|
---|
379 | if (strcmp(*version, "1.00") == 0) {
|
---|
380 |
|
---|
381 | if (xdr_u_int(xdrs,&(mcftmp->nRecords)) == FALSE) return FALSE;
|
---|
382 | } else return FALSE; /* Futur version encoded here. */
|
---|
383 | return TRUE;
|
---|
384 |
|
---|
385 | }
|
---|
386 |
|
---|
387 | bool_t xdr_mcfast_eventheader(XDR *xdrs, int *blockid,
|
---|
388 | int *ntot, char** version, mcfxdrEventHeader **mcf)
|
---|
389 | {
|
---|
390 | /* Translate a mcf Event header block. This subroutine will allocate
|
---|
391 | the memory needed if the stream is DECODE */
|
---|
392 |
|
---|
393 | int *itmp;
|
---|
394 | unsigned int nn, nnold, nNTuOld, *uitmp;
|
---|
395 | mcfxdrEventHeader *mcftmp;
|
---|
396 |
|
---|
397 |
|
---|
398 | mcftmp = *mcf;
|
---|
399 | if (xdrs->x_op == XDR_ENCODE) {
|
---|
400 | *ntot = sizeof(mcfxdrEventHeader)
|
---|
401 | + sizeof(unsigned int)* mcftmp->nBlocks
|
---|
402 | + sizeof(int ) * mcftmp->nBlocks
|
---|
403 | - sizeof(int *) - sizeof(u_int *) ;
|
---|
404 | strcpy(*version, "2.00");
|
---|
405 | } else if (xdrs->x_op == XDR_FREE) {
|
---|
406 | mcfioC_Free_EventHeader(mcf);
|
---|
407 | return 1;
|
---|
408 | } else if((xdrs->x_op == XDR_DECODE) && (mcftmp == NULL)) {
|
---|
409 | mcftmp =
|
---|
410 | (mcfxdrEventHeader *) malloc(sizeof(mcfxdrEventHeader));
|
---|
411 | *mcf = mcftmp;
|
---|
412 | mcftmp->blockIds = NULL;
|
---|
413 | mcftmp->ptrBlocks = NULL;
|
---|
414 | }
|
---|
415 |
|
---|
416 |
|
---|
417 |
|
---|
418 | if (( xdr_int(xdrs, blockid) &&
|
---|
419 | xdr_int(xdrs, ntot) &&
|
---|
420 | xdr_string(xdrs, version, MCF_XDR_VERSION_LENGTH))
|
---|
421 | == FALSE) return FALSE;
|
---|
422 |
|
---|
423 | /*
|
---|
424 | ** Code valid for version 1.00
|
---|
425 | */
|
---|
426 | if (strcmp(*version, "1.00") == 0) {
|
---|
427 | if((xdrs->x_op == XDR_DECODE) && (mcftmp->blockIds != NULL))
|
---|
428 | nnold = mcftmp->dimBlocks;
|
---|
429 | else nnold = 0;
|
---|
430 | if ((xdr_int(xdrs,&(mcftmp->evtnum)) &&
|
---|
431 | xdr_int(xdrs,&(mcftmp->storenum)) &&
|
---|
432 | xdr_int(xdrs,&(mcftmp->runnum)) &&
|
---|
433 | xdr_int(xdrs,&(mcftmp->trigMask)) &&
|
---|
434 | xdr_u_int(xdrs,&(mcftmp->nBlocks)) &&
|
---|
435 | xdr_u_int(xdrs,&(mcftmp->dimBlocks))) == FALSE) return FALSE;
|
---|
436 | if(xdrs->x_op == XDR_DECODE) {
|
---|
437 | if ((mcftmp->blockIds == NULL) || (mcftmp->dimBlocks > nnold)) {
|
---|
438 | if (mcftmp->blockIds != NULL) {
|
---|
439 | /*
|
---|
440 | ** I don't trust realloc.. just alloc again..
|
---|
441 | */
|
---|
442 | free(mcftmp->blockIds); free(mcftmp->ptrBlocks);
|
---|
443 | }
|
---|
444 | mcftmp->blockIds =
|
---|
445 | (int *) malloc(sizeof(unsigned int) * mcftmp->dimBlocks);
|
---|
446 | mcftmp->ptrBlocks =
|
---|
447 | (unsigned int *) malloc(sizeof(unsigned int) * mcftmp->dimBlocks);
|
---|
448 | }
|
---|
449 | }
|
---|
450 | if (xdrs->x_op == XDR_ENCODE) nn = mcftmp->dimBlocks;
|
---|
451 | itmp = mcftmp->blockIds;
|
---|
452 | if (xdr_array(xdrs, (char **) &itmp, &nn,
|
---|
453 | mcftmp->dimBlocks, sizeof(int), (void *) xdr_int) == FALSE)
|
---|
454 | return FALSE;
|
---|
455 | uitmp = mcftmp->ptrBlocks;
|
---|
456 | if (xdr_array(xdrs, (char **) &uitmp, &nn,
|
---|
457 | mcftmp->dimBlocks, sizeof(u_int), (void *) xdr_u_int) == FALSE)
|
---|
458 | return FALSE;
|
---|
459 | } else if (strcmp(*version, "2.00") == 0) {
|
---|
460 | if (xdrs->x_op == XDR_DECODE) {
|
---|
461 | nnold = 0;
|
---|
462 | if (mcftmp->blockIds != NULL) nnold = mcftmp->dimBlocks;
|
---|
463 | nNTuOld = 0;
|
---|
464 | if (mcftmp->nTupleIds != NULL) nNTuOld = mcftmp->dimNTuples;
|
---|
465 | }
|
---|
466 | if ((xdr_int(xdrs,&(mcftmp->evtnum)) &&
|
---|
467 | xdr_int(xdrs,&(mcftmp->storenum)) &&
|
---|
468 | xdr_int(xdrs,&(mcftmp->runnum)) &&
|
---|
469 | xdr_int(xdrs,&(mcftmp->trigMask)) &&
|
---|
470 | xdr_u_int(xdrs,&(mcftmp->nBlocks)) &&
|
---|
471 | xdr_u_int(xdrs,&(mcftmp->dimBlocks)) &&
|
---|
472 | xdr_u_int(xdrs,&(mcftmp->nNTuples)) &&
|
---|
473 | xdr_u_int(xdrs,&(mcftmp->dimNTuples))) == FALSE) return FALSE;
|
---|
474 | if(xdrs->x_op == XDR_DECODE) {
|
---|
475 | if ((mcftmp->blockIds == NULL) || (mcftmp->dimBlocks > nnold)) {
|
---|
476 | if (mcftmp->blockIds != NULL) {
|
---|
477 | free(mcftmp->blockIds);
|
---|
478 | free(mcftmp->ptrBlocks);
|
---|
479 | }
|
---|
480 | mcftmp->blockIds =
|
---|
481 | (int *) malloc(sizeof(unsigned int) * mcftmp->dimBlocks);
|
---|
482 | mcftmp->ptrBlocks =
|
---|
483 | (unsigned int *) malloc(sizeof(unsigned int) * mcftmp->dimBlocks);
|
---|
484 | }
|
---|
485 | if ((mcftmp->nTupleIds == NULL) || (mcftmp->dimNTuples > nNTuOld)) {
|
---|
486 | if (mcftmp->nTupleIds != NULL) {
|
---|
487 | free(mcftmp->nTupleIds);
|
---|
488 | free(mcftmp->ptrNTuples);
|
---|
489 | }
|
---|
490 | mcftmp->nTupleIds =
|
---|
491 | (int *) malloc(sizeof(unsigned int) * mcftmp->dimNTuples);
|
---|
492 | mcftmp->ptrNTuples =
|
---|
493 | (unsigned int *) malloc(sizeof(unsigned int) * mcftmp->dimNTuples);
|
---|
494 | }
|
---|
495 | }
|
---|
496 | if (mcftmp->dimBlocks > 0) {
|
---|
497 | if (xdrs->x_op == XDR_ENCODE) nn = mcftmp->dimBlocks;
|
---|
498 | itmp = mcftmp->blockIds;
|
---|
499 | if (xdr_array(xdrs, (char **) &itmp, &nn,
|
---|
500 | mcftmp->dimBlocks, sizeof(int), (void *) xdr_int) == FALSE)
|
---|
501 | return FALSE;
|
---|
502 | uitmp = mcftmp->ptrBlocks;
|
---|
503 | if (xdr_array(xdrs, (char **) &uitmp, &nn,
|
---|
504 | mcftmp->dimBlocks, sizeof(u_int), (void *) xdr_u_int) == FALSE)
|
---|
505 | return FALSE;
|
---|
506 | }
|
---|
507 | if (mcftmp->dimNTuples > 0) {
|
---|
508 | if (xdrs->x_op == XDR_ENCODE) nn = mcftmp->dimNTuples;
|
---|
509 | itmp = mcftmp->nTupleIds;
|
---|
510 | if (xdr_array(xdrs, (char **) &itmp, &nn,
|
---|
511 | mcftmp->dimNTuples, sizeof(int), (void *) xdr_int) == FALSE)
|
---|
512 | return FALSE;
|
---|
513 | uitmp = mcftmp->ptrNTuples;
|
---|
514 | if (xdr_array(xdrs, (char **) &uitmp, &nn,
|
---|
515 | mcftmp->dimNTuples, sizeof(u_int), (void *) xdr_u_int) == FALSE)
|
---|
516 | return FALSE;
|
---|
517 | }
|
---|
518 | } else
|
---|
519 | return FALSE; /* Futur version encoded here. */
|
---|
520 | return TRUE;
|
---|
521 |
|
---|
522 | }
|
---|
523 |
|
---|
524 | static bool_t xdr_mcfast_NTuDDL(XDR *xdrs, char *version, nTuDDL *ddl)
|
---|
525 | {
|
---|
526 | int i, nc_title, nc_category, idRef;
|
---|
527 | descrGenNtuple *dNTu;
|
---|
528 |
|
---|
529 |
|
---|
530 | /*
|
---|
531 | ** This is the first version, let us not get too compilcated..
|
---|
532 | */
|
---|
533 | if (xdrs->x_op == XDR_ENCODE) {
|
---|
534 | nc_title = strlen(ddl->title);
|
---|
535 | nc_category = strlen(ddl->category);
|
---|
536 | idRef = -1;
|
---|
537 | /*
|
---|
538 | ** Cross reference is only valid within the same stream.
|
---|
539 | */
|
---|
540 | if ((ddl->reference != NULL) &&
|
---|
541 | (ddl->streamId == ddl->reference->streamId )) {
|
---|
542 | /*
|
---|
543 | ** compute the rerefence token. This is the sequential
|
---|
544 | ** number of the reference Ntuple for this stream.
|
---|
545 | */
|
---|
546 | for (i=0, idRef=0; i<NumOfNTuples; i++) {
|
---|
547 | if (NTuDDLList[i]->streamId == ddl->reference->streamId)
|
---|
548 | idRef++;
|
---|
549 | if (NTuDDLList[i]->id == ddl->reference->id) break;
|
---|
550 | }
|
---|
551 | }
|
---|
552 | }
|
---|
553 | if (xdr_int(xdrs, &nc_title) == FALSE) return FALSE;
|
---|
554 | if (xdr_int(xdrs, &nc_category) == FALSE) return FALSE;
|
---|
555 | if (xdr_int(xdrs, &idRef) == FALSE) return FALSE;
|
---|
556 | if (xdrs->x_op == XDR_DECODE) {
|
---|
557 | ddl->title = (char *) malloc(sizeof(char) * (nc_title +1));
|
---|
558 | ddl->category = (char *) malloc(sizeof(char) * (nc_category +1));
|
---|
559 | ddl->dbinFileName = NULL;
|
---|
560 | ddl->streamId = -1;
|
---|
561 | }
|
---|
562 | if (xdr_int(xdrs,&(ddl->uid)) == FALSE) return FALSE;
|
---|
563 | if (xdr_string(xdrs, &(ddl->title), nc_title) == FALSE) return FALSE;
|
---|
564 | if (xdr_string(xdrs, &(ddl->category),
|
---|
565 | nc_category) == FALSE) return FALSE;
|
---|
566 | if (idRef == -1) {
|
---|
567 | if (xdrs->x_op == XDR_DECODE)
|
---|
568 | ddl->descrNtu = (descrGenNtuple *) malloc (sizeof(descrGenNtuple));
|
---|
569 | if (ddl->descrNtu == NULL) dNTu = ddl->reference->descrNtu;
|
---|
570 | else dNTu = ddl->descrNtu;
|
---|
571 | if (xdr_mcfast_descrNTU(xdrs, version, dNTu) == FALSE)
|
---|
572 | return FALSE;
|
---|
573 | if (xdrs->x_op == XDR_DECODE) ddl->reference = NULL;
|
---|
574 | } else {
|
---|
575 | if (xdrs->x_op == XDR_DECODE) {
|
---|
576 | ddl->descrNtu = NULL;
|
---|
577 | ddl->referenceId = idRef;
|
---|
578 | /* we will set the reference pointer in mcfio_Direct */
|
---|
579 | }
|
---|
580 | }
|
---|
581 | return TRUE;
|
---|
582 |
|
---|
583 | }
|
---|
584 |
|
---|
585 | static bool_t xdr_mcfast_descrNTU(XDR *xdrs, char *version,
|
---|
586 | descrGenNtuple *dNTu)
|
---|
587 | {
|
---|
588 | int i, nc_desc, nc_title;
|
---|
589 | u_int nn;
|
---|
590 | char *tc;
|
---|
591 | /*
|
---|
592 | ** This is the first version, let us not get too compilcated..
|
---|
593 | */
|
---|
594 |
|
---|
595 | if (xdr_int(xdrs,&(dNTu->numVariables)) == FALSE) return FALSE;
|
---|
596 | dNTu->numAvailable = dNTu->numVariables;
|
---|
597 | if (xdr_int(xdrs,&(dNTu->maxMultiplicity)) == FALSE) return FALSE;
|
---|
598 | if (xdr_int(xdrs,&(dNTu->orgStyle)) == FALSE)return FALSE;
|
---|
599 | if (xdr_int(xdrs,&(dNTu->firstIndexed)) == FALSE) return FALSE;
|
---|
600 | if (xdrs->x_op == XDR_ENCODE) nc_title = strlen(dNTu->title);
|
---|
601 | if (xdr_int(xdrs, &nc_title) == FALSE) return FALSE;
|
---|
602 | if (xdrs->x_op == XDR_ENCODE) nc_desc = strlen(dNTu->description);
|
---|
603 | if (xdr_int(xdrs, &nc_desc) == FALSE) return FALSE;
|
---|
604 | if (xdrs->x_op == XDR_DECODE) {
|
---|
605 | dNTu->title = (char *) malloc(sizeof(char) * (nc_title+1));
|
---|
606 | dNTu->subXDROffset = NULL;
|
---|
607 | dNTu->description = (char *) malloc(sizeof(char) * (nc_desc+1));
|
---|
608 | dNTu->varOrdering = (int *) malloc(sizeof(int) * dNTu->numVariables);
|
---|
609 | for (i=0; i<dNTu->numVariables; i++) dNTu->varOrdering[i] = i;
|
---|
610 | if (dNTu->orgStyle == PARALLEL_ARRAY_NTU) {
|
---|
611 | dNTu->subXDROffset = NULL;
|
---|
612 | dNTu->subOffset = NULL;
|
---|
613 | } else {
|
---|
614 | dNTu->subOffset =
|
---|
615 | (long *) malloc(sizeof(long) * dNTu->maxMultiplicity);
|
---|
616 | dNTu->subXDROffset =
|
---|
617 | (u_int *) malloc(sizeof(long) * dNTu->maxMultiplicity);
|
---|
618 | }
|
---|
619 | dNTu->variables =
|
---|
620 | (varGenNtuple **) malloc(sizeof(varGenNtuple *) * dNTu->numVariables);
|
---|
621 | for (i=0; i<dNTu->numVariables; i++)
|
---|
622 | dNTu->variables[i] = (varGenNtuple *) malloc(sizeof(varGenNtuple));
|
---|
623 | }
|
---|
624 | tc = dNTu->nameIndex;
|
---|
625 | if (xdr_string(xdrs, &tc, 31) == FALSE) return FALSE;
|
---|
626 | if (xdr_string(xdrs,
|
---|
627 | (char **) &(dNTu->title), nc_title) == FALSE) return FALSE;
|
---|
628 | if (xdr_string(xdrs,
|
---|
629 | &(dNTu->description), nc_desc) == FALSE) return FALSE;
|
---|
630 | tc = dNTu->version;
|
---|
631 | if (xdr_string(xdrs, &tc, 7) == FALSE) return FALSE;
|
---|
632 | if (xdr_long(xdrs, &(dNTu->multOffset)) == FALSE) return FALSE;
|
---|
633 | if (xdr_long(xdrs, &(dNTu->fenceOffset)) == FALSE) return FALSE;
|
---|
634 | nn = dNTu->maxMultiplicity;
|
---|
635 | if (dNTu->orgStyle != PARALLEL_ARRAY_NTU) {
|
---|
636 | if (xdr_array(xdrs,
|
---|
637 | (char **) &(dNTu->subOffset), &nn, nn, sizeof(long), (void *) xdr_long) == FALSE)
|
---|
638 | return FALSE;
|
---|
639 | }
|
---|
640 | for (i=0; i<dNTu->numVariables; i++)
|
---|
641 | if (xdr_mcfast_varDescrNTU(xdrs, version, dNTu->variables[i]) == FALSE)
|
---|
642 | return FALSE;
|
---|
643 | return TRUE;
|
---|
644 | }
|
---|
645 | static bool_t xdr_mcfast_varDescrNTU(XDR *xdrs, char *version,
|
---|
646 | varGenNtuple *var)
|
---|
647 | {
|
---|
648 | int nc_name, nc_desc, *pdim;
|
---|
649 | u_int nn;
|
---|
650 |
|
---|
651 |
|
---|
652 |
|
---|
653 | if (xdrs->x_op == XDR_ENCODE) nc_name = strlen(var->name);
|
---|
654 | if (xdr_int(xdrs, &nc_name) == FALSE) return FALSE;
|
---|
655 | if (xdrs->x_op == XDR_ENCODE) {
|
---|
656 | if (var->description == NULL) nc_desc = 0;
|
---|
657 | else nc_desc = strlen(var->description);
|
---|
658 | }
|
---|
659 | if (xdr_int(xdrs, &nc_desc) == FALSE) return FALSE;
|
---|
660 | if (xdrs->x_op == XDR_DECODE) {
|
---|
661 | var->name = (char *) malloc(sizeof(char) * (nc_name+1));
|
---|
662 | if (nc_desc>0)
|
---|
663 | var->description = (char *) malloc(sizeof(char) * (nc_desc+1));
|
---|
664 | else var->description = NULL;
|
---|
665 | var->nameBlank = FALSE;
|
---|
666 | }
|
---|
667 |
|
---|
668 | if (xdr_string(xdrs, &(var->name), nc_name) == FALSE) return FALSE;
|
---|
669 | if (nc_desc > 0)
|
---|
670 | if (xdr_string(xdrs, &(var->description), nc_desc) == FALSE)
|
---|
671 | return FALSE;
|
---|
672 | if (xdr_int(xdrs,&(var->type)) == FALSE) return FALSE;
|
---|
673 | if (xdr_char(xdrs,&(var->isFixedSize)) == FALSE) return FALSE;
|
---|
674 | if (xdr_int(xdrs,&(var->numDim)) == FALSE) return FALSE;
|
---|
675 | nn = var->numDim;
|
---|
676 | pdim = var->dimensions;
|
---|
677 | if ((nn > 0) && (xdr_array(xdrs,
|
---|
678 | (char **) &pdim, &nn, nn, sizeof(int), (void *) xdr_int)) == FALSE)
|
---|
679 | return FALSE;
|
---|
680 | if (xdrs->x_op == XDR_ENCODE) nn = (u_int) var->lengthB;
|
---|
681 | if (xdr_u_int(xdrs,&(nn)) == FALSE) return FALSE;
|
---|
682 | if (xdrs->x_op == XDR_DECODE) var->lengthB = (size_t) nn;
|
---|
683 | if (xdrs->x_op == XDR_ENCODE) nn = (u_int) var->lengthW;
|
---|
684 | if (xdr_u_int(xdrs,&(nn)) == FALSE) return FALSE;
|
---|
685 | if (xdrs->x_op == XDR_DECODE) var->lengthW = (size_t) nn;
|
---|
686 | if (xdr_long(xdrs,&(var->offset)) == FALSE) return FALSE;
|
---|
687 | return TRUE;
|
---|
688 | }
|
---|
689 | /*
|
---|
690 | ** Generalized NTuple XDR filter
|
---|
691 | */
|
---|
692 | bool_t xdr_mcfast_NTuple(XDR *xdrs, descrGenNtuple *dNTu,
|
---|
693 | int *pnTot, int nTupleId, char* version)
|
---|
694 | {
|
---|
695 | int i, j, id, nm, lastFixed;
|
---|
696 | u_int nn;
|
---|
697 | char *vv, *cDat, *start;
|
---|
698 | int *pnMult;
|
---|
699 | void *pnFence;
|
---|
700 | int *ipnFence;
|
---|
701 | void *pt;
|
---|
702 | bool_t ok;
|
---|
703 | /*
|
---|
704 | ** Upon write, check that the version token is identical to the one stored
|
---|
705 | ** in the ddl.
|
---|
706 | */
|
---|
707 | start = version;
|
---|
708 | if(dNTu->firstIndexed == -1) lastFixed = dNTu->numVariables;
|
---|
709 | else lastFixed = dNTu->firstIndexed;
|
---|
710 | if ((xdrs->x_op == XDR_ENCODE) || (xdrs->x_op == XDR_MCFIOCODE)) {
|
---|
711 | nn = strlen(dNTu->version);
|
---|
712 | if (strncmp(version, dNTu->version, (size_t) nn ) != 0) {
|
---|
713 | fprintf (stderr, "mcfio_NTuple: version mismatch! \n\
|
---|
714 | Version used in the Event loop = %s\n\
|
---|
715 | ... in the DDl template = %s\n", version,dNTu->version);
|
---|
716 | return FALSE;
|
---|
717 | }
|
---|
718 | id = nTupleId;
|
---|
719 | /*
|
---|
720 | ** Compute the total length
|
---|
721 | */
|
---|
722 | cDat = start; cDat += dNTu->multOffset;
|
---|
723 | pnMult = (int *) cDat;
|
---|
724 | nm = *pnMult;
|
---|
725 | for (i=0, nn=0; i<lastFixed; i++)
|
---|
726 | nn += dNTu->variables[i]->lengthB;
|
---|
727 | if(dNTu->firstIndexed != -1)
|
---|
728 | for(i=dNTu->firstIndexed; i<dNTu->numVariables; i++)
|
---|
729 | nn += (dNTu->variables[i]->lengthB * nm);
|
---|
730 | *pnTot = 6 + nn/4;
|
---|
731 | }
|
---|
732 | if (xdr_int(xdrs, &id) == FALSE) return FALSE;
|
---|
733 | if (xdr_int(xdrs, pnTot) == FALSE) return FALSE;
|
---|
734 | if (xdrs->x_op == XDR_ENCODE) {
|
---|
735 | vv = dNTu->version;
|
---|
736 | if (xdr_string(xdrs, &vv, 11) == FALSE) return FALSE;
|
---|
737 | } else if (xdrs->x_op == XDR_DECODE) {
|
---|
738 | if (xdr_string(xdrs, &version, 11) == FALSE) return FALSE;
|
---|
739 | if (strcmp(version, dNTu->version) != 0) {
|
---|
740 | fprintf (stderr, "mcfio_NTuple: version mismatch! \n\
|
---|
741 | Version used in the Event loop = %s\n\
|
---|
742 | ... in the DDl template = %s\n", version,dNTu->version);
|
---|
743 | return FALSE;
|
---|
744 | }
|
---|
745 | if (id != nTupleId) {
|
---|
746 | fprintf (stderr, "mcfio_NTuple: internal error! \n\
|
---|
747 | Unexpected NTuple identifier %d instead of %d\n", id, nTupleId);
|
---|
748 | return FALSE;
|
---|
749 | }
|
---|
750 | }
|
---|
751 |
|
---|
752 | cDat = start; cDat += dNTu->multOffset;
|
---|
753 | pnMult = (int *) cDat;
|
---|
754 | if (xdr_int(xdrs, pnMult) == FALSE) return FALSE;
|
---|
755 | /*
|
---|
756 | ** Close the fence now, we will check it upon DECODE at the end
|
---|
757 | */
|
---|
758 | cDat = start; cDat += dNTu->fenceOffset;
|
---|
759 | pnFence = (void *) cDat;
|
---|
760 | if (xdrs->x_op == XDR_ENCODE) memcpy(pnFence, pnTot, sizeof(int));
|
---|
761 | if (xdr_int(xdrs, (int *) pnFence) == FALSE) return FALSE;
|
---|
762 | nm = *pnMult;
|
---|
763 | for (i=0; i<lastFixed; i++) {
|
---|
764 | if (dNTu->variables[i]->lengthW == 1) {
|
---|
765 | cDat = start; cDat += dNTu->variables[i]->offset;
|
---|
766 | pt = (void *) cDat;
|
---|
767 | switch (dNTu->variables[i]->type) {
|
---|
768 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
769 | ok = xdr_char(xdrs, (char *) pt);
|
---|
770 | break;
|
---|
771 | case INTEGER2_NTU:
|
---|
772 | ok = xdr_short(xdrs, (short *) pt);
|
---|
773 | break;
|
---|
774 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
775 | ok = xdr_int(xdrs, (int *) pt);
|
---|
776 | break;
|
---|
777 | case REAL_NTU:
|
---|
778 | ok = xdr_float(xdrs, (float *) pt);
|
---|
779 | break;
|
---|
780 | case DBL_PRECISION_NTU:
|
---|
781 | ok = xdr_double(xdrs, (double *) pt);
|
---|
782 | break;
|
---|
783 | case COMPLEX_NTU:
|
---|
784 | nn =2;
|
---|
785 | ok = xdr_array(xdrs,
|
---|
786 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
787 | break;
|
---|
788 | case DBL_COMPLEX_NTU:
|
---|
789 | nn =2;
|
---|
790 | ok = xdr_array(xdrs,
|
---|
791 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
792 | break;
|
---|
793 | case POINTER_NTU:
|
---|
794 | ok = xdr_long(xdrs, (long *) pt);
|
---|
795 | break;
|
---|
796 | default :
|
---|
797 | fprintf (stderr, "mcfio_NTuple: internal error! \n\
|
---|
798 | Unexpected variables type %d on NTuple %d\n",
|
---|
799 | dNTu->variables[i]->type, nTupleId);
|
---|
800 | break;
|
---|
801 | }
|
---|
802 | }
|
---|
803 | else if (dNTu->variables[i]->lengthW > 0) {
|
---|
804 | cDat = start; cDat += dNTu->variables[i]->offset;
|
---|
805 | pt = (void *) cDat;
|
---|
806 | nn = dNTu->variables[i]->lengthW;
|
---|
807 | switch (dNTu->variables[i]->type) {
|
---|
808 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
809 | ok = xdr_bytes(xdrs, (char **) &pt, &nn, nn);
|
---|
810 | break;
|
---|
811 | case INTEGER2_NTU:
|
---|
812 | ok = xdr_array(xdrs,
|
---|
813 | (char **) &pt, &nn, nn, sizeof(short), (void *) xdr_short);
|
---|
814 | break;
|
---|
815 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
816 | ok = xdr_array(xdrs,
|
---|
817 | (char **) &pt, &nn, nn, sizeof(int), (void *) xdr_int);
|
---|
818 | break;
|
---|
819 | case REAL_NTU:
|
---|
820 | ok = xdr_array(xdrs,
|
---|
821 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
822 | break;
|
---|
823 | case DBL_PRECISION_NTU:
|
---|
824 | ok = xdr_array(xdrs,
|
---|
825 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
826 | break;
|
---|
827 | case COMPLEX_NTU:
|
---|
828 | nn = nn*2;
|
---|
829 | ok = xdr_array(xdrs,
|
---|
830 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
831 | break;
|
---|
832 | case DBL_COMPLEX_NTU:
|
---|
833 | nn = nn*2;
|
---|
834 | ok = xdr_array(xdrs,
|
---|
835 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
836 | break;
|
---|
837 | case POINTER_NTU:
|
---|
838 | ok = xdr_array(xdrs,
|
---|
839 | (char **) &pt, &nn, nn, sizeof(long), (void *) xdr_long);
|
---|
840 | break;
|
---|
841 | default :
|
---|
842 | fprintf (stderr, "mcfio_NTuple: internal error! \n\
|
---|
843 | Unexpected variables type %d on NTuple %d\n",
|
---|
844 | dNTu->variables[i]->type, nTupleId);
|
---|
845 | break;
|
---|
846 | }
|
---|
847 | if (ok == FALSE) return FALSE;
|
---|
848 | }
|
---|
849 | }
|
---|
850 | if (dNTu->firstIndexed != -1) {
|
---|
851 | if (dNTu->orgStyle == PARALLEL_ARRAY_NTU) {
|
---|
852 | for (i=dNTu->firstIndexed; i<dNTu->numVariables; i++) {
|
---|
853 | cDat = start; cDat += dNTu->variables[i]->offset;
|
---|
854 | pt = (void *) cDat;
|
---|
855 | nn = nm * dNTu->variables[i]->lengthW;
|
---|
856 | switch (dNTu->variables[i]->type) {
|
---|
857 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
858 | vv = (char *) pt;
|
---|
859 | ok = xdr_bytes(xdrs, (char **) &pt, &nn, nn);
|
---|
860 | break;
|
---|
861 | case INTEGER2_NTU:
|
---|
862 | ok = xdr_array(xdrs,
|
---|
863 | (char **) &pt, &nn, nn, sizeof(short), (void *) xdr_short);
|
---|
864 | break;
|
---|
865 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
866 | ok = xdr_array(xdrs,
|
---|
867 | (char **) &pt, &nn, nn, sizeof(int), (void *) xdr_int);
|
---|
868 | break;
|
---|
869 | case REAL_NTU:
|
---|
870 | ok = xdr_array(xdrs,
|
---|
871 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
872 | break;
|
---|
873 | case DBL_PRECISION_NTU:
|
---|
874 | ok = xdr_array(xdrs,
|
---|
875 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
876 | break;
|
---|
877 | case COMPLEX_NTU:
|
---|
878 | nn = nn*2;
|
---|
879 | ok = xdr_array(xdrs,
|
---|
880 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
881 | break;
|
---|
882 | case DBL_COMPLEX_NTU:
|
---|
883 | nn = nn*2;
|
---|
884 | ok = xdr_array(xdrs,
|
---|
885 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
886 | break;
|
---|
887 | case POINTER_NTU:
|
---|
888 | ok = xdr_array(xdrs,
|
---|
889 | (char **) &pt, &nn, nn, sizeof(long), (void *) xdr_long);
|
---|
890 | break;
|
---|
891 | default :
|
---|
892 | fprintf (stderr, "mcfio_NTuple: internal error! \n\
|
---|
893 | Unexpected variables type %d on NTuple %d\n",
|
---|
894 | dNTu->variables[i]->type, nTupleId);
|
---|
895 | break;
|
---|
896 | }
|
---|
897 | if (ok == FALSE) return FALSE;
|
---|
898 | }
|
---|
899 | } else { /*dump the substructures one a time */
|
---|
900 | for (j=0; j<nm; j++) {
|
---|
901 | for (i=dNTu->firstIndexed; i<dNTu->numVariables; i++) {
|
---|
902 | cDat = start;
|
---|
903 | cDat += (dNTu->subOffset[j] + dNTu->variables[i]->offset);
|
---|
904 | pt = (void *) cDat;
|
---|
905 | if (dNTu->variables[i]->lengthW == 1) {
|
---|
906 | switch (dNTu->variables[i]->type) {
|
---|
907 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
908 | ok = xdr_char(xdrs, (char *) pt);
|
---|
909 | break;
|
---|
910 | case INTEGER2_NTU:
|
---|
911 | ok = xdr_short(xdrs, (short *) pt);
|
---|
912 | break;
|
---|
913 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
914 | ok = xdr_int(xdrs, (int *) pt);
|
---|
915 | break;
|
---|
916 | case REAL_NTU:
|
---|
917 | ok = xdr_float(xdrs, (float *) pt);
|
---|
918 | break;
|
---|
919 | case DBL_PRECISION_NTU:
|
---|
920 | ok = xdr_double(xdrs, (double *) pt);
|
---|
921 | break;
|
---|
922 | case COMPLEX_NTU:
|
---|
923 | nn =2;
|
---|
924 | ok = xdr_array(xdrs,
|
---|
925 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
926 | break;
|
---|
927 | case DBL_COMPLEX_NTU:
|
---|
928 | nn =2;
|
---|
929 | ok = xdr_array(xdrs,
|
---|
930 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
931 | break;
|
---|
932 | case POINTER_NTU:
|
---|
933 | ok = xdr_long(xdrs, (long *) pt);
|
---|
934 | break;
|
---|
935 | default :
|
---|
936 | fprintf (stderr, "mcfio_NTuple: internal error! \n\
|
---|
937 | Unexpected variables type %d on NTuple %d\n",
|
---|
938 | dNTu->variables[i]->type, nTupleId);
|
---|
939 | break;
|
---|
940 | }
|
---|
941 | }
|
---|
942 | else if (dNTu->variables[i]->lengthW > 0) {
|
---|
943 | nn = dNTu->variables[i]->lengthW;
|
---|
944 | switch (dNTu->variables[i]->type) {
|
---|
945 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
946 | ok = xdr_bytes(xdrs, (char **) &pt, &nn, nn);
|
---|
947 | break;
|
---|
948 | case INTEGER2_NTU:
|
---|
949 | ok = xdr_array(xdrs,
|
---|
950 | (char **) &pt, &nn, nn, sizeof(short), (void *) xdr_short);
|
---|
951 | break;
|
---|
952 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
953 | ok = xdr_array(xdrs,
|
---|
954 | (char **) &pt, &nn, nn, sizeof(int), (void *) xdr_int);
|
---|
955 | break;
|
---|
956 | case REAL_NTU:
|
---|
957 | ok = xdr_array(xdrs,
|
---|
958 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
959 | break;
|
---|
960 | case DBL_PRECISION_NTU:
|
---|
961 | ok = xdr_array(xdrs,
|
---|
962 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
963 | break;
|
---|
964 | case COMPLEX_NTU:
|
---|
965 | nn = nn*2;
|
---|
966 | ok = xdr_array(xdrs,
|
---|
967 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
968 | break;
|
---|
969 | case DBL_COMPLEX_NTU:
|
---|
970 | nn = nn*2;
|
---|
971 | ok = xdr_array(xdrs,
|
---|
972 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
973 | break;
|
---|
974 | case POINTER_NTU:
|
---|
975 | ok = xdr_array(xdrs,
|
---|
976 | (char **) &pt, &nn, nn, sizeof(long), (void *) xdr_long);
|
---|
977 | break;
|
---|
978 | default :
|
---|
979 | fprintf (stderr, "mcfio_NTuple: internal error! \n\
|
---|
980 | Unexpected variables type %d on NTuple %d\n",
|
---|
981 | dNTu->variables[i]->type, nTupleId);
|
---|
982 | break;
|
---|
983 | }
|
---|
984 | if (ok == FALSE) return FALSE;
|
---|
985 | }
|
---|
986 | } /*end of i loop */
|
---|
987 | } /*end of j loop */
|
---|
988 | } /* End of orgStyle clause */
|
---|
989 | } /* End of firstIndexed clause */
|
---|
990 | /*
|
---|
991 | ** Check the fence..
|
---|
992 | */
|
---|
993 | ipnFence = (int *) pnFence;
|
---|
994 | if ((xdrs->x_op == XDR_DECODE) && (*ipnFence != *pnTot)) {
|
---|
995 | fprintf (stderr, "mcfio_NTuple: Suspected Data Overwrite! \n\
|
---|
996 | Fence content found on the input stream is = %d\n\
|
---|
997 | ... while we expect %d\n", *ipnFence, *pnTot);
|
---|
998 | return FALSE;
|
---|
999 | }
|
---|
1000 | return TRUE;
|
---|
1001 | }
|
---|
1002 |
|
---|
1003 | /*
|
---|
1004 | ** Generalized NTuple XDR filter, for DECODE only, used exclusively
|
---|
1005 | ** to establish the relative XDR pointers.
|
---|
1006 | */
|
---|
1007 | bool_t xdr_mcfast_NTupleXDRPtr(XDR *xdrs, descrGenNtuple *dNTu,
|
---|
1008 | int *pnTot, int nTupleId, char* version)
|
---|
1009 | {
|
---|
1010 | int i, j, id, nm, lastFixed;
|
---|
1011 | u_int nn, startXDR;
|
---|
1012 | char *vv, *cDat;
|
---|
1013 | int *pnMult, *pnFence;
|
---|
1014 | void *start, *pt;
|
---|
1015 | bool_t ok;
|
---|
1016 |
|
---|
1017 | /*
|
---|
1018 | ** Allocate memory for supointer array if need be.
|
---|
1019 | */
|
---|
1020 | if(dNTu->firstIndexed == -1) lastFixed = dNTu->numVariables;
|
---|
1021 | else lastFixed = dNTu->firstIndexed;
|
---|
1022 |
|
---|
1023 | if (dNTu->subXDROffset != NULL) free(dNTu->subXDROffset);
|
---|
1024 | dNTu->subXDROffset =
|
---|
1025 | (u_int *) malloc (sizeof(u_int) * dNTu->maxMultiplicity);
|
---|
1026 | start = (void *) version;
|
---|
1027 | startXDR = xdr_getpos(xdrs);
|
---|
1028 | if (xdr_int(xdrs, &id) == FALSE) return FALSE;
|
---|
1029 | if (xdr_int(xdrs, pnTot) == FALSE) return FALSE;
|
---|
1030 |
|
---|
1031 | if (xdr_string(xdrs, &version, 11) == FALSE) return FALSE;
|
---|
1032 | if (id != nTupleId) {
|
---|
1033 | fprintf (stderr, "mcfio_NTuple: internal error! \n\
|
---|
1034 | Unexpected NTuple identifier %d instead of %d\n", id, nTupleId);
|
---|
1035 | return FALSE;
|
---|
1036 | }
|
---|
1037 | cDat = start; cDat += dNTu->multOffset;
|
---|
1038 | pnMult = (int *) cDat;
|
---|
1039 | dNTu->multXDROffset = xdr_getpos(xdrs) - startXDR;
|
---|
1040 | if (xdr_int(xdrs, pnMult) == FALSE) return FALSE;
|
---|
1041 | /*
|
---|
1042 | ** Close the fence now, we will check it upon DECODE at the end
|
---|
1043 | */
|
---|
1044 | cDat = start; cDat += dNTu->fenceOffset;
|
---|
1045 | pnFence = (int *) cDat;
|
---|
1046 | dNTu->fenceXDROffset = xdr_getpos(xdrs) - startXDR;
|
---|
1047 | if (xdr_int(xdrs, (int *) pnFence) == FALSE) return FALSE;
|
---|
1048 | nm = *pnMult;
|
---|
1049 | for (i=0; i<lastFixed; i++) {
|
---|
1050 | dNTu->variables[i]->offsetXDR = 0;
|
---|
1051 | if (dNTu->variables[i]->lengthW == 1) {
|
---|
1052 | cDat = start; cDat += dNTu->variables[i]->offset;
|
---|
1053 | pt = (void *) cDat;
|
---|
1054 | dNTu->variables[i]->offsetXDR = xdr_getpos(xdrs) - startXDR;
|
---|
1055 | switch (dNTu->variables[i]->type) {
|
---|
1056 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
1057 | ok = xdr_char(xdrs, (char *) pt);
|
---|
1058 | break;
|
---|
1059 | case INTEGER2_NTU:
|
---|
1060 | ok = xdr_short(xdrs, (short *) pt);
|
---|
1061 | break;
|
---|
1062 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
1063 | ok = xdr_int(xdrs, (int *) pt);
|
---|
1064 | break;
|
---|
1065 | case REAL_NTU:
|
---|
1066 | ok = xdr_float(xdrs, (float *) pt);
|
---|
1067 | break;
|
---|
1068 | case DBL_PRECISION_NTU:
|
---|
1069 | ok = xdr_double(xdrs, (double *) pt);
|
---|
1070 | break;
|
---|
1071 | case COMPLEX_NTU:
|
---|
1072 | nn =2;
|
---|
1073 | ok = xdr_array(xdrs,
|
---|
1074 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1075 | break;
|
---|
1076 | case DBL_COMPLEX_NTU:
|
---|
1077 | nn =2;
|
---|
1078 | ok = xdr_array(xdrs,
|
---|
1079 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1080 | break;
|
---|
1081 | case POINTER_NTU:
|
---|
1082 | ok = xdr_long(xdrs, (long *) pt);
|
---|
1083 | break;
|
---|
1084 | default :
|
---|
1085 | fprintf (stderr, "mcfio_NTuple: internal error! \n\
|
---|
1086 | Unexpected variables type %d on NTuple %d\n",
|
---|
1087 | dNTu->variables[i]->type, nTupleId);
|
---|
1088 | break;
|
---|
1089 | }
|
---|
1090 | }
|
---|
1091 | else if (dNTu->variables[i]->lengthW > 0) {
|
---|
1092 | cDat = start; cDat += dNTu->variables[i]->offset;
|
---|
1093 | pt = (void *) cDat;
|
---|
1094 | nn = dNTu->variables[i]->lengthW;
|
---|
1095 | dNTu->variables[i]->offsetXDR = xdr_getpos(xdrs) - startXDR;
|
---|
1096 | switch (dNTu->variables[i]->type) {
|
---|
1097 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
1098 | ok = xdr_bytes(xdrs, (char **) &pt, &nn, nn);
|
---|
1099 | break;
|
---|
1100 | case INTEGER2_NTU:
|
---|
1101 | ok = xdr_array(xdrs,
|
---|
1102 | (char **) &pt, &nn, nn, sizeof(short), (void *) xdr_short);
|
---|
1103 | break;
|
---|
1104 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
1105 | ok = xdr_array(xdrs,
|
---|
1106 | (char **) &pt, &nn, nn, sizeof(int), (void *) xdr_int);
|
---|
1107 | break;
|
---|
1108 | case REAL_NTU:
|
---|
1109 | ok = xdr_array(xdrs,
|
---|
1110 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1111 | break;
|
---|
1112 | case DBL_PRECISION_NTU:
|
---|
1113 | ok = xdr_array(xdrs,
|
---|
1114 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1115 | break;
|
---|
1116 | case COMPLEX_NTU:
|
---|
1117 | nn = nn*2;
|
---|
1118 | ok = xdr_array(xdrs,
|
---|
1119 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1120 | break;
|
---|
1121 | case DBL_COMPLEX_NTU:
|
---|
1122 | nn = nn*2;
|
---|
1123 | ok = xdr_array(xdrs,
|
---|
1124 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1125 | break;
|
---|
1126 | case POINTER_NTU:
|
---|
1127 | ok = xdr_array(xdrs,
|
---|
1128 | (char **) &pt, &nn, nn, sizeof(long), (void *) xdr_long);
|
---|
1129 | break;
|
---|
1130 | default :
|
---|
1131 | fprintf (stderr, "mcfio_NTuple: internal error! \n\
|
---|
1132 | Unexpected variables type %d on NTuple %d\n",
|
---|
1133 | dNTu->variables[i]->type, nTupleId);
|
---|
1134 | break;
|
---|
1135 | }
|
---|
1136 | if (ok == FALSE) return FALSE;
|
---|
1137 | }
|
---|
1138 | }
|
---|
1139 | if (dNTu->firstIndexed != -1) {
|
---|
1140 | if (dNTu->orgStyle == PARALLEL_ARRAY_NTU) {
|
---|
1141 | for (i=dNTu->firstIndexed; i<dNTu->numVariables; i++) {
|
---|
1142 | cDat =start; cDat += dNTu->variables[i]->offset;
|
---|
1143 | pt = (void *) cDat;
|
---|
1144 | nn = nm * dNTu->variables[i]->lengthW;
|
---|
1145 | dNTu->variables[i]->offsetXDR = xdr_getpos(xdrs) - startXDR;
|
---|
1146 | switch (dNTu->variables[i]->type) {
|
---|
1147 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
1148 | vv = (char *) pt;
|
---|
1149 | ok = xdr_bytes(xdrs, (char **) &pt, &nn, nn);
|
---|
1150 | break;
|
---|
1151 | case INTEGER2_NTU:
|
---|
1152 | ok = xdr_array(xdrs,
|
---|
1153 | (char **) &pt, &nn, nn, sizeof(short), (void *) xdr_short);
|
---|
1154 | break;
|
---|
1155 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
1156 | ok = xdr_array(xdrs,
|
---|
1157 | (char **) &pt, &nn, nn, sizeof(int), (void *) xdr_int);
|
---|
1158 | break;
|
---|
1159 | case REAL_NTU:
|
---|
1160 | ok = xdr_array(xdrs,
|
---|
1161 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1162 | break;
|
---|
1163 | case DBL_PRECISION_NTU:
|
---|
1164 | ok = xdr_array(xdrs,
|
---|
1165 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1166 | break;
|
---|
1167 | case COMPLEX_NTU:
|
---|
1168 | nn = nn*2;
|
---|
1169 | ok = xdr_array(xdrs,
|
---|
1170 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1171 | break;
|
---|
1172 | case DBL_COMPLEX_NTU:
|
---|
1173 | nn = nn*2;
|
---|
1174 | ok = xdr_array(xdrs,
|
---|
1175 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1176 | break;
|
---|
1177 | case POINTER_NTU:
|
---|
1178 | ok = xdr_array(xdrs,
|
---|
1179 | (char **) &pt, &nn, nn, sizeof(long), (void *) xdr_long);
|
---|
1180 | break;
|
---|
1181 | default :
|
---|
1182 | fprintf (stderr, "mcfio_NTuple: internal error! \n\
|
---|
1183 | Unexpected variables type %d on NTuple %d\n",
|
---|
1184 | dNTu->variables[i]->type, nTupleId);
|
---|
1185 | break;
|
---|
1186 | }
|
---|
1187 | if (ok == FALSE) return FALSE;
|
---|
1188 | }
|
---|
1189 | } else { /*dump the substructure one a time */
|
---|
1190 | for (j=0; j<nm; j++) {
|
---|
1191 | dNTu->subXDROffset[j] = xdr_getpos(xdrs) - startXDR;
|
---|
1192 | for (i=dNTu->firstIndexed; i<dNTu->numVariables; i++) {
|
---|
1193 | cDat = start;
|
---|
1194 | cDat += (dNTu->subOffset[j] + dNTu->variables[i]->offset);
|
---|
1195 | pt = (void *) cDat;
|
---|
1196 | if (j == 0) dNTu->variables[i]->offsetXDR = 0;
|
---|
1197 | if (dNTu->variables[i]->lengthW == 1) {
|
---|
1198 | if (j == 0) dNTu->variables[i]->offsetXDR =
|
---|
1199 | xdr_getpos(xdrs) - startXDR- dNTu->subXDROffset[j];
|
---|
1200 | switch (dNTu->variables[i]->type) {
|
---|
1201 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
1202 | ok = xdr_char(xdrs, (char *) pt);
|
---|
1203 | break;
|
---|
1204 | case INTEGER2_NTU:
|
---|
1205 | ok = xdr_short(xdrs, (short *) pt);
|
---|
1206 | break;
|
---|
1207 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
1208 | ok = xdr_int(xdrs, (int *) pt);
|
---|
1209 | break;
|
---|
1210 | case REAL_NTU:
|
---|
1211 | ok = xdr_float(xdrs, (float *) pt);
|
---|
1212 | break;
|
---|
1213 | case DBL_PRECISION_NTU:
|
---|
1214 | ok = xdr_double(xdrs, (double *) pt);
|
---|
1215 | break;
|
---|
1216 | case COMPLEX_NTU:
|
---|
1217 | nn =2;
|
---|
1218 | ok = xdr_array(xdrs,
|
---|
1219 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1220 | break;
|
---|
1221 | case DBL_COMPLEX_NTU:
|
---|
1222 | nn =2;
|
---|
1223 | ok = xdr_array(xdrs,
|
---|
1224 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1225 | break;
|
---|
1226 | case POINTER_NTU:
|
---|
1227 | ok = xdr_long(xdrs, (long *) pt);
|
---|
1228 | break;
|
---|
1229 | default :
|
---|
1230 | fprintf (stderr, "mcfio_NTuple: internal error! \n\
|
---|
1231 | Unexpected variables type %d on NTuple %d\n",
|
---|
1232 | dNTu->variables[i]->type, nTupleId);
|
---|
1233 | break;
|
---|
1234 | }
|
---|
1235 | }
|
---|
1236 | else if (dNTu->variables[i]->lengthW > 0) {
|
---|
1237 | nn = dNTu->variables[i]->lengthW;
|
---|
1238 | if (j == 0) dNTu->variables[i]->offsetXDR =
|
---|
1239 | xdr_getpos(xdrs) - startXDR - dNTu->subXDROffset[0];
|
---|
1240 | switch (dNTu->variables[i]->type) {
|
---|
1241 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
1242 | ok = xdr_bytes(xdrs, (char **) &pt, &nn, nn);
|
---|
1243 | break;
|
---|
1244 | case INTEGER2_NTU:
|
---|
1245 | ok = xdr_array(xdrs,
|
---|
1246 | (char **) &pt, &nn, nn, sizeof(short), (void *) xdr_short);
|
---|
1247 | break;
|
---|
1248 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
1249 | ok = xdr_array(xdrs,
|
---|
1250 | (char **) &pt, &nn, nn, sizeof(int), (void *) xdr_int);
|
---|
1251 | break;
|
---|
1252 | case REAL_NTU:
|
---|
1253 | ok = xdr_array(xdrs,
|
---|
1254 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1255 | break;
|
---|
1256 | case DBL_PRECISION_NTU:
|
---|
1257 | ok = xdr_array(xdrs,
|
---|
1258 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1259 | break;
|
---|
1260 | case COMPLEX_NTU:
|
---|
1261 | nn = nn*2;
|
---|
1262 | ok = xdr_array(xdrs,
|
---|
1263 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1264 | break;
|
---|
1265 | case DBL_COMPLEX_NTU:
|
---|
1266 | nn = nn*2;
|
---|
1267 | ok = xdr_array(xdrs,
|
---|
1268 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1269 | break;
|
---|
1270 | case POINTER_NTU:
|
---|
1271 | ok = xdr_array(xdrs,
|
---|
1272 | (char **) &pt, &nn, nn, sizeof(long), (void *) xdr_long);
|
---|
1273 | break;
|
---|
1274 | default :
|
---|
1275 | fprintf (stderr, "mcfio_NTuple: internal error! \n\
|
---|
1276 | Unexpected variables type %d on NTuple %d\n",
|
---|
1277 | dNTu->variables[i]->type, nTupleId);
|
---|
1278 | break;
|
---|
1279 | }
|
---|
1280 | if (ok == FALSE) return FALSE;
|
---|
1281 | }
|
---|
1282 | } /*end of i loop */
|
---|
1283 | } /*end of j loop */
|
---|
1284 | } /* End of orgStyle clause */
|
---|
1285 | } /* End of firstIndexed clause */
|
---|
1286 | /*
|
---|
1287 | ** Check the fence..
|
---|
1288 | */
|
---|
1289 | if (*pnFence != *pnTot) {
|
---|
1290 | fprintf (stderr, "mcfio_NTuple: Suspected Data Overwrite! \n\
|
---|
1291 | Fence content found on the input stream is = %d\n\
|
---|
1292 | ... while we expect %d\n", *pnFence, *pnTot);
|
---|
1293 | return FALSE;
|
---|
1294 | }
|
---|
1295 | return TRUE;
|
---|
1296 | }
|
---|
1297 | /*
|
---|
1298 | ** Generalized NTuple XDR filter, used for Decode only.
|
---|
1299 | ** Simply decode the multiplicty value. No checks whatsoever!
|
---|
1300 | */
|
---|
1301 | bool_t xdr_mcfast_NTupleMult(mcfStream *str, descrGenNtuple *dNTu,
|
---|
1302 | char* version)
|
---|
1303 | {
|
---|
1304 | char *cDat;
|
---|
1305 |
|
---|
1306 | cDat = version;
|
---|
1307 | cDat += dNTu->multOffset;
|
---|
1308 | xdr_setpos(str->xdr, (str->currentPos + dNTu->multXDROffset) );
|
---|
1309 | return (xdr_int(str->xdr, ((int *) cDat)));
|
---|
1310 | }
|
---|
1311 |
|
---|
1312 | /*
|
---|
1313 | ** Generalized NTuple XDR filter, used for Decode only.
|
---|
1314 | ** Simply decode one variable (scalar) or array value. No checks whatsoever!
|
---|
1315 | ** Not applicable if the structure organization style is VAX FORTRAN d/s
|
---|
1316 | ** and the index corresponds to an indexed variable.
|
---|
1317 | */
|
---|
1318 | bool_t xdr_mcfast_NTupleVar(mcfStream *str, descrGenNtuple *dNTu,
|
---|
1319 | int ivar, char* version)
|
---|
1320 | {
|
---|
1321 | char *cDat;
|
---|
1322 | u_int nn;
|
---|
1323 | void *pt;
|
---|
1324 | int ivarP;
|
---|
1325 |
|
---|
1326 | ivarP = ivar;
|
---|
1327 | while (dNTu->variables[ivarP]->lengthW == 0) ivarP--;
|
---|
1328 | cDat = version;
|
---|
1329 | cDat += dNTu->variables[ivarP]->offset;
|
---|
1330 | pt = (void *) cDat;
|
---|
1331 | xdr_setpos(str->xdr,
|
---|
1332 | (str->currentPos + dNTu->variables[ivarP]->offsetXDR));
|
---|
1333 | if ((dNTu->variables[ivarP]->lengthW == 1) &&
|
---|
1334 | (ivarP < dNTu->firstIndexed)) {
|
---|
1335 | switch (dNTu->variables[ivarP]->type) {
|
---|
1336 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
1337 | return xdr_char(str->xdr, (char *) pt);
|
---|
1338 | case INTEGER2_NTU:
|
---|
1339 | return xdr_short(str->xdr, (short *) pt);
|
---|
1340 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
1341 | return xdr_int(str->xdr, (int *) pt);
|
---|
1342 | case REAL_NTU:
|
---|
1343 | return xdr_float(str->xdr, (float *) pt);
|
---|
1344 | case DBL_PRECISION_NTU:
|
---|
1345 | return xdr_double(str->xdr, (double *) pt);
|
---|
1346 | case COMPLEX_NTU:
|
---|
1347 | nn =2;
|
---|
1348 | return xdr_array(str->xdr,
|
---|
1349 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1350 | case DBL_COMPLEX_NTU:
|
---|
1351 | nn =2;
|
---|
1352 | return xdr_array(str->xdr,
|
---|
1353 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1354 | case POINTER_NTU:
|
---|
1355 | return xdr_long(str->xdr, (long *) pt);
|
---|
1356 | default :
|
---|
1357 | return FALSE;
|
---|
1358 | }
|
---|
1359 | } else {
|
---|
1360 | nn = dNTu->variables[ivarP]->lengthW;
|
---|
1361 | switch (dNTu->variables[ivarP]->type) {
|
---|
1362 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
1363 | return xdr_bytes(str->xdr, (char **) &pt, &nn, nn);
|
---|
1364 | case INTEGER2_NTU:
|
---|
1365 | return xdr_array(str->xdr,
|
---|
1366 | (char **) &pt, &nn, nn, sizeof(short), (void *) xdr_short);
|
---|
1367 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
1368 | return xdr_array(str->xdr,
|
---|
1369 | (char **) &pt, &nn, nn, sizeof(int), (void *) xdr_int);
|
---|
1370 | case REAL_NTU:
|
---|
1371 | return xdr_array(str->xdr,
|
---|
1372 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1373 | case DBL_PRECISION_NTU:
|
---|
1374 | return xdr_array(str->xdr,
|
---|
1375 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1376 | case COMPLEX_NTU:
|
---|
1377 | nn = nn*2;
|
---|
1378 | return xdr_array(str->xdr,
|
---|
1379 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1380 | case DBL_COMPLEX_NTU:
|
---|
1381 | nn = nn*2;
|
---|
1382 | return xdr_array(str->xdr,
|
---|
1383 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1384 | case POINTER_NTU:
|
---|
1385 | return xdr_array(str->xdr,
|
---|
1386 | (char **) &pt, &nn, nn, sizeof(long), (void *) xdr_long);
|
---|
1387 | default :
|
---|
1388 | return FALSE;
|
---|
1389 | }
|
---|
1390 | }
|
---|
1391 | }
|
---|
1392 | /*
|
---|
1393 | ** Generalized NTuple XDR filter, used for Decode only.
|
---|
1394 | ** Simply decode one variable (scalar) or array value. No checks whatsoever!
|
---|
1395 | ** Not applicable if the structure organization style is parallel array
|
---|
1396 | ** or the index corresponds to a fixed size variable.
|
---|
1397 | */
|
---|
1398 | bool_t xdr_mcfast_NTupleSubVar(mcfStream *str, descrGenNtuple *dNTu,
|
---|
1399 | int ivar, int multIndex, char* version)
|
---|
1400 | {
|
---|
1401 | char *cDat;
|
---|
1402 | u_int nn;
|
---|
1403 | void *pt;
|
---|
1404 | int ivarP;
|
---|
1405 |
|
---|
1406 | ivarP = ivar;
|
---|
1407 | while (dNTu->variables[ivarP]->lengthW == 0) ivarP--;
|
---|
1408 | cDat = version;
|
---|
1409 | cDat += dNTu->subOffset[multIndex];
|
---|
1410 | cDat += dNTu->variables[ivarP]->offset;
|
---|
1411 | pt = (void *) cDat;
|
---|
1412 | xdr_setpos(str->xdr,
|
---|
1413 | (str->currentPos + dNTu->subXDROffset[multIndex] +
|
---|
1414 | dNTu->variables[ivarP]->offsetXDR));
|
---|
1415 | if (dNTu->variables[ivarP]->lengthW == 1) {
|
---|
1416 | switch (dNTu->variables[ivarP]->type) {
|
---|
1417 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
1418 | return xdr_char(str->xdr, (char *) pt);
|
---|
1419 | case INTEGER2_NTU:
|
---|
1420 | return xdr_short(str->xdr, (short *) pt);
|
---|
1421 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
1422 | return xdr_int(str->xdr, (int *) pt);
|
---|
1423 | case REAL_NTU:
|
---|
1424 | return xdr_float(str->xdr, (float *) pt);
|
---|
1425 | case DBL_PRECISION_NTU:
|
---|
1426 | return xdr_double(str->xdr, (double *) pt);
|
---|
1427 | case COMPLEX_NTU:
|
---|
1428 | nn =2;
|
---|
1429 | return xdr_array(str->xdr,
|
---|
1430 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1431 | case DBL_COMPLEX_NTU:
|
---|
1432 | nn =2;
|
---|
1433 | return xdr_array(str->xdr,
|
---|
1434 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1435 | case POINTER_NTU:
|
---|
1436 | return xdr_long(str->xdr, (long *) pt);
|
---|
1437 | default :
|
---|
1438 | return FALSE;
|
---|
1439 | }
|
---|
1440 | } else {
|
---|
1441 | nn = dNTu->variables[ivarP]->lengthW;
|
---|
1442 | switch (dNTu->variables[ivarP]->type) {
|
---|
1443 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
1444 | return xdr_bytes(str->xdr, (char **) &pt, &nn, nn);
|
---|
1445 | case INTEGER2_NTU:
|
---|
1446 | return xdr_array(str->xdr,
|
---|
1447 | (char **) &pt, &nn, nn, sizeof(short), (void *) xdr_short);
|
---|
1448 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
1449 | return xdr_array(str->xdr,
|
---|
1450 | (char **) &pt, &nn, nn, sizeof(int), (void *) xdr_int);
|
---|
1451 | case REAL_NTU:
|
---|
1452 | return xdr_array(str->xdr,
|
---|
1453 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1454 | case DBL_PRECISION_NTU:
|
---|
1455 | return xdr_array(str->xdr,
|
---|
1456 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1457 | case COMPLEX_NTU:
|
---|
1458 | nn = nn*2;
|
---|
1459 | return xdr_array(str->xdr,
|
---|
1460 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1461 | case DBL_COMPLEX_NTU:
|
---|
1462 | nn = nn*2;
|
---|
1463 | return xdr_array(str->xdr,
|
---|
1464 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1465 | case POINTER_NTU:
|
---|
1466 | return xdr_array(str->xdr,
|
---|
1467 | (char **) &pt, &nn, nn, sizeof(long), (void *) xdr_long);
|
---|
1468 | default :
|
---|
1469 | return FALSE;
|
---|
1470 | }
|
---|
1471 | }
|
---|
1472 | }
|
---|
1473 | /*
|
---|
1474 | ** Generalized NTuple XDR filter, used for Decode only.
|
---|
1475 | ** Simply decode a sub-structure given a value for the multiplicity index.
|
---|
1476 | ** Not applicable if the structure organization style is parallel array.
|
---|
1477 | ** No check whatsover!
|
---|
1478 | */
|
---|
1479 | bool_t xdr_mcfast_NTupleSubStruct(mcfStream *str, descrGenNtuple *dNTu,
|
---|
1480 | int multIndex, char* version)
|
---|
1481 | {
|
---|
1482 | char *cDat;
|
---|
1483 | u_int nn;
|
---|
1484 | void *pt;
|
---|
1485 | int iv;
|
---|
1486 | bool_t ok;
|
---|
1487 |
|
---|
1488 | xdr_setpos(str->xdr,
|
---|
1489 | (str->currentPos + dNTu->subXDROffset[multIndex]));
|
---|
1490 | for (iv=dNTu->firstIndexed; iv<dNTu->numVariables; iv++) {
|
---|
1491 | cDat = version;
|
---|
1492 | cDat +=
|
---|
1493 | dNTu->subOffset[multIndex] + dNTu->variables[iv]->offset;
|
---|
1494 | pt = (void *) cDat;
|
---|
1495 | if (dNTu->variables[iv]->lengthW == 1) {
|
---|
1496 | switch (dNTu->variables[iv]->type) {
|
---|
1497 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
1498 | ok = xdr_char(str->xdr, (char *) pt);
|
---|
1499 | break;
|
---|
1500 | case INTEGER2_NTU:
|
---|
1501 | ok = xdr_short(str->xdr, (short *) pt);
|
---|
1502 | break;
|
---|
1503 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
1504 | ok = xdr_int(str->xdr, (int *) pt);
|
---|
1505 | break;
|
---|
1506 | case REAL_NTU:
|
---|
1507 | ok = xdr_float(str->xdr, (float *) pt);
|
---|
1508 | break;
|
---|
1509 | case DBL_PRECISION_NTU:
|
---|
1510 | ok = xdr_double(str->xdr, (double *) pt);
|
---|
1511 | break;
|
---|
1512 | case COMPLEX_NTU:
|
---|
1513 | nn =2;
|
---|
1514 | ok = xdr_array(str->xdr,
|
---|
1515 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1516 | break;
|
---|
1517 | case DBL_COMPLEX_NTU:
|
---|
1518 | nn =2;
|
---|
1519 | ok = xdr_array(str->xdr,
|
---|
1520 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1521 | break;
|
---|
1522 | case POINTER_NTU:
|
---|
1523 | ok = xdr_long(str->xdr, (long *) pt);
|
---|
1524 | default :
|
---|
1525 | return FALSE;
|
---|
1526 | }
|
---|
1527 | } else if (dNTu->variables[iv]->lengthW > 1){
|
---|
1528 | nn = dNTu->variables[iv]->lengthW;
|
---|
1529 | switch (dNTu->variables[iv]->type) {
|
---|
1530 | case BYTE_NTU: case CHARACTER_NTU:
|
---|
1531 | ok = xdr_bytes(str->xdr, (char **) &pt, &nn, nn);
|
---|
1532 | break;
|
---|
1533 | case INTEGER2_NTU:
|
---|
1534 | ok = xdr_array(str->xdr,
|
---|
1535 | (char **) &pt, &nn, nn, sizeof(short), (void *) xdr_short);
|
---|
1536 | break;
|
---|
1537 | case LOGICAL_NTU: case INTEGER_NTU:
|
---|
1538 | ok = xdr_array(str->xdr,
|
---|
1539 | (char **) &pt, &nn, nn, sizeof(int), (void *) xdr_int);
|
---|
1540 | break;
|
---|
1541 | case REAL_NTU:
|
---|
1542 | ok = xdr_array(str->xdr,
|
---|
1543 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1544 | break;
|
---|
1545 | case DBL_PRECISION_NTU:
|
---|
1546 | ok = xdr_array(str->xdr,
|
---|
1547 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1548 | break;
|
---|
1549 | case COMPLEX_NTU:
|
---|
1550 | nn = nn*2;
|
---|
1551 | ok = xdr_array(str->xdr,
|
---|
1552 | (char **) &pt, &nn, nn, sizeof(float), (void *) xdr_float);
|
---|
1553 | break;
|
---|
1554 | case DBL_COMPLEX_NTU:
|
---|
1555 | nn = nn*2;
|
---|
1556 | ok = xdr_array(str->xdr,
|
---|
1557 | (char **) &pt, &nn, nn, sizeof(double), (void *) xdr_double);
|
---|
1558 | break;
|
---|
1559 | case POINTER_NTU:
|
---|
1560 | ok = xdr_array(str->xdr,
|
---|
1561 | (char **) &pt, &nn, nn, sizeof(long), (void *) xdr_long);
|
---|
1562 | break;
|
---|
1563 | default :
|
---|
1564 | return FALSE;
|
---|
1565 | }
|
---|
1566 | }
|
---|
1567 | }
|
---|
1568 | return TRUE;
|
---|
1569 | }
|
---|