/****************************************************************
 *								*
 *	Copyright 2001, 2010 Fidelity Information Services, Inc	*
 *								*
 *	This source code contains the intellectual property	*
 *	of its copyright holder(s), and is made available	*
 *	under a license.  If you do not know the terms of	*
 *	the license, please stop and do not read further.	*
 *								*
 ****************************************************************/

#include "mdef.h"
#include "gtm_string.h"
#include "cmd_qlf.h"
#include "cli.h"

GBLDEF list_params 		lst_param;

GBLREF command_qualifier 	glb_cmd_qlf;
GBLREF boolean_t		gtm_utf8_mode;

void get_cmd_qlf(command_qualifier *qualif)
{
	static readonly char upper[] = "UPPER";
	static readonly char lower[] = "LOWER";
	mstr		*s;
	int4		temp_int;
	unsigned short	len;
	unsigned char	inbuf[255];

	qualif->qlf = glb_cmd_qlf.qlf;
	qualif->object_file.mvtype = qualif->list_file.mvtype = qualif->ceprep_file.mvtype = 0;
	if (gtm_utf8_mode)
		qualif->qlf |= CQ_UTF8;		/* Mark as being compiled in UTF8 mode */
	if (cli_present("OBJECT") == CLI_PRESENT)
	{
		qualif->qlf |= CQ_OBJECT;
		qualif->object_file.mvtype = MV_STR;
		s = &qualif->object_file.str;
		len = s->len;
		if (cli_get_str("OBJECT", s->addr, &len) == FALSE)
		{
			s->len = 0;
			if (glb_cmd_qlf.object_file.mvtype == MV_STR  &&  glb_cmd_qlf.object_file.str.len > 0)
			{
				s->len = glb_cmd_qlf.object_file.str.len;
				memcpy(s->addr, glb_cmd_qlf.object_file.str.addr,
					s->len);
			}
		} else
			s->len = len;
	} else if (cli_negated("OBJECT") == TRUE)
		qualif->qlf &= ~CQ_OBJECT;


	if (cli_present("CROSS_REFERENCE") == CLI_PRESENT)
		qualif->qlf |= CQ_CROSS_REFERENCE;
	else if (cli_negated("CROSS_REFERENCE") == TRUE)
		qualif->qlf &= ~CQ_CROSS_REFERENCE;

	if (cli_negated("IGNORE") == TRUE)
		qualif->qlf &= ~CQ_IGNORE;
	else
		qualif->qlf |= CQ_IGNORE;

	if (cli_present("DEBUG") == CLI_PRESENT)
		qualif->qlf |= CQ_DEBUG;
	else if (cli_negated("DEBUG") == TRUE)
		qualif->qlf &= ~CQ_DEBUG;

	if (cli_negated("LINE_ENTRY") == TRUE)
		qualif->qlf &= ~CQ_LINE_ENTRY;

	if (cli_negated("INLINE_LITERALS") == TRUE)
		qualif->qlf &= ~CQ_INLINE_LITERALS;

	if (cli_negated("ALIGN_STRINGS") == TRUE)
		qualif->qlf &= ~CQ_ALIGN_STRINGS;

#ifdef DEBUG
	if (cli_present("MACHINE_CODE") == CLI_PRESENT)
		qualif->qlf |= CQ_MACHINE_CODE;
	else if (cli_negated("MACHINE_CODE") == TRUE)
		qualif->qlf &= ~CQ_MACHINE_CODE;
#else
	qualif->qlf &= ~CQ_MACHINE_CODE;
#endif

	if (cli_negated("WARNINGS") == TRUE)
		qualif->qlf &= ~CQ_WARNINGS;
	else
		qualif->qlf |= CQ_WARNINGS;


	if (cli_negated("LIST") == TRUE)
		qualif->qlf &= (~CQ_LIST & ~CQ_MACHINE_CODE);
	else if (cli_present("LIST") == CLI_PRESENT)
	{
		qualif->qlf |= CQ_LIST;
		qualif->list_file.mvtype = MV_STR;
		s = &qualif->list_file.str;
		len = s->len;
		if (cli_get_str("LIST", s->addr, &len) == FALSE)
		{
			s->len = 0;
			if (glb_cmd_qlf.list_file.mvtype == MV_STR  &&  glb_cmd_qlf.list_file.str.len > 0)
			{
				s->len = glb_cmd_qlf.list_file.str.len;
				memcpy(s->addr, glb_cmd_qlf.list_file.str.addr,
					s->len);
			}
		} else
			s->len = len;
	} else if (!(qualif->qlf & CQ_LIST))
		qualif->qlf &= ~CQ_MACHINE_CODE;

	if (cli_get_int("LENGTH",&temp_int) == FALSE)
		temp_int = 66;
	lst_param.lines_per_page = temp_int;
	if (cli_get_int("SPACE",&temp_int) == FALSE || temp_int <= 0 || temp_int >= lst_param.lines_per_page)
		temp_int = 1;
	lst_param.space = temp_int;

	if (cli_present("LABELS") == CLI_PRESENT)
	{
		len = SIZEOF(inbuf);
		if (cli_get_str("LABELS", (char *)&inbuf[0], &len))
		{
			if (len == SIZEOF(upper) - 1)
			{
				if (!memcmp(upper, &inbuf[0], len))
					qualif->qlf &= ~CQ_LOWER_LABELS;
				else if (!memcmp(lower, &inbuf[0], len))
					qualif->qlf |= CQ_LOWER_LABELS;
			}
		}
	}
#	ifdef UNIX
	if (CLI_PRESENT == cli_present("NAMEOFRTN"))
		qualif->qlf |= CQ_NAMEOFRTN;
#	endif
	if (cli_present("CE_PREPROCESS") == CLI_PRESENT)
        {
		qualif->qlf |= CQ_CE_PREPROCESS;
		qualif->ceprep_file.mvtype = MV_STR;
		s = &qualif->ceprep_file.str;
		len = s->len;
		if (cli_get_str("CE_PREPROCESS", s->addr, &len) == FALSE)
		{
			s->len = 0;
			if (glb_cmd_qlf.ceprep_file.mvtype == MV_STR  &&  glb_cmd_qlf.ceprep_file.str.len > 0)
			{
				s->len = glb_cmd_qlf.ceprep_file.str.len;
				memcpy(s->addr, glb_cmd_qlf.ceprep_file.str.addr, s->len);
			}
		} else
			s->len = len;
	} else if (cli_negated("CE_PREPROCESS") == TRUE)
		qualif->qlf &= ~CQ_CE_PREPROCESS;
}
