energymech/src/alias.c

197 lines
3.6 KiB
C
Raw Normal View History

2014-03-08 19:56:21 -05:00
/*
EnergyMech, IRC bot software
Copyright (c) 1997-2004 proton
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define ALIAS_C
#include "config.h"
#ifdef ALIAS
#include "defines.h"
#include "structs.h"
#include "global.h"
#include "h.h"
#include "text.h"
#include "mcmd.h"
void afmt(char *copy_to, const char *src, const char *input)
{
#define BUFTAIL (tmp+MSGLEN-1) /* avoid buffer overflows */
char tmp[MSGLEN];
const char *np;
char *dest;
int n,t,tu,spc;
dest = tmp;
while(*src)
{
check_fmt:
if (*src == '$')
{
src++;
if (*src == '$')
goto copychar;
tu = t = n = 0;
while(attrtab[(uchar)*src] & NUM)
{
n = (n * 10) + (*(src++) - '0');
}
if (n)
{
if (*src == '-')
{
tu = n;
src++;
while(attrtab[(uchar)*src] & NUM)
{
t = (t * 10) + (*(src++) - '0');
}
}
n--;
spc = 0;
for(np=input;*np;)
{
if (*np == ' ')
{
if (!spc)
n--;
spc = 1;
}
else
{
spc = 0;
if (!n)
break;
}
np++;
}
spc = 0;
while(*np)
{
if (*np == ' ')
{
if (!tu || (t && tu >= t))
goto check_fmt;
if (!spc)
tu++;
spc = 1;
}
else
{
spc = 0;
}
if (dest == BUFTAIL)
goto afmt_escape;
*(dest++) = *(np++);
}
}
goto check_fmt;
}
copychar:
if (dest == BUFTAIL)
goto afmt_escape;
*(dest++) = *(src++);
}
afmt_escape:
*dest = 0;
Strcpy(copy_to,tmp);
}
/*
*
* associated commands
*
*/
void do_alias(COMMAND_ARGS)
{
/*
* on_msg checks: GAXS
*/
Alias *alias;
char *cmd;
if (!*rest)
{
/* list all aliases */
if (!aliaslist)
to_user(from,TEXT_NOALIASES);
else
{
if (dcc_only_command(from))
return;
to_user(from,"\037Alias\037 \037Format\037");
for(alias=aliaslist;alias;alias=alias->next)
{
to_user(from,"%-18s %s",alias->alias,alias->format);
}
}
return;
}
cmd = chop(&rest);
if (!*rest)
{
usage(from); /* usage for CurrentCmd->name */
return;
}
for(alias=aliaslist;alias;alias=alias->next)
{
if (!Strcasecmp(alias->alias,cmd))
{
Free(&alias->format);
set_mallocdoer(do_alias);
alias->format = Strdup(rest);
to_user(from,"Replaced alias: %s --> %s",cmd,rest);
return;
}
}
set_mallocdoer(do_alias);
alias = (Alias*)Calloc(sizeof(Alias)+strlen(cmd));
Strcpy(alias->alias,cmd);
set_mallocdoer(do_alias);
alias->format = Strdup(rest);
alias->next = aliaslist;
aliaslist = alias;
to_user(from,"Added alias: %s --> %s",cmd,rest);
}
void do_unalias(COMMAND_ARGS)
{
/*
* on_msg checks: GAXS + CARGS
*/
Alias *alias,**ap;
for(ap=&aliaslist;*ap;ap=&(*ap)->next)
{
if (!Strcasecmp(rest,(*ap)->alias))
{
alias = *ap;
*ap = alias->next;
to_user(from,"Removed alias: %s (--> %s)",alias->alias,alias->format);
Free(&alias->format);
Free((void*)&alias);
return;
}
}
to_user(from,"Couldnt find matching alias");
}
#endif /* ALIAS */