char **pp;
const char **pp;
int MAIN(int argc, char **argv)	{	int ret=1,i;	char **pp;	int verbose=0, list_cap=0, test_avail=0, test_avail_noise = 0;	ENGINE *e;	STACK *engines = sk_new_null();	STACK *pre_cmds = sk_new_null();	STACK *post_cmds = sk_new_null();	int badops=1;	BIO *bio_out=NULL;	const char *indent = "     ";	apps_startup();	SSL_load_error_strings();	if (bio_err == NULL)		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);	if (!load_config(bio_err, NULL))		goto end;	bio_out=BIO_new_fp(stdout,BIO_NOCLOSE);#ifdef OPENSSL_SYS_VMS	{	BIO *tmpbio = BIO_new(BIO_f_linebuffer());	bio_out = BIO_push(tmpbio, bio_out);	}#endif	argc--;	argv++;	while (argc >= 1)		{		if (strncmp(*argv,"-v",2) == 0)			{			if(strspn(*argv + 1, "v") < strlen(*argv + 1))				goto skip_arg_loop;			if((verbose=strlen(*argv + 1)) > 4)				goto skip_arg_loop;			}		else if (strcmp(*argv,"-c") == 0)			list_cap=1;		else if (strncmp(*argv,"-t",2) == 0)			{			test_avail=1;			if(strspn(*argv + 1, "t") < strlen(*argv + 1))				goto skip_arg_loop;			if((test_avail_noise = strlen(*argv + 1) - 1) > 1)				goto skip_arg_loop;			}		else if (strcmp(*argv,"-pre") == 0)			{			argc--; argv++;			sk_push(pre_cmds,*argv);			}		else if (strcmp(*argv,"-post") == 0)			{			argc--; argv++;			sk_push(post_cmds,*argv);			}		else if ((strncmp(*argv,"-h",2) == 0) ||				(strcmp(*argv,"-?") == 0))			goto skip_arg_loop;		else			sk_push(engines,*argv);		argc--;		argv++;		}	/* Looks like everything went OK */	badops = 0;skip_arg_loop:	if (badops)		{		for (pp=engine_usage; (*pp != NULL); pp++)			BIO_printf(bio_err,"%s",*pp);		goto end;		}	if (sk_num(engines) == 0)		{		for(e = ENGINE_get_first(); e != NULL; e = ENGINE_get_next(e))			{			sk_push(engines,(char *)ENGINE_get_id(e));			}		}	for (i=0; i<sk_num(engines); i++)		{		const char *id = sk_value(engines,i);		if ((e = ENGINE_by_id(id)) != NULL)			{			const char *name = ENGINE_get_name(e);			/* Do "id" first, then "name". Easier to auto-parse. */			BIO_printf(bio_out, "(%s) %s\n", id, name);			util_do_cmds(e, pre_cmds, bio_out, indent);			if (strcmp(ENGINE_get_id(e), id) != 0)				{				BIO_printf(bio_out, "Loaded: (%s) %s\n",					ENGINE_get_id(e), ENGINE_get_name(e));				}			if (list_cap)				{				int cap_size = 256;				char *cap_buf = NULL;				int k,n;				const int *nids;				ENGINE_CIPHERS_PTR fn_c;				ENGINE_DIGESTS_PTR fn_d;				if (ENGINE_get_RSA(e) != NULL					&& !append_buf(&cap_buf, "RSA",						&cap_size, 256))					goto end;				if (ENGINE_get_DSA(e) != NULL					&& !append_buf(&cap_buf, "DSA",						&cap_size, 256))					goto end;				if (ENGINE_get_DH(e) != NULL					&& !append_buf(&cap_buf, "DH",						&cap_size, 256))					goto end;				if (ENGINE_get_RAND(e) != NULL					&& !append_buf(&cap_buf, "RAND",						&cap_size, 256))					goto end;				fn_c = ENGINE_get_ciphers(e);				if(!fn_c) goto skip_ciphers;				n = fn_c(e, NULL, &nids, 0);				for(k=0 ; k < n ; ++k)					if(!append_buf(&cap_buf,						       OBJ_nid2sn(nids[k]),						       &cap_size, 256))						goto end;skip_ciphers:				fn_d = ENGINE_get_digests(e);				if(!fn_d) goto skip_digests;				n = fn_d(e, NULL, &nids, 0);				for(k=0 ; k < n ; ++k)					if(!append_buf(&cap_buf,						       OBJ_nid2sn(nids[k]),						       &cap_size, 256))						goto end;skip_digests:				if (cap_buf && (*cap_buf != '\0'))					BIO_printf(bio_out, " [%s]\n", cap_buf);				OPENSSL_free(cap_buf);				}			if(test_avail)				{				BIO_printf(bio_out, "%s", indent);				if (ENGINE_init(e))					{					BIO_printf(bio_out, "[ available ]\n");					util_do_cmds(e, post_cmds, bio_out, indent);					ENGINE_finish(e);					}				else					{					BIO_printf(bio_out, "[ unavailable ]\n");					if(test_avail_noise)						ERR_print_errors_fp(stdout);					ERR_clear_error();					}				}			if((verbose > 0) && !util_verbose(e, verbose, bio_out, indent))				goto end;			ENGINE_free(e);			}		else			ERR_print_errors(bio_err);		}	ret=0;end:	ERR_print_errors(bio_err);	sk_pop_free(engines, identity);	sk_pop_free(pre_cmds, identity);	sk_pop_free(post_cmds, identity);	if (bio_out != NULL) BIO_free_all(bio_out);	apps_shutdown();	OPENSSL_EXIT(ret);	}