Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!seismo!columbia!caip!clyde!cbatt!cbosgd!ihnp4!cuae2!ltuxa!we53!sw013b!dj3b1!killer!toma From: toma@killer.UUCP (Tom Armistead) Newsgroups: net.lang.c Subject: Re: C-STYLE (goto?) Message-ID: <264@killer.UUCP> Date: Wed, 27-Aug-86 13:16:47 EDT Article-I.D.: killer.264 Posted: Wed Aug 27 13:16:47 1986 Date-Received: Sat, 30-Aug-86 03:18:08 EDT References: <3253@brl-smoke.ARPA> Organization: The Unix(tm) Connection BBS, Dallas, Tx Lines: 88 Summary: setjmp() and longjmp() alternatives to goto In article <3253@brl-smoke.ARPA>, jeff@isi-vaxa.ARPA writes: > I am sure that this case of style has been brought up before. It has been > bothering me for awhile. > > The way I like to do it is: > > setup_step_1; > if ( (status = step_1()) == FAILURE ) > goto abort_operation; > > setup_step_2; > if ( (status = step_2()) == FAILURE ) > goto abort_operation; > > . > . > . > > setup_step_n; > if ( (status = step_n()) == FAILURE ) > goto abort_operation; > > abort_operation: > > cleanup(); > return (status); > > Now, I know a lot of people detest this because of the use of goto's, but this > seems the nicest way to perform this function. I really have nothing against > goto's if they are directed to the same spot (i.e., don't jump back and forth) > and enhance the readability of the code. > > Any comments? I am willing to adapt to another reasonable style for such > cases (if anyone really cared). There is always the use of setjmp and longjmp to acomplish this task, sometging like this: #include #define FAILURE 1 /* cannot == 0, due to setjmp conventions */ routine() { jmp_buf env; /* envireoment for setjmp,lonjmp */ int val, /* used in return to setjmp */ status; if (setjmp(env) == FAILURE) /* if abort return, cleanup and exit */ { cleanup(); return(status); } /* setup_step_1 */ if ((status = step_1()) == FAILURE) longjmp(env,FAILURE); /* return to setjmp call w/FAILURE */ /* setup_step_2 */ if ((status = step_2()) == FAILURE) longjmp(env,FAILURE); /* return to setjmp call w/FAILURE */ . . . /* setup_step_n */ if ((status = step_n()) == FAILURE) longjmp(env,FAILURE); /* return to setjmp call w/failure */ . . . /* continue on from here ... */ } This will accomplish the same thing and possibly not affend the goto haters, although it is somewhat harder to follow if you are no farmiliar with setjmp() and lonjmp(). Tom --- UUCP: ihnp4\ \killer!toma / drillsys!infoswx!convex!dj3b1/ Tom Armistead