146 lines
3.4 KiB
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;
|
|
}
|