blob: 09423112b2b5c97c732429b0786a588900e70cd5 [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 "tol.h"
#include "comment.h"
#include "command.h"
#include "strings.h"
#include "parse.h"
/*
** storage for the string that signals an embedded command
*/
static char _C_cmdword[Z_WORDLEN];
/*
** storage for the command script
*/
static int _C_nextcmd = 0;
static char *_C_cmds[_C_CMDMAX];
/*
** add a string to the command buffer
*/
void
C_addcmd(str)
char *str;
{
S_savestr(&_C_cmds[_C_nextcmd++],str);
return;
}
/*
** execute a single command
*/
static void
_C_do_a_cmd(str)
char *str;
{
/*
** place holder for the beginning of the string
*/
char *beginning = str;
S_skipspace(&str);
/*
** set the command string to allow embedded commands
*/
if (!S_wordcmp(str,"command"))
{
S_nextword(&str);
if (strlen(str) >= Z_WORDLEN)
{
Z_fatal("command word is too long");
}
S_wordcpy(_C_cmdword,str);
}
/*
** set the tolerances
*/
else if (!S_wordcmp(str,"tol"))
{
S_nextword(&str);
T_tolline(str);
}
/*
** add a comment specification
*/
else if (!S_wordcmp(str,"comment"))
{
S_nextword(&str);
if (strlen(str) >= Z_WORDLEN)
{
Z_fatal("command word is too long");
}
W_addcom(str,0);
}
else if (!S_wordcmp(str,"nestcom"))
{
S_nextword(&str);
if (strlen(str) >= Z_WORDLEN)
{
Z_fatal("command word is too long");
}
W_addcom(str,1);
}
/*
** add a literal string specification
*/
else if (!S_wordcmp(str,"literal"))
{
S_nextword(&str);
if (strlen(str) >= Z_WORDLEN)
{
Z_fatal("command word is too long");
}
W_addlit(str);
}
else if (!S_wordcmp(str,"resetcomments"))
{
W_clearcoms();
}
else if (!S_wordcmp(str,"resetliterals"))
{
W_clearlits();
}
else if (!S_wordcmp(str,"beginchar"))
{
S_nextword(&str);
W_setbolchar(*str);
}
else if (!S_wordcmp(str,"endchar"))
{
S_nextword(&str);
W_seteolchar(*str);
}
else if (!S_wordcmp(str,"addalpha"))
{
S_nextword(&str);
P_addalpha(str);
}
else if ((0 == strlen(str)) || !S_wordcmp(str,"rem")
|| ('#' == *str))
{
/* do nothing */
}
else
{
(void) sprintf(Z_err_buf,
"don't understand command %s\n",
beginning);
Z_fatal(Z_err_buf);
}
return;
}
/*
** execute the commands in the command buffer
*/
void
C_docmds()
{
int i;
for (i=0;i<_C_nextcmd;i++)
{
_C_do_a_cmd(_C_cmds[i]);
}
return;
}
/*
** disable embedded command key word recognition
*/
void
C_clear_cmd()
{
_C_cmdword[0] = '\0';
return;
}
int
C_is_cmd(in_line)
char *in_line;
{
char *ptr;
/*
** see if this is a command line
** and if so, do the command right away
*/
if (('\0' != _C_cmdword[0]) && (!S_wordcmp(in_line,_C_cmdword)))
{
ptr = in_line;
S_nextword(&ptr);
_C_do_a_cmd(ptr);
return(1);
}
return(0);
}