/* 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); }