nifti_tool.c
来自「DTMK软件开发包,此为开源软件,是一款很好的医学图像开发资源.」· C语言 代码 · 共 1,625 行 · 第 1/5 页
C
1,625 行
ac++;
CHECK_NEXT_OPT(ac, argc, "-debug");
opts->debug = atoi(argv[ac]);
}
else if( ! strncmp(argv[ac], "-diff_hdr", 8) )
opts->diff_hdr = 1;
else if( ! strncmp(argv[ac], "-diff_nim", 8) )
opts->diff_nim = 1;
else if( ! strncmp(argv[ac], "-disp_exts", 7) )
opts->disp_exts = 1;
else if( ! strncmp(argv[ac], "-disp_hdr", 8) )
opts->disp_hdr = 1;
else if( ! strncmp(argv[ac], "-disp_nim", 8) )
opts->disp_nim = 1;
else if( ! strncmp(argv[ac], "-dci_lines", 6) || /* before -dts */
! strncmp(argv[ac], "-dts_lines", 6) )
{
opts->dci_lines = 1;
}
else if( ! strncmp(argv[ac], "-disp_collapsed_image", 10) ||
! strncmp(argv[ac], "-disp_ci", 8) )
{
/* we need to read in the 7 dimension values */
int index;
opts->ci_dims[0] = 0;
for( index = 1; index < 8; index++ )
{
ac++;
CHECK_NEXT_OPT_MSG(ac,argc,"-disp_ci",
"7 dimension values are requred");
if( ! isdigit(argv[ac][0]) && strcmp(argv[ac],"-1") ){
fprintf(stderr,"** -disp_ci param %d (= '%s') is not a valid\n"
" consider: 'nifti_tool -help'\n",index,argv[ac]);
return -1;
}
opts->ci_dims[index] = atoi(argv[ac]);
}
opts->dci = 1;
}
else if( ! strncmp(argv[ac], "-disp_ts", 10) ||
! strncmp(argv[ac], "-dts", 4) )
{
/* we need to read in the ijk indices into the ci_dims array */
int index;
for( index = 1; index <= 3; index++ )
{
ac++;
CHECK_NEXT_OPT_MSG(ac,argc,"-dts","i,j,k indices are requied\n");
if( ! isdigit(argv[ac][0]) ){
fprintf(stderr,"** -dts param %d (= '%s') is not a number\n"
" consider: 'nifti_tool -help'\n",index,argv[ac]);
return -1;
}
opts->ci_dims[index] = atoi(argv[ac]);
}
/* and fill the rest of the array */
opts->ci_dims[0] = 0;
for( index = 4; index < 8; index++ ) opts->ci_dims[index] = -1;
opts->dts = 1;
}
else if( ! strncmp(argv[ac], "-field", 2) )
{
ac++;
CHECK_NEXT_OPT(ac, argc, "-field");
if( add_string(&opts->flist, argv[ac]) ) return -1; /* add field */
}
else if( ! strncmp(argv[ac], "-infiles", 3) )
{
int count;
/* for -infiles, get all next arguments until a '-' or done */
ac++;
for( count = 0; (ac < argc) && (argv[ac][0] != '-'); ac++, count++ )
if( add_string(&opts->infiles, argv[ac]) ) return -1;/* add field */
if( count > 0 && ac < argc ) ac--; /* more options to process */
if( g_debug > 2 ) fprintf(stderr,"+d have %d file names\n", count);
}
else if( ! strncmp(argv[ac], "-make_image", 8) )
{
opts->make_im = 1; /* will setup later, as -cbl and MAKE_IM */
}
else if( ! strncmp(argv[ac], "-mod_field", 6) )
{
ac++;
CHECK_NEXT_OPT(ac, argc, "-mod_field");
if( add_string(&opts->flist, argv[ac]) ) return -1; /* add field */
ac++;
CHECK_NEXT_OPT(ac, argc, "-mod_field (2)");
if( add_string(&opts->vlist, argv[ac]) ) return -1; /* add value */
}
else if( ! strncmp(argv[ac], "-mod_hdr", 7) )
opts->mod_hdr = 1;
else if( ! strncmp(argv[ac], "-mod_nim", 7) )
opts->mod_nim = 1;
else if( ! strncmp(argv[ac], "-keep_hist", 5) )
opts->keep_hist = 1;
else if( ! strncmp(argv[ac], "-new_dim", 8) )
{
/* we need to read in the 8 dimension values */
int index;
for( index = 0; index < 8; index++ )
{
ac++;
CHECK_NEXT_OPT_MSG(ac,argc,"-new_dim","8 dim values are requred");
if( ! isdigit(argv[ac][0]) && strcmp(argv[ac],"-1") ){
fprintf(stderr,"** -new_dim param %d (= '%s') is not a valid\n"
" consider: 'nifti_tool -help'\n",index,argv[ac]);
return -1;
}
opts->new_dim[index] = atoi(argv[ac]);
}
}
else if( ! strncmp(argv[ac], "-new_datatype", 10) )
{
ac++;
CHECK_NEXT_OPT(ac, argc, "-new_datatype");
opts->new_datatype = atoi(argv[ac]);
}
else if( ! strncmp(argv[ac], "-overwrite", 6) )
opts->overwrite = 1;
else if( ! strncmp(argv[ac], "-prefix", 4) )
{
ac++;
CHECK_NEXT_OPT(ac, argc, "-prefix");
opts->prefix = argv[ac];
}
else if( ! strncmp(argv[ac], "-quiet", 3) )
opts->debug = 0;
else if( ! strncmp(argv[ac], "-rm_ext", 7) )
{
ac++;
CHECK_NEXT_OPT(ac, argc, "-rm_ext");
if( strcmp(argv[ac],"ALL") == 0 ) /* special case, pass -1 */
{
if( add_string(&opts->elist, "-1") ) return -1;
}
else
{
int index = atoi(argv[ac]);
if( (index != -1) && ((index > 1000) || !isdigit(*argv[ac])) ){
fprintf(stderr,
"** '-rm_ext' requires an extension index (read '%s')\n",
argv[ac]);
return -1;
}
if( add_string(&opts->elist, argv[ac]) ) return -1;
}
opts->rm_exts = 1;
}
else if( ! strncmp(argv[ac], "-strip_extras", 6) )
opts->strip = 1;
else
{
fprintf(stderr,"** unknown option: '%s'\n", argv[ac]);
return -1;
}
}
if( opts->make_im )
{
if( opts->infiles.len > 0 )
{
fprintf(stderr,"** -infiles is invalid when using -make_im\n");
return -1;
}
/* apply -make_im via -cbl and "MAKE_IM" */
opts->cbl = 1;
if( add_string(&opts->infiles, NT_MAKE_IM_NAME) ) return -1;
}
/* verify for programming purposes */
if( opts->add_exts && ( opts->elist.len != opts->etypes.len ) )
{
fprintf(stderr,"** ext list length (%d) != etype length (%d)\n",
opts->elist.len, opts->etypes.len);
return -1;
}
g_debug = opts->debug;
nifti_set_debug_level(g_debug);
fill_cmd_string(opts, argc, argv); /* copy this command */
if( g_debug > 2 ) disp_nt_opts("options read: ", opts);
return 0;
}
/*----------------------------------------------------------------------
* verify that the options make sense
*----------------------------------------------------------------------*/
int verify_opts( nt_opts * opts, char * prog )
{
int ac, errs = 0; /* number of requested action types */
/* check that only one of disp, diff, mod or add_*_ext is used */
ac = (opts->check_hdr || opts->check_nim ) ? 1 : 0;
ac += (opts->diff_hdr || opts->diff_nim ) ? 1 : 0;
ac += (opts->disp_hdr || opts->disp_nim || opts->disp_exts) ? 1 : 0;
ac += (opts->mod_hdr || opts->mod_nim ) ? 1 : 0;
ac += (opts->add_exts || opts->rm_exts ) ? 1 : 0;
ac += (opts->strip ) ? 1 : 0;
ac += (opts->cbl ) ? 1 : 0;
ac += (opts->cci ) ? 1 : 0;
ac += (opts->dts || opts->dci ) ? 1 : 0;
if( ac < 1 )
{
fprintf(stderr,
"** no action option, so nothing to do...\n"
" (try one of '-add...', '-diff...', '-disp...' or '-mod...')\n"
" (see '%s -help' for details)\n", prog);
return 1;
}
else if( ac > 1 )
{
fprintf(stderr,
"** only one action option is allowed, please use only one of:\n"
" '-add_...', '-check_...', '-diff_...', '-disp_...',\n"
" '-mod_...', '-strip', '-dts', '-cbl' or '-cci'\n"
" (see '%s -help' for details)\n", prog);
return 1;
}
/* can modify nifti_1_header or nifti_image, but not both */
if( opts->mod_hdr && opts->mod_nim )
{
fprintf(stderr,"** cannot use both '-mod_hdr' and '-mod_nim'\n");
return 1;
}
/* can add or remove extensions, but not both */
if( opts->add_exts && opts->rm_exts )
{
fprintf(stderr,"** cannot use both '-add_*_ext' and '-rm_ext'\n");
return 1;
}
if( (opts->add_exts || opts->rm_exts) && opts->elist.len <= 0 )
{
fprintf(stderr,"** missing extensions to add or remove\n");
return 1;
}
/* if modify, then we need fields and corresponding values */
if( opts->mod_hdr || opts->mod_nim )
{
if( opts->flist.len <= 0 )
{
fprintf(stderr,"** missing field to modify (need '-mod_field' opt)\n");
return 1;
}
if( opts->flist.len != opts->vlist.len )
{
fprintf(stderr,"** error: modifying %d fields with %d values\n",
opts->flist.len, opts->vlist.len);
return 1;
}
}
/* verify the number of files given for each of 4 action types */
/* -diff_... : require nfiles == 2 */
if( opts->diff_hdr || opts->diff_nim )
{
if( opts->infiles.len != 2 )
{
fprintf(stderr,"** '-diff_XXX' options require exactly 2 inputs files\n");
return 1;
}
}
/* if we are making changes, but not overwriting... */
else if( (opts->elist.len > 0 || opts->mod_hdr || opts->mod_nim) &&
!opts->overwrite )
{
if( opts->infiles.len > 1 )
{
fprintf(stderr,"** without -overwrite, only one input file may be"
" modified at a time\n");
errs++;
}
if( ! opts->prefix )
{
fprintf(stderr,"** missing -prefix for output file\n");
errs++;
}
}
if( opts->dci_lines && ! opts->dts && ! opts->dci )
{
fprintf(stderr,"** option '-dci_lines' must only be used with '-dts'\n");
errs++;
}
if( opts->infiles.len <= 0 ) /* in any case */
{
fprintf(stderr,"** missing input files (see -infiles option)\n");
errs++;
}
if ( opts->overwrite && opts->prefix )
{
fprintf(stderr, "** please specify only one of -prefix and -overwrite\n");
errs++;
}
if( errs ) return 1;
if( g_debug > 1 ) fprintf(stderr,"+d options seem valid\n");
return 0;
}
/*----------------------------------------------------------------------
* re-assemble the command string into opts->command
*----------------------------------------------------------------------*/
int fill_cmd_string( nt_opts * opts, int argc, char * argv[])
{
char * cp;
int len, remain = NT_CMD_LEN; /* NT_CMD_LEN is max command len */
int c, ac;
int has_space; /* arguments containing space must be quoted */
int skip = 0; /* counter to skip some of the arguments */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?