92 lines
2.0 KiB
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);
|
|
}
|
|
|