From c95a927599e20c3d7762073450e3126d9694107d Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Tue, 16 May 2000 04:33:59 +0000 Subject: [PATCH] r56: Improved option processing --- src/Makefile.am | 2 + src/ctrec.c | 91 +++++++++++++++---------- src/phm2rs.c | 151 +++++++++++++++++++++++------------------ src/phm2sdf.c | 103 ++++++++++++++++------------ src/rs2sdf.c | 38 +++++++---- src/sample-ctrec.sh.in | 20 ++++-- src/sdf-1.c | 33 ++++++--- src/sdf-2.c | 34 +++++++--- src/sdf2img.c | 69 +++++++++++-------- src/sdfinfo.c | 33 ++++++--- 10 files changed, 352 insertions(+), 222 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 070099d..0f6975c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -42,6 +42,8 @@ phm2rs-lam: phm2rs.c endif +shared: ctrec.c phm2rs.c phm2sdf.c sdf2img.c rs2sdf.c sdf-1.c sdf-2.c sdfinfo.c + $(CC) @DEFS@ $(CFLAGS) $(INCLUDES) -DNO_MAIN -shared phm2rs.c phm2sdf.c sdf2img.c rs2sdf.c sdf-1.c sdf-2.c sdfinfo.c @ctlibs@ $(LDFLAGS) -o ir.so diff --git a/src/ctrec.c b/src/ctrec.c index 1843d31..a643d16 100644 --- a/src/ctrec.c +++ b/src/ctrec.c @@ -2,8 +2,11 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: ctrec.c,v 1.10 2000/05/11 01:06:30 kevin Exp $ +** $Id: ctrec.c,v 1.11 2000/05/16 04:33:59 kevin Exp $ ** $Log: ctrec.c,v $ +** Revision 1.11 2000/05/16 04:33:59 kevin +** Improved option processing +** ** Revision 1.10 2000/05/11 01:06:30 kevin ** Changed sprintf to snprintf ** @@ -79,7 +82,7 @@ static struct option my_options[] = }; void -usage (const char *program) +ctrec_usage (const char *program) { fprintf(stdout,"usage: %s raysum-file image-file nx-image ny-image [OPTIONS]\n", kbasename(program)); fprintf(stdout,"Image reconstruction from raysum projections\n"); @@ -121,17 +124,17 @@ usage (const char *program) fprintf(stdout," --debug Turn on debug mode\n"); fprintf(stdout," --version Print version\n"); fprintf(stdout," --help Print this help message\n"); - exit(1); } #ifdef MPI_CT static void mpi_scatter_rs (RAYSUM *rs_global, RAYSUM *rs_local, const int debug); #endif + static void print_raysum_info(const RAYSUM *rs); int -main (const int argc, char *const argv[]) +ctrec_main (const int argc, char *const argv[]) { IMAGE *im_global = NULL; RAYSUM *rs_global = NULL; @@ -190,19 +193,27 @@ main (const int argc, char *const argv[]) switch (c) { case O_INTERP: - opt_interp = opt_set_interpolation(optarg, argv[0]); + if ((opt_interp = opt_set_interpolation(optarg)) < 0) { + ctrec_usage(argv[0]); + return (1); + } break; case O_FILTER: - opt_filter = opt_set_filter(optarg, argv[0]); + if ((opt_filter = opt_set_filter(optarg)) < 0) { + ctrec_usage(argv[0]); + return (1); + } break; case O_BACKPROJ: - opt_backproj = opt_set_backproj(optarg, argv[0]); + if ((opt_backproj = opt_set_backproj(optarg)) < 0) { + ctrec_usage(argv[0]); + return (1); + } break; case O_FILTER_PARAM: opt_filter_param = strtod(optarg, &endptr); if (endptr != optarg + strlen(optarg)) { - usage(argv[0]); - exit(1); + ctrec_usage(argv[0]); } break; case O_VERBOSE: @@ -212,7 +223,10 @@ main (const int argc, char *const argv[]) opt_debug = 1; break; case O_TRACE: - opt_trace = opt_set_trace(optarg, argv[0]); + if ((opt_trace = opt_set_trace(optarg)) < 0) { + ctrec_usage(argv[0]); + return (1); + } break; case O_VERSION: #ifdef VERSION @@ -223,17 +237,17 @@ main (const int argc, char *const argv[]) exit(0); case O_HELP: case '?': - usage(argv[0]); - exit(0); + ctrec_usage(argv[0]); + return (0); default: - usage(argv[0]); - exit(1); + ctrec_usage(argv[0]); + return (1); } } if (optind + 4 != argc) { - usage(argv[0]); - exit(1); + ctrec_usage(argv[0]); + return (1); } rs_name = argv[optind]; @@ -350,10 +364,6 @@ main (const int argc, char *const argv[]) #endif #ifdef MPI_CT - if (mpi_ct.my_rank == 0) { - raysum_close (rs_global); - } - if (opt_verbose) mpi_t1 = MPI_Wtime(); @@ -372,24 +382,26 @@ main (const int argc, char *const argv[]) if (mpi_ct.my_rank == 0) printf("Time to reduce image = %f secs, max time = %f\n", mpi_t, mpi_t_g); } - if (mpi_ct.my_rank == 0) { - strncpy (im_global->remark, remark, sizeof(im_global->remark)); - time_end = MPI_Wtime(); - im_global->calctime = time_end - time_start; - image_save (im_global); - if (opt_verbose) - fprintf (stdout, "Time active = %.2f\n", im_global->calctime); - } -#else - raysum_close (rs_global); - strncpy (im_global->remark, remark, sizeof(im_global->remark)); + + if (mpi_ct.my_rank == 0) + time_end = MPI_Wtime(); +#else time_end = td_current_sec(); - im_global->calctime = time_end - time_start; - image_save (im_global); - if (opt_verbose) - fprintf (stdout, "Time active = %.2f secs\n", im_global->calctime); #endif + +#ifdef MPI_CT + if (mpi_ct.my_rank == 0) +#endif + { + raysum_close (rs_global); + strncpy (im_global->remark, remark, sizeof(im_global->remark)); + im_global->calctime = time_end - time_start; + image_save (im_global); + if (opt_verbose) + fprintf (stdout, "Time active = %.2f\n", im_global->calctime); + } + #ifdef MPI_CT MPI_Finalize(); #endif @@ -448,3 +460,12 @@ static void print_raysum_info(const RAYSUM *rs) printf (" rot_start: %f\n", rs->rot_start); printf (" rot_inc: %f\n", rs->rot_inc); } + +#ifndef NO_MAIN +int +main (const int argc, char *const argv[]) +{ + return (ctrec_main(argc, argv)); +} +#endif + diff --git a/src/phm2rs.c b/src/phm2rs.c index cf47837..b92c914 100644 --- a/src/phm2rs.c +++ b/src/phm2rs.c @@ -2,10 +2,17 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: phm2rs.c,v 1.10 2000/05/11 14:07:55 kevin Exp $ +** PURPOSE +** Generate raysum projections from phantom object +** +** HISTORY +** 1984 -- Final DOS version +** 1999 -- First UNIX version +** +** $Id: phm2rs.c,v 1.11 2000/05/16 04:33:59 kevin Exp $ ** $Log: phm2rs.c,v $ -** Revision 1.10 2000/05/11 14:07:55 kevin -** *** empty log message *** +** Revision 1.11 2000/05/16 04:33:59 kevin +** Improved option processing ** ** Revision 1.9 2000/05/08 20:02:32 kevin ** ANSI C changes @@ -50,19 +57,14 @@ ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ******************************************************************************/ -/* FILE - * phm2rs.c Generate raysum projections from phantom object - * - * HISTORY - * 1984 -- Final DOS version - * 1999 -- First UNIX version - */ + #include "ct.h" -enum { O_PHANTOM, O_DESC, O_NRAY, O_ROTANGLE, O_TRACE, O_VERBOSE, O_HELP, O_PHMFILE, O_DEBUG, O_VERSION }; +enum { O_PHANTOM, O_DESC, O_NRAY, O_ROTANGLE, O_PHMFILE, + O_TRACE, O_VERBOSE, O_HELP, O_DEBUG, O_VERSION }; -static struct option my_options[] = +static struct option phm2rs_options[] = { {"phantom", 1, 0, O_PHANTOM}, {"phmfile", 1, 0, O_PHMFILE}, @@ -77,8 +79,9 @@ static struct option my_options[] = {0, 0, 0, 0} }; + void -usage (const char *program) +phm2rs_usage (const char *program) { #ifdef MPI_CT if (mpi_ct.my_rank == 0) @@ -115,14 +118,14 @@ if (mpi_ct.my_rank == 0) } MPI_Abort(mpi_ct.comm, 1); #endif - exit(1); } - +#ifdef MPI_CT void mpi_gather_rs (RAYSUM *rs_global, RAYSUM *rs_local, const int opt_debug); +#endif int -main (const int argc, char *const argv[]) +phm2rs_main (const int argc, char *const argv[]) { DETECTOR *det; PHANTOM *phm = NULL; @@ -137,7 +140,10 @@ main (const int argc, char *const argv[]) int opt_debug = 0; double opt_rotangle = 1; double time_start = 0, time_end = 0; -#ifdef MPI_CT + +#ifndef MPI_CT + time_start = td_current_sec(); +#else RAYSUM *rs_local; int mpi_argc = argc; char **mpi_argv = (char **) argv; @@ -149,13 +155,10 @@ main (const int argc, char *const argv[]) MPI_Comm_rank(mpi_ct.comm, &mpi_ct.my_rank); if (mpi_ct.nproc > MPI_MAX_PROCESS) { - sys_error(ERR_FATAL, "Number of mpi processes (%d) exceeds max processes (%d)", - mpi_ct.nproc, MPI_MAX_PROCESS); + sys_error(ERR_FATAL, "Number of mpi processes (%d) exceeds max processes (%d)", mpi_ct.nproc, MPI_MAX_PROCESS); exit(1); } time_start = MPI_Wtime(); -#else - time_start = td_current_sec(); #endif #ifdef MPI_CT @@ -164,7 +167,7 @@ main (const int argc, char *const argv[]) strcpy(opt_desc, ""); strcpy(opt_phmfilename, ""); while (1) { - int c = getopt_long(argc, argv, "", my_options, NULL); + int c = getopt_long(argc, argv, "", phm2rs_options, NULL); char *endptr = NULL; char *endstr; @@ -173,14 +176,17 @@ main (const int argc, char *const argv[]) switch (c) { case O_PHANTOM: - opt_phmnum = opt_set_phantom (optarg, argv[0]); + if ((opt_phmnum = opt_set_phantom (optarg)) < 0) { + phm2rs_usage(argv[0]); + return (1); + } phm = phm_create (opt_phmnum); break; case O_PHMFILE: #ifdef MPI_CT if (mpi_ct.my_rank == 0) fprintf(stderr, "Can not read phantom from file in MPI mode\n"); - exit(1); + return (1); #endif strncpy(opt_phmfilename, optarg, sizeof(opt_phmfilename)); phm = phm_create_from_file(opt_phmfilename); @@ -193,7 +199,10 @@ main (const int argc, char *const argv[]) break; break; case O_TRACE: - opt_trace = opt_set_trace(optarg, argv[0]); + if ((opt_trace = opt_set_trace(optarg)) < 0) { + phm2rs_usage(argv[0]); + return (1); + } break; case O_DESC: strncpy(opt_desc, optarg, sizeof(opt_desc)); @@ -203,8 +212,8 @@ main (const int argc, char *const argv[]) endstr = optarg + strlen(optarg); if (endptr != endstr) { fprintf(stderr,"Error setting --rotangle to %s\n", optarg); - usage(argv[0]); - exit(1); + phm2rs_usage(argv[0]); + return (1); } break; case O_NRAY: @@ -212,8 +221,8 @@ main (const int argc, char *const argv[]) endstr = optarg + strlen(optarg); if (endptr != endstr) { fprintf(stderr,"Error setting --nray to %s\n", optarg); - usage(argv[0]); - exit(1); + phm2rs_usage(argv[0]); + return (1); } break; case O_VERSION: @@ -225,37 +234,38 @@ main (const int argc, char *const argv[]) exit(0); case O_HELP: case '?': - usage(argv[0]); - exit(0); + phm2rs_usage(argv[0]); + return (0); default: - usage(argv[0]); - exit(1); + phm2rs_usage(argv[0]); + return (1); } } if (phm == NULL) { fprintf(stderr, "No phantom defined\n"); - usage(argv[0]); - exit(1); + phm2rs_usage(argv[0]); + return (1); } if (optind + 3 != argc) { - usage(argv[0]); - exit(1); + phm2rs_usage(argv[0]); + return (1); } + opt_outfile = argv[optind]; opt_ndet = strtol(argv[optind+1], &endptr, 10); endstr = argv[optind+1] + strlen(argv[optind+1]); if (endptr != endstr) { fprintf(stderr,"Error setting --ndet to %s\n", argv[optind+1]); - usage(argv[0]); - exit(1); + phm2rs_usage(argv[0]); + return (1); } opt_nview = strtol(argv[optind+2], &endptr, 10); endstr = argv[optind+2] + strlen(argv[optind+2]); if (endptr != endstr) { fprintf(stderr,"Error setting --nview to %s\n", argv[optind+2]); - usage(argv[0]); - exit(1); + phm2rs_usage(argv[0]); + return (1); } snprintf(str, sizeof(str), @@ -333,42 +343,43 @@ main (const int argc, char *const argv[]) raysum_collect (rs_global, det, phm, 0, opt_trace, FALSE); #endif -#ifdef MPI_CT - time_end = MPI_Wtime(); - if (mpi_ct.my_rank == 0) { - rs_global->calctime = time_end - time_start; - strncpy (rs_global->remark, opt_desc, sizeof(rs_global->remark)); - if (opt_verbose) { - fprintf(stdout, "Remark: %s\n", rs_global->remark); - fprintf(stdout, "Time active = %.2f secs\n", rs_global->calctime); - } - } -#else +#ifndef MPI_CT time_end = td_current_sec(); - rs_global->calctime = time_end - time_start; - strncpy (rs_global->remark, opt_desc, sizeof(rs_global->remark)); - if (opt_verbose) { - fprintf(stdout, "Remark: %s\n", rs_global->remark); - fprintf(stdout, "Time active = %.2f secs\n", rs_global->calctime); - } +#else + time_end = MPI_Wtime(); + if (mpi_ct.my_rank == 0) #endif + { + rs_global->calctime = time_end - time_start; + strncpy (rs_global->remark, opt_desc, sizeof(rs_global->remark)); + if (opt_verbose) { + fprintf(stdout, "Remark: %s\n", rs_global->remark); + fprintf(stdout, "Time active = %.2f secs\n", rs_global->calctime); + } + } #ifdef MPI_CT - if (mpi_ct.my_rank == 0) { - raysum_write (rs_global); - raysum_close (rs_global); - } -#else - raysum_write (rs_global); - raysum_close (rs_global); + if (mpi_ct.my_rank == 0) #endif + { + raysum_write (rs_global); + raysum_close (rs_global); + } + phm_free (phm); detector_free (det); return (0); } +/* FUNCTION + * mpi_gather_rs + * + * SYNOPSIS + * Gather's raysums from all processes in rs_local in rs_global in process 0 + */ + #ifdef MPI_CT void mpi_gather_rs (RAYSUM *rs_global, RAYSUM *rs_local, const int opt_debug) { @@ -404,3 +415,13 @@ void mpi_gather_rs (RAYSUM *rs_global, RAYSUM *rs_local, const int opt_debug) } #endif + + +#ifndef NO_MAIN +int +main (const int argc, char *const argv[]) +{ + return (phm2rs_main(argc, argv)); +} +#endif + diff --git a/src/phm2sdf.c b/src/phm2sdf.c index f87e5ac..4f06389 100644 --- a/src/phm2sdf.c +++ b/src/phm2sdf.c @@ -2,8 +2,11 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: phm2sdf.c,v 1.8 2000/05/11 01:06:30 kevin Exp $ +** $Id: phm2sdf.c,v 1.9 2000/05/16 04:33:59 kevin Exp $ ** $Log: phm2sdf.c,v $ +** Revision 1.9 2000/05/16 04:33:59 kevin +** Improved option processing +** ** Revision 1.8 2000/05/11 01:06:30 kevin ** Changed sprintf to snprintf ** @@ -44,6 +47,7 @@ ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ******************************************************************************/ + /* FILE * phm2sdf.c Generate a SDF image from a phantom * @@ -76,9 +80,9 @@ static struct option my_options[] = }; void -usage (const char *program) +phm2sdf_usage (const char *program) { - fprintf(stdout,"usage: %s outfile nx ny [--phantom phantom-name] [--phmfile filename] [--filter filter-name] [OPTIONS]\n",kbasename(program)); + fprintf(stdout,"phm2sdf_usage: %s outfile nx ny [--phantom phantom-name] [--phmfile filename] [--filter filter-name] [OPTIONS]\n",kbasename(program)); fprintf(stdout,"Generate phantom image from a predefined --phantom or a --phmfile\n"); fprintf(stdout,"\n"); fprintf(stdout," outfile Name of output file for image\n"); @@ -119,7 +123,6 @@ usage (const char *program) fprintf(stdout," --verbose Verbose mode\n"); fprintf(stdout," --version Print version\n"); fprintf(stdout," --help Print this help message\n"); - exit(1); } #ifdef MPI_CT @@ -127,7 +130,7 @@ void mpi_gather_image (IMAGE *im_global, IMAGE *im_local, const int opt_debug); #endif int -main (const int argc, char *const argv[]) +phm2sdf_main (const int argc, char *const argv[]) { IMAGE *im_global = NULL; PHANTOM *phm = NULL; @@ -160,7 +163,6 @@ main (const int argc, char *const argv[]) if (mpi_ct.nproc > MPI_MAX_PROCESS) { sys_error(ERR_FATAL, "Number of mpi processes (%d) exceeds max processes (%d)", mpi_ct.nproc, MPI_MAX_PROCESS); - exit(1); } #endif @@ -186,7 +188,10 @@ main (const int argc, char *const argv[]) switch (c) { case O_PHANTOM: - opt_phmnum = opt_set_phantom(optarg, argv[0]); + if ((opt_phmnum = opt_set_phantom(optarg)) < 0) { + phm2sdf_usage(argv[0]); + return (1); + } break; case O_PHMFILE: strncpy(opt_phmfilename, optarg, sizeof(opt_phmfilename)); @@ -194,7 +199,7 @@ main (const int argc, char *const argv[]) #ifdef MPI_CT if (mpi_ct.my_rank == 0) fprintf(stderr, "Can't use phantom from file in MPI mode\n"); - exit(1); + return (1); #endif break; case O_VERBOSE: @@ -204,13 +209,22 @@ main (const int argc, char *const argv[]) opt_debug = 1; break; case O_TRACE: - opt_trace = opt_set_trace(optarg, argv[0]); + if ((opt_trace = opt_set_trace(optarg)) < 0) { + phm2sdf_usage(argv[0]); + return (1); + } break; case O_FILTER: - opt_filter = opt_set_filter(optarg, argv[0]); + if ((opt_filter = opt_set_filter(optarg)) < 0) { + phm2sdf_usage (argv[0]); + return (1); + } break; case O_FILTER_DOMAIN: - opt_filter_domain = opt_set_filter_domain(optarg, argv[0]); + if ((opt_filter_domain = opt_set_filter_domain(optarg)) < 0) { + phm2sdf_usage (argv[0]); + return (1); + } break; case O_DESC: strncpy(opt_desc, optarg, sizeof(opt_desc)); @@ -220,8 +234,8 @@ main (const int argc, char *const argv[]) endstr = optarg + strlen(optarg); if (endptr != endstr) { fprintf(stderr,"Error setting --filter-bw to %s\n", optarg); - usage(argv[0]); - exit(1); + phm2sdf_usage(argv[0]); + return (1); } break; case O_FILTER_PARAM: @@ -229,8 +243,8 @@ main (const int argc, char *const argv[]) endstr = optarg + strlen(optarg); if (endptr != endstr) { fprintf(stderr,"Error setting --filter-param to %s\n", optarg); - usage(argv[0]); - exit(1); + phm2sdf_usage(argv[0]); + return (1); } break; case O_NSAMPLE: @@ -238,8 +252,8 @@ main (const int argc, char *const argv[]) endstr = optarg + strlen(optarg); if (endptr != endstr) { fprintf(stderr,"Error setting --nsample to %s\n", optarg); - usage(argv[0]); - exit(1); + phm2sdf_usage(argv[0]); + return (1); } break; case O_VERSION: @@ -250,18 +264,18 @@ main (const int argc, char *const argv[]) #endif case O_HELP: case '?': - usage(argv[0]); - exit(0); + phm2sdf_usage(argv[0]); + return (0); default: - usage(argv[0]); - exit(1); + phm2sdf_usage(argv[0]); + return (1); } } if (phm == NULL && opt_phmnum == -1 && opt_filter == -1) { fprintf(stderr, "No phantom defined\n"); - usage(argv[0]); - exit(1); + phm2sdf_usage(argv[0]); + return (1); } #if HAVE_INTERACTIVE_GRAPHICS @@ -270,23 +284,23 @@ main (const int argc, char *const argv[]) #endif if (optind + 3 != argc) { - usage(argv[0]); - exit(1); + phm2sdf_usage(argv[0]); + return (1); } opt_outfile = argv[optind]; opt_nx = strtol(argv[optind+1], &endptr, 10); endstr = argv[optind+1] + strlen(argv[optind+1]); if (endptr != endstr) { fprintf(stderr,"Error setting nx to %s\n", argv[optind+1]); - usage(argv[0]); - exit(1); + phm2sdf_usage(argv[0]); + return (1); } opt_ny = strtol(argv[optind+2], &endptr, 10); endstr = argv[optind+2] + strlen(argv[optind+2]); if (endptr != endstr) { fprintf(stderr,"Error setting ny to %s\n", argv[optind+2]); - usage(argv[0]); - exit(1); + phm2sdf_usage(argv[0]); + return (1); } snprintf(str, sizeof(str), "nx=%d, ny=%d, nsample=%d, ", opt_nx, opt_ny, opt_nsample); @@ -398,25 +412,20 @@ main (const int argc, char *const argv[]) #ifdef MPI_CT time_end = MPI_Wtime(); - if (mpi_ct.my_rank == 0) { +#else + time_end = td_current_sec(); +#endif + +#ifdef MPI_CT + if (mpi_ct.my_rank == 0) +#endif + { im_global->calctime = time_end - time_start; strncpy (im_global->remark, opt_desc, sizeof(im_global->remark)); - } - - if (mpi_ct.my_rank == 0) { image_save (im_global); if (opt_verbose) fprintf (stdout, "Time to compile image = %.2f sec\n\n", im_global->calctime); } -#else - time_end = td_current_sec(); - im_global->calctime = time_end - time_start; - strncpy (im_global->remark, opt_desc, sizeof(im_global->remark)); - image_save (im_global); - - if (opt_verbose) - fprintf (stdout, "Time to compile image = %.2f sec\n\n", im_global->calctime); -#endif if (opt_trace >= TRACE_PHM) { @@ -431,6 +440,8 @@ main (const int argc, char *const argv[]) } + phm_free (phm); + return (0); } @@ -471,3 +482,11 @@ void mpi_gather_image (IMAGE *im_global, IMAGE *im_local, const int opt_debug) } #endif + +#ifndef NO_MAIN +int +main (const int argc, char *const argv[]) +{ + return (phm2sdf_main(argc, argv)); +} +#endif diff --git a/src/rs2sdf.c b/src/rs2sdf.c index edfd411..80d1304 100644 --- a/src/rs2sdf.c +++ b/src/rs2sdf.c @@ -2,8 +2,11 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: rs2sdf.c,v 1.2 2000/05/08 20:02:32 kevin Exp $ +** $Id: rs2sdf.c,v 1.3 2000/05/16 04:33:59 kevin Exp $ ** $Log: rs2sdf.c,v $ +** Revision 1.3 2000/05/16 04:33:59 kevin +** Improved option processing +** ** Revision 1.2 2000/05/08 20:02:32 kevin ** ANSI C changes ** @@ -25,6 +28,7 @@ ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ******************************************************************************/ + /* FILE * rs2sdf.c Convert Raysum to image * @@ -46,20 +50,20 @@ static struct option my_options[] = void -usage (const char *program) +rs2sdf_usage (const char *program) { - fprintf(stdout, "usage: %s in-rs-file out-sdf-file [OPTIONS]\n", kbasename(program)); + fprintf(stdout, "rs2sdf_usage: %s in-rs-file out-sdf-file [OPTIONS]\n", kbasename(program)); fprintf(stdout, "This program converts a raysum file to a SDF2D file\n"); fprintf(stdout, "\n"); fprintf(stdout, " --verbose Verbose mode\n"); fprintf(stdout, " --version Print version\n"); fprintf(stdout, " --help Print this help message\n"); - exit(1); } + int -main (const int argc, char *const argv[]) +rs2sdf_main (const int argc, char *const argv[]) { IMAGE *im; RAYSUM *rs; @@ -89,23 +93,25 @@ main (const int argc, char *const argv[]) exit(0); case O_HELP: case '?': - usage(argv[0]); - exit(0); + rs2sdf_usage(argv[0]); + return (0); default: - usage(argv[0]); - exit(1); + rs2sdf_usage(argv[0]); + return (1); } } - if (argc - optind != 2) - usage(argv[0]); + if (argc - optind != 2) { + rs2sdf_usage(argv[0]); + return (1); + } rs_name = argv[optind]; im_name = argv[optind + 1]; if (file_exists(rs_name) == FALSE) { fprintf (stderr, "Raysum file %s does not exist\n", rs_name); - exit(1); + return (1); } rs = raysum_open (rs_name); @@ -138,3 +144,11 @@ main (const int argc, char *const argv[]) return(0); } + +#ifndef NO_MAIN +int +main (const int argc, char *const argv[]) +{ + return (rs2sdf_main(argc, argv)); +} +#endif diff --git a/src/sample-ctrec.sh.in b/src/sample-ctrec.sh.in index bf7410d..b85e71f 100755 --- a/src/sample-ctrec.sh.in +++ b/src/sample-ctrec.sh.in @@ -4,16 +4,24 @@ bin="@prefix@/bin/" # Generate phantom image -${bin}phm2sdf sample-phm.sdf 256 256 --nsample 2 -${bin}sdf2img sample-phm.sdf sample-phm.png --format png +${bin}phm2sdf sample-phm.sdf 256 256 --nsample 2 --phantom herman +if [ -f sample-phm.sdf ] ; then + ${bin}sdf2img sample-phm.sdf sample-phm.png --format png +fi # Simulate CT data collection and generate raysum sinugram for display -${bin}phm2rs sample-rs.rs 367 320 --nray 2 -${bin}rs2sdf sample-rs.rs sample-rs.sdf -${bin}sdf2img sample-rs.sdf sample-rs.png --format png +${bin}phm2rs sample-rs.rs 367 320 --nray 2 --phantom herman +if [ -f sample-rs.rs ]; then + ${bin}rs2sdf sample-rs.rs sample-rs.sdf +fi +if [ -f sample-rs.sdf ]; then + ${bin}sdf2img sample-rs.sdf sample-rs.png --format png +fi # Reconstruct raysums and generate image for display ${bin}ctrec sample-rs.rs sample-rec.sdf 256 256 -${bin}sdf2img sample-rec.sdf sample-rec.png --format png +if [ -f sample-rec.sdf ]; then + ${bin}sdf2img sample-rec.sdf sample-rec.png --format png +fi # Files sample-phm.png, sample-rs.png, and sample-rec.png are ready for display diff --git a/src/sdf-1.c b/src/sdf-1.c index b95deb8..d9119cb 100644 --- a/src/sdf-1.c +++ b/src/sdf-1.c @@ -2,8 +2,11 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: sdf-1.c,v 1.4 2000/05/09 14:52:27 kevin Exp $ +** $Id: sdf-1.c,v 1.5 2000/05/16 04:33:59 kevin Exp $ ** $Log: sdf-1.c,v $ +** Revision 1.5 2000/05/16 04:33:59 kevin +** Improved option processing +** ** Revision 1.4 2000/05/09 14:52:27 kevin ** added sqr and sqrt functions ** @@ -53,9 +56,9 @@ static struct option my_options[] = }; void -usage (const char *program) +sdf1_usage (const char *program) { - fprintf(stdout, "usage: %s infile outfile [OPTIONS]\n", kbasename(program)); + fprintf(stdout, "sdf1_usage: %s infile outfile [OPTIONS]\n", kbasename(program)); fprintf(stdout, "Generate a SDF2D file from a SDF2D file\n"); fprintf(stdout, "\n"); fprintf(stdout, " --invert Invert image\n"); @@ -66,11 +69,10 @@ usage (const char *program) fprintf(stdout, " --verbose Verbose modem\n"); fprintf(stdout, " --version Print version\n"); fprintf(stdout, " --help Print this help message\n"); - exit(1); } int -main (int argc, char *const argv[]) +sdf1_main (int argc, char *const argv[]) { IMAGE *im_in; IMAGE *im_out; @@ -119,18 +121,18 @@ main (int argc, char *const argv[]) exit(0); case O_HELP: case '?': - usage(argv[0]); - exit(0); + sdf1_usage(argv[0]); + return (0); default: - usage(argv[0]); - exit(1); + sdf1_usage(argv[0]); + return (1); } } if (optind + 2 != argc) { - usage(argv[0]); - exit(1); + sdf1_usage(argv[0]); + return (1); } in_file = argv[optind]; @@ -174,3 +176,12 @@ main (int argc, char *const argv[]) return (0); } + +#ifndef NO_MAIN +int +main (int argc, char *const argv[]) +{ + return (sdf1_main(argc, argv)); +} +#endif + diff --git a/src/sdf-2.c b/src/sdf-2.c index 89e9bf4..29ccc34 100644 --- a/src/sdf-2.c +++ b/src/sdf-2.c @@ -2,8 +2,11 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: sdf-2.c,v 1.3 2000/05/11 01:06:30 kevin Exp $ +** $Id: sdf-2.c,v 1.4 2000/05/16 04:33:59 kevin Exp $ ** $Log: sdf-2.c,v $ +** Revision 1.4 2000/05/16 04:33:59 kevin +** Improved option processing +** ** Revision 1.3 2000/05/11 01:06:30 kevin ** Changed sprintf to snprintf ** @@ -28,6 +31,7 @@ ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ******************************************************************************/ + /* FILE * sdf-2.c Generate a SDF file from two input SDF files */ @@ -49,9 +53,9 @@ static struct option my_options[] = }; void -usage (const char *program) +sdf2_usage (const char *program) { - fprintf(stdout, "usage: %s infile1 infile2 outfile [OPTIONS]\n", kbasename(program)); + fprintf(stdout, "sdf2_usage: %s infile1 infile2 outfile [OPTIONS]\n", kbasename(program)); fprintf(stdout, "Generate an SDF2D file from two input SDF2D files\n"); fprintf(stdout, "\n"); fprintf(stdout, " infile1 Name of first input SDF file\n"); @@ -64,11 +68,10 @@ usage (const char *program) fprintf(stdout, " --verbose Verbose modem\n"); fprintf(stdout, " --version Print version\n"); fprintf(stdout, " --help Print this help message\n"); - exit(1); } int -main (int argc, char *const argv[]) +sdf2_main (int argc, char *const argv[]) { IMAGE *im_in1; IMAGE *im_in2; @@ -115,18 +118,18 @@ main (int argc, char *const argv[]) exit(0); case O_HELP: case '?': - usage(argv[0]); - exit(0); + sdf2_usage(argv[0]); + return (0); default: - usage(argv[0]); - exit(1); + sdf2_usage(argv[0]); + return (1); } } if (optind + 3 != argc) { - usage(argv[0]); - exit(1); + sdf2_usage(argv[0]); + return (1); } in_file1 = argv[optind]; @@ -195,3 +198,12 @@ main (int argc, char *const argv[]) return (0); } + +#ifndef NO_MAIN +int +main (int argc, char *const argv[]) +{ + return (sdf2_main(argc, argv)); +} +#endif + diff --git a/src/sdf2img.c b/src/sdf2img.c index b19013b..600d8d7 100644 --- a/src/sdf2img.c +++ b/src/sdf2img.c @@ -2,8 +2,11 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: sdf2img.c,v 1.2 2000/05/08 20:02:32 kevin Exp $ +** $Id: sdf2img.c,v 1.3 2000/05/16 04:33:59 kevin Exp $ ** $Log: sdf2img.c,v $ +** Revision 1.3 2000/05/16 04:33:59 kevin +** Improved option processing +** ** Revision 1.2 2000/05/08 20:02:32 kevin ** ANSI C changes ** @@ -25,8 +28,9 @@ ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ******************************************************************************/ + /* FILE - * sdf2img.c Convert an SDF file to a viewable format image + * sdf2img.c Convert an SDF file to a viewable format image */ #include "ct.h" @@ -89,9 +93,9 @@ static struct option my_options[] = #define O_FORMAT_PGMASC_STR "pgmasc" void -usage (const char *program) +sdf2img_usage (const char *program) { - fprintf(stdout, "usage: %s sdfname outfile [OPTIONS]\n", kbasename(program)); + fprintf(stdout, "sdf2img_usage: %s sdfname outfile [OPTIONS]\n", kbasename(program)); fprintf(stdout, "Convert SDF2D file to an image file\n"); fprintf(stdout, "\n"); fprintf(stdout, " sdfname Name of input SDF file\n"); @@ -124,11 +128,11 @@ usage (const char *program) fprintf(stdout, " --verbose Set verbose mode\n"); fprintf(stdout, " --version Print version\n"); fprintf(stdout, " --help Print this help message\n"); - exit(1); } + int -main (int argc, char *const argv[]) +sdf2img_main (int argc, char *const argv[]) { IMAGE *im; double densmin = HUGE_VAL, densmax = -HUGE_VAL; @@ -162,8 +166,8 @@ main (int argc, char *const argv[]) if (endptr != endstr) { fprintf(stderr, "Error setting --min to %s\n", optarg); - usage(argv[0]); - exit(1); + sdf2img_usage(argv[0]); + return (1); } break; case O_MAX: @@ -173,8 +177,8 @@ main (int argc, char *const argv[]) if (endptr != endstr) { fprintf(stderr, "Error setting --max to %s\n", optarg); - usage(argv[0]); - exit(1); + sdf2img_usage(argv[0]); + return (1); } break; case O_SCALE: @@ -183,8 +187,8 @@ main (int argc, char *const argv[]) if (endptr != endstr) { fprintf(stderr,"Error setting --scale to %s\n", optarg); - usage(argv[0]); - exit(1); + sdf2img_usage(argv[0]); + return (1); } break; case O_AUTO: @@ -203,8 +207,8 @@ main (int argc, char *const argv[]) else { fprintf(stderr, "Invalid auto mode %s\n", optarg); - usage(argv[0]); - exit(1); + sdf2img_usage(argv[0]); + return (1); } break; case O_CENTER: @@ -215,8 +219,8 @@ main (int argc, char *const argv[]) else { fprintf(stderr, "Invalid center mode %s\n", optarg); - usage(argv[0]); - exit(1); + sdf2img_usage(argv[0]); + return (1); } break; case O_FORMAT: @@ -234,10 +238,10 @@ main (int argc, char *const argv[]) #endif else { fprintf(stderr, "Invalid format mode %s\n", optarg); - usage(argv[0]); - exit(1); + sdf2img_usage(argv[0]); + return (1); } - break; + break; case O_LABELS: opt_labels = 1; break; @@ -259,18 +263,18 @@ main (int argc, char *const argv[]) exit(0); case O_HELP: case '?': - usage(argv[0]); - exit(0); + sdf2img_usage(argv[0]); + return (0); default: - usage(argv[0]); - exit(1); + sdf2img_usage(argv[0]); + return (1); } } if (optind + 2 != argc) { - usage(argv[0]); - exit(1); + sdf2img_usage(argv[0]); + return (1); } in_file = argv[optind]; @@ -279,7 +283,7 @@ main (int argc, char *const argv[]) if ((im = image_load (in_file)) == NULL) { fprintf(stderr, "File %s does not exist\n", in_file); - exit(1); + return (1); } if (opt_labels) @@ -391,7 +395,7 @@ main (int argc, char *const argv[]) else { fprintf(stderr, "Internal Error: Invalid auto mode %d\n", opt_auto); - exit(1); + return (1); } } if (opt_stats) @@ -415,7 +419,7 @@ main (int argc, char *const argv[]) else { fprintf(stderr, "Internal Error: Invalid center mode %d\n", opt_center); - exit(1); + return (1); } if (! opt_set_max) densmax = center + window; @@ -445,7 +449,7 @@ main (int argc, char *const argv[]) else { fprintf(stderr, "Internal Error: Invalid format mode %d\n", opt_format); - exit(1); + return (1); } return (0); } @@ -692,3 +696,10 @@ sdf2d_to_gif (IMAGE *im, char *outfile, int nxcell, int nycell, double densmin, #endif } +#ifndef NO_MAIN +int +main (int argc, char *const argv[]) +{ + return (sdf2img_main(argc, argv)); +} +#endif diff --git a/src/sdfinfo.c b/src/sdfinfo.c index 49cfd9f..568c951 100644 --- a/src/sdfinfo.c +++ b/src/sdfinfo.c @@ -2,8 +2,11 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: sdfinfo.c,v 1.2 2000/05/08 20:02:32 kevin Exp $ +** $Id: sdfinfo.c,v 1.3 2000/05/16 04:33:59 kevin Exp $ ** $Log: sdfinfo.c,v $ +** Revision 1.3 2000/05/16 04:33:59 kevin +** Improved option processing +** ** Revision 1.2 2000/05/08 20:02:32 kevin ** ANSI C changes ** @@ -25,6 +28,7 @@ ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ******************************************************************************/ + /* FILE * sdfinfo.c Display info on sdf files */ @@ -47,9 +51,9 @@ static struct option my_options[] = }; void -usage (const char *program) +sdfinfo_usage (const char *program) { - fprintf(stdout, "usage: %s infile [OPTIONS]\n", kbasename(program)); + fprintf(stdout, "sdfinfo_usage: %s infile [OPTIONS]\n", kbasename(program)); fprintf(stdout, "Analyze an SDF2D file\n"); fprintf(stdout, "\n"); fprintf(stdout, " infile Name of input SDF file\n"); @@ -62,11 +66,10 @@ usage (const char *program) fprintf(stdout, " --verbose Verbose mode\n"); fprintf(stdout, " --version Print version\n"); fprintf(stdout, " --help Print this help message\n"); - exit(1); } int -main (int argc, char *const argv[]) +sdfinfo_main (int argc, char *const argv[]) { IMAGE *im; char *in_file; @@ -111,18 +114,18 @@ main (int argc, char *const argv[]) exit(0); case O_HELP: case '?': - usage(argv[0]); - exit(0); + sdfinfo_usage(argv[0]); + return (0); default: - usage(argv[0]); - exit(1); + sdfinfo_usage(argv[0]); + return (1); } } if (optind + 1 != argc) { - usage(argv[0]); - exit(1); + sdfinfo_usage(argv[0]); + return (1); } in_file = argv[optind]; @@ -225,3 +228,11 @@ main (int argc, char *const argv[]) return (0); } + +#ifndef NO_MAIN +int +main (int argc, char *const argv[]) +{ + return (sdfinfo_main(argc, argv)); +} +#endif -- 2.34.1