fis-gtm/sr_port/lb_init.c

146 lines
3.4 KiB
C

/****************************************************************
* *
* Copyright 2001, 2011 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 "compiler.h"
#include "toktyp.h"
#include "comp_esc.h"
#include "advancewindow.h"
#include "lb_init.h"
GBLREF unsigned char *source_buffer;
GBLREF char *lexical_ptr;
GBLREF struct ce_sentinel_desc *ce_def_list;
error_def(ERR_CETOOMANY);
LITREF char ctypetab[NUM_CHARS];
#define MAX_SUBSTITUTIONS 1024
void lb_init(void)
{
int num_subs, y;
short int sav_last_src_col, source_col;
int4 source_len, skip_count;
unsigned char *cp, *cp1;
bool possible_sentinel;
struct ce_sentinel_desc *shp;
# ifdef DEBUG
unsigned char original_source[MAX_SRCLINE];
# endif
DCL_THREADGBL_ACCESS;
SETUP_THREADGBL_ACCESS;
if (NULL != ce_def_list)
{
for (source_len = 0; '\0' != source_buffer[source_len]; source_len++);
# ifdef DEBUG
memcpy (original_source, source_buffer, source_len + 2); /* include terminating null characters */
# endif
source_col = 1;
num_subs = 0;
cp = source_buffer;
possible_sentinel = TRUE;
while (possible_sentinel && source_buffer[source_col - 1])
{
possible_sentinel = FALSE;
cp = source_buffer + source_col - 1;
if (DEL < *cp)
break;
if ('\"' == *cp)
{
for (cp1 = cp + 1; ; )
{
if (SP > *cp1)
break;
if ('\"' == *cp1++)
{
if ('\"' == *cp1)
cp1++; /* escaped quotation mark inside string */
else
break; /* end of string */
}
}
source_col += (cp1 - cp);
cp = cp1;
if ('\0' == *cp)
break;
} else if ('?' == *cp)
{
for (cp1 = cp + 1; ; )
{
if (NUM_ASCII_CHARS <= *cp1)
break;
y = ctypetab[*cp1];
if ((TK_UPPER == y) || (TK_LOWER == y) || (TK_DIGIT == y) || (TK_PERIOD == y)
|| (TK_ATSIGN == y))
cp1++;
else if ('\"' == *cp1) /* quoted string in pattern */
{
for (cp1++; ; )
{
if (SP > *cp1)
break;
if ('\"' == *cp1)
{
cp1++;
if ('\"' == *cp1) /* escaped quotation mark in string */
cp1++;
else /* character following string */
break;
} else
cp1++;
}
} else
break;
}
source_col += (cp1 - cp);
cp = cp1;
if ('\0' == *cp)
break;
}
for (shp = ce_def_list; NULL != shp; shp = shp->next)
{
if (0 == memcmp(cp, shp->escape_sentinel, shp->escape_length))
{
ce_substitute (shp, source_col, &skip_count);
num_subs++;
if (MAX_SUBSTITUTIONS >= num_subs)
{
if (0 < skip_count) /* a substitution occurred */
possible_sentinel = TRUE;
} else
{
sav_last_src_col = TREF(last_source_column);
TREF(last_source_column) = source_col;
stx_error (ERR_CETOOMANY);
TREF(last_source_column) = sav_last_src_col;
}
break;
}
}
if (!possible_sentinel)
{ /* in this column */
source_col++;
possible_sentinel = TRUE; /* next column may have sentinel */
}
}
}
lexical_ptr = (char *)source_buffer;
advancewindow();
advancewindow();
return;
}