/*
 * Copyright (c) 2003-2006 Sendmail, Inc. and its suppliers.
 *	All rights reserved.
 *
 * By using this file, you agree to the terms and conditions set
 * forth in the LICENSE file which can be found at the top level of
 * the sendmail distribution.
 */

#include "sm/generic.h"
SM_RCSID("@(#)$Id: t-strexp.c,v 1.9 2006/01/05 22:41:53 ca Exp $")

#include "sm/assert.h"
#include "sm/magic.h"
#include "sm/error.h"
#include "sm/rpool.h"
#include "sm/test.h"
#include "sm/str.h"
#include "sm/strexp.h"
#include "sm/io.h"

extern char *optarg;
extern int optind;
extern int optopt;
extern int opterr;

#define SMAXLEN	1024
#define NMACROS	10

static int Verbose = 0;

static void
test_harness(sm_rpool_P a)
{
	uint argc;
	sm_str_P src, dst, argv[NMACROS];
	sm_ret_T ret;

	src = sm_str_new(a, SMAXLEN, SMAXLEN);
	SM_TEST(src != NULL);
	if (src == NULL)
		return;
	dst = sm_str_new(a, SMAXLEN, SMAXLEN);
	SM_TEST(dst != NULL);
	if (dst == NULL)
		return;

	for (argc = 0; argc < NMACROS; argc++)
	{
		argv[argc] = sm_str_new(a, SMAXLEN, SMAXLEN);
		SM_TEST(argv[argc] != NULL);
		if (argv[argc] == NULL)
			return;
		sm_strprintf(argv[argc], "arg-%u!", argc);
	}

	/* simple expansion */
	sm_str_clr(src);
	sm_str_clr(dst);
	ret = sm_str_scat0(src, "str%0");
	SM_TEST(ret == SM_SUCCESS);
	if (ret != SM_SUCCESS)
		return;
	ret = sm_str_expdig(src, dst, '\0', 1, argv);
	SM_TEST(sm_is_success(ret));
	if (!sm_is_success(ret))
		return;
	SM_TEST(strcmp((char *)sm_str_getdata(dst), "strarg-0!") == 0);
	if (Verbose > 2)
		sm_io_fprintf(smioerr, "dst='%S'\n", dst);

	/* two expansions and keep '%%' */
	sm_str_clr(src);
	sm_str_clr(dst);
	ret = sm_str_scat0(src, "%0-%%-%1");
	SM_TEST(ret == SM_SUCCESS);
	if (ret != SM_SUCCESS)
		return;
	ret = sm_str_expdig(src, dst, '\0', 2, argv);
	SM_TEST(sm_is_success(ret));
	if (!sm_is_success(ret))
		return;
	SM_TEST(strcmp((char *)sm_str_getdata(dst), "arg-0!-%-arg-1!") == 0);
	if (Verbose > 2)
		sm_io_fprintf(smioerr, "dst='%S'\n", dst);

	/* keep '%%', one expansion does not have an argument */
	sm_str_clr(src);
	sm_str_clr(dst);
	ret = sm_str_scat0(src, "%0-%%-%1");
	SM_TEST(ret == SM_SUCCESS);
	if (ret != SM_SUCCESS)
		return;
	ret = sm_str_expdig(src, dst, '\0', 1, argv);
	SM_TEST(sm_is_success(ret));
	if (!sm_is_success(ret))
		return;
	SM_TEST(strcmp((char *)sm_str_getdata(dst), "arg-0!-%-") == 0);
	if (Verbose > 2)
		sm_io_fprintf(smioerr, "dst='%S'\n", dst);

	/* two expansions and keep trailing '%' */
	sm_str_clr(src);
	sm_str_clr(dst);
	ret = sm_str_scat0(src, "%0-%1-%");
	SM_TEST(ret == SM_SUCCESS);
	if (ret != SM_SUCCESS)
		return;
	ret = sm_str_expdig(src, dst, '\0', 2, argv);
	SM_TEST(sm_is_success(ret));
	if (!sm_is_success(ret))
		return;
	SM_TEST(strcmp((char *)sm_str_getdata(dst), "arg-0!-arg-1!-%") == 0);
	if (Verbose > 2)
		sm_io_fprintf(smioerr, "dst='%S'\n", dst);

	/* many expansions */
	sm_str_clr(src);
	sm_str_clr(dst);
	ret = sm_str_scat0(src, "%0.%1.%2.%3.%4.%5.%6.%7.%8.%9.%A");
	SM_TEST(ret == SM_SUCCESS);
	if (ret != SM_SUCCESS)
		return;
	ret = sm_str_expdig(src, dst, '\0', NMACROS, argv);
	SM_TEST(sm_is_success(ret));
	if (!sm_is_success(ret))
		return;
	SM_TEST(strcmp((char *)sm_str_getdata(dst),
		"arg-0!.arg-1!.arg-2!.arg-3!.arg-4!.arg-5!.arg-6!.arg-7!.arg-8!.arg-9!.A") == 0);
	if (Verbose > 2)
		sm_io_fprintf(smioerr, "dst='%S'\n", dst);

	for (argc = 0; argc < NMACROS; argc++)
		sm_str_free(argv[argc]);
	sm_str_free(src);
	sm_str_free(dst);
}

int
main(int argc, char *argv[])
{
	int c;
	sm_rpool_P a;

	while ((c = getopt(argc, argv, "V")) != -1)
	{
		switch (c)
		{
		  case 'V':
			++Verbose;
			break;
		  default:
			/* usage(prg); */
			break;
		}
	}
	sm_test_begin(argc, argv, "test strexpdig()");
	argc -= optind;
	argv += optind;

	/* create an rpool for entire test */
	a = sm_rpool_new(NULL);
	SM_TEST(a != NULL);
	test_harness(a);
	sm_rpool_delete(a);

	/* test without rpool */
	test_harness(NULL);
	return sm_test_end();
}


syntax highlighted by Code2HTML, v. 0.9.1