Files
energymech/src/lib/string.c

242 lines
3.7 KiB
C
Raw Normal View History

2018-04-04 06:00:19 +02:00
/*
EnergyMech, IRC bot software
Copyright (c) 1997-2018 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 STRING_C
#include "config.h"
2018-04-04 06:04:58 +02:00
2018-04-04 06:00:19 +02:00
#include "defines.h"
#include "structs.h"
#include "global.h"
#include "h.h"
/*
* returns NULL or non-zero length string
* callers responsibility that src is not NULL
*/
char *chop(char **src)
{
char *tok,*cut = *src;
while(*cut && *cut == ' ')
cut++;
if (*cut)
{
tok = cut;
while(*cut && *cut != ' ')
cut++;
*src = cut;
while(*cut && *cut == ' ')
cut++;
**src = 0;
*src = cut;
}
else
{
tok = NULL;
}
return(tok);
}
/*
* remove all '\0' in an array bounded by two pointers
*/
void unchop(char *orig, const char *rest)
{
for(;orig<rest;orig++)
{
if (*orig == 0)
*orig = ' ';
}
}
int stringcasecmp(const char *p1, const char *p2)
{
int ret;
if (p1 != p2)
{
while(!(ret = tolowertab[(uchar)*(p1++)] - tolowertab[(uchar)*p2]) && *(p2++))
;
return(ret);
}
return(0);
}
int stringcmp(const char *p1, const char *p2)
{
int ret;
if (p1 != p2)
{
while(!(ret = *(p1++) - *p2) && *(p2++))
;
return(ret);
}
return(0);
}
int nickcmp(const char *p1, const char *p2)
{
int ret;
int c;
if (p1 != p2)
{
while(!(ret = nickcmptab[(uchar)*(p1++)] - (c = nickcmptab[(uchar)*(p2++)])) && c)
;
return(ret);
}
return(0);
}
char *nickcpy(char *dest, const char *nuh)
{
char *ret;
if (!dest)
dest = nick_buf;
ret = dest;
while(*nuh && (*nuh != '!'))
*(dest++) = *(nuh++);
*dest = 0;
return(ret);
}
void stringcpy_n(char *dst, const char *src, int sz)
{
int n = 0;
while(src[n] && n<sz)
{
dst[n] = src[n];
n++;
}
dst[n] = 0;
/*
char *stop = dst + sz - 1;
while(*src)
{
*(dst++) = *(src++);
if (dst == stop)
break;
}
*dst = 0;
*/
}
char *stringcpy(char *dst, const char *src)
{
int n = 0;
while(src[n])
{
dst[n] = src[n];
n++;
}
dst[n] = 0;
return(dst+n);
}
char *stringchr(const char *t, int c)
{
char ch = c;
while(*t != ch && *t)
t++;
return((*t == ch) ? (char*)t : NULL);
}
char *stringdup(const char *src)
{
char *dest;
#ifdef TEST
dest = (char*)calloc(1,strlen(src)+1);
#else
dest = (char*)Calloc(strlen(src)+1);
#endif
stringcpy(dest,src);
return(dest);
}
const int StrlenX(const char *first, ...)
{
const char *s,*o;
int n;
va_list vlist;
va_start(vlist,first);
n = 0;
o = s = first;
do
{
while(*s)
s++;
n += (s - o);
s = o = va_arg(vlist,const char *);
}
while(s);
va_end(vlist);
return(n);
}
/*
* combined length of two strings
* both strings must be non-NULL, caller is responsible
*/
const int Strlen2(const char *one, const char *two)
{
const char *s1,*s2;
for(s1=one;*s1;s1++);
for(s2=two;*s2;s2++);
return((s1 - one) + (s2 - two));
}
/*
* This code might look odd but its optimized for size,
* so dont change it!
*/
char *stringcat(char *dst, const char *src)
{
while(*(dst++))
;
--dst;
while((*(dst++) = *(src++)) != 0)
;
return(dst-1);
}
char *tolowercat(char *dest, const char *src)
{
dest = STREND(dest);
while(*src)
*(dest++) = (char)tolowertab[(uchar)*(src++)];
return(dest);
}