sold = source;
include(name, argc, argv, intr_ok)	const char *name;	int argc;	char **argv;	int intr_ok;{	register Source *volatile s = NULL;	Source *volatile sold;	struct shf *shf;	char **volatile old_argv;	volatile int old_argc;	int i;	shf = shf_open(name, O_RDONLY, 0, SHF_MAPHI|SHF_CLEXEC);	if (shf == NULL)		return -1;	if (argv) {		old_argv = e->loc->argv;		old_argc = e->loc->argc;	} else {		old_argv = (char **) 0;		old_argc = 0;	}	sold = source;	newenv(E_INCL);	i = ksh_sigsetjmp(e->jbuf, 0);	if (i) {		source = sold;		if (s) /* Do this before quitenv(), which frees the memory */			shf_close(s->u.shf);		quitenv();		if (old_argv) {			e->loc->argv = old_argv;			e->loc->argc = old_argc;		}		switch (i) {		  case LRETURN:		  case LERROR:			return exstat & 0xff; /* see below */		  case LINTR:			/* intr_ok is set if we are including .profile or $ENV.			 * If user ^C's out, we don't want to kill the shell...			 */			if (intr_ok && (exstat - 128) != SIGTERM)				return 1;			/* fall through... */		  case LEXIT:		  case LLEAVE:		  case LSHELL:			unwind(i);			/*NOREACHED*/		  default:			internal_errorf(1, "include: %d", i);			/*NOREACHED*/		}	}	if (argv) {		e->loc->argv = argv;		e->loc->argc = argc;	}	s = pushs(SFILE, ATEMP);	s->u.shf = shf;	s->file = str_save(name, ATEMP);	i = shell(s, FALSE);	source = sold;	shf_close(s->u.shf);	quitenv();	if (old_argv) {		e->loc->argv = old_argv;		e->loc->argc = old_argc;	}	return i & 0xff;	/* & 0xff to ensure value not -1 */}