version 1.1, 2012/02/21 23:32:47
|
version 1.1.1.2, 2021/03/17 00:39:23
|
Line 100
|
Line 100
|
u_char exact:1; /* true if this is an exact match */ |
u_char exact:1; /* true if this is an exact match */ |
union { |
union { |
struct cm_exact { |
struct cm_exact { |
char *pat; /* exact string to match */ | char *pat; /* exact string to match */ |
u_short *fail; /* failure function */ |
u_short *fail; /* failure function */ |
u_int matched; /* number of chars matched so far */ |
u_int matched; /* number of chars matched so far */ |
} exact; |
} exact; |
Line 178
|
Line 178
|
{ NOTHING, CMD_NOTHING, 1, 1 }, |
{ NOTHING, CMD_NOTHING, 1, 1 }, |
}; |
}; |
|
|
#define CHAT_NUM_COMMANDS (sizeof(gCmds) / sizeof(*gCmds)) | #define CHAT_NUM_COMMANDS ((int)(sizeof(gCmds) / sizeof(*gCmds))) |
|
|
/* |
/* |
* INTERNAL FUNCTIONS |
* INTERNAL FUNCTIONS |
Line 191
|
Line 191
|
static void ChatCancel(ChatInfo c, const char *set); |
static void ChatCancel(ChatInfo c, const char *set); |
static int ChatGoto(ChatInfo c, const char *label); |
static int ChatGoto(ChatInfo c, const char *label); |
static void ChatCall(ChatInfo c, const char *label); |
static void ChatCall(ChatInfo c, const char *label); |
static void ChatLog(ChatInfo c, int code, const char *string); | static void ChatLog(ChatInfo c, const char *string); |
static void ChatPrint(ChatInfo c, const char *string); |
static void ChatPrint(ChatInfo c, const char *string); |
static void ChatReturn(ChatInfo c, int seek); |
static void ChatReturn(ChatInfo c, int seek); |
static void ChatRun(ChatInfo c); |
static void ChatRun(ChatInfo c); |
Line 214
|
Line 214
|
static int ChatVarExtract(const char *string, |
static int ChatVarExtract(const char *string, |
char *buf, int max, int strict); |
char *buf, int max, int strict); |
|
|
static void ChatFreeMatch(ChatInfo c, ChatMatch match); | static void ChatFreeMatch(ChatMatch match); |
static void ChatFreeTimer(ChatInfo c, ChatTimer timer); | static void ChatFreeTimer(ChatTimer timer); |
static int ChatMatchChar(struct cm_exact *ex, char ch); |
static int ChatMatchChar(struct cm_exact *ex, char ch); |
static int ChatMatchRegex(ChatInfo c, regex_t *reg, const char *input); |
static int ChatMatchRegex(ChatInfo c, regex_t *reg, const char *input); |
static void ChatSetMatchVars(ChatInfo c, int exact, const char *input, ...); |
static void ChatSetMatchVars(ChatInfo c, int exact, const char *input, ...); |
static void ChatComputeFailure(ChatInfo c, struct cm_exact *ex); | static void ChatComputeFailure(struct cm_exact *ex); |
|
|
static int ChatDecodeTime(ChatInfo c, char *string, u_int *secsp); | static int ChatDecodeTime(ChatInfo c, const char *string, u_int *secsp); |
static int ChatSetBaudrate(ChatInfo c, const char *new); |
static int ChatSetBaudrate(ChatInfo c, const char *new); |
static char *ChatExpandString(ChatInfo c, const char *string); |
static char *ChatExpandString(ChatInfo c, const char *string); |
|
|
static char *ChatReadLine(ChatInfo c); |
static char *ChatReadLine(ChatInfo c); |
static int ChatParseLine(ChatInfo c, char *line, char *av[], int max); | static int ChatParseLine(char *line, char *av[], int max); |
static int ChatSeekToLabel(ChatInfo c, const char *label); |
static int ChatSeekToLabel(ChatInfo c, const char *label); |
static void ChatDumpBuf(ChatInfo c, const char *buf, |
static void ChatDumpBuf(ChatInfo c, const char *buf, |
int len, const char *fmt, ...); |
int len, const char *fmt, ...); |
Line 360 ChatRead(int type, void *cookie)
|
Line 360 ChatRead(int type, void *cookie)
|
{ |
{ |
ChatInfo const c = (ChatInfo) cookie; |
ChatInfo const c = (ChatInfo) cookie; |
ChatMatch match; |
ChatMatch match; |
int nread, lineBufLen; | size_t lineBufLen; |
| int nread; |
char ch; |
char ch; |
Link const l = (Link) c->arg; |
Link const l = (Link) c->arg; |
|
|
/* Sanity */ |
/* Sanity */ |
|
|
assert(c->state == CHAT_WAIT); |
assert(c->state == CHAT_WAIT); |
|
(void)type; |
|
|
/* Process one byte at a time */ |
/* Process one byte at a time */ |
|
|
Line 497 ChatTimeout(int type, void *cookie)
|
Line 499 ChatTimeout(int type, void *cookie)
|
/* Sanity */ |
/* Sanity */ |
|
|
assert(c->state == CHAT_WAIT); |
assert(c->state == CHAT_WAIT); |
| (void)type; |
/* Locate timer in list */ |
/* Locate timer in list */ |
|
|
for (tp = &c->timers; *tp != timer; tp = &(*tp)->next); |
for (tp = &c->timers; *tp != timer; tp = &(*tp)->next); |
Line 559 ChatRun(ChatInfo c)
|
Line 561 ChatRun(ChatInfo c)
|
|
|
/* Parse out line */ |
/* Parse out line */ |
|
|
ac = ChatParseLine(c, line, av, CHAT_MAX_ARGS); | ac = ChatParseLine(line, av, CHAT_MAX_ARGS); |
Freee(line); |
Freee(line); |
|
|
/* Do command */ |
/* Do command */ |
Line 733 ChatDoCmd(ChatInfo c, int ac, char *av[])
|
Line 735 ChatDoCmd(ChatInfo c, int ac, char *av[])
|
break; |
break; |
|
|
case CMD_LOG: |
case CMD_LOG: |
ChatLog(c, 0, av[1]); | ChatLog(c, av[1]); |
break; |
break; |
|
|
case CMD_RETURN: |
case CMD_RETURN: |
Line 916 ChatAddMatch(ChatInfo c, int exact, const char *set,
|
Line 918 ChatAddMatch(ChatInfo c, int exact, const char *set,
|
if (exact) { |
if (exact) { |
match->u.exact.pat = pat; |
match->u.exact.pat = pat; |
match->u.exact.matched = 0; |
match->u.exact.matched = 0; |
ChatComputeFailure(c, &match->u.exact); | ChatComputeFailure(&match->u.exact); |
} else { |
} else { |
int errcode; |
int errcode; |
char errbuf[100]; |
char errbuf[100]; |
Line 991 ChatCancel(ChatInfo c, const char *set0)
|
Line 993 ChatCancel(ChatInfo c, const char *set0)
|
for (mp = &c->matches; (match = *mp) != NULL; ) { |
for (mp = &c->matches; (match = *mp) != NULL; ) { |
if (all || !strcmp(match->set, set)) { |
if (all || !strcmp(match->set, set)) { |
*mp = match->next; |
*mp = match->next; |
ChatFreeMatch(c, match); | ChatFreeMatch(match); |
} else |
} else |
mp = &match->next; |
mp = &match->next; |
} |
} |
Line 1001 ChatCancel(ChatInfo c, const char *set0)
|
Line 1003 ChatCancel(ChatInfo c, const char *set0)
|
for (tp = &c->timers; (timer = *tp) != NULL; ) { |
for (tp = &c->timers; (timer = *tp) != NULL; ) { |
if (all || !strcmp(timer->set, set)) { |
if (all || !strcmp(timer->set, set)) { |
*tp = timer->next; |
*tp = timer->next; |
ChatFreeTimer(c, timer); | ChatFreeTimer(timer); |
} else |
} else |
tp = &timer->next; |
tp = &timer->next; |
} |
} |
Line 1125 ChatReturn(ChatInfo c, int seek)
|
Line 1127 ChatReturn(ChatInfo c, int seek)
|
for (mp = &c->matches; (match = *mp) != NULL; ) { |
for (mp = &c->matches; (match = *mp) != NULL; ) { |
if (--match->frameDepth < 0) { |
if (--match->frameDepth < 0) { |
*mp = match->next; |
*mp = match->next; |
ChatFreeMatch(c, match); | ChatFreeMatch(match); |
} else |
} else |
mp = &match->next; |
mp = &match->next; |
} |
} |
for (tp = &c->timers; (timer = *tp) != NULL; ) { |
for (tp = &c->timers; (timer = *tp) != NULL; ) { |
if (--timer->frameDepth < 0) { |
if (--timer->frameDepth < 0) { |
*tp = timer->next; |
*tp = timer->next; |
ChatFreeTimer(c, timer); | ChatFreeTimer(timer); |
} else |
} else |
tp = &timer->next; |
tp = &timer->next; |
} |
} |
Line 1143 ChatReturn(ChatInfo c, int seek)
|
Line 1145 ChatReturn(ChatInfo c, int seek)
|
*/ |
*/ |
|
|
static void |
static void |
ChatLog(ChatInfo c, int code, const char *string) | ChatLog(ChatInfo c, const char *string) |
{ |
{ |
char *exp_string; |
char *exp_string; |
Link const l = (Link) c->arg; |
Link const l = (Link) c->arg; |
Line 1199 ChatWrite(int type, void *cookie)
|
Line 1201 ChatWrite(int type, void *cookie)
|
int nw; |
int nw; |
Link const l = (Link) c->arg; |
Link const l = (Link) c->arg; |
|
|
/* Write as much as we can */ |
|
|
|
assert(c->out != NULL && c->outLen > 0); |
assert(c->out != NULL && c->outLen > 0); |
|
(void)type; |
|
|
|
/* Write as much as we can */ |
if ((nw = write(c->fd, c->out, c->outLen)) < 0) { |
if ((nw = write(c->fd, c->out, c->outLen)) < 0) { |
if (errno == EAGAIN) |
if (errno == EAGAIN) |
return; |
return; |
Line 1375 ChatVarExtract(const char *string, char *buf, int max,
|
Line 1378 ChatVarExtract(const char *string, char *buf, int max,
|
*/ |
*/ |
|
|
static void |
static void |
ChatFreeMatch(ChatInfo c, ChatMatch match) | ChatFreeMatch(ChatMatch match) |
{ |
{ |
Freee(match->set); |
Freee(match->set); |
Freee(match->label); |
Freee(match->label); |
Line 1393 ChatFreeMatch(ChatInfo c, ChatMatch match)
|
Line 1396 ChatFreeMatch(ChatInfo c, ChatMatch match)
|
*/ |
*/ |
|
|
static void |
static void |
ChatFreeTimer(ChatInfo c, ChatTimer timer) | ChatFreeTimer(ChatTimer timer) |
{ |
{ |
EventUnRegister(&timer->event); |
EventUnRegister(&timer->event); |
Freee(timer->set); |
Freee(timer->set); |
Line 1580 ChatSetMatchVars(ChatInfo c, int exact, const char *in
|
Line 1583 ChatSetMatchVars(ChatInfo c, int exact, const char *in
|
static int |
static int |
ChatMatchChar(struct cm_exact *ex, char ch) |
ChatMatchChar(struct cm_exact *ex, char ch) |
{ |
{ |
const int len = strlen(ex->pat); | const u_int len = strlen(ex->pat); |
|
|
/* Account for zero length pattern string -- match on next input char */ |
/* Account for zero length pattern string -- match on next input char */ |
if (len == 0) |
if (len == 0) |
Line 1640 ChatMatchRegex(ChatInfo c, regex_t *reg, const char *i
|
Line 1643 ChatMatchRegex(ChatInfo c, regex_t *reg, const char *i
|
*/ |
*/ |
|
|
static void |
static void |
ChatComputeFailure(ChatInfo c, struct cm_exact *ex) | ChatComputeFailure(struct cm_exact *ex) |
{ |
{ |
const int len = strlen(ex->pat); |
const int len = strlen(ex->pat); |
int i, j, k; |
int i, j, k; |
Line 1662 ChatComputeFailure(ChatInfo c, struct cm_exact *ex)
|
Line 1665 ChatComputeFailure(ChatInfo c, struct cm_exact *ex)
|
*/ |
*/ |
|
|
static int |
static int |
ChatDecodeTime(ChatInfo c, char *string, u_int *secsp) | ChatDecodeTime(ChatInfo c, const char *string, u_int *secsp) |
{ |
{ |
u_long secs; |
u_long secs; |
char *secstr, *mark; |
char *secstr, *mark; |
Line 1695 ChatReadLine(ChatInfo c)
|
Line 1698 ChatReadLine(ChatInfo c)
|
*/ |
*/ |
|
|
static int |
static int |
ChatParseLine(ChatInfo c, char *line, char *av[], int max) | ChatParseLine(char *line, char *av[], int max) |
{ |
{ |
return ParseLine(line, av, max, 1); |
return ParseLine(line, av, max, 1); |
} |
} |