#include "mrilib.h"

int main( int argc , char * argv[] )
{
   THD_3dim_dataset *dset ;
   int iarg=1 ;
   char *prefix = "flip" ;
   void *row ;
   int nx,ny,nz , ii,jj,kk , dcode , ival ;

   if( argc < 2 || strcmp(argv[1],"-help") == 0 ){
      printf("Usage: 3dLRflip [-prefix ppp] dataset\n"
             "Flips the Left-to-Right rows of a dataset.\n"
             "This is useful only in the case where you have\n"
             "constructed a dataset with the L-R direction\n"
             "incorrectly labeled.\n"
            ) ;
      exit(0) ;
   }

   mainENTRY("3dLRflip main"); machdep(); AFNI_logger("3dLRflip",argc,argv);

   while( argv[iarg][0] == '-' ){

     if( strcmp(argv[iarg],"-prefix") == 0 ){
       prefix = argv[++iarg] ;
       if( !THD_filename_ok(prefix) ){
         fprintf(stderr,"** Illegal prefix: %s\n",prefix); exit(1);
       }
       iarg++ ; continue ;
     }
   }

   /*-- read data --*/

   dset = THD_open_dataset(argv[iarg]) ;
   CHECK_OPEN_ERROR(dset,argv[iarg]) ;
   DSET_mallocize(dset) ; DSET_load(dset) ; CHECK_LOAD_ERROR(dset) ;

   nx=DSET_NX(dset); ny=DSET_NY(dset); nz=DSET_NZ(dset);

   if( dset->daxes->xxorient == ORI_R2L_TYPE ||
       dset->daxes->xxorient == ORI_L2R_TYPE   ) dcode = 1 ;
   else
   if( dset->daxes->yyorient == ORI_R2L_TYPE ||
       dset->daxes->yyorient == ORI_L2R_TYPE   ) dcode = 2 ;
   else
   if( dset->daxes->zzorient == ORI_R2L_TYPE ||
       dset->daxes->zzorient == ORI_L2R_TYPE   ) dcode = 3 ;
   else
   { fprintf(stderr,"** Dataset has no L-R axis!\n"); exit(1); }

   /* modify dataset name */

   dset->dblk->diskptr->storage_mode = STORAGE_BY_BRICK ; /* 14 Jan 2004 */
   dset->idcode = MCW_new_idcode() ;  /* 24 Aug 2003 - ooops */
   EDIT_dset_items( dset , ADN_prefix , prefix , ADN_none ) ;
   tross_Make_History( "3dLRflip", argc,argv, dset ) ;

   /* loop over bricks */

   for( ival=0 ; ival < DSET_NVALS(dset) ; ival++ ){

     switch( dcode ){

       case 1:   /* flip x-axis rows */
         for( kk=0 ; kk < nz ; kk++ )
          for( jj=0 ; jj < ny ; jj++ ){
            row = THD_get_dset_row( dset , ival , -dcode , 0,jj,kk ) ;
                  THD_put_dset_row( dset , ival ,  dcode , 0,jj,kk , row ) ;
            free(row) ;
          }
       break ;

       case 2:   /* flip y-axis rows */
         for( kk=0 ; kk < nz ; kk++ )
          for( ii=0 ; ii < nx ; ii++ ){
            row = THD_get_dset_row( dset , ival , -dcode , ii,0,kk ) ;
                  THD_put_dset_row( dset , ival ,  dcode , ii,0,kk , row ) ;
            free(row) ;
          }
       break ;

       case 3:   /* flip z-axis rows */
         for( jj=0 ; jj < ny ; jj++ )
          for( ii=0 ; ii < nx ; ii++ ){
            row = THD_get_dset_row( dset , ival , -dcode , ii,jj,0 ) ;
                  THD_put_dset_row( dset , ival ,  dcode , ii,jj,0 , row ) ;
            free(row) ;
          }
       break ;

     }
   }

   /* done */

   DSET_write(dset) ; exit(0) ;
}


syntax highlighted by Code2HTML, v. 0.9.1