Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
cifdup.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/cifdup.c     30.5    07/26/96 07:19:13";
00038 
00039 
00040 /*
00041  * Cif_Duplicate copies the input Cif structure to newly malloc'd space.
00042  */
00043 
00044 #define CIF_VERSION 3
00045 
00046 #ifdef _ABSOFT
00047 #include "cif.h"
00048 #else
00049 #include <cif.h>
00050 #endif
00051 
00052 #include <stdlib.h>
00053 #include <stdio.h>
00054 #include <string.h>
00055 
00056 #include "cif_int.h"
00057 
00058 extern char *strdup(const char *s);
00059 
00060 struct Cif_generic *Cif_Duplicate
00061 #ifdef __STDC__
00062 (struct Cif_generic *cr)
00063 #else
00064 (cr)
00065 struct Cif_generic *cr;
00066 #endif
00067 {
00068 
00069         register int i, rectype, size;
00070         struct Cif_generic *ncr;
00071         char *cp, *ncp;
00072         
00073         /* Copy the basic structure */
00074 
00075         rectype = cr->rectype;
00076         if (rectype < 0 || rectype > CIF_MAXRECORD)
00077                 return (NULL);
00078         if ((size = _Cif_structsize[rectype][_cif_version]) == 0)
00079                 return (NULL);
00080         if ((ncr = (struct Cif_generic *)malloc(size)) == NULL)
00081                 return (NULL);
00082         (void) memcpy ((char *)ncr, (char *)cr, size);
00083 
00084         /* Copy other items associated with each particular structure */
00085 
00086         switch (rectype) {
00087 
00088         case CIF_CALLSITE:
00089                 if ((size = CIFCS(cr)->nargs) > 0) {
00090                         if ((CIFCS(ncr)->argids = (long *) malloc (sizeof(long *)*size))
00091                                 == NULL) return (NULL);
00092                         for (i=0; i < size; i++)
00093                                 (CIFCS(ncr)->argids)[i] = (CIFCS(cr)->argids)[i];
00094                 }
00095                 break;  
00096 
00097         case CIF_COMBLK:
00098                 if (_cif_version == 1) { /* must use v1 cif records */
00099                         if ((CIFCB1(ncr)->name = strdup (CIFCB1(cr)->name)) == NULL)
00100                                 return (NULL);
00101                 }
00102                 else { /* use v2 cif record2 */
00103                         if ((CIFCB(ncr)->name = strdup (CIFCB(cr)->name)) == NULL)
00104                                 return (NULL);
00105                 }
00106                 break;
00107 
00108         case CIF_CONST:
00109                 if ((CIFCON(ncr)->name = strdup (CIFCON(cr)->name)) == NULL)
00110                         return (NULL);
00111                 if ((CIFCON(ncr)->value = strdup (CIFCON(cr)->value)) == NULL)
00112                         return (NULL);
00113                 if (CIFCON(cr)->origform)
00114                   if ((CIFCON(ncr)->oform = strdup (CIFCON(cr)->oform)) == NULL)
00115                     return (NULL);
00116                 break;
00117 
00118         case CIF_ENTRY:
00119                 if ((CIFENTRY(ncr)->name = strdup (CIFENTRY(cr)->name)) == NULL)
00120                         return (NULL);
00121                 if ((size = CIFENTRY(cr)->nargs) > 0) {
00122                         if ((CIFENTRY(ncr)->argids = (long *) malloc (sizeof(long *)*size))
00123                                 == NULL) return (NULL);
00124                         for (i=0; i < size; i++)
00125                                 (CIFENTRY(ncr)->argids)[i] = (CIFENTRY(cr)->argids)[i];
00126                 }
00127                 break;
00128 
00129         case CIF_CDIR:
00130                 if ((size = CIFCDIR(cr)->nids) > 0) {
00131                         if ((CIFCDIR(ncr)->ids = (long *) malloc (sizeof(long *)*size))
00132                                 == NULL) return (NULL);
00133                         for (i=0; i < size; i++)
00134                                 (CIFCDIR(ncr)->ids)[i] = (CIFCDIR(cr)->ids)[i];
00135                 }
00136                 break;
00137 
00138         case CIF_CDIR_DOSHARED:
00139                 if ((size = CIFCDIRDO(cr)->nids) > 0) {
00140                         if ((CIFCDIRDO(ncr)->ids = (long *) malloc (sizeof(long *)*size))
00141                                 == NULL) return (NULL);
00142                         for (i=0; i < size; i++)
00143                                 (CIFCDIRDO(ncr)->ids)[i] = (CIFCDIRDO(cr)->ids)[i];
00144                 }
00145                 break;
00146 
00147         case CIF_GEOMETRY:
00148                 if (CIFGEOM(cr)->ndims > 0) {
00149                         size = sizeof(struct Cif_geometry_dim) * CIFGEOM(cr)->ndims;
00150                         if ((CIFGEOM(ncr)->dim = (struct Cif_geometry_dim *) malloc (size)) == NULL)
00151                                 return (NULL);
00152                         (void) memcpy ((char *)CIFGEOM(ncr)->dim, (char *)CIFGEOM(cr)->dim,size);
00153 
00154                 }
00155                 if (CIFGEOM(cr)->name != (char *) NULL)
00156                         CIFGEOM(ncr)->name = strdup (CIFGEOM(cr)->name);
00157                 break;
00158 
00159         case CIF_FILE:
00160                 if (_cif_version == 3) {
00161 
00162                   if ((CIFFILE(ncr)->name = strdup (CIFFILE(cr)->name)) == NULL)
00163                       return(NULL);
00164 
00165                   if (CIFFILE(cr)->oname == NULL)
00166                       CIFFILE(ncr)->oname = NULL;
00167                   else
00168                       if ((CIFFILE(ncr)->oname = strdup (CIFFILE(cr)->oname)) == NULL)
00169                           return(NULL);
00170                 }
00171                 else { /* must use v1/v2 version of the cif_file record */
00172 
00173                   if ((CIFFILE1(ncr)->name = strdup (CIFFILE1(cr)->name)) == NULL)
00174                       return(NULL);
00175 
00176                 }
00177                 break;
00178 
00179         case CIF_LABEL:
00180                 if ((CIFLABEL(ncr)->name = strdup (CIFLABEL(cr)->name)) == NULL)
00181                         return(NULL);
00182                 break;
00183 
00184         case CIF_ORIG_CMD:
00185                 if ((CIFOCMD(ncr)->name = strdup (CIFOCMD(cr)->name)) == NULL)
00186                         return(NULL);
00187                 break;
00188 
00189 
00190         case CIF_MESSAGE:
00191                 if (_cif_version < 3) { /* must use v1/2 cif records */
00192 
00193                   if ((size = CIFMSG1(cr)->nargs) > 0) {
00194                     if ((CIFMSG1(ncr)->args = (char **) malloc (sizeof(char *)*size))
00195                         == NULL) return (NULL);
00196                     for (i = 0; i < size; i++)
00197                         if (((CIFMSG1(ncr)->args)[i] = strdup ((CIFMSG1(cr)->args)[i]))
00198                             == NULL) return (NULL);
00199                   }
00200                 }
00201                 else { /* V3 CIF */
00202 
00203                   if (CIFMSG(cr)->nlen > 0 &&
00204                       (CIFMSG(ncr)->name = strdup (CIFMSG(cr)->name)) == NULL)
00205                       return(NULL);
00206 
00207                   if ((size = CIFMSG(cr)->nargs) > 0) {
00208                     if ((CIFMSG(ncr)->args = (char **) malloc (sizeof(char *)*size))
00209                         == NULL) return (NULL);
00210                     for (i = 0; i < size; i++)
00211                         if (((CIFMSG(ncr)->args)[i] = strdup ((CIFMSG(cr)->args)[i]))
00212                             == NULL) return (NULL);
00213                   }
00214 
00215                 }
00216                 break;
00217 
00218         case CIF_MISC_OPTS:
00219 
00220                 if (_cif_version == 1) { /* must use v1 cif records */
00221 
00222                   if ((size = CIFMO1(cr)->nmsgs) > 0) {
00223                     if ((CIFMO1(ncr)->msgno = (long *) malloc (sizeof(long)*size))
00224                         == NULL) return (NULL);
00225                     (void) memcpy ((char *)CIFMO1(ncr)->msgno, (char *)CIFMO1(cr)->msgno,
00226                                    sizeof(long)*size);
00227                   }
00228                   if ((size = CIFMO1(cr)->ncdirs) > 0) {
00229                     if ((CIFMO1(ncr)->cdirs = (char **) malloc (sizeof(char *)*size))
00230                         == NULL) return (NULL);
00231                     for (i = 0; i < size; i++)
00232                       if (((CIFMO1(ncr)->cdirs)[i] = strdup ((CIFMO1(cr)->cdirs)[i]))
00233                           == NULL) return (NULL);
00234                   }
00235                   if (CIFMO1(cr)->objname != NULL)
00236                     if ((CIFMO1(ncr)->objname = strdup (CIFMO1(cr)->objname)) == NULL)
00237                       return(NULL);
00238                   if (CIFMO1(cr)->calname != NULL)
00239                     if ((CIFMO1(ncr)->calname = strdup (CIFMO1(cr)->calname)) == NULL)
00240                       return(NULL);
00241                   if (CIFMO1(cr)->inname != NULL)
00242                     if ((CIFMO1(ncr)->inname = strdup (CIFMO1(cr)->inname)) == NULL)
00243                       return(NULL);
00244 
00245                 }
00246                 else { /* use v2 cif records */
00247 
00248 
00249                   if ((size = CIFMO(cr)->nmsgs) > 0) {
00250                     if ((CIFMO(ncr)->msgno = (long *) malloc (sizeof(long)*size))
00251                         == NULL) return (NULL);
00252                     (void) memcpy ((char *)CIFMO(ncr)->msgno, (char *)CIFMO(cr)->msgno,
00253                                    sizeof(long)*size);
00254                   }
00255                   if ((size = CIFMO(cr)->ncdirs) > 0) {
00256                     if ((CIFMO(ncr)->cdirs = (char **) malloc (sizeof(char *)*size))
00257                         == NULL) return (NULL);
00258                     for (i = 0; i < size; i++)
00259                       if (((CIFMO(ncr)->cdirs)[i] = strdup ((CIFMO(cr)->cdirs)[i]))
00260                           == NULL) return (NULL);
00261                   }
00262                   if ((size = CIFMO(cr)->numincs) > 0) {
00263                     if ((CIFMO(ncr)->incdirs = (char **) malloc (sizeof(char *)*size))
00264                         == NULL) return (NULL);
00265                     for (i = 0; i < size; i++)
00266                       if (((CIFMO(ncr)->incdirs)[i] = strdup ((CIFMO(cr)->incdirs)[i]))
00267                           == NULL) return (NULL);
00268                   }
00269                   if (CIFMO(cr)->objname != NULL)
00270                     if ((CIFMO(ncr)->objname = strdup (CIFMO(cr)->objname)) == NULL)
00271                       return(NULL);
00272                   if (CIFMO(cr)->lname != NULL)
00273                     if ((CIFMO(ncr)->lname = strdup (CIFMO(cr)->lname)) == NULL)
00274                       return(NULL);
00275                   if (CIFMO(cr)->calname != NULL)
00276                     if ((CIFMO(ncr)->calname = strdup (CIFMO(cr)->calname)) == NULL)
00277                       return(NULL);
00278                   if (CIFMO(cr)->inname != NULL)
00279                     if ((CIFMO(ncr)->inname = strdup (CIFMO(cr)->inname)) == NULL)
00280                       return(NULL);
00281 
00282 
00283                 }
00284                 break;
00285 
00286         case CIF_NAMELIST:
00287                 if ((CIFNL(ncr)->name = strdup (CIFNL(cr)->name)) == NULL)
00288                         return (NULL);
00289                 size = sizeof(long) * CIFNL(cr)->nids;
00290                 if ((CIFNL(ncr)->ids = (long *) malloc (size)) == NULL) return (NULL);
00291                 for (i = 0; i < (int) CIFNL(cr)->nids; i++)
00292                         (CIFNL(ncr)->ids)[i] = (CIFNL(cr)->ids)[i];
00293                 break;
00294 
00295         case CIF_ND_MSG:
00296                 if ((size = CIFNMSG(cr)->nargs) > 0) {
00297                         if ((CIFNMSG(ncr)->args = (char **) malloc (sizeof(char *)*size))
00298                                 == NULL) return (NULL);
00299                         for (i = 0; i < size; i++)
00300                                 if (((CIFNMSG(ncr)->args)[i] = strdup ((CIFNMSG(cr)->args)[i]))
00301                                         == NULL) return (NULL);
00302                 }
00303                 break;
00304 
00305         case CIF_OBJECT:
00306                 if (_cif_version == 1) { /* must use v1 cif records */
00307 
00308                         if (CIFOBJ1(cr)->name != NULL)
00309                                 if ((CIFOBJ1(ncr)->name = strdup (CIFOBJ1(cr)->name)) == NULL)
00310                                         return(NULL);
00311                         if (CIFOBJ1(cr)->ndims > 0) {
00312                                 size = sizeof(struct Cif_dim) * CIFOBJ1(cr)->ndims;
00313                                 if ((CIFOBJ1(ncr)->dim = (struct Cif_dim *) malloc (size)) == NULL)
00314                                         return (NULL);
00315                                 (void) memcpy ((char *)CIFOBJ1(ncr)->dim, (char *)CIFOBJ1(cr)->dim,size);
00316                               }
00317                 }
00318                 else { /* use v2 cif records */
00319 
00320                         if (CIFOBJ(cr)->name != NULL)
00321                                 if ((CIFOBJ(ncr)->name = strdup (CIFOBJ(cr)->name)) == NULL)
00322                                         return(NULL);
00323                         if (CIFOBJ(cr)->ndims > 0) {
00324                                 size = sizeof(struct Cif_dim) * CIFOBJ(cr)->ndims;
00325                                 if ((CIFOBJ(ncr)->dim = (struct Cif_dim *) malloc (size)) == NULL)
00326                                         return (NULL);
00327                                 (void) memcpy ((char *)CIFOBJ(ncr)->dim, (char *)CIFOBJ(cr)->dim,size);
00328                               }
00329 
00330                 }
00331                 break;
00332 
00333         case CIF_UNIT:
00334                 if ((CIFUNIT(ncr)->name = strdup (CIFUNIT(cr)->name)) == NULL)
00335                         return (NULL);
00336                 break;
00337 
00338         case CIF_ENDUNIT:
00339                 if ((CIFENDU(ncr)->name = strdup (CIFENDU(cr)->name)) == NULL)
00340                         return (NULL);
00341                 break;
00342 
00343         case CIF_USAGE:
00344                 if (_cif_version == 1) { /* must use v1 cif records */
00345 
00346                   size = sizeof(struct Cif_use) * CIFUSAGE1(cr)->nuses;
00347                   if ((CIFUSAGE1(ncr)->use = (struct Cif_use *) malloc (size)) == NULL)
00348                     return (NULL);
00349                   (void) memcpy ((char *)CIFUSAGE1(ncr)->use, (char *)CIFUSAGE1(cr)->use,
00350                                  size);
00351 
00352                 }
00353                 else {  /* use v2 cif records */
00354 
00355                   size = sizeof(struct Cif_use) * CIFUSAGE(cr)->nuses;
00356                   if ((CIFUSAGE(ncr)->use = (struct Cif_use *) malloc (size)) == NULL)
00357                     return (NULL);
00358                   (void) memcpy ((char *)CIFUSAGE(ncr)->use, (char *)CIFUSAGE(cr)->use,
00359                                  size);
00360                   if (CIFUSAGE(cr)->nmembs > 0) {
00361                     size = sizeof(long) * CIFUSAGE(cr)->nmembs;
00362                     if ((CIFUSAGE(ncr)->membs = (long *) malloc (size)) == NULL)
00363                       return (NULL);
00364                     (void) memcpy ((char *)CIFUSAGE(ncr)->membs, (char *)CIFUSAGE(cr)->membs,
00365                                  size);
00366                   }
00367 
00368                 }
00369 
00370                 break;
00371 
00372         case CIF_FILEDIR:
00373         {
00374                 struct Cif_unittbl *nut, *ut;
00375 
00376                 size = sizeof(struct Cif_unittbl) * CIFFDIR(cr)->nunits;
00377                 ut = CIFFDIR(cr)->ut;
00378                 if ((nut = CIFFDIR(ncr)->ut = (struct Cif_unittbl *)malloc (size))
00379                         == NULL) return (NULL);
00380                 (void) memcpy ((char *)nut, (char *)ut, size);
00381                 for (i = 0; i < (int) CIFFDIR(cr)->nunits; i++)
00382                         if ((nut[i].name = strdup (ut[i].name)) == NULL) return (NULL);
00383                 break;
00384         }
00385 
00386         case CIF_UNITDIR:
00387                 size = sizeof(struct Cif_urectbl) * CIFUDIR(cr)->nsections;
00388                 if ((CIFUDIR(ncr)->ur = (struct Cif_urectbl *) malloc (size))
00389                         == NULL) return (NULL);
00390                 (void) memcpy ((char *)CIFUDIR(ncr)->ur, (char *)CIFUDIR(cr)->ur, size);
00391                 break;
00392 
00393         case CIF_C_TAG:
00394                 if (CIFCTAG(cr)->nmods > 0) {
00395                         size = sizeof(struct Cif_tmod) * CIFCTAG(cr)->nmods;
00396                         if ((CIFCTAG(ncr)->mods = (struct Cif_tmod *) malloc (size))
00397                                 == NULL) return (NULL);
00398                         (void) memcpy ((char *)CIFCTAG(ncr)->mods, (char *)CIFCTAG(cr)->mods,
00399                                        size);
00400                 }
00401                 if (CIFCTAG(cr)->nmems > 0) {
00402                         size = sizeof(long) * CIFCTAG(cr)->nmems;
00403                         if ((CIFCTAG(ncr)->memids = (long *) malloc (size)) == NULL)
00404                                 return (NULL);
00405                         (void) memcpy ((char *)CIFCTAG(ncr)->memids,
00406                                        (char *)CIFCTAG(cr)->memids,
00407                                        size);
00408                 }
00409                 if ((CIFCTAG(ncr)->name = strdup (CIFCTAG(cr)->name)) == NULL)
00410                         return (NULL);
00411                 break;
00412 
00413         case CIF_C_OPTS:
00414         {
00415                 char **ncp, **cp;
00416 
00417                 if ((CIFCOPTS(ncr)->name = strdup (CIFCOPTS(cr)->name)) == NULL)
00418                         return (NULL);
00419                 if (CIFCOPTS(cr)->nincs > 0) {
00420                         cp = CIFCOPTS(cr)->incs;
00421                         size = CIFCOPTS(cr)->nincs;
00422                         if ((ncp = (char **)malloc(sizeof(char *)*size)) == NULL)
00423                                  return (NULL);
00424                         CIFCOPTS(ncr)->incs = ncp;
00425                         for (i = 0; i < size; i++)
00426                                 if ((ncp[i] = strdup (cp[i])) == NULL) return (NULL);
00427                 }
00428                 if (CIFCOPTS(cr)->ndefs > 0) {
00429                         cp = CIFCOPTS(cr)->defs;
00430                         size = CIFCOPTS(cr)->ndefs;
00431                         if ((ncp = (char **)malloc(sizeof(char *)*size)) == NULL)
00432                                 return (NULL);
00433                         CIFCOPTS(ncr)->defs = ncp;
00434                         for (i = 0; i < size; i++)
00435                                 if ((ncp[i] = strdup (cp[i])) == NULL) return (NULL);
00436                 }
00437                 if (CIFCOPTS(cr)->nudefs > 0) {
00438                         cp = CIFCOPTS(cr)->udefs;
00439                         size = CIFCOPTS(cr)->nudefs;
00440                         if ((ncp = (char **)malloc(sizeof(char *)*size)) == NULL)
00441                                 return (NULL);
00442                         CIFCOPTS(ncr)->udefs = ncp;
00443                         for (i = 0; i < size; i++)
00444                                 if ((ncp[i] = strdup (cp[i])) == NULL) return (NULL);
00445                 }
00446                 break;
00447         }
00448 
00449         case CIF_C_MESSAGE:
00450 
00451                 if (_cif_version == 1) { /* must use v1 cif records */
00452 
00453                   if ((size = CIFCMSG1(cr)->nargs) > 0) {
00454                         if ((CIFCMSG1(ncr)->args = (char **) malloc (sizeof(char *)*size))
00455                                 == NULL) return (NULL);
00456                         for (i = 0; i < size; i++)
00457                                 if (((CIFCMSG1(cr)->args)[i] =
00458                                      strdup ((CIFCMSG1(cr)->args)[i]))
00459                                         == NULL) return (NULL);
00460                       }
00461 
00462                 }
00463                 else { /* use v2 cif records */
00464 
00465                   if ((size = CIFCMSG(cr)->nargs) > 0) {
00466                         if ((CIFCMSG(ncr)->args = (char **) malloc (sizeof(char *)*size))
00467                                 == NULL) return (NULL);
00468                         for (i = 0; i < size; i++)
00469                                 if (((CIFCMSG(cr)->args)[i] = strdup ((CIFCMSG(cr)->args)[i]))
00470                                         == NULL) return (NULL);
00471                       }
00472 
00473                 }
00474                 break;
00475 
00476         case CIF_C_CONST:
00477                 if ((CIFCCON(ncr)->value = strdup (CIFCCON(cr)->value)) == NULL)
00478                         return (NULL);
00479                 break;
00480 
00481         case CIF_C_ENTRY:
00482 
00483                 if (_cif_version == 1) { /* must use v1 cif records */
00484 
00485                   if (CIFCENTRY1(cr)->nmods > 0) {
00486                         size = sizeof(struct Cif_tmod) * CIFCENTRY1(cr)->nmods;
00487                         if ((CIFCENTRY1(ncr)->mods = (struct Cif_tmod *) malloc (size))
00488                                 == NULL) return (NULL);
00489                         (void) memcpy ((char *)CIFCENTRY1(ncr)->mods,
00490                                        (char *)CIFCENTRY1(cr)->mods,
00491                                        size);
00492                       }
00493 
00494                   if (CIFCENTRY1(cr)->nargs > 0) {
00495                         size = sizeof(long) * CIFCENTRY1(cr)->nargs;
00496                         if ((CIFCENTRY1(ncr)->argids = (long *) malloc (size)) == NULL)
00497                                 return (NULL);
00498                         (void) memcpy ((char *)CIFCENTRY1(ncr)->argids,
00499                                        (char *)CIFCENTRY1(cr)->argids,
00500                                        size);
00501                       }
00502                   if ((CIFCENTRY1(ncr)->name = strdup (CIFCENTRY1(cr)->name)) == NULL)
00503                          return (NULL);
00504 
00505                 }
00506                 else { /* use v2 cif records */
00507 
00508                   if (CIFCENTRY(cr)->nmods > 0) {
00509                         size = sizeof(struct Cif_tmod) * CIFCENTRY(cr)->nmods;
00510                         if ((CIFCENTRY(ncr)->mods = (struct Cif_tmod *) malloc (size))
00511                                 == NULL) return (NULL);
00512                         (void) memcpy ((char *)CIFCENTRY(ncr)->mods,
00513                                        (char *)CIFCENTRY(cr)->mods,
00514                                        size);
00515                       }
00516 
00517                   if (CIFCENTRY(cr)->nargs > 0) {
00518                         size = sizeof(long) * CIFCENTRY(cr)->nargs;
00519                         if ((CIFCENTRY(ncr)->argids = (long *) malloc (size)) == NULL)
00520                                 return (NULL);
00521                         (void) memcpy ((char *)CIFCENTRY(ncr)->argids,
00522                                        (char *)CIFCENTRY(cr)->argids,
00523                                        size);
00524                       }
00525                   if ((CIFCENTRY(ncr)->name = strdup (CIFCENTRY(cr)->name)) == NULL)
00526                          return (NULL);
00527                 }
00528 
00529                 break;
00530 
00531         case CIF_C_OBJECT:
00532                 if (CIFCOBJ(cr)->nmods > 0) {
00533                         size = sizeof(struct Cif_tmod) * CIFCOBJ(cr)->nmods;
00534                         if ((CIFCOBJ(ncr)->mods = (struct Cif_tmod *) malloc (size))
00535                                 == NULL) return (NULL);
00536                         (void) memcpy ((char *)CIFCOBJ(ncr)->mods, (char *)CIFCOBJ(cr)->mods,
00537                                        size);
00538                 }
00539                 if ((CIFCOBJ(ncr)->name = strdup (CIFCOBJ(cr)->name)) == NULL)
00540                         return (NULL);
00541                 break;
00542 
00543         case CIF_C_LINT_DIRECTIVE:
00544                 if ((CIFCLDIR(ncr)->name = strdup (CIFCLDIR(cr)->name)) == NULL)
00545                         return (NULL);
00546                 break;
00547 
00548         case CIF_C_MACRO_DEF:
00549                 if ((CIFCMDEF(ncr)->name = strdup (CIFCMDEF(cr)->name)) == NULL)
00550                         return (NULL);
00551                 break;
00552 
00553         case CIF_C_ENTRY_END:
00554                 if ((CIFCEEND(ncr)->name = strdup (CIFCEEND(cr)->name)) == NULL)
00555                         return (NULL);
00556                 break;
00557 
00558 
00559         case CIF_F90_CALLSITE:
00560                 if ((size = CIFF90CS(cr)->nargs) > 0) {
00561                         if ((CIFF90CS(ncr)->argids = (long *) malloc (sizeof(long *)*size))
00562                                 == NULL) return (NULL);
00563                         if (CIFF90CS(cr)->rank == 1)
00564                             if ((CIFF90CS(ncr)->ranks = (int *) malloc (sizeof(int)*size))
00565                                 == NULL) return (NULL);
00566 
00567                         for (i=0; i < size; i++) {
00568                                 (CIFF90CS(ncr)->argids)[i] = (CIFF90CS(cr)->argids)[i];
00569                                 (CIFF90CS(ncr)->nmembs)[i] = (CIFF90CS(cr)->nmembs)[i];
00570                                 (CIFF90CS(ncr)->membs)[i] =
00571                                   (long *) malloc ((CIFF90CS(cr)->nmembs)[i] * sizeof(long));
00572                                 (void) memcpy (((char *) (CIFF90CS(ncr)->membs)[i]),
00573                                                ((char *) (CIFF90CS(cr)->membs)[i]),
00574                                                (CIFF90CS(cr)->nmembs)[i] * sizeof(long));
00575 
00576                                 if (CIFF90CS(cr)->rank == 1)
00577                                     (CIFF90CS(ncr)->ranks)[i] = (CIFF90CS(cr)->ranks)[i];
00578 
00579                               }
00580                 }
00581                 break;
00582 
00583         case CIF_F90_SCOPE_INFO:
00584                 if ((size = CIFF90SI(cr)->numalts) > 0) {
00585                         if ((CIFF90SI(ncr)->entryids = (long *) malloc (sizeof(long *)*size))
00586                                 == NULL) return (NULL);
00587                         for (i=0; i < size; i++)
00588                                 (CIFF90SI(ncr)->entryids)[i] = (CIFF90SI(cr)->entryids)[i];
00589                 }
00590                 break;
00591 
00592         case CIF_F90_COMBLK:
00593                 if ((CIFF90CB(ncr)->name = strdup (CIFF90CB(cr)->name)) == NULL)
00594                         return (NULL);
00595                 break;
00596 
00597         case CIF_F90_CONST:
00598                 if ((CIFF90CON(ncr)->value = strdup (CIFF90CON(cr)->value)) == NULL)
00599                         return (NULL);
00600                 break;
00601 
00602         case CIF_F90_ENTRY:
00603                 if ((CIFF90ENTRY(ncr)->name = strdup (CIFF90ENTRY(cr)->name)) == NULL)
00604                         return (NULL);
00605                 if ((size = CIFF90ENTRY(cr)->nargs) > 0) {
00606                         if ((CIFF90ENTRY(ncr)->argids = (long *) malloc (sizeof(long *)*size))
00607                                 == NULL) return (NULL);
00608                         for (i=0; i < size; i++)
00609                                 (CIFF90ENTRY(ncr)->argids)[i] = (CIFF90ENTRY(cr)->argids)[i];
00610                 }
00611 
00612                 break;
00613 
00614         case CIF_F90_DERIVED_TYPE:
00615                 if (_cif_version == 2) { /* must use v2 cif records */
00616 
00617                   if ((CIFF90DTYPE2(ncr)->name = strdup (CIFF90DTYPE2(cr)->name)) == NULL)
00618                       return (NULL);
00619                   if ((size = CIFF90DTYPE2(cr)->nmembs) > 0) {
00620                     if ((CIFF90DTYPE2(ncr)->memids = (long *) malloc (sizeof(long *)*size))
00621                         == NULL) return (NULL);
00622                     for (i=0; i < size; i++)
00623                         (CIFF90DTYPE2(ncr)->memids)[i] = (CIFF90DTYPE2(cr)->memids)[i];
00624                   }
00625                 }
00626                 else {  /* Version 3 CIF */
00627 
00628                   if ((CIFF90DTYPE(ncr)->name = strdup (CIFF90DTYPE(cr)->name)) == NULL)
00629                       return (NULL);
00630                   if ((size = CIFF90DTYPE(cr)->nmembs) > 0) {
00631                     if ((CIFF90DTYPE(ncr)->memids = (long *) malloc (sizeof(long *)*size))
00632                         == NULL) return (NULL);
00633                     for (i=0; i < size; i++)
00634                         (CIFF90DTYPE(ncr)->memids)[i] = (CIFF90DTYPE(cr)->memids)[i];
00635                   }
00636                 }
00637                 break;
00638 
00639         case CIF_F90_LABEL:
00640                 if ((CIFF90LABEL(ncr)->name = strdup (CIFF90LABEL(cr)->name)) == NULL)
00641                         return(NULL);
00642                 break;
00643 
00644         case CIF_F90_NAMELIST:
00645                 if ((CIFF90NL(ncr)->name = strdup (CIFF90NL(cr)->name)) == NULL)
00646                         return (NULL);
00647                 size = sizeof(long) * CIFF90NL(cr)->nids;
00648                 if ((CIFF90NL(ncr)->ids = (long *) malloc (size)) == NULL) return (NULL);
00649                 for (i = 0; i < (int) CIFF90NL(cr)->nids; i++)
00650                         (CIFF90NL(ncr)->ids)[i] = (CIFF90NL(cr)->ids)[i];
00651                 break;
00652 
00653         case CIF_F90_OBJECT:
00654                 if (CIFF90OBJ(cr)->name != NULL)
00655                         if ((CIFF90OBJ(ncr)->name = strdup (CIFF90OBJ(cr)->name)) == NULL)
00656                                 return(NULL);
00657                 if (CIFF90OBJ(cr)->ndims > 0) {
00658                         size = sizeof(struct Cif_dim) * CIFF90OBJ(cr)->ndims;
00659                         if ((CIFF90OBJ(ncr)->dim = (struct Cif_dim *) malloc (size)) == NULL)
00660                                 return (NULL);
00661                         (void) memcpy ((char *)CIFF90OBJ(ncr)->dim, (char *)CIFF90OBJ(cr)->dim,size);
00662                 }
00663                 break;
00664 
00665 
00666    case CIF_F90_MISC_OPTS:
00667                 if ((size = CIFF90MO(cr)->nmsgs) > 0) {
00668                         if ((CIFF90MO(ncr)->msgno = (long *) malloc (sizeof(long)*size))
00669                                 == NULL) return (NULL);
00670                         (void) memcpy ((char *)CIFF90MO(ncr)->msgno, (char *)CIFF90MO(cr)->msgno,
00671                                         sizeof(long)*size);
00672                 }
00673                 if ((size = CIFF90MO(cr)->ncdirs) > 0) {
00674                         if ((CIFF90MO(ncr)->cdirs = (char **) malloc (sizeof(char *)*size))
00675                                 == NULL) return (NULL);
00676                         for (i = 0; i < size; i++)
00677                                 if (((CIFF90MO(ncr)->cdirs)[i] = strdup ((CIFF90MO(cr)->cdirs)[i]))
00678                                         == NULL) return (NULL);
00679                 }
00680                 if ((size = CIFF90MO(cr)->nPdirs) > 0) {
00681                         if ((CIFF90MO(ncr)->Pdirs = (char **) malloc (sizeof(char *)*size))
00682                                 == NULL) return (NULL);
00683                         for (i = 0; i < size; i++)
00684                                 if (((CIFF90MO(ncr)->Pdirs)[i] = strdup ((CIFF90MO(cr)->Pdirs)[i]))
00685                                         == NULL) return (NULL);
00686                 }
00687                 if ((size = CIFF90MO(cr)->npdirs) > 0) {
00688                         if ((CIFF90MO(ncr)->pdirs = (char **) malloc (sizeof(char *)*size))
00689                                 == NULL) return (NULL);
00690                         for (i = 0; i < size; i++)
00691                                 if (((CIFF90MO(ncr)->pdirs)[i] = strdup ((CIFF90MO(cr)->pdirs)[i]))
00692                                         == NULL) return (NULL);
00693                 }
00694                 if (CIFF90MO(cr)->objname != NULL)
00695                         if ((CIFF90MO(ncr)->objname = strdup (CIFF90MO(cr)->objname)) == NULL)
00696                                 return(NULL);
00697                 if (CIFF90MO(cr)->calname != NULL)
00698                         if ((CIFF90MO(ncr)->calname = strdup (CIFF90MO(cr)->calname)) == NULL)
00699                                 return(NULL);
00700                 if (CIFF90MO(cr)->inname != NULL)
00701                         if ((CIFF90MO(ncr)->inname = strdup (CIFF90MO(cr)->inname)) == NULL)
00702                                 return(NULL);
00703                 if (CIFF90MO(cr)->cifname != NULL)
00704                         if ((CIFF90MO(ncr)->cifname = strdup (CIFF90MO(cr)->cifname)) == NULL)
00705                                 return(NULL);
00706                 break;
00707 
00708         case CIF_F90_OPT_OPTS:
00709                 if (CIFF90OPTOPT(cr)->noptlevels > 0) {
00710                         size = sizeof(struct Cif_f90_level_opts) * CIFF90OPTOPT(cr)->noptlevels;
00711                         if ((CIFF90OPTOPT(ncr)->lopts = (struct Cif_f90_level_opts *) malloc (size)) == NULL)
00712                                 return (NULL);
00713                         (void) memcpy ((char *)CIFF90OPTOPT(ncr)->lopts, (char *)CIFF90OPTOPT(cr)->lopts,size);
00714                 }
00715                 break;
00716 
00717         case CIF_F90_INT_BLOCK:
00718                 if (_cif_version == 2) { /* must use v2 cif records */
00719 
00720                   if (CIFF90IB2(cr)->name != NULL)
00721                       if ((CIFF90IB2(ncr)->name = strdup (CIFF90IB2(cr)->name)) == NULL)
00722                           return(NULL);
00723 
00724                   if ((size = CIFF90IB2(cr)->numints) > 0) {
00725                     if ((CIFF90IB2(ncr)->procids = (long *) malloc (sizeof(long)*size))
00726                         == NULL) return (NULL);
00727                     (void) memcpy ((char *)CIFF90IB2(ncr)->procids,
00728                                    (char *)CIFF90IB2(cr)->procids,
00729                                    sizeof(long)*size);
00730                   }
00731                 }
00732                 else {  /* Version 3 CIF */
00733 
00734                   if (CIFF90IB(cr)->name != NULL)
00735                       if ((CIFF90IB(ncr)->name = strdup (CIFF90IB(cr)->name)) == NULL)
00736                           return(NULL);
00737 
00738                   if ((size = CIFF90IB(cr)->numints) > 0) {
00739                     if ((CIFF90IB(ncr)->procids = (long *) malloc (sizeof(long)*size))
00740                         == NULL) return (NULL);
00741                     (void) memcpy ((char *)CIFF90IB(ncr)->procids,
00742                                    (char *)CIFF90IB(cr)->procids,
00743                                    sizeof(long)*size);
00744                   }
00745                 }
00746                 break;
00747 
00748 
00749         case CIF_BE_NODE:
00750                 if (_cif_version == 2) { /* must use v2 cif records */
00751                     size = CIFBENODE2(cr)->nsuccs * sizeof( int );
00752                     if ((ncp = (char *) malloc( size )) == NULL )
00753                         return( NULL );
00754                     CIFBENODE2(ncr)->succs = (int *) ncp;
00755                     cp = (char *) CIFBENODE2(cr)->succs;
00756                     (void) memcpy (ncp, cp, size);
00757                     size = CIFBENODE2(cr)->nlines * sizeof( int );
00758                     if ((ncp = (char *) malloc( size )) == NULL )
00759                         return( NULL );
00760                     CIFBENODE2(ncr)->lines = (int *) ncp;
00761                     cp = (char *) CIFBENODE2(cr)->lines;
00762                     (void) memcpy (ncp, cp, size);
00763                     if ((CIFBENODE2(ncr)->label = strdup (CIFBENODE2(cr)->label)) == NULL)
00764                         return (NULL);
00765                 } else {
00766                     size = CIFBENODE(cr)->nsuccs * sizeof( int );
00767                     if ((ncp = (char *) malloc( size )) == NULL )
00768                             return( NULL );
00769                     CIFBENODE(ncr)->succs = (int *) ncp;
00770                     cp = (char *) CIFBENODE(cr)->succs;
00771                     (void) memcpy (ncp, cp, size);
00772                     size = CIFBENODE(cr)->nlines * sizeof( int );
00773                     if ((ncp = (char *) malloc( size )) == NULL )
00774                             return( NULL );
00775                     CIFBENODE(ncr)->fid = (int *) ncp;
00776                     cp = (char *) CIFBENODE(cr)->fid;
00777                     (void) memcpy (ncp, cp, size);
00778                     if ((ncp = (char *) malloc( size )) == NULL )
00779                             return( NULL );
00780                     CIFBENODE(ncr)->lines = (int *) ncp;
00781                     cp = (char *) CIFBENODE(cr)->lines;
00782                     (void) memcpy (ncp, cp, size);
00783                     if ((CIFBENODE(ncr)->label = strdup (CIFBENODE(cr)->label)) == NULL)
00784                             return (NULL);
00785                 }
00786                 break;
00787 
00788 
00789         case CIF_BE_FID:
00790                 size = CIFBEFID(cr)->nfid * sizeof( int );
00791                 if ((ncp = (char *) malloc( size )) == NULL )
00792                         return( NULL );
00793                 CIFBEFID(ncr)->fid = (int *) ncp;
00794                 cp = (char *) CIFBEFID(cr)->fid;
00795                 (void) memcpy (ncp, cp, size);
00796                 break;
00797 
00798 
00799         case CIF_CC_TYPE:
00800                 if (CIFCCTYPE(cr)->nlen > 0) {
00801                     CIFCCTYPE(ncr)->name = strdup (CIFCCTYPE(cr)->name);
00802                     if (CIFCCTYPE(ncr)->name == NULL)
00803                         return(NULL);
00804                 }
00805                 if (CIFCCTYPE(cr)->nmem > 0) {
00806                     size = CIFCCTYPE(cr)->nmem * sizeof( int );
00807                     if ((ncp = (char *) malloc( size )) == NULL )
00808                         return( NULL );
00809                     CIFCCTYPE(ncr)->mem = (int *) ncp;
00810                     cp = (char *) CIFCCTYPE(cr)->mem;
00811                     (void) memcpy (ncp, cp, size);
00812                 }
00813                 break;
00814 
00815         case CIF_CC_ENTRY:
00816                 if (CIFCCENT(cr)->nlen > 0) {
00817                     CIFCCENT(ncr)->name = strdup (CIFCCENT(cr)->name);
00818                     if (CIFCCENT(ncr)->name == NULL)
00819                         return(NULL);
00820                 }
00821                 if (CIFCCENT(cr)->nparam > 0) {
00822                     size = CIFCCENT(cr)->nparam * sizeof( int );
00823                     if ((ncp = (char *) malloc( size )) == NULL )
00824                         return( NULL );
00825                     CIFCCENT(ncr)->param = (int *) ncp;
00826                     cp = (char *) CIFCCENT(cr)->param;
00827                     (void) memcpy (ncp, cp, size);
00828                 }
00829                 break;
00830 
00831         case CIF_CC_OBJ:
00832                 if (CIFCCOBJ(cr)->nlen > 0) {
00833                     CIFCCOBJ(ncr)->name = strdup (CIFCCOBJ(cr)->name);
00834                     if (CIFCCOBJ(ncr)->name == NULL)
00835                         return(NULL);
00836                 }
00837                 break;
00838 
00839         case CIF_CC_ENUM:
00840                 if (CIFCCENUM(cr)->nlen > 0) {
00841                     CIFCCENUM(ncr)->name = strdup (CIFCCENUM(cr)->name);
00842                     if (CIFCCENUM(ncr)->name == NULL)
00843                         return(NULL);
00844                 }
00845                 if (CIFCCENUM(cr)->vlen > 0) {
00846                     CIFCCENUM(ncr)->value = strdup (CIFCCENUM(cr)->value);
00847                     if (CIFCCENUM(ncr)->value == NULL)
00848                         return(NULL);
00849                 }
00850                 break;
00851 
00852         case CIF_CC_EXPR:
00853                 if (CIFCCEXPR(cr)->noper > 0) {
00854                     size = CIFCCEXPR(cr)->noper * sizeof( int );
00855                     if ((ncp = (char *) malloc( size )) == NULL )
00856                         return( NULL );
00857                     CIFCCEXPR(ncr)->oper = (int *) ncp;
00858                     cp = (char *) CIFCCEXPR(cr)->oper;
00859                     (void) memcpy (ncp, cp, size);
00860                 }
00861                 break;
00862 
00863         default:
00864                 break;
00865         }
00866 
00867         return (ncr);
00868 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines