fis-gtm/sr_unix_cm/rc_frmt_lck.c

92 lines
2.0 KiB
C

/****************************************************************
* *
* Copyright 2001, 2003 Sanchez Computer Associates, 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 "gdsroot.h"
#include "gdsblk.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "copy.h"
#include "rc.h"
#include "gvsub2str.h"
#ifdef __STDC__
int rc_frmt_lck(char *c, int4 max_size, unsigned char *key, short key_len, short *subcnt)
#else
int rc_frmt_lck(c, max_size, key, key_len, subcnt)
char *c;
int4 max_size;
unsigned char *key;
short key_len;
short *subcnt;
#endif
/* return a pointer that points after the last char added */
{
short t_len;
unsigned char *g, *g_top;
char *length, *start;
char buff[MAX_ZWR_KEY_SZ], *b_top, *b, *c_top, *sub_start;
c_top = c + max_size;
g = key;
g_top = g + key_len;
length = c;
c += 1;
*c++ = '^';
for (b = c ; (*c = *g++); c++)
{ ;
}
*length = (c - b) + 1;
t_len = *length;
*subcnt = 1;
if (t_len > 9) /* GT.M does not support global names > 8 chars
(one char for "^") */
return(-RC_KEYTOOLONG);
if (g >= g_top) /* no subscipts */
{ return(t_len);
}
length = c++;
for(;;)
{
*subcnt = *subcnt + 1;
/* sanity check subscript before passing to gvsub2str */
if (*g == '\0') /* not a valid number or a string */
return -RC_BADXBUF;
b_top = (char *)gvsub2str(g,(uchar_ptr_t)buff,FALSE);
sub_start = c;
for (b = buff; b < b_top;)
{ if (c >= c_top)
{
return(-RC_SUBTOOLONG);
}
*c++ = *b++;
}
if (c >= c_top)
return (-RC_SUBTOOLONG);
*length = c - sub_start;
t_len += *length;
for(; *g++ ; )
;
if (g >= g_top)
break;
length = c++;
}
return(t_len);
}