blob: 8f2e22d8275632d80ae3edf25fc9f7f8eae57c2a [file] [log] [blame]
/* Copyright (c) 1988 Bellcore
** All Rights Reserved
** Permission is granted to copy or use this program, EXCEPT that it
** may not be sold for profit, the copyright notice must be reproduced
** on copies, and credit should be given to Bellcore where it is due.
** BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
*/
#ifndef lint
static char rcsid[]= "$Header$";
#endif
#include "misc.h"
#include "comment.h"
#include "strings.h"
/*
** storage for the comment specifiers that can appear
** anywhere on a line
*/
static int _W_nextcom = 0;
_W_comstruct _W_coms[_W_COMMAX];
/*
** storage for comment specifiers that are examined only at the
** beginning of each line
*/
static int _W_nextbol = 0;
_W_bolstruct _W_bols[_W_BOLMAX];
/*
** storage for delimiters of literal strings
*/
static int _W_nextlit = 0;
_W_litstruct _W_lits[_W_LITMAX];
/*
** storage for characters to specify beginning and end of line
** in the comment and literal commands
*/
char _W_bolchar = '^';
char _W_eolchar = '$';
/*
** build up a list of comment delimiters
*/
void
W_addcom(str,nestflag)
char *str;
int nestflag;
{
/*
** check for comments that begin at the beginning of line
*/
if (*str == _W_bolchar)
{
if (_W_nextbol >= _W_BOLMAX)
Z_fatal("too many beginning of line comment delimiter sets");
str++; /*skip the bol char */
S_wordcpy(_W_bols[_W_nextbol].begin,str);
S_nextword(&str);
if (*str == _W_eolchar)
{
(void) strcpy(_W_bols[_W_nextbol].end,"\n");
}
else
{
S_wordcpy(_W_bols[_W_nextbol].end,str);
}
S_nextword(&str);
S_wordcpy(_W_bols[_W_nextbol].escape,str);
/*
**
*/
if (nestflag)
Z_complain("begining of line comment won't nest");
_W_nextbol++;
}
else
{
if (_W_nextcom >= _W_COMMAX)
Z_fatal("too many comment delimiter sets");
S_wordcpy(_W_coms[_W_nextcom].begin,str);
S_nextword(&str);
if (*str == _W_eolchar)
{
(void) strcpy(_W_coms[_W_nextbol].end,"\n");
}
else
{
S_wordcpy(_W_coms[_W_nextbol].end,str);
}
S_nextword(&str);
S_wordcpy(_W_coms[_W_nextcom].escape,str);
_W_coms[_W_nextcom].nestbit = nestflag;
_W_nextcom++;
}
return;
}
/*
** clear the comment delimiter storage
*/
void
W_clearcoms()
{
_W_nextcom = 0;
_W_nextbol = 0;
return;
}
/*
** build up the list of literal delimiters
*/
void
W_addlit(str)
char *str;
{
if (_W_nextlit >= _W_LITMAX)
Z_fatal("too many literal delimiter sets");
S_wordcpy(_W_lits[_W_nextlit].begin,str);
S_nextword(&str);
S_wordcpy(_W_lits[_W_nextlit].end,str);
S_nextword(&str);
S_wordcpy(_W_lits[_W_nextlit].escape,str);
_W_nextlit++;
return;
}
/*
** clear the literal delimiter storage
*/
void
W_clearlits()
{
_W_nextlit = 0;
return;
}
static _W_bolstruct bol_scratch;
static void
_W_copybol(to,from)
W_bol to,from;
{
(void) strcpy(to->begin,from->begin);
(void) strcpy(to->end,from->end);
(void) strcpy(to->escape,from->escape);
}
W_bol
W_isbol(str)
char *str;
{
int i;
for(i=0;i<_W_nextbol;i++)
{
if(!S_wordcmp(str,_W_bols[i].begin))
{
_W_copybol(&bol_scratch,&_W_bols[i]);
return(&bol_scratch);
}
}
return(W_BOLNULL);
}
int
W_is_bol(ptr)
W_bol ptr;
{
int i;
for(i=0;i<_W_nextbol;i++)
{
if(!S_wordcmp(ptr->begin,_W_bols[i].begin) &&
!S_wordcmp(ptr->end,_W_bols[i].end) &&
!S_wordcmp(ptr->escape,_W_bols[i].escape))
{
return(1);
}
}
return(0);
}
static _W_litstruct lit_scratch;
static void
_W_copylit(to,from)
W_lit to,from;
{
(void) strcpy(to->begin,from->begin);
(void) strcpy(to->end,from->end);
(void) strcpy(to->escape,from->escape);
}
W_lit
W_islit(str)
char *str;
{
int i;
for(i=0;i<_W_nextlit;i++)
{
if(!S_wordcmp(str,_W_lits[i].begin))
{
_W_copylit(&lit_scratch,&_W_lits[i]);
return(&lit_scratch);
}
}
return(W_LITNULL);
}
int
W_is_lit(ptr)
W_lit ptr;
{
int i;
for(i=0;i<_W_nextlit;i++)
{
if(!S_wordcmp(ptr->begin,_W_lits[i].begin) &&
!S_wordcmp(ptr->end,_W_lits[i].end) &&
!S_wordcmp(ptr->escape,_W_lits[i].escape))
{
return(1);
}
}
return(0);
}
static _W_comstruct com_scratch;
static void
_W_copycom(to,from)
W_com to,from;
{
(void) strcpy(to->begin,from->begin);
(void) strcpy(to->end,from->end);
(void) strcpy(to->escape,from->escape);
to->nestbit = from->nestbit;
}
W_com
W_iscom(str)
char *str;
{
int i;
for(i=0;i<_W_nextcom;i++)
{
if(!S_wordcmp(str,_W_coms[i].begin))
{
_W_copycom(&com_scratch,&_W_coms[i]);
return(&com_scratch);
}
}
return(W_COMNULL);
}
int
W_is_com(ptr)
W_com ptr;
{
int i;
for(i=0;i<_W_nextcom;i++)
{
if(!S_wordcmp(ptr->begin,_W_coms[i].begin) &&
!S_wordcmp(ptr->end,_W_coms[i].end) &&
!S_wordcmp(ptr->escape,_W_coms[i].escape) &&
ptr->nestbit == _W_coms[i].nestbit)
{
return(1);
}
}
return(0);
}
int
W_is_nesting(ptr)
W_com ptr;
{
return(ptr->nestbit);
}