File: op_fnzwrite.c

package info (click to toggle)
fis-gtm 6.3-007-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 36,284 kB
  • sloc: ansic: 328,861; asm: 5,182; csh: 5,102; sh: 1,918; awk: 291; makefile: 69; sed: 13
file content (57 lines) | stat: -rw-r--r-- 1,761 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/****************************************************************
 *								*
 * Copyright (c) 2012-2019 Fidelity National Information	*
 * Services, Inc. and/or its subsidiaries. All rights reserved.	*
 *								*
 *	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 "stringpool.h"
#include "op.h"
#include "zshow.h"

error_def(ERR_MAXSTRLEN);

/* Routine to return a string in zwrite format */
void op_fnzwrite(boolean_t direction, mval* src, mval* dst)
{
	boolean_t	ok;
	int		dst_len, str_len;
	mstr		tmp_mstr;

	MV_FORCE_STR(src);
	if MV_IS_CANONICAL(src)
		*dst = *src;
	else
	{
		str_len = direction ? src->str.len : ZWR_EXP_RATIO(src->str.len);
		ENSURE_STP_FREE_SPACE((int)str_len);
		DBG_MARK_STRINGPOOL_UNEXPANDABLE;
		if (direction)
		{
			tmp_mstr.addr = (char *)stringpool.free;
			ok = zwr2format(&src->str, &tmp_mstr);
			dst_len = ok ? tmp_mstr.len : 0;
			dst->str.addr = tmp_mstr.addr;
			DBG_MARK_STRINGPOOL_EXPANDABLE;
		} else
		{
			dst_len = str_len;
			format2zwr((sm_uc_ptr_t)src->str.addr, src->str.len, (uchar_ptr_t)stringpool.free, &dst_len);
			DBG_MARK_STRINGPOOL_EXPANDABLE;
			if (MAX_STRLEN < dst_len)
				rts_error_csa(NULL, VARLSTCNT(1) ERR_MAXSTRLEN);
			dst->str.addr = (char *)stringpool.free;	/* deferred in case dst == str */
		}
		dst->str.len = dst_len;
		dst->mvtype = MV_STR;
		assert((unsigned char *)(dst->str.addr + dst_len) <= stringpool.top);
		stringpool.free = (unsigned char *)(dst->str.addr + dst_len);
	}
}