📄 ptapi.c
字号:
/* Check for empty fields */ /* ---------------------- */ if (slen[i] == 0) { status = -1; HEpush(DFE_GENAPP, "PTdeflevel", __FILE__, __LINE__); HEreport("\"Empty\" field in fieldlist: %s.\n", fieldlist); break; } /* Check fieldname for length */ /* -------------------------- */ memcpy(utlbuf, pntr[i], slen[i]); utlbuf[slen[i]] = 0; if (slen[i] > FIELDNAMELENMAX) { status = -1; HEpush(DFE_GENAPP, "PTdeflevel", __FILE__, __LINE__); HEreport("Fieldname \"%s\" more than %d characters.\n", utlbuf, FIELDNAMELENMAX); } } /* If no problems proceed ... */ /* -------------------------- */ if (status == 0) { /* Get Data Vgroup ID */ /* ------------------ */ vgid = PTXPoint[pID].VIDTable[0]; /* Get number of levels in point */ /* ----------------------------- */ nlevels = Vntagrefs(vgid); /* Get new vdata ID */ /* ---------------- */ vdataID = VSattach(fid, -1, "w"); /* Store Vdata ID in external array */ /* -------------------------------- */ PTXPoint[pID].vdID[nlevels] = vdataID; /* For all fields in fieldlist ... */ /* ------------------------------- */ for (i = 0; i < nfields; i++) { /* Copy fieldname into utlbuf */ /* -------------------------- */ memcpy(utlbuf, pntr[i], slen[i]); utlbuf[slen[i]] = 0; /* Get field order (change order = 0 to order = 1) */ /* ----------------------------------------------- */ order = fieldorder[i]; if (order == 0) { order = 1; } /* Define the field within vdata */ /* ----------------------------- */ status = VSfdefine(vdataID, utlbuf, fieldtype[i], order); if(status != 0) { status = -1; HEpush(DFE_GENAPP, "PTdeflevel", __FILE__, __LINE__); HEreport("Cannot define %d th field. One probable cause can be exceeding of HDF's limits for MAX_ORDER and/or MAX_FIELD_SIZE \"%d\".\n",i+1,MAX_ORDER); break; } } if(status == 0) { /* Set all fields within vdata */ /* --------------------------- */ status = VSsetfields(vdataID, fieldlist); if(status != 0) { status = -1; HEpush(DFE_GENAPP, "PTdeflevel", __FILE__, __LINE__); HEreport("Cannot set fields. Probably exceeded HDF's limit MAX_FIELD_SIZE \"%d\" for the fields.\n",MAX_FIELD_SIZE); } } if(status == 0) { /* Get size in bytes of vdata record */ /* --------------------------------- */ size = VSsizeof(vdataID, fieldlist); if(size <= 0) { status = -1; HEpush(DFE_GENAPP, "PTdeflevel", __FILE__, __LINE__); HEreport("Size of Vdata is not greater than zero.\n"); } } if(status == 0) { /* Write out empty buffer to establish vdata */ /* ----------------------------------------- */ zerobuf = (char *) calloc(size, 1); if(zerobuf == NULL) { HEpush(DFE_NOSPACE,"PTdeflevel", __FILE__, __LINE__); return(-1); } VSwrite(vdataID, (VOIDP) zerobuf, 1, FULL_INTERLACE); free(zerobuf); /* Set name of vdata to levelname */ /* ------------------------------ */ VSsetname(vdataID, levelname); /* Insert within data Vgroup */ /* ------------------------- */ Vinsert(vgid, vdataID); /* Setup Back & Forward Pointer Vdatas */ /* ----------------------------------- */ /* If previous levels exist ... */ /* ---------------------------- */ if (nlevels > 0) { /* Get Vgroup ID of Linkage Vgroup */ /* ------------------------------- */ vgid = PTXPoint[pID].VIDTable[1]; /* Get new vdata ID for BCKPOINTER Vdata */ /* ------------------------------------- */ vdataID = VSattach(fid, -1, "w"); /* Define & set BCKPOINTER field within BCKPOINTER Vdata */ /* ----------------------------------------------------- */ VSfdefine(vdataID, "BCKPOINTER", DFNT_INT32, 1); VSsetfields(vdataID, "BCKPOINTER"); /* Get size in bytes of BCKPOINTER record */ /* -------------------------------------- */ size = VSsizeof(vdataID, "BCKPOINTER"); /* Write out empty buffer to establish vdata */ /* ----------------------------------------- */ zerobuf = (char *) calloc(size, 1); if(zerobuf == NULL) { HEpush(DFE_NOSPACE,"PTdeflevel", __FILE__, __LINE__); return(-1); } VSwrite(vdataID, (VOIDP) zerobuf, 1, FULL_INTERLACE); free(zerobuf); /* Set name of BCKPOINTER Vdata */ /* ---------------------------- */ sprintf(utlbuf, "%s%d%s%d", "BCKPOINTER:", nlevels, "->", nlevels - 1); VSsetname(vdataID, utlbuf); /* Insert BCKPOINTER Vdata in Linkage Vgroup */ /* ----------------------------------------- */ Vinsert(vgid, vdataID); /* Detach BCKPOINTER Vdata */ /* ----------------------- */ VSdetach(vdataID); /* Get new vdata ID for FWDPOINTER Vdata */ /* ------------------------------------- */ vdataID = VSattach(fid, -1, "w"); /* Define & set BEGIN & EXTENT field within FWDPOINTER Vdata */ /* ------------------------------------------------- */ VSfdefine(vdataID, "BEGIN", DFNT_INT32, 1); VSfdefine(vdataID, "EXTENT", DFNT_INT32, 1); VSsetfields(vdataID, "BEGIN,EXTENT"); /* Get size in bytes of FWDPOINTER record */ /* -------------------------------------- */ size = VSsizeof(vdataID, "BEGIN,EXTENT"); /* Write out buffer (with -1 fill value) to establish vdata */ /* ------------------------------------------------- */ zerobuf = (char *) calloc(size, 1); if(zerobuf == NULL) { HEpush(DFE_NOSPACE,"PTdeflevel", __FILE__, __LINE__); return(-1); } memcpy(zerobuf, &m1, 4); VSwrite(vdataID, (VOIDP) zerobuf, 1, FULL_INTERLACE); free(zerobuf); /* Set name of FWDPOINTER Vdata */ /* ---------------------------- */ sprintf(utlbuf, "%s%d%s%d", "FWDPOINTER:", nlevels - 1, "->", nlevels); VSsetname(vdataID, utlbuf); /* Insert FWDPOINTER Vdata in Linkage Vgroup */ /* ----------------------------------------- */ Vinsert(vgid, vdataID); /* Detach FWDPOINTER Vdata */ /* ----------------------- */ VSdetach(vdataID); } } } if (status == 0) { /* Insert Point Level metadata */ /* --------------------------- */ Vgetname(PTXPoint[pointID % idOffset].IDTable, pointname); status = EHinsertmeta(sdInterfaceID, pointname, "p", 10L, levelname, &dum); for (i = 0; i < nfields; i++) { /* Concatenate fieldname with level name */ /* ------------------------------------- */ memcpy(utlbuf, pntr[i], slen[i]); utlbuf[slen[i]] = 0; strcat(utlbuf, ":"); strcat(utlbuf, levelname); /* Get field order (change order = 0 to order = 1) */ /* ----------------------------------------------- */ order = fieldorder[i]; if (order == 0) { order = 1; } /* Load fieldtype and field order into metadata input array */ /* -------------------------------------------------------- */ metadata[0] = fieldtype[i]; metadata[1] = order; /* Insert point field metadata */ /* --------------------------- */ status = EHinsertmeta(sdInterfaceID, pointname, "p", 11L, utlbuf, metadata); } } } return (status);}/*----------------------------------------------------------------------------|| BEGIN_PROLOG || || FUNCTION: PTdeflinkage || || DESCRIPTION: Defines link field to use between two levels. || || || Return Value Type Units Description || ============ ====== ========= ===================================== || status intn return status (0) SUCCEED, (-1) FAIL || || INPUTS: || pointID int32 point structure ID || parent char parent level name || child char child level name || linkfield char linkage field name || || || OUTPUTS: || None || || NOTES: || || || Date Programmer Description || ====== ============ ================================================= || Jun 96 Joel Gales Original Programmer || Nov 96 Joel Gales Fix problem with spurious "Level Not Found" error || || END_PROLOG |-----------------------------------------------------------------------------*/intnPTdeflinkage(int32 pointID, char *parent, char *child, char *linkfield){ intn i; /* Loop index */ intn status = 0; /* routine return status variable */ int32 fid; /* HDF-EOS file id */ int32 sdInterfaceID; /* HDF SDS interface ID */ int32 idOffset = PTIDOFFSET; /* Point ID offset */ int32 ptVgrpID; /* Point Vgroup ID */ int32 nlevels; /* Number of levels in point */ int32 vdataID; /* Vdata ID */ int32 dum; /* Dummy variable */ int32 foundParent = -1; /* Found parent level flag */ int32 foundChild = -1; /* Found child level flag */ char pointname[80]; /* Point name */ char utlbuf[256];/* Utility buffer */ char *mess1 = "Linkage Field \"%s\" not found in Parent Level: \"%s\".\n"; char *mess2 = "Linkage Field \"%s\" not found in Child Level: \"%s\".\n"; /* Check for valid point ID */ /* ----
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -