Пример #1
0
/** Verify that given file is a valid Interfile header file.
\return Returns 0 if not, and 1 if it is a valid header file. If image data
    filename is requested and found in header, then 2 is returned.
 */
int interfileIsHeader(
    /** Interfile header filename, with correct extension */
    const char *hdrfile,
    /** Pointer to allocated string where Interfile image data filename is
     *  written if found in header; enter NULL if not needed. */
    char *imgfile
) {
    char /*key[256], value[256],*/ temp[FILENAME_MAX];
    IFT ift;
    int li, ret;

    //printf("\ninterfileIsHeader(%s, *imgfile)\n", hdrfile);
    if(hdrfile==NULL || strlen(hdrfile)<1) return 0;
    if(imgfile!=NULL) strcpy(imgfile, "");
    iftInit(&ift);
    strcpy(temp, hdrfile);
    ret=iftRead(&ift, temp, 0);
    if(ret!=0 || ift.keyNr<2) {
        iftEmpty(&ift);
        return(0);
    }
    /* Check that file starts with !INTERFILE */
    //iftWriteItem(&ift, 0, stdout);
    if(ift.item[0].type!='!') {
        iftEmpty(&ift);
        return(0);
    }
    if(strcasecmp(ift.item[0].value, "INTERFILE")!=0) {
        iftEmpty(&ift);
        return(0);
    }
    /* If imgfile was not requested, then we are done */
    if(imgfile==NULL) {
        iftEmpty(&ift);
        return(1);
    }
    /* Find filename for image data */
    //iftWriteItem(&ift, 1, stdout);
    li=iftGetFrom(&ift, 1, "name of data file");
    if(li<0 || strlen(ift.item[li].value)<1) {
        iftEmpty(&ift);
        return(1);
    }
    strcpy(imgfile, ift.item[li].value);
    iftEmpty(&ift);
    return(2);
}
Пример #2
0
/** Read Volume Range Definition File.
\return Returns 0 if successful.
 */
int vrdRead(
  /** Volume Range Definition File filename, which contains image volume corners
   *  (x y z) in IFT format: corner1 = x y z corner2 = x y z */
  char *vrdfile,
  /** Image volume range */
  VOL_RANGE *vol_range,
  /** Pointer to a string (allocated for at least 64 chars) where error message
      or other execution status will be written; enter NULL, if not needed */     
  char *status
) {
  int ret, ii, x, y, z;
  IFT ift;
  char key[256];

  /* Check that input is ok */
  if(vrdfile==NULL || strlen(vrdfile)<1 || vol_range==NULL) {
    if(status!=NULL) strcpy(status, "program error");
    return 1;
  }
  /* Read VDF as IFT file */
  iftInit(&ift); ret=iftRead(&ift, vrdfile, 1); if(ret) {
    if(status!=NULL) strcpy(status, ift.status);
    iftEmpty(&ift); return 2;
  }
  /* Try to find keys 'corner1' and 'corner2' */
  strcpy(key, "corner1"); ii=iftGet(&ift, key);
  if(ii>=0) {
    ret=string_to_xyz(ift.item[ii].value, &x, &y, &z);
    if(ret==0) {
      vol_range->x1=x; vol_range->y1=y; vol_range->z1=z;
      strcpy(key, "corner2"); ii=iftGet(&ift, key);
      if(ii>=0) {
        ret=string_to_xyz(ift.item[ii].value, &x, &y, &z);
        vol_range->x2=x; vol_range->y2=y; vol_range->z2=z;
        if(ret==0) {
          vrdReorder(vol_range);
          if(status!=NULL) strcpy(status, "ok");
          iftEmpty(&ift); return 0;
        }
      }
    }
  }
  /* We are here only if keys were not found */
  /* Lets not care about keys at all */
  for(ii=0, ret=0; ii<ift.keyNr; ii++) {
    if(ret==0 && string_to_xyz(ift.item[ii].value, &x, &y, &z)==0)
    {
      vol_range->x1=x; vol_range->y1=y; vol_range->z1=z;
      ret++; continue;
    }
    if(ret==1 && string_to_xyz(ift.item[ii].value, &x, &y, &z)==0)
    {
      vol_range->x2=x; vol_range->y2=y; vol_range->z2=z;
      ret++; break;
    }
  }
  if(ret<2) {
    if(status!=NULL) strcpy(status, "volume definitions not found");
    iftEmpty(&ift); return 2;
  }

  vrdReorder(vol_range);
  if(status!=NULL) strcpy(status, "ok");
  iftEmpty(&ift);
  return 0;
}