Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
cifbinread.c
Go to the documentation of this file.
00001 /*
00002 
00003   Copyright (C) 2000, 2001 Silicon Graphics, Inc.  All Rights Reserved.
00004 
00005   This program is free software; you can redistribute it and/or modify it
00006   under the terms of version 2.1 of the GNU Lesser General Public License 
00007   as published by the Free Software Foundation.
00008 
00009   This program is distributed in the hope that it would be useful, but
00010   WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
00012 
00013   Further, this software is distributed without any warranty that it is
00014   free of the rightful claim of any third person regarding infringement 
00015   or the like.  Any license provided herein, whether implied or 
00016   otherwise, applies only to this software file.  Patent licenses, if
00017   any, provided herein do not apply to combinations of this program with 
00018   other software, or any other product whatsoever.  
00019 
00020   You should have received a copy of the GNU Lesser General Public 
00021   License along with this program; if not, write the Free Software 
00022   Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, 
00023   USA.
00024 
00025   Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pky,
00026   Mountain View, CA 94043, or:
00027 
00028   http://www.sgi.com
00029 
00030   For further information regarding this notice, see:
00031 
00032   http://oss.sgi.com/projects/GenInfo/NoticeExplan
00033 
00034 */
00035 
00036 
00037 static char USMID[] = "@(#) libcif/cifbinread.c 30.8    07/26/96 07:19:13";
00038 
00039 
00040 /*
00041  *      _Cif_binread reads the variable portions of a binary CIF record based
00042  *      on the record type.
00043  */
00044 
00045 #define CIF_VERSION 3
00046 
00047 #ifdef _ABSOFT
00048 #include "cif.h"
00049 #else
00050 #include <cif.h>
00051 #endif
00052 
00053 #include <memory.h>
00054 #include <stdio.h>
00055 #include <assert.h>
00056 
00057 #include "cif_int.h"
00058 
00059 extern void free(void *ptr);
00060 
00061 /* --------------------------------------------------------------------------
00062  * read_strlist reads in an array of strings.
00063  * --------------------------------------------------------------------------
00064  */
00065 static int
00066 read_strlist (cifd, ns, sp, fd)
00067 int cifd;                                       /* CIF descriptor */
00068 int ns;                                         /* number of strings in array */
00069 char ***sp;                                     /* address of pointer to array of string pointers */
00070 FILE *fd;
00071 {
00072         register int i;
00073         register char **cp;                             /* pointer to array of string pointrs */
00074         register int mode;                              /* memory management mode */
00075         short slen[100];                                        /* array of string lengths */
00076 
00077         if (fread ((char *)slen, sizeof(short), ns, fd) != ns) IO_ERROR;
00078         mode = _Cif_filetbl[cifd].mode;
00079         cp = *sp = (char **)_Cif_space[mode] (ns * sizeof(char *), cifd);
00080         if (cp == NULL)
00081                 return (CIF_NOMEM);
00082         for (i = 0; i < ns; i++) {
00083                 cp[i] = _Cif_space[mode] (slen[i]+1, cifd);
00084                 if (cp[i] == NULL)
00085                         return (CIF_NOMEM);
00086                 if (fread (cp[i], sizeof(char), slen[i], fd) != slen[i]) IO_ERROR;
00087                 (cp[i])[slen[i]] = '\0';
00088         }
00089         return (0);
00090 }
00091 
00092 /* --------------------------------------------------------------------------
00093  * _Cif_binread
00094  * --------------------------------------------------------------------------
00095  */
00096 int
00097 _Cif_binread
00098 #ifdef __STDC__
00099 (int cifd, int rtype, struct Cif_generic *cr, FILE *fd)
00100 #else
00101 (cifd, rtype, cr, fd)
00102 int cifd;
00103 int rtype;
00104 struct Cif_generic *cr;
00105 FILE *fd;
00106 #endif
00107 {
00108 
00109         register int i, n;
00110         register char *cp;
00111         register long *lp;
00112         register int mode;
00113         unsigned char c;
00114 
00115         mode = _Cif_filetbl[cifd].mode;
00116 
00117         switch (rtype) {
00118 
00119         case CIF_CALLSITE:
00120                 if ((n = CIFCS(cr)->nargs) > 0) {
00121                         lp= CIFCS(cr)->argids= (long *)_Cif_space[mode] (sizeof(long)*n, cifd);
00122                         if (lp == NULL)
00123                                 return (CIF_NOMEM);
00124                         if (fread ((char *)lp, sizeof(long), n, fd) != n) IO_ERROR;
00125                 }
00126                 break;
00127 
00128         case CIF_CIFHDR:
00129                 CIFHDR(cr)->canpos = _Cif_filetbl[cifd].seek;
00130                 CIFHDR(cr)->form = BINARY_CIF_FORMAT;
00131                 break;
00132 
00133         case CIF_COMBLK:
00134                 if (_Cif_filetbl[cifd].return_version == 1) {
00135 
00136                         n = CIFCB1(cr)->nlen;
00137                         cp = CIFCB1(cr)->name = _Cif_space[mode] (n+1, cifd);
00138                         if (cp == NULL)
00139                                 return (CIF_NOMEM);
00140                         if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00141                         cp[n] = '\0';
00142                 }
00143                 else { /* version 2 */
00144 
00145                         n = CIFCB(cr)->nlen;
00146                         cp = CIFCB(cr)->name = _Cif_space[mode] (n+1, cifd);
00147                         if (cp == NULL)
00148                                 return (CIF_NOMEM);
00149                         if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00150                         cp[n] = '\0';
00151                 }
00152                 break;
00153 
00154         case CIF_CONST:
00155                 n = CIFCON(cr)->nlen;
00156                 cp = CIFCON(cr)->name = _Cif_space[mode] (n+1, cifd);
00157                 if (cp == NULL)
00158                         return(CIF_NOMEM);
00159                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00160                 cp[n] = '\0';
00161                 n = CIFCON(cr)->vlen;
00162                 cp = CIFCON(cr)->value = _Cif_space[mode] (n+1, cifd);
00163                 if (cp == NULL)
00164                         return(CIF_NOMEM);
00165                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00166                 cp[n] = '\0';
00167 
00168                 if (CIFCON(cr)->origform) {
00169                   n = CIFCON(cr)->olen;
00170                   cp = CIFCON(cr)->oform = _Cif_space[mode] (n+1, cifd);
00171 
00172                   if (cp == NULL)
00173                     return(CIF_NOMEM);
00174                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00175                   cp[n] = '\0';
00176                 }
00177 
00178 
00179                 break;
00180 
00181         case CIF_ENTRY:
00182                 if ((n = CIFENTRY(cr)->nargs) > 0) {
00183                         lp = CIFENTRY(cr)->argids = (long *) _Cif_space[mode]
00184                                                                  (sizeof(long)*n, cifd);
00185                         if (lp == NULL)
00186                                 return (CIF_NOMEM);
00187                         if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
00188                 }
00189                 n = CIFENTRY(cr)->nlen;
00190                 cp = CIFENTRY(cr)->name = _Cif_space[mode] (n+1, cifd);
00191                 if (cp == NULL)
00192                         return (CIF_NOMEM);
00193                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00194                 cp[n] = '\0';
00195                 break;
00196 
00197         case CIF_FILE:
00198                 if (_Cif_filetbl[cifd].return_version < 3) {
00199                   int onlen = CIFFILE(cr)->onlen;
00200                         /* do NOT move this line down!
00201                            On 32-bit architectures like sparc
00202                            CIFFILE(cr)->onlen and CIFFILE1(cr)->name
00203                            occupy the same space, so this MUST be done first */
00204 
00205                   n = CIFFILE1(cr)->nlen;
00206                   cp = CIFFILE1(cr)->name = _Cif_space[mode] (n+1, cifd);
00207                   if (cp == NULL)
00208                       return (CIF_NOMEM);
00209                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00210                   cp[n] = '\0';
00211 
00212 
00213                   if (_Cif_filetbl[cifd].version == 3) {
00214 
00215                     /* Read and discard the original file name which exists in
00216                      * in a V3 CIF but not in V1 or V2 */
00217 
00218                     char *tmp;
00219                     tmp = _Cif_space[mode] (onlen +1, cifd);
00220                     if (tmp == NULL)
00221                         return (CIF_NOMEM);
00222                     if (fread (tmp, sizeof(char), onlen, fd) != onlen) IO_ERROR;
00223                   }
00224                 }
00225                 else { /* Version 3 CIF */
00226 
00227                   n = CIFFILE(cr)->nlen;
00228                   cp = CIFFILE(cr)->name = _Cif_space[mode] (n+1, cifd);
00229                   if (cp == NULL)
00230                       return (CIF_NOMEM);
00231                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00232                   cp[n] = '\0';
00233 
00234                   if (_Cif_filetbl[cifd].version == 3) {
00235                     n = CIFFILE(cr)->onlen;
00236                     if (n > 0) {
00237                       cp = CIFFILE(cr)->oname = _Cif_space[mode] (n+1, cifd);
00238                       if (cp == NULL)
00239                           return (CIF_NOMEM);
00240                       if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00241                       cp[n] = '\0';
00242                     }
00243                   }
00244                   else {
00245                     CIFFILE(cr)->oname = (char *) NULL;
00246                   }
00247                 }
00248                 break;
00249 
00250         case CIF_LABEL:
00251                 n = CIFLABEL(cr)->nlen;
00252                 cp = CIFLABEL(cr)->name = _Cif_space[mode] (n+1, cifd);
00253                 if (cp == NULL)
00254                         return (CIF_NOMEM);
00255                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00256                 cp[n] = '\0';
00257                 break;
00258 
00259         case CIF_ORIG_CMD:
00260                 n = CIFOCMD(cr)->nlen;
00261                 cp = CIFOCMD(cr)->name = _Cif_space[mode] (n+1, cifd);
00262                 if (cp == NULL)
00263                         return (CIF_NOMEM);
00264                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00265                 cp[n] = '\0';
00266                 break;
00267 
00268         case CIF_CDIR:
00269                 n = CIFCDIR(cr)->nids;
00270                 lp = CIFCDIR(cr)->ids = (long *)_Cif_space[mode] (sizeof(long)*n, cifd);
00271                 if (lp == NULL)
00272                         return (CIF_NOMEM);
00273                 if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
00274                 break;
00275 
00276         case CIF_CDIR_DOSHARED:
00277                 n = CIFCDIRDO(cr)->nids;
00278                 lp = CIFCDIRDO(cr)->ids = (long *)_Cif_space[mode] (sizeof(long)*n, cifd);
00279                 if (lp == NULL)
00280                         return (CIF_NOMEM);
00281                 if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
00282                 break;
00283 
00284         case CIF_GEOMETRY:
00285                 if ((n = CIFGEOM(cr)->ndims) > 0) {
00286                         CIFGEOM(cr)->dim =
00287                                 (struct Cif_geometry_dim *)_Cif_space[mode](sizeof(struct Cif_geometry_dim)*n, cifd);
00288                         if (CIFGEOM(cr)->dim == NULL)
00289                                 return (CIF_NOMEM);
00290                         if (fread ((char *)CIFGEOM(cr)->dim, GEOM_SSIZE, n, fd) != n) IO_ERROR;
00291                 }
00292                 n = CIFGEOM(cr)->nlen;
00293                 if (n > 0) {
00294                         cp = CIFGEOM(cr)->name = _Cif_space[mode] (n+1, cifd);
00295                         if (cp == NULL)
00296                                 return (CIF_NOMEM);
00297                         if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00298                         cp[n] = '\0';
00299                 }
00300                 break;
00301 
00302         case CIF_MESSAGE:
00303 
00304                 if (_Cif_filetbl[cifd].return_version < 3) {
00305 
00306                   if (_Cif_filetbl[cifd].version == 3) {
00307 
00308                     /* Read and discard the scoping unit name which exists
00309                      * in a V3 CIF but not in V1 or V2 */
00310 
00311                     char *tmp;
00312                     n = CIFMSG(cr)->nlen;
00313                     tmp = _Cif_space[mode] (n +1, cifd);
00314                     if (tmp == NULL)
00315                         return (CIF_NOMEM);
00316                     if (fread (tmp, sizeof(char), n, fd) != n) IO_ERROR;
00317                   }
00318 
00319                   if (CIFMSG1(cr)->nargs > 0) {
00320                     if ((i= read_strlist (cifd,
00321                                           (int) CIFMSG1(cr)->nargs,
00322                                           &CIFMSG1(cr)->args, fd)) < 0)
00323                         return (i);
00324                   }
00325                 }
00326                 else { /* Version 3 CIF */
00327                   if (_Cif_filetbl[cifd].version == 3) {
00328                     n = CIFMSG(cr)->nlen;
00329                     if (n > 0) {
00330                       cp = CIFMSG(cr)->name = _Cif_space[mode] (n+1, cifd);
00331                       if (cp == NULL)
00332                           return (CIF_NOMEM);
00333                       if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00334                       cp[n] = '\0';
00335                     }
00336                   }
00337                   else {
00338                     CIFMSG(cr)->name = (char *) NULL;
00339                   }
00340                   if (CIFMSG(cr)->nargs > 0) {
00341                     if ((i= read_strlist (cifd,
00342                                           (int) CIFMSG(cr)->nargs,
00343                                           &CIFMSG(cr)->args, fd)) < 0)
00344                         return (i);
00345                   }
00346                 }
00347 
00348                 break;
00349 
00350         case CIF_MISC_OPTS:
00351 
00352                 if (_Cif_filetbl[cifd].return_version == 1) {
00353 
00354                   if ((n = CIFMO1(cr)->nmsgs) > 0) {
00355                     lp= CIFMO1(cr)->msgno= (long *) _Cif_space[mode] (sizeof(long)*n, cifd);
00356                     if (lp == NULL)
00357                       return (CIF_NOMEM);
00358                     if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
00359                   }
00360                   if (CIFMO1(cr)->ncdirs > 0) {
00361                     if ((i= read_strlist (cifd, (int) CIFMO1(cr)->ncdirs, &CIFMO1(cr)->cdirs, fd)) < 0)
00362                       return (i);
00363                   }
00364                   n = CIFMO1(cr)->onlen;
00365                   cp = CIFMO1(cr)->objname = _Cif_space[mode] (n+1, cifd);
00366                   if (cp == NULL)
00367                     return (CIF_NOMEM);
00368                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00369                   cp[n] = '\0';
00370                   n = CIFMO1(cr)->cnlen;
00371                   cp = CIFMO1(cr)->calname = _Cif_space[mode] (n+1, cifd);
00372                   if (cp == NULL)
00373                     return (CIF_NOMEM);
00374                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00375                   cp[n] = '\0';
00376                   n = CIFMO1(cr)->inlen;
00377                   cp = CIFMO1(cr)->inname = _Cif_space[mode] (n+1, cifd);
00378                   if (cp == NULL)
00379                     return (CIF_NOMEM);
00380                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00381                   cp[n] = '\0';
00382                 }
00383                 else {  /* a v2 cif */
00384 
00385                   if ((n = CIFMO(cr)->nmsgs) > 0) {
00386                     lp= CIFMO(cr)->msgno= (long *) _Cif_space[mode] (sizeof(long)*n, cifd);
00387                     if (lp == NULL)
00388                       return (CIF_NOMEM);
00389                     if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
00390                   }
00391                   if (CIFMO(cr)->ncdirs > 0) {
00392                     if ((i= read_strlist (cifd, (int) CIFMO(cr)->ncdirs, &CIFMO(cr)->cdirs, fd)) < 0)
00393                       return (i);
00394                   }
00395                   n = CIFMO(cr)->onlen;
00396                   cp = CIFMO(cr)->objname = _Cif_space[mode] (n+1, cifd);
00397                   if (cp == NULL)
00398                     return (CIF_NOMEM);
00399                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00400                   cp[n] = '\0';
00401                   n = CIFMO(cr)->cnlen;
00402                   cp = CIFMO(cr)->calname = _Cif_space[mode] (n+1, cifd);
00403                   if (cp == NULL)
00404                     return (CIF_NOMEM);
00405                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00406                   cp[n] = '\0';
00407                   n = CIFMO(cr)->inlen;
00408                   cp = CIFMO(cr)->inname = _Cif_space[mode] (n+1, cifd);
00409                   if (cp == NULL)
00410                     return (CIF_NOMEM);
00411                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00412                   cp[n] = '\0';
00413                   n = CIFMO(cr)->llen;
00414                   cp = CIFMO(cr)->lname = _Cif_space[mode] (n+1, cifd);
00415                   if (cp == NULL)
00416                     return (CIF_NOMEM);
00417                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00418                   cp[n] = '\0';
00419 
00420                   if (CIFMO(cr)->numincs > 0) {
00421                     if ((i= read_strlist (cifd, (int) CIFMO(cr)->numincs, &CIFMO(cr)->incdirs, fd)) < 0)
00422                       return (i);
00423                   }
00424 
00425                 }
00426 
00427                 break;
00428                         
00429         case CIF_NAMELIST:
00430                 n = CIFNL(cr)->nlen;
00431                 cp = CIFNL(cr)->name = _Cif_space[mode] (n+1, cifd);
00432                 if (cp == NULL)
00433                         return (CIF_NOMEM);
00434                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00435                 cp[n] = '\0';
00436                 n = CIFNL(cr)->nids;
00437                 lp = CIFNL(cr)->ids = (long *)_Cif_space[mode] (sizeof(long)*n, cifd);
00438                 if (lp == NULL)
00439                         return (CIF_NOMEM);
00440                 if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
00441                 break;
00442 
00443         case CIF_ND_MSG:
00444                 if (CIFNMSG(cr)->nargs > 0) {
00445                         if ((i = read_strlist (cifd, (int) CIFNMSG(cr)->nargs, &CIFNMSG(cr)->args, fd))
00446                                 < 0) return (i);
00447                 }
00448                 break;
00449 
00450         case CIF_OBJECT:
00451                 if (_Cif_filetbl[cifd].return_version == 1) {
00452 
00453                 if ((n = CIFOBJ1(cr)->nlen) > 0) {
00454                         cp = CIFOBJ1(cr)->name = _Cif_space[mode] (n+1, cifd);
00455                         if (cp == NULL)
00456                                 return (CIF_NOMEM);
00457                         if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00458                         cp[n] = '\0';
00459                 }
00460                 if ((n = CIFOBJ1(cr)->ndims) > 0) {
00461                         CIFOBJ1(cr)->dim =
00462                                 (struct Cif_dim *)_Cif_space[mode] (sizeof(struct Cif_dim)*n, cifd);
00463                         if (CIFOBJ1(cr)->dim == NULL)
00464                                 return (CIF_NOMEM);
00465                         if (fread ((char *)CIFOBJ1(cr)->dim, DIM_SSIZE, n, fd) != n) IO_ERROR;
00466                 }
00467               }
00468                 else {
00469                 if ((n = CIFOBJ(cr)->nlen) > 0) {
00470                         cp = CIFOBJ(cr)->name = _Cif_space[mode] (n+1, cifd);
00471                         if (cp == NULL)
00472                                 return (CIF_NOMEM);
00473                         if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00474                         cp[n] = '\0';
00475                 }
00476                 if ((n = CIFOBJ(cr)->ndims) > 0) {
00477                         CIFOBJ(cr)->dim =
00478                                 (struct Cif_dim *)_Cif_space[mode] (sizeof(struct Cif_dim)*n, cifd);
00479                         if (CIFOBJ(cr)->dim == NULL)
00480                                 return (CIF_NOMEM);
00481                         if (fread ((char *)CIFOBJ(cr)->dim, DIM_SSIZE, n, fd) != n) IO_ERROR;
00482                 }
00483               }
00484                 break;
00485 
00486         case CIF_UNIT:
00487                 n = CIFUNIT(cr)->nlen;
00488                 cp = CIFUNIT(cr)->name = _Cif_space[mode] (n+1, cifd);
00489                 if (cp == NULL)
00490                         return (CIF_NOMEM);
00491                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00492                 cp[n] = '\0';
00493                 break;
00494 
00495         case CIF_ENDUNIT:
00496                 n = CIFENDU(cr)->nlen;
00497                 cp = CIFENDU(cr)->name = _Cif_space[mode] (n+1, cifd);
00498                 if (cp == NULL)
00499                         return (CIF_NOMEM);
00500                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00501                 cp[n] = '\0';
00502                 break;
00503 
00504         case CIF_USAGE:
00505                 if (_Cif_filetbl[cifd].return_version == 1) {
00506 
00507                   n = CIFUSAGE1(cr)->nuses;
00508                   CIFUSAGE1(cr)->use =
00509                     (struct Cif_use *) _Cif_space[mode] (sizeof(struct Cif_use_1)*n, cifd);
00510                   if (CIFUSAGE1(cr)->use == NULL)
00511                     return (CIF_NOMEM);
00512                   if (fread ((char *)CIFUSAGE1(cr)->use, sizeof(struct Cif_use_1), n, fd)
00513                       != n) IO_ERROR;
00514 
00515                 }
00516                 else { /* a v2 cif */
00517 
00518                   n = CIFUSAGE(cr)->nuses;
00519                   CIFUSAGE(cr)->use =
00520                     (struct Cif_use *) _Cif_space[mode] (sizeof(struct Cif_use)*n, cifd);
00521                   if (CIFUSAGE(cr)->use == NULL)
00522                     return (CIF_NOMEM);
00523                   if (fread ((char *)CIFUSAGE(cr)->use, sizeof(struct Cif_use), n, fd)
00524                       != n) IO_ERROR;
00525 
00526                   if (CIFUSAGE(cr)->nmembs > 0) {
00527 
00528                     n = CIFUSAGE(cr)->nmembs;
00529                     CIFUSAGE(cr)->membs = (long *) _Cif_space[mode] (sizeof(long)*n, cifd);
00530                     if (CIFUSAGE(cr)->membs == NULL)
00531                       return (CIF_NOMEM);
00532                     if (fread ((char *)CIFUSAGE(cr)->membs, sizeof(long), n, fd)
00533                         != n) IO_ERROR;
00534                   }
00535                 }
00536                 break;
00537 
00538         case CIF_FILEDIR:
00539         {
00540                 struct Cif_unittbl *ut;
00541 
00542                 n = CIFFDIR(cr)->nunits;
00543                 ut = CIFFDIR(cr)->ut = (struct Cif_unittbl *) _Cif_space[mode]
00544                                                      (sizeof(struct Cif_unittbl)*n, cifd);
00545                 if (ut == NULL)
00546                         return (CIF_NOMEM);
00547                 (void) memset((char *)ut, 0, n * sizeof(struct Cif_unittbl));
00548                 for (i = 0; i < n; i++, ut++) {
00549                         if (fread ((char *)ut, UNITTBL_SSIZE, 1, fd) != 1) IO_ERROR;
00550                         cp = ut->name = _Cif_space[mode] (ut->nlen+1, cifd);
00551                         if (cp == NULL)
00552                                 return (CIF_NOMEM);
00553                         if (fread (cp, sizeof(char), ut->nlen, fd) != ut->nlen) IO_ERROR;
00554                         cp[ut->nlen] = '\0';
00555                 }
00556                 break;
00557         }
00558 
00559         case CIF_UNITDIR:
00560         {
00561                 struct Cif_urectbl ur[CIF_MAXRECORD];
00562                 struct Cif_urectbl *urp;
00563 
00564                 n = sizeof(struct Cif_urectbl) * CIF_MAXRECORD;
00565                 urp = CIFUDIR(cr)->ur = (struct Cif_urectbl *) _Cif_space[mode] (n, cifd);
00566                 if (urp == NULL)
00567                         return(CIF_NOMEM);
00568                 (void) memset ((char *)urp, '\0', n);
00569                 n = CIFUDIR(cr)->nsections;
00570                 if (fread ((char *)ur, sizeof(struct Cif_urectbl), n, fd) != n)
00571                         IO_ERROR;
00572                 for (i = 0; i < n; i++) {
00573                   urp[ur[i].rectype] = ur[i];
00574 
00575                   /* mask out those records that this cif version (eg v1) doesn't know about */
00576 
00577                   if (_Cif_shortsize[ur[i].rectype][_Cif_filetbl[cifd].return_version] == 0)
00578                     urp[ur[i].rectype].nrecords = 0;
00579                 }
00580 
00581                 /* Only returns the correct number of entries for the version requested */
00582                 if (_Cif_filetbl[cifd].return_version == 1)
00583                   CIFUDIR(cr)->nsections = CIF_MAXRECORD_1;
00584                 else
00585                   CIFUDIR(cr)->nsections = CIF_MAXRECORD;
00586 
00587                 break;
00588         }
00589 
00590         case CIF_C_TAG:
00591         {
00592                 struct Cif_tmod *tm;
00593 
00594                 n = CIFCTAG(cr)->nmods;
00595                 tm = CIFCTAG(cr)->mods =
00596                         (struct Cif_tmod *) _Cif_space[mode] (sizeof(struct Cif_tmod)*n, cifd);
00597                 if (tm == NULL)
00598                         return (CIF_NOMEM);
00599                 for (i = 0; i < n; i++)
00600                         if (fread ((char *)&(tm[i]), TMOD_SSIZE, 1, fd) != 1) IO_ERROR;
00601                 n = CIFCTAG(cr)-> nmems;
00602                 CIFCTAG(cr)->memids = (long *) _Cif_space[mode] (sizeof(long)*n, cifd);
00603                 if (CIFCTAG(cr)->memids == NULL)
00604                         return (CIF_NOMEM);
00605                 if (fread ((char *)CIFCTAG(cr)->memids, sizeof(long), n, fd) != n) 
00606                         IO_ERROR;
00607                 n = CIFCTAG(cr)->nlen;
00608                 CIFCTAG(cr)->name = _Cif_space[mode](n+1, cifd);
00609                 if (CIFCTAG(cr)->name == NULL)
00610                         return (CIF_NOMEM);
00611                 if (fread ((char *)CIFCTAG(cr)->name, sizeof(char), n, fd) != n)
00612                         IO_ERROR;
00613                 (CIFCTAG(cr)->name)[n] = '\0';
00614                 break;
00615         }
00616 
00617         case CIF_C_OPTS:
00618                 n = CIFCOPTS(cr)->nlen;
00619                 CIFCOPTS(cr)->name = _Cif_space[mode](n+1, cifd);
00620                 if (CIFCOPTS(cr)->name == NULL)
00621                         return (CIF_NOMEM);
00622                 if (fread ((char *)CIFCOPTS(cr)->name, sizeof(char), n, fd) != n)
00623                         IO_ERROR;
00624                 (CIFCOPTS(cr)->name)[n] = '\0';
00625                 if (CIFCOPTS(cr)->nincs > 0) {
00626                         if ((i = read_strlist (cifd, (int) CIFCOPTS(cr)->nincs, &CIFCOPTS(cr)->incs, fd))
00627                                 < 0) return (i);
00628                 }
00629                 if (CIFCOPTS(cr)->ndefs > 0) {
00630                         if ((i = read_strlist (cifd, (int) CIFCOPTS(cr)->ndefs, &CIFCOPTS(cr)->defs, fd))
00631                                 < 0) return (i);
00632                 }
00633                 if (CIFCOPTS(cr)->nudefs > 0) {
00634                         if ((i = read_strlist (cifd, (int) CIFCOPTS(cr)->nudefs, &CIFCOPTS(cr)->udefs, fd))
00635                                 < 0) return (i);
00636                 }
00637                 break;
00638 
00639         case CIF_C_MESSAGE:
00640                 if (_Cif_filetbl[cifd].return_version == 1) {
00641                   if (CIFCMSG1(cr)->nargs > 0) {
00642                     if ((i = read_strlist (cifd, (int) CIFCMSG(cr)->nargs, &CIFCMSG(cr)->args, fd)) < 0)
00643                       return (i);
00644                   }
00645                 }
00646                 else {
00647                   if (CIFCMSG(cr)->nargs > 0) {
00648                     if ((i = read_strlist (cifd, (int) CIFCMSG(cr)->nargs, &CIFCMSG(cr)->args, fd)) < 0)
00649                       return (i);
00650                   }
00651                 }
00652                 break;
00653 
00654         case CIF_C_CONST:
00655                 n = CIFCCON(cr)->vlen;
00656                 CIFCCON(cr)->value = _Cif_space[mode](n+1, cifd);
00657                 if (CIFCCON(cr)->value == NULL)
00658                         return (CIF_NOMEM);
00659                 if (fread ((char *)CIFCCON(cr)->value, sizeof(char), n, fd) != n)
00660                         IO_ERROR;
00661                 (CIFCCON(cr)->value)[n] = '\0';
00662                 break;
00663 
00664         case CIF_C_ENTRY:
00665         {
00666                 struct Cif_tmod *tm;
00667 
00668                 if (_Cif_filetbl[cifd].return_version == 1) {
00669 
00670                   n = CIFCENTRY1(cr)->nmods;
00671                   tm = CIFCENTRY1(cr)->mods =
00672                     (struct Cif_tmod *) _Cif_space[mode] (sizeof(struct Cif_tmod)*n, cifd);
00673                   if (tm == NULL)
00674                     return (CIF_NOMEM);
00675                   for (i = 0; i < n; i++)
00676                     if (fread ((char *)&(tm[i]), TMOD_SSIZE, 1, fd) != 1) IO_ERROR;
00677 
00678                   n = CIFCENTRY1(cr)->nargs;
00679                   CIFCENTRY1(cr)->argids = (long *) _Cif_space[mode](sizeof(long)*n, cifd);
00680                   if (CIFCENTRY1(cr)->argids == NULL)
00681                     return (CIF_NOMEM);
00682                   if (fread ((char *)CIFCENTRY1(cr)->argids, sizeof(long), n, fd) != n)
00683                     IO_ERROR;
00684 
00685                   n = CIFCENTRY1(cr)->nlen;
00686                   CIFCENTRY1(cr)->name = _Cif_space[mode](n+1, cifd);
00687                   if (CIFCENTRY1(cr)->name == NULL)
00688                     return (CIF_NOMEM);
00689                   if (fread ((char *)CIFCENTRY1(cr)->name, sizeof(char), n, fd) != n)
00690                     IO_ERROR;
00691                   (CIFCENTRY1(cr)->name)[n] = '\0';
00692                 }
00693                 else {
00694 
00695                   n = CIFCENTRY(cr)->nmods;
00696                   tm = CIFCENTRY(cr)->mods =
00697                     (struct Cif_tmod *) _Cif_space[mode] (sizeof(struct Cif_tmod)*n, cifd);
00698                   if (tm == NULL)
00699                     return (CIF_NOMEM);
00700                   for (i = 0; i < n; i++)
00701                     if (fread ((char *)&(tm[i]), TMOD_SSIZE, 1, fd) != 1) IO_ERROR;
00702 
00703                   n = CIFCENTRY(cr)->nargs;
00704                   CIFCENTRY(cr)->argids = (long *) _Cif_space[mode](sizeof(long)*n, cifd);
00705                   if (CIFCENTRY(cr)->argids == NULL)
00706                     return (CIF_NOMEM);
00707                   if (fread ((char *)CIFCENTRY(cr)->argids, sizeof(long), n, fd) != n)
00708                     IO_ERROR;
00709 
00710                   n = CIFCENTRY(cr)->nlen;
00711                   CIFCENTRY(cr)->name = _Cif_space[mode](n+1, cifd);
00712                   if (CIFCENTRY(cr)->name == NULL)
00713                     return (CIF_NOMEM);
00714                   if (fread ((char *)CIFCENTRY(cr)->name, sizeof(char), n, fd) != n)
00715                     IO_ERROR;
00716                   (CIFCENTRY(cr)->name)[n] = '\0';
00717                 }
00718 
00719                 break;
00720         }
00721 
00722         case CIF_C_OBJECT:
00723         {
00724                 struct Cif_tmod *tm;
00725 
00726                 n = CIFCOBJ(cr)->nmods;
00727                 tm = CIFCOBJ(cr)->mods =
00728                         (struct Cif_tmod *) _Cif_space[mode] (sizeof(struct Cif_tmod)*n, cifd);
00729                 if (tm == NULL)
00730                         return (CIF_NOMEM);
00731                 for (i = 0; i < n; i++)
00732                         if (fread ((char *)&(tm[i]), TMOD_SSIZE, 1, fd) != 1) IO_ERROR;
00733                 if ((n = CIFCOBJ(cr)->nlen) > 0) {
00734                         CIFCOBJ(cr)->name = _Cif_space[mode](n+1, cifd);
00735                         if (CIFCOBJ(cr)->name == NULL)
00736                                 return (CIF_NOMEM);
00737                         if (fread ((char *)CIFCOBJ(cr)->name, sizeof(char), n, fd) != n)
00738                                 IO_ERROR;
00739                         (CIFCOBJ(cr)->name)[n] = '\0';
00740                 }
00741 
00742                 break;
00743         }
00744 
00745         case CIF_C_LINT_DIRECTIVE:
00746         {
00747                 if ((n = CIFCLDIR(cr)->nlen) > 0) {
00748                         CIFCLDIR(cr)->name = _Cif_space[mode](n+1, cifd);
00749                         if (CIFCLDIR(cr)->name == NULL)
00750                                 return (CIF_NOMEM);
00751                         if (fread ((char *)CIFCLDIR(cr)->name, sizeof(char), n, fd) != n)
00752                                 IO_ERROR;
00753                         (CIFCLDIR(cr)->name)[n] = '\0';
00754                 }
00755 
00756                 break;
00757         }
00758 
00759         case CIF_C_MACRO_DEF:
00760         {
00761                 if ((n = CIFCMDEF(cr)->nlen) > 0) {
00762                         CIFCMDEF(cr)->name = _Cif_space[mode](n+1, cifd);
00763                         if (CIFCMDEF(cr)->name == NULL)
00764                                 return (CIF_NOMEM);
00765                         if (fread ((char *)CIFCMDEF(cr)->name, sizeof(char), n, fd) != n)
00766                                 IO_ERROR;
00767                         (CIFCMDEF(cr)->name)[n] = '\0';
00768                 }
00769 
00770                 break;
00771         }
00772 
00773         case CIF_C_ENTRY_END:
00774         {
00775                 if ((n = CIFCEEND(cr)->nlen) > 0) {
00776                         CIFCEEND(cr)->name = _Cif_space[mode](n+1, cifd);
00777                         if (CIFCEEND(cr)->name == NULL)
00778                                 return (CIF_NOMEM);
00779                         if (fread ((char *)CIFCEEND(cr)->name, sizeof(char), n, fd) != n)
00780                                 IO_ERROR;
00781                         (CIFCEEND(cr)->name)[n] = '\0';
00782                 }
00783 
00784                 break;
00785         }
00786 
00787 #ifndef CRAY2
00788         case CIF_F90_CALLSITE:
00789                 if ((n = CIFF90CS(cr)->nargs) > 0) {
00790                         lp= CIFF90CS(cr)->argids= (long *)_Cif_space[mode] (sizeof(long)*n, cifd);
00791                         if (lp == NULL)
00792                                 return (CIF_NOMEM);
00793                         if (fread ((char *)lp, sizeof(long), n, fd) != n) IO_ERROR;
00794 
00795                         lp= (long *) (CIFF90CS(cr)->nmembs=
00796                                       (int *)_Cif_space[mode] (sizeof(int)*n, cifd));
00797                         if (lp == NULL)
00798                                 return (CIF_NOMEM);
00799                         if (fread ((char *)lp, sizeof(int), n, fd) != n) IO_ERROR;
00800                         lp= (long *) (CIFF90CS(cr)->membs=
00801                                       (long **)_Cif_space[mode] (sizeof(long *)*n, cifd));
00802                         if (lp == NULL)
00803                             return (CIF_NOMEM);
00804 
00805                         for (i = 0; i < (int) CIFF90CS(cr)->nargs; i++) {
00806                             if (CIFF90CS(cr)->nmembs[i] > 0) {
00807                                 lp= (long *) (CIFF90CS(cr)->membs[i]=
00808                                               (long *)_Cif_space[mode] (sizeof(long)*CIFF90CS(cr)->nmembs[i], cifd));
00809                                 if (lp == NULL)
00810                                     return (CIF_NOMEM);
00811                                 if (fread ((char *)lp, sizeof(long), CIFF90CS(cr)->nmembs[i], fd) != CIFF90CS(cr)->nmembs[i]) IO_ERROR;
00812                             }
00813                         }
00814 
00815                         if (CIFF90CS(cr)->rank == 1) {
00816 
00817                             lp= (long *) (CIFF90CS(cr)->ranks = (int *)_Cif_space[mode] (sizeof(int)*n, cifd));
00818                             if (lp == NULL)
00819                                 return (CIF_NOMEM);
00820                             if (fread ((char *)lp, sizeof(int), n, fd) != n) IO_ERROR;
00821                         }
00822 
00823 
00824                     }
00825                 break;
00826 
00827         case CIF_F90_SCOPE_INFO:
00828                 if ((n = CIFF90SI(cr)->numalts) > 0) {
00829                         lp= CIFF90SI(cr)->entryids= (long *)_Cif_space[mode] (sizeof(long)*n, cifd);
00830                         if (lp == NULL)
00831                                 return (CIF_NOMEM);
00832                         if (fread ((char *)lp, sizeof(long), n, fd) != n) IO_ERROR;
00833                 }
00834                 break;
00835 
00836         case CIF_F90_COMBLK:
00837                 n = CIFF90CB(cr)->nlen;
00838                 cp = CIFF90CB(cr)->name = _Cif_space[mode] (n+1, cifd);
00839                 if (cp == NULL)
00840                         return (CIF_NOMEM);
00841                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00842                 cp[n] = '\0';
00843                 break;
00844 
00845         case CIF_F90_CONST:
00846                 n = CIFF90CON(cr)->vlen;
00847                 cp = CIFF90CON(cr)->value = _Cif_space[mode] (n+1, cifd);
00848                 if (cp == NULL)
00849                         return(CIF_NOMEM);
00850                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00851                 cp[n] = '\0';
00852                 break;
00853 
00854         case CIF_F90_ENTRY:
00855 
00856                 if ((n = CIFF90ENTRY(cr)->nargs) > 0) {
00857                         lp = CIFF90ENTRY(cr)->argids = (long *) _Cif_space[mode]
00858                                                                 (sizeof(long)*n, cifd);
00859                         if (lp == NULL)
00860                                 return (CIF_NOMEM);
00861                         if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
00862                 }
00863                 n = CIFF90ENTRY(cr)->nlen;
00864                 cp = CIFF90ENTRY(cr)->name = _Cif_space[mode] (n+1, cifd);
00865                 if (cp == NULL)
00866                         return (CIF_NOMEM);
00867                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00868                 cp[n] = '\0';
00869                 break;
00870 
00871         case CIF_F90_DERIVED_TYPE:
00872                 if (_Cif_filetbl[cifd].return_version == 2) {
00873 
00874                   n = CIFF90DTYPE2(cr)->nlen;
00875                   cp = CIFF90DTYPE2(cr)->name = _Cif_space[mode] (n+1, cifd);
00876                   if (cp == NULL)
00877                       return (CIF_NOMEM);
00878                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00879                   cp[n] = '\0';
00880 
00881                   if ((n = CIFF90DTYPE2(cr)->nmembs) > 0) {
00882                     lp = CIFF90DTYPE2(cr)->memids = (long *) _Cif_space[mode]
00883                         (sizeof(long)*n, cifd);
00884                     if (lp == NULL)
00885                         return (CIF_NOMEM);
00886                     if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
00887                   }
00888                 }
00889                 else {
00890                   n = CIFF90DTYPE(cr)->nlen;
00891                   cp = CIFF90DTYPE(cr)->name = _Cif_space[mode] (n+1, cifd);
00892                   if (cp == NULL)
00893                       return (CIF_NOMEM);
00894                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00895                   cp[n] = '\0';
00896 
00897                   if ((n = CIFF90DTYPE(cr)->nmembs) > 0) {
00898                     lp = CIFF90DTYPE(cr)->memids = (long *) _Cif_space[mode]
00899                         (sizeof(long)*n, cifd);
00900                     if (lp == NULL)
00901                         return (CIF_NOMEM);
00902                     if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
00903                   }
00904                 }
00905                 break;
00906 
00907         case CIF_F90_LABEL:
00908                 n = CIFF90LABEL(cr)->nlen;
00909                 cp = CIFF90LABEL(cr)->name = _Cif_space[mode] (n+1, cifd);
00910                 if (cp == NULL)
00911                         return (CIF_NOMEM);
00912                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00913                 cp[n] = '\0';
00914                 break;
00915 
00916         case CIF_F90_NAMELIST:
00917                 n = CIFF90NL(cr)->nlen;
00918                 cp = CIFF90NL(cr)->name = _Cif_space[mode] (n+1, cifd);
00919                 if (cp == NULL)
00920                         return (CIF_NOMEM);
00921                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00922                 cp[n] = '\0';
00923                 n = CIFF90NL(cr)->nids;
00924                 lp = CIFF90NL(cr)->ids = (long *)_Cif_space[mode] (sizeof(long)*n, cifd);
00925                 if (lp == NULL)
00926                         return (CIF_NOMEM);
00927                 if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
00928                 break;
00929 
00930         case CIF_F90_OBJECT:
00931                 if ((n = CIFF90OBJ(cr)->nlen) > 0) {
00932                         cp = CIFF90OBJ(cr)->name = _Cif_space[mode] (n+1, cifd);
00933                         if (cp == NULL)
00934                                 return (CIF_NOMEM);
00935                         if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00936                         cp[n] = '\0';
00937                 }
00938                 if ((n = CIFF90OBJ(cr)->ndims) > 0 &&
00939                     CIFF90OBJ(cr)->atype != CIF_AT_DEFERRED) { /* deferred arrays have all
00940                                                                 * dimensions assumed to be ':'
00941                                                                 */
00942                         CIFF90OBJ(cr)->dim =
00943                                 (struct Cif_dim *)_Cif_space[mode] (sizeof(struct Cif_dim)*n, cifd);
00944                         if (CIFF90OBJ(cr)->dim == NULL)
00945                                 return (CIF_NOMEM);
00946                         if (fread ((char *)CIFF90OBJ(cr)->dim, DIM_SSIZE, n, fd) != n) IO_ERROR;
00947                 }
00948                 break;
00949 
00950 
00951    case CIF_F90_MISC_OPTS:
00952                 n = CIFF90MO(cr)->ciflen;
00953                 cp = CIFF90MO(cr)->cifname = _Cif_space[mode] (n+1, cifd);
00954                 if (cp == NULL)
00955                         return (CIF_NOMEM);
00956                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00957                 cp[n] = '\0';
00958 
00959                 if (CIFF90MO(cr)->nPdirs > 0) {
00960                         if ((i= read_strlist (cifd, (int) CIFF90MO(cr)->nPdirs, &CIFF90MO(cr)->Pdirs, fd)) < 0)
00961                                 return (i);
00962                 }
00963                 if (CIFF90MO(cr)->npdirs > 0) {
00964                         if ((i= read_strlist (cifd, (int) CIFF90MO(cr)->npdirs, &CIFF90MO(cr)->pdirs, fd)) < 0)
00965                                 return (i);
00966                 }
00967                 if ((n = CIFF90MO(cr)->nmsgs) > 0) {
00968                         lp= CIFF90MO(cr)->msgno= (long *) _Cif_space[mode] (sizeof(long)*n, cifd);
00969                         if (lp == NULL)
00970                                 return (CIF_NOMEM);
00971                         if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
00972                 }
00973                 if (CIFF90MO(cr)->ncdirs > 0) {
00974                         if ((i= read_strlist (cifd, (int) CIFF90MO(cr)->ncdirs, &CIFF90MO(cr)->cdirs, fd)) < 0)
00975                                 return (i);
00976                 }
00977                 n = CIFF90MO(cr)->onlen;
00978                 cp = CIFF90MO(cr)->objname = _Cif_space[mode] (n+1, cifd);
00979                 if (cp == NULL)
00980                         return (CIF_NOMEM);
00981                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00982                 cp[n] = '\0';
00983                 n = CIFF90MO(cr)->cnlen;
00984                 cp = CIFF90MO(cr)->calname = _Cif_space[mode] (n+1, cifd);
00985                 if (cp == NULL)
00986                         return (CIF_NOMEM);
00987                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00988                 cp[n] = '\0';
00989                 n = CIFF90MO(cr)->inlen;
00990                 cp = CIFF90MO(cr)->inname = _Cif_space[mode] (n+1, cifd);
00991                 if (cp == NULL)
00992                         return (CIF_NOMEM);
00993                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
00994                 cp[n] = '\0';
00995                 break;
00996 
00997         case CIF_F90_OPT_OPTS:
00998 
00999                 if ((n = CIFF90OPTOPT(cr)->noptlevels) > 0) {
01000                         CIFF90OPTOPT(cr)->lopts =
01001                                 (struct Cif_f90_level_opts *)_Cif_space[mode] (sizeof(struct Cif_f90_level_opts)*n, cifd);
01002                         if (CIFF90OPTOPT(cr)->lopts == NULL)
01003                                 return (CIF_NOMEM);
01004                         if (CIFF90OPTOPT(cr)->newdef == 1) {
01005                             if (fread ((char *)CIFF90OPTOPT(cr)->lopts, OPTS_SSIZE, n, fd) != n) IO_ERROR;
01006                         }
01007                         else {
01008                             if (fread ((char *)CIFF90OPTOPT(cr)->lopts, 4, n, fd) != n) IO_ERROR;
01009                         }
01010                 }
01011                 break;
01012 
01013         case CIF_F90_INT_BLOCK:
01014                 if (_Cif_filetbl[cifd].return_version == 2) {
01015 
01016                   n = CIFF90IB2(cr)->nlen;
01017                   cp = CIFF90IB2(cr)->name = _Cif_space[mode] (n+1, cifd);
01018                   if (cp == NULL)
01019                       return (CIF_NOMEM);
01020                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
01021                   cp[n] = '\0';
01022 
01023                   if ((n = CIFF90IB2(cr)->numints) > 0) {
01024                     lp= CIFF90IB2(cr)->procids= (long *) _Cif_space[mode] (sizeof(long)*n, cifd);
01025                     if (lp == NULL)
01026                         return (CIF_NOMEM);
01027                     if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
01028                   }
01029                 }
01030                 else { /* Version 3 or beyond */
01031 
01032                   n = CIFF90IB(cr)->nlen;
01033                   cp = CIFF90IB(cr)->name = _Cif_space[mode] (n+1, cifd);
01034                   if (cp == NULL)
01035                       return (CIF_NOMEM);
01036                   if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
01037                   cp[n] = '\0';
01038 
01039                   if ((n = CIFF90IB(cr)->numints) > 0) {
01040                     lp= CIFF90IB(cr)->procids= (long *) _Cif_space[mode] (sizeof(long)*n, cifd);
01041                     if (lp == NULL)
01042                         return (CIF_NOMEM);
01043                     if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
01044                   }
01045                 }
01046                 break;
01047 
01048         case CIF_F90_RENAME:
01049 
01050                 n = CIFF90RN(cr)->nlen;
01051                 cp = CIFF90RN(cr)->name = _Cif_space[mode] (n+1, cifd);
01052                 if (cp == NULL)
01053                         return (CIF_NOMEM);
01054                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
01055                 cp[n] = '\0';
01056 
01057                 n = CIFF90RN(cr)->orignlen;
01058                 cp = CIFF90RN(cr)->origname = _Cif_space[mode] (n+1, cifd);
01059                 if (cp == NULL)
01060                         return (CIF_NOMEM);
01061                 if (fread (cp, sizeof(char), n, fd) != n) IO_ERROR;
01062                 cp[n] = '\0';
01063 
01064                 if ((n = CIFF90RN(cr)->nlocalids) > 0) {
01065                         lp= CIFF90RN(cr)->localid = (long *) _Cif_space[mode] (sizeof(long)*n, cifd);
01066                         if (lp == NULL)
01067                                 return (CIF_NOMEM);
01068                         if (fread (lp, sizeof(long), n, fd) != n) IO_ERROR;
01069                 }
01070                 break;
01071 
01072         case CIF_CC_TYPE:
01073                 n = CIFCCTYPE(cr)->nlen;
01074                 cp = CIFCCTYPE(cr)->name = _Cif_space[mode] (n+1, cifd);
01075                 if (cp == NULL)
01076                         return (CIF_NOMEM);
01077                 if (fread (cp, sizeof(char), n, fd) != n)
01078                     IO_ERROR;
01079                 cp[n] = '\0';
01080 
01081                 if ( (n = CIFCCTYPE(cr)->nmem) > 0 ) {
01082                     cp = _Cif_space[ mode ]( n * sizeof( int ), cifd );
01083                     if ( cp == NULL )
01084                         return( CIF_NOMEM );
01085                     CIFCCTYPE(cr)->mem = (int *) cp;
01086                     if ( (int) fread( cp, sizeof( int ), n, fd ) < n )
01087                         IO_ERROR;
01088                 }
01089                 break;
01090 
01091         case CIF_CC_ENTRY:
01092                 n = CIFCCENT(cr)->nlen;
01093                 cp = CIFCCENT(cr)->name = _Cif_space[mode] (n+1, cifd);
01094                 if (cp == NULL)
01095                         return (CIF_NOMEM);
01096                 if (fread (cp, sizeof(char), n, fd) != n)
01097                     IO_ERROR;
01098                 cp[n] = '\0';
01099 
01100                 n = CIFCCENT(cr)->elen;
01101                 cp = CIFCCENT(cr)->ename = _Cif_space[mode] (n+1, cifd);
01102                 if (cp == NULL)
01103                         return (CIF_NOMEM);
01104                 if (fread (cp, sizeof(char), n, fd) != n)
01105                     IO_ERROR;
01106                 cp[n] = '\0';
01107 
01108                 if ( (n = CIFCCENT(cr)->nparam) > 0 ) {
01109                     cp = _Cif_space[ mode ]( n * sizeof( int ), cifd );
01110                     if ( cp == NULL )
01111                         return( CIF_NOMEM );
01112                     CIFCCENT(cr)->param = (int *) cp;
01113                     if ( (int) fread( cp, sizeof( int ), n, fd ) < n )
01114                         IO_ERROR;
01115                 }
01116                 break;
01117 
01118         case CIF_CC_OBJ:
01119                 n = CIFCCOBJ(cr)->nlen;
01120                 cp = CIFCCOBJ(cr)->name = _Cif_space[mode] (n+1, cifd);
01121                 if (cp == NULL)
01122                         return (CIF_NOMEM);
01123                 if (fread (cp, sizeof(char), n, fd) != n)
01124                     IO_ERROR;
01125                 cp[n] = '\0';
01126                 break;
01127 
01128         case CIF_CC_ENUM:
01129                 n = CIFCCENUM(cr)->nlen;
01130                 cp = CIFCCENUM(cr)->name = _Cif_space[mode] (n+1, cifd);
01131                 if (cp == NULL)
01132                         return (CIF_NOMEM);
01133                 if (fread (cp, sizeof(char), n, fd) != n)
01134                     IO_ERROR;
01135                 cp[n] = '\0';
01136                 n = CIFCCENUM(cr)->vlen;
01137                 cp = CIFCCENUM(cr)->value = _Cif_space[mode] (n+1, cifd);
01138                 if (cp == NULL)
01139                         return (CIF_NOMEM);
01140                 if (fread (cp, sizeof(char), n, fd) != n)
01141                     IO_ERROR;
01142                 cp[n] = '\0';
01143                 break;
01144 
01145         case CIF_CC_EXPR:
01146                 if ( (n = CIFCCEXPR(cr)->noper) > 0 ) {
01147                     cp = _Cif_space[ mode ]( n * sizeof( int ), cifd );
01148                     if ( cp == NULL )
01149                         return( CIF_NOMEM );
01150                     CIFCCEXPR(cr)->oper = (int *) cp;
01151                     if ( (int) fread( cp, sizeof( int ), n, fd ) < n )
01152                         IO_ERROR;
01153                 }
01154                 break;
01155 
01156         case CIF_BE_NODE:
01157                 if ( _Cif_filetbl[cifd].return_version == 2 ) {
01158                     if ( (n = CIFBENODE2(cr)->nsuccs) > 0 ) {
01159                         cp = _Cif_space[ mode ]( n * sizeof( int ), cifd );
01160                         if ( cp == NULL )
01161                             return( CIF_NOMEM );
01162                         CIFBENODE2(cr)->succs = (int *) cp;
01163                         if ( (int) fread( cp, sizeof( int ), n, fd ) < n )
01164                             IO_ERROR;
01165                     }
01166                     if ( (n = CIFBENODE2(cr)->nlines) > 0 ) {
01167                         if ( _Cif_filetbl[cifd].version == 3 ) {
01168                             /* Read and discard file ids 
01169                              * which exist in a V3 CIF but not in V2 */
01170                             cp = _Cif_space[ mode ]( n * sizeof( int ), cifd );
01171                             if ( cp == NULL )
01172                                 return( CIF_NOMEM );
01173                             if ( (int) fread( cp, sizeof( int ), n, fd ) < n )
01174                                 IO_ERROR;
01175                             free( cp );
01176                         }
01177                         cp = _Cif_space[ mode ]( n * sizeof( int ), cifd );
01178                         if ( cp == NULL )
01179                             return( CIF_NOMEM );
01180                         CIFBENODE2(cr)->lines = (int *) cp;
01181                         if ( (int) fread( cp, sizeof( int ), n, fd ) < n )
01182                             IO_ERROR;
01183                     }
01184                     if ( (int) fread( &c, 1, 1, fd ) < 1 )
01185                         IO_ERROR;
01186                     n = c;
01187                     cp = _Cif_space[ mode ]( n+1, cifd );
01188                         if ( cp == NULL )
01189                             return( CIF_NOMEM );
01190                     CIFBENODE2(cr)->label = cp;
01191                     if ( (int) fread( cp, 1, n, fd ) < n )
01192                         IO_ERROR;
01193                     cp[ n ] = 0;
01194                 }
01195                 else { /* Version 3 or beyond */
01196                     if ( (n = CIFBENODE(cr)->nsuccs) > 0 ) {
01197                         cp = _Cif_space[ mode ]( n * sizeof( int ), cifd );
01198                         if ( cp == NULL )
01199                             return( CIF_NOMEM );
01200                         CIFBENODE(cr)->succs = (int *) cp;
01201                         if ( (int) fread( cp, sizeof( int ), n, fd ) < n )
01202                             IO_ERROR;
01203                     }
01204                     if ( (n = CIFBENODE(cr)->nlines) > 0 ) {
01205                         cp = _Cif_space[ mode ]( n * sizeof( int ), cifd );
01206                         if ( cp == NULL )
01207                             return( CIF_NOMEM );
01208                         CIFBENODE(cr)->fid = (int *) cp;
01209                         if ( _Cif_filetbl[cifd].version == 2 ) {
01210                             for ( i = 0; i < n; i++ )
01211                                 CIFBENODE(cr)->fid[ i ] = 0;
01212                         } else {
01213                             if ( (int) fread( cp, sizeof( int ), n, fd ) < n )
01214                                 IO_ERROR;
01215                         }
01216                         cp = _Cif_space[ mode ]( n * sizeof( int ), cifd );
01217                         if ( cp == NULL )
01218                             return( CIF_NOMEM );
01219                         CIFBENODE(cr)->lines = (int *) cp;
01220                         if ( (int) fread( cp, sizeof( int ), n, fd ) < n )
01221                             IO_ERROR;
01222                     }
01223                     if ( (int) fread( &c, 1, 1, fd ) < 1 )
01224                         IO_ERROR;
01225                     n = c;
01226                     assert( n >= 0 && n < 255 );
01227                     cp = _Cif_space[ mode ]( n+1, cifd );
01228                         if ( cp == NULL )
01229                             return( CIF_NOMEM );
01230                     CIFBENODE(cr)->label = cp;
01231                     if ( (int) fread( cp, 1, n, fd ) < n )
01232                         IO_ERROR;
01233                     cp[ n ] = 0;
01234                 }
01235                 break;
01236 
01237         case CIF_BE_FID:
01238                 if ( (n = CIFBEFID(cr)->nfid) > 0 ) {
01239                     cp = _Cif_space[ mode ]( n * sizeof( int ), cifd );
01240                     if ( cp == NULL )
01241                         return( CIF_NOMEM );
01242                     CIFBEFID(cr)->fid = (int *) cp;
01243                     if ( (int) fread( cp, sizeof( int ), n, fd ) < n )
01244                         IO_ERROR;
01245                 }
01246                 break;
01247 
01248 #endif
01249 
01250 
01251         case CIF_MACH_CHAR:
01252                 if (_Cif_filetbl[cifd].lang == CIF_LG_F77) {
01253                   if (_Cif_filetbl[cifd].return_version == 1) {
01254 
01255                     /*
01256                      * We have the correct bits, but some of them could
01257                      * not be set in v1, so mask those out
01258                      */
01259 #ifdef CRAY2
01260                     /*
01261                      * On a Cray2, TAILGT was 0x01 in v1, it is now 0x02
01262                      * It is the only valid cray2 value for a v1 cif
01263                      */
01264                     if (CIFMC1(cr)->valmask | CIF_MC_TAILGT_1)  {
01265                       CIFMC1(cr)->valmask = CIF_MC_TAILGT;
01266                     }
01267                     else {
01268                       CIFMC1(cr)->valmask = 0;
01269                     }
01270 #else  /* Non-Cray2 have more bits to mask out */
01271                     CIFMC1(cr)->valmask = CIFMC1(cr)->valmask & CIF_MC_MASK;
01272 #endif /* CRAY2 */
01273 
01274                   } /* else, v2, no change required to value mask */
01275                 } /* else, f90 or C, no change required to the value mask */
01276 
01277                 break;
01278 
01279         default:
01280                 break;
01281 
01282         }
01283 
01284         return (0);
01285 
01286 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines