00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #pragma ident "@(#) libf/fio/cntigchk.c 92.1 06/18/99 10:21:14"
00043
00044 #include <liberrno.h>
00045 #include <stdlib.h>
00046 #include <string.h>
00047 #include <cray/nassert.h>
00048 #include <cray/dopevec.h>
00049 #include "fio.h"
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 int
00077 _cntig_chk(DopeVectorType *dv,
00078 void **newar,
00079 int *nocontig,
00080 long *extent,
00081 long *nbytes)
00082 {
00083 long *base;
00084 char *cbase;
00085 long extnt = 1;
00086 int i;
00087 long k;
00088 int type;
00089 long nbyts;
00090 int notcontig = 0;
00091 int nd;
00092 long extente;
00093 long elsize;
00094 long id2, id3,id4;
00095 long id5, id6, id7;
00096 int badjust;
00097 long *addr;
00098 char *baddr;
00099 void *addr2, *addr3, *addr4;
00100 void *addr5, *addr6;
00101
00102 type = dv->type_lens.type;
00103 nd = dv->n_dim;
00104
00105
00106 if (dv->type_lens.type == DVTYPE_ASCII) {
00107 nbyts = _fcdlen (dv->base_addr.charptr);
00108 elsize = nbyts;
00109 }
00110 else {
00111 nbyts = dv->type_lens.int_len >> 3;
00112 elsize = nbyts >> 3;
00113 }
00114
00115
00116
00117
00118 for (i=0; i < nd; i++) {
00119 long st;
00120 long ex;
00121 extnt *= dv->dimension[i].extent;
00122 st = dv->dimension[i].stride_mult;
00123 ex = dv->dimension[i].extent;
00124
00125 if ((i < nd-1) && ((st * ex) !=
00126 dv->dimension[i+1].stride_mult))
00127 notcontig = 1;
00128
00129 else if ((i == nd-1) && (st != elsize))
00130 notcontig = 1;
00131 }
00132
00133 *nocontig = notcontig;
00134 *extent = extnt;
00135
00136
00137 nbyts *= extnt;
00138 *nbytes = nbyts;
00139
00140 if (notcontig == 0) {
00141 *newar = NULL;
00142 return(0);
00143 }
00144
00145
00146 base = (void *) NULL;
00147 *newar = base;
00148
00149
00150
00151
00152 if (nbyts != 0) {
00153 base = (void *) malloc (nbyts);
00154
00155
00156 if (base == NULL) {
00157 return(FENOMEMY);
00158
00159 }
00160 }
00161 *newar = base;
00162
00163
00164 if (nbyts == 0)
00165 return(0);
00166
00167
00168 badjust = 0;
00169 extente = dv->dimension[0].extent;
00170 if (type == DVTYPE_ASCII) {
00171 char *ba;
00172 cbase = (char *) base;
00173 baddr = _fcdtocp(dv->base_addr.charptr) +
00174 badjust * (dv->type_lens.int_len >> 3);
00175
00176 switch(nd) {
00177 case 7:
00178 for (id7=0; id7<dv->dimension[6].extent; id7++) {
00179 addr6 = baddr;
00180 case 6:
00181 for (id6=0; id6<dv->dimension[5].extent; id6++) {
00182 addr5 = baddr;
00183 case 5:
00184 for (id5=0; id5<dv->dimension[4].extent; id5++) {
00185 addr4 = baddr;
00186 case 4:
00187 for (id4=0; id4<dv->dimension[3].extent; id4++) {
00188 addr3 = baddr;
00189 case 3:
00190 for (id3=0; id3<dv->dimension[2].extent; id3++) {
00191 addr2 = baddr;
00192 case 2:
00193 for (id2=0; id2<dv->dimension[1].extent; id2++) {
00194 case 1:
00195 ba = baddr;
00196 for (i=0; i<extente; i++) {
00197 (void *) memcpy (cbase,ba,elsize);
00198 cbase += elsize;
00199 ba += dv->dimension[0].stride_mult;
00200 }
00201 if (nd == 1) goto done;
00202 baddr += dv->dimension[1].stride_mult;
00203 }
00204 if (nd == 2) goto done;
00205 baddr = addr2;
00206 baddr += dv->dimension[2].stride_mult;
00207 }
00208 if (nd == 3) goto done;
00209 baddr = addr3;
00210 baddr += dv->dimension[3].stride_mult;
00211 }
00212 if (nd == 4) goto done;
00213 baddr = addr4;
00214 baddr += dv->dimension[4].stride_mult;
00215 }
00216 if (nd == 5) goto done;
00217 baddr = addr5;
00218 baddr += dv->dimension[5].stride_mult;
00219 }
00220 if (nd == 6) goto done;
00221 baddr = addr6;
00222 baddr += dv->dimension[6].stride_mult;
00223 }
00224 }
00225 }
00226 else {
00227 long *ba;
00228 k = 0;
00229 addr = (long*)dv->base_addr.a.ptr + badjust;
00230
00231 switch(nd) {
00232 case 7:
00233 for (id7=0; id7<dv->dimension[6].extent; id7++) {
00234 addr6 = addr;
00235 case 6:
00236 for (id6=0; id6<dv->dimension[5].extent; id6++) {
00237 addr5 = addr;
00238 case 5:
00239 for (id5=0; id5<dv->dimension[4].extent; id5++) {
00240 addr4 = addr;
00241 case 4:
00242 for (id4=0; id4<dv->dimension[3].extent; id4++) {
00243 addr3 = addr;
00244 case 3:
00245 for (id3=0; id3<dv->dimension[2].extent; id3++) {
00246 addr2 = addr;
00247 case 2:
00248 for (id2=0; id2<dv->dimension[1].extent; id2++) {
00249 case 1:
00250 ba = addr;
00251 for (i=0; i<extente; i++) {
00252
00253 base[k] = ba[0];
00254 k++;
00255 ba += dv->dimension[0].stride_mult;
00256 }
00257 if (nd == 1) goto done;
00258 addr += dv->dimension[1].stride_mult;
00259 }
00260 if (nd == 2) goto done;
00261 addr = addr2;
00262 addr += dv->dimension[2].stride_mult;
00263 }
00264 if (nd == 3) goto done;
00265 addr = addr3;
00266 addr += dv->dimension[3].stride_mult;
00267 }
00268 if (nd == 4) goto done;
00269 addr = addr4;
00270 addr += dv->dimension[4].stride_mult;
00271 }
00272 if (nd == 5) goto done;
00273 addr = addr5;
00274 addr += dv->dimension[5].stride_mult;
00275 }
00276 if (nd == 6) goto done;
00277 addr = addr6;
00278 addr += dv->dimension[6].stride_mult;
00279 }
00280 }
00281 }
00282 done: return(0);
00283 }
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294 int
00295 _unpack_arry(void *dvc, DopeVectorType *dvnc)
00296 {
00297 long * restrict base;
00298 char * restrict cbase;
00299 long extnt = 1;
00300 int i;
00301 long k;
00302 int type;
00303 long elsize;
00304 int nd;
00305 long extente;
00306 long id2, id3,id4;
00307 long id5, id6, id7;
00308 int badjust;
00309 long *addr;
00310 char *baddr;
00311 void *addr2, *addr3, *addr4;
00312 void *addr5, *addr6;
00313
00314 type = dvnc->type_lens.type;
00315 nd = dvnc->n_dim;
00316
00317
00318 if (dvnc->type_lens.type == DVTYPE_ASCII)
00319 elsize = _fcdlen (dvnc->base_addr.charptr);
00320 else
00321 elsize = dvnc->type_lens.int_len >> 6;
00322
00323
00324 for (i=0; i < nd; i++)
00325 extnt *= dvnc->dimension[i].extent;
00326
00327
00328 extente = dvnc->dimension[0].extent;
00329 base = dvc;
00330 cbase = (char *) base;
00331 badjust = 0;
00332 if (type == DVTYPE_ASCII) {
00333 char *ba;
00334 baddr = _fcdtocp(dvnc->base_addr.charptr) +
00335 badjust * (dvnc->type_lens.int_len >> 3);
00336
00337 switch(nd) {
00338 case 7:
00339 for (id7=0; id7<dvnc->dimension[6].extent; id7++) {
00340 addr6 = baddr;
00341 case 6:
00342 for (id6=0; id6<dvnc->dimension[5].extent; id6++) {
00343 addr5 = baddr;
00344 case 5:
00345 for (id5=0; id5<dvnc->dimension[4].extent; id5++) {
00346 addr4 = baddr;
00347 case 4:
00348 for (id4=0; id4<dvnc->dimension[3].extent; id4++) {
00349 addr3 = baddr;
00350 case 3:
00351 for (id3=0; id3<dvnc->dimension[2].extent; id3++) {
00352 addr2 = baddr;
00353 case 2:
00354 for (id2=0; id2<dvnc->dimension[1].extent; id2++) {
00355 case 1:
00356 ba = baddr;
00357 for (i=0; i<extente; i++) {
00358 (void *) memcpy (ba,cbase,elsize);
00359 cbase += elsize;
00360 ba += dvnc->dimension[0].stride_mult;
00361 }
00362 if (nd == 1) goto done;
00363 baddr += dvnc->dimension[1].stride_mult;
00364 }
00365 if (nd == 2) goto done;
00366 baddr = addr2;
00367 baddr += dvnc->dimension[2].stride_mult;
00368 }
00369 if (nd == 3) goto done;
00370 baddr = addr3;
00371 baddr += dvnc->dimension[3].stride_mult;
00372 }
00373 if (nd == 4) goto done;
00374 baddr = addr4;
00375 baddr += dvnc->dimension[4].stride_mult;
00376 }
00377 if (nd == 5) goto done;
00378 baddr = addr5;
00379 baddr += dvnc->dimension[5].stride_mult;
00380 }
00381 if (nd == 6) goto done;
00382 baddr = addr6;
00383 baddr += dvnc->dimension[6].stride_mult;
00384 }
00385 }
00386 }
00387 else {
00388 long *ba;
00389 k = 0;
00390 addr = (long*)dvnc->base_addr.a.ptr + badjust;
00391
00392 switch(nd) {
00393 case 7:
00394 for (id7=0; id7<dvnc->dimension[6].extent; id7++) {
00395 addr6 = addr;
00396 case 6:
00397 for (id6=0; id6<dvnc->dimension[5].extent; id6++) {
00398 addr5 = addr;
00399 case 5:
00400 for (id5=0; id5<dvnc->dimension[4].extent; id5++) {
00401 addr4 = addr;
00402 case 4:
00403 for (id4=0; id4<dvnc->dimension[3].extent; id4++) {
00404 addr3 = addr;
00405 case 3:
00406 for (id3=0; id3<dvnc->dimension[2].extent; id3++) {
00407 addr2 = addr;
00408 case 2:
00409 for (id2=0; id2<dvnc->dimension[1].extent; id2++) {
00410 case 1:
00411 ba = addr;
00412 for (i=0; i<extente; i++) {
00413 ba[0] = base[k];
00414 k++;
00415 ba += dvnc->dimension[0].stride_mult;
00416 }
00417 if (nd == 1) goto done;
00418 addr += dvnc->dimension[1].stride_mult;
00419 }
00420 if (nd == 2) goto done;
00421 addr = addr2;
00422 addr += dvnc->dimension[2].stride_mult;
00423 }
00424 if (nd == 3) goto done;
00425 addr = addr3;
00426 addr += dvnc->dimension[3].stride_mult;
00427 }
00428 if (nd == 4) goto done;
00429 addr = addr4;
00430 addr += dvnc->dimension[4].stride_mult;
00431 }
00432 if (nd == 5) goto done;
00433 addr = addr5;
00434 addr += dvnc->dimension[5].stride_mult;
00435 }
00436 if (nd == 6) goto done;
00437 addr = addr6;
00438 addr += dvnc->dimension[6].stride_mult;
00439 }
00440 }
00441 }
00442 done: return(0);
00443 }