From 10f37e0c82d75a55322247b69b4ac5fa8509abc1 Mon Sep 17 00:00:00 2001
From: Matthew Webster <mwebster@fmrib.ox.ac.uk>
Date: Fri, 9 Jan 2015 16:41:17 +0000
Subject: [PATCH] Current Version Jan 15

---
 fslcreatehd.cc | 151 +++++++++++++++++++------------------------------
 1 file changed, 57 insertions(+), 94 deletions(-)

diff --git a/fslcreatehd.cc b/fslcreatehd.cc
index 1faf1eb..947e991 100755
--- a/fslcreatehd.cc
+++ b/fslcreatehd.cc
@@ -23,75 +23,57 @@ void print_usage(const string& progname)
 
 int fslcreatehd_main(int argc, char *argv[])
 {
-  FSLIO* fslio;
-  void *buffer=NULL;
-  char *hdrxml, *filename;
-  int fileread=1, filetype=-1, existingimage=0;
-  size_t bufsize=0;
-  short x,y,z,v, dt=-1;
+  NiftiIO reader;
+  vector <NiftiExtension> extensions;
+  NiftiHeader header,originalHeader;
+  char *buffer(NULL);
+  string filename;
+  int fileread(1);
+  bool existingImage(false);
   
-  if (argc==3) {
-      /* use the XML form of header specification */
-      filename = argv[2];
-  } else {
-      filename = argv[13];
-  }
+  if (argc==3) /* use the XML form of header specification */
+    filename = string(argv[2]);
+  else 
+    filename = string(argv[13]);
 
   /* check if file already exists and if so, read the image contents */
-  /* also store the size of this buffer for later in case it is wrong */ 
   if (FslFileExists(filename)) {
-    /* buffer = FslReadAllVolumes(fslio,filename); */
-    existingimage = 1;
-    fslio = FslOpen(filename,"rb");
-    FslGetDim(fslio,&x,&y,&z,&v);
-    filetype = FslGetFileType(fslio);
-    bufsize = x * y * z * v * (FslGetDataType(fslio,&dt) / 8);
-    buffer = (void *) calloc(bufsize,1);
-    FslReadVolumes(fslio,buffer,v);
-    FslClose(fslio);
+    existingImage = true;
+    filename=return_validimagefilename(filename);
+    header=reader.loadImage(filename,buffer,extensions);
+    originalHeader=header;
   }
   
-  if (existingimage) {
-    fslio = FslXOpen(filename,"wb",filetype);
-  } else {
-    fslio = FslOpen(filename,"wb");
-    filetype = FslGetFileType(fslio);
-  }
 
   if (argc>3) {
     /* set uninteresting defaults */
-    if (existingimage) {
-      FslSetDataType(fslio,dt);
-    } else {
-      FslSetDataType(fslio,atoi(argv[12]));
-    }
-    FslSetDim(fslio,atoi(argv[1]),atoi(argv[2]),atoi(argv[3]),atoi(argv[4])); 
-    FslSetVoxDim(fslio,atof(argv[5]),atof(argv[6]),atof(argv[7]),atof(argv[8])); 
-    
-    {
-      short short_array[100];
-      short_array[0]=atoi(argv[9]);
-      short_array[1]=atoi(argv[10]);
-      short_array[2]=atoi(argv[11]);
-      if ( (short_array[0]!=0) || (short_array[1]!=0) || (short_array[2]!=0) )
-	{
-           FslSetAnalyzeSform(fslio,short_array,
-			 atof(argv[5]),atof(argv[6]),atof(argv[7]));
- 	}
+    if (!existingImage) 
+      header.datatype=atoi(argv[12]);
+    header.dim[0]=4;
+    for (int i=1;i<=4;i++)
+      header.dim[i]=atoi(argv[i]);
+    for (int i=1;i<=4;i++)
+      header.pixdim[i]=atoi(argv[i+4]);
+
+
+    if ( atoi(argv[9]) != 0 || atoi(argv[10]) != 0 || atoi(argv[11]) != 0 ) {
+      header.sX[3]=atoi(argv[9]);
+      header.sY[3]=atoi(argv[10]);
+      header.sZ[3]=atoi(argv[11]);
+      header.sX[0]=atoi(argv[5]);
+      header.sY[1]=atoi(argv[6]);
+      header.sZ[2]=atoi(argv[7]);
     }
-    
   } else {
       /* read XML form */
       char *newstr, *oldfname, *oldiname;
       ifstream inputfile;
+      vector<string> settings;
       
-  
       if (strcmp(argv[1],"-")==0) {fileread=0;}
       newstr = (char *)calloc(10000,1);
       oldfname = (char *)calloc(10000,1);
       oldiname = (char *)calloc(10000,1);
-      //hdrxml = (char *)calloc(65534,1);  /* too long, to be safe */
-      hdrxml = new char[65534];
       if (fileread) 
       {
 	inputfile.open (argv[1], ifstream::in | ifstream::binary);
@@ -112,60 +94,41 @@ int fslcreatehd_main(int argc, char *argv[])
           {
 	      if (fgets(newstr,9999,stdin)==NULL) break;
 	  }
-	  strcat(hdrxml,newstr);
-      }  while (strcmp(newstr + strlen(newstr) - 2,"/>")!=0);
+	  settings.push_back(string(newstr));
+      }  while (settings[settings.size()-1]!="/>");
 
-      strcpy(oldfname,fslio->niftiptr->fname);
-      strcpy(oldiname,fslio->niftiptr->iname);
-      int bytes_read=1; //dummy for function call
-      fslio->niftiptr = nifti_image_from_ascii(hdrxml, &bytes_read);
+      header=NiftiHeader(settings);
 
-      if (fslio->niftiptr == NULL) 
-      {
-	  cerr << "Incomplete or incorrect text: could not form header info" << endl;
-	  return EXIT_FAILURE;
-      }
-
-      fslio->niftiptr->fname = oldfname;
-      fslio->niftiptr->iname = oldiname;
+      if (fileread) 
+	inputfile.close();
+  }
 
-      //free(hdrxml);
-      delete [] hdrxml;
-      if (fileread) inputfile.close();
+  /* reset datatype in case it has been overwritten */
+  if (existingImage) {
+    header.datatype=originalHeader.datatype;
+    header.bitsPerVoxel=header.bpvOfDatatype();
   }
 
-  /* reset filetype and datatype in case it has been overwritten */
-  
-  FslSetFileType(fslio,filetype);
-  if (existingimage) {
-    /* dt is only set if an image was previously read */ 
-    FslSetDataType(fslio,dt);
+ /* if previously read buffer is wrong size then make a zero image here */
+  if ( header.nElements() != originalHeader.nElements() ) {
+    if(buffer!=NULL)
+      delete buffer;
+    buffer = new char[header.nElements()*(header.bpvOfDatatype()/8)];
+    fill(buffer,buffer+header.nElements(),0);
   }
 
-  fslio->niftiptr->byteorder = nifti_short_order();
-//   if (strcmp(argv[argc-1],"-r")==0) { 
-//       /* swap */
-//       if (nifit_short_order()==MSB_FIRST) fslio->niftiptr->byteorder = LSB_FIRST;
-//       else fslio->niftiptr->byteorder = MSB_FIRST;
-//   }
-  
-  /* write header */
-  
-  FslWriteHeader(fslio);
+    int filetype=FslGetEnvOutputType(); 
+    if(!existingImage) {
+      filename=make_basename(filename)+outputExtension(filetype);
+    }
 
-  /* if previously read buffer is wrong size then make a zero image here */
-  FslGetDim(fslio,&x,&y,&z,&v);
-  if ( bufsize != ( x * y * z * v * (FslGetDataType(fslio,&dt)/8)) ) {
-    if (bufsize>0) free(buffer);  /* only if previously read */
-      buffer = (void *) calloc(x * y * z * v,FslGetDataType(fslio,&dt)/8);
-  }
+    //header.report();
+    header.bitsPerVoxel=header.bpvOfDatatype();
+    header.setNiftiVersion(FslNiftiVersionFileType(filetype),FslIsSingleFileType(filetype));
+    reader.saveImage(filename,buffer,extensions,header, FslIsCompressedFileType(filetype));
 
-  /* write the data out - either from previous read or zeros */
-  FslWriteVolumes(fslio,buffer,fslio->niftiptr->dim[4]);
-  
-  FslClose(fslio);
   return 0;
-}
+  }
 
 
 int main(int argc,char *argv[])
-- 
GitLab