418 lines
7.2 KiB
C
418 lines
7.2 KiB
C
|
/*****************************************************************************
|
|||
|
*
|
|||
|
* $Id: strutil.c,v 1.16 2007/08/22 21:09:24 mbse Exp $
|
|||
|
* Purpose ...............: Common string functions
|
|||
|
*
|
|||
|
*****************************************************************************
|
|||
|
* Copyright (C) 1997-2007
|
|||
|
*
|
|||
|
* Michiel Broek FIDO: 2:280/2802
|
|||
|
* Beekmansbos 10
|
|||
|
* 1971 BV IJmuiden
|
|||
|
* the Netherlands
|
|||
|
*
|
|||
|
* This file is part of MBSE BBS.
|
|||
|
*
|
|||
|
* This BBS 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, or (at your option) any
|
|||
|
* later version.
|
|||
|
*
|
|||
|
* MB BBS 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 MB BBS; see the file COPYING. If not, write to the Free
|
|||
|
* Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|||
|
*****************************************************************************/
|
|||
|
|
|||
|
#include "../config.h"
|
|||
|
#include "mbselib.h"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
char *padleft(char *str, int size, char pad)
|
|||
|
{
|
|||
|
static char stri[256];
|
|||
|
static char temp[256];
|
|||
|
|
|||
|
strcpy(stri, str);
|
|||
|
memset(temp, pad, (size_t)size);
|
|||
|
temp[size] = '\0';
|
|||
|
if (strlen(stri) <= size)
|
|||
|
memmove(temp, stri, (size_t)strlen(stri));
|
|||
|
else
|
|||
|
memmove(temp, stri, (size_t)size);
|
|||
|
return temp;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Small function to convert String to LowerCase
|
|||
|
*/
|
|||
|
char *tl(char *str)
|
|||
|
{
|
|||
|
char *p = str;
|
|||
|
|
|||
|
while (*p != '\0') {
|
|||
|
*p = (char)tolower(*p);
|
|||
|
p++;
|
|||
|
}
|
|||
|
|
|||
|
return str;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void Striplf(char *String)
|
|||
|
{
|
|||
|
int i;
|
|||
|
|
|||
|
for(i = 0; i < strlen(String); i++) {
|
|||
|
if(*(String + i) == '\0')
|
|||
|
break;
|
|||
|
if(*(String + i) == '\n')
|
|||
|
*(String + i) = '\0';
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void mbse_CleanSubject(char *String)
|
|||
|
{
|
|||
|
int i, fixed = FALSE;
|
|||
|
|
|||
|
i = strlen(String) -1;
|
|||
|
|
|||
|
while ((isspace(String[i])) && i) {
|
|||
|
String[i] = '\0';
|
|||
|
i--;
|
|||
|
fixed = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
if ((strncasecmp(String, "Re: ", 4) == 0) && (strncmp(String, "Re: ", 4))) {
|
|||
|
/*
|
|||
|
* Fix Re:
|
|||
|
*/
|
|||
|
String[0] = 'R';
|
|||
|
String[1] = 'e';
|
|||
|
String[2] = ':';
|
|||
|
String[3] = ' ';
|
|||
|
fixed = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
if (fixed)
|
|||
|
Syslog('m', "Fixed subj: \"%s\"", printable(String, 0));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Converts first letter to UpperCase
|
|||
|
*/
|
|||
|
void tlf(char *str)
|
|||
|
{
|
|||
|
*(str) = toupper(*(str));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Small function to convert String to UpperCase
|
|||
|
*/
|
|||
|
char *tu(char *str)
|
|||
|
{
|
|||
|
char *p = str;
|
|||
|
|
|||
|
while (*p != '\0') {
|
|||
|
*p = (char)toupper(*p);
|
|||
|
p++;
|
|||
|
}
|
|||
|
|
|||
|
return str;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Converts the first letter in every word in a string to uppercase,
|
|||
|
* all other character will be lowercase. Will handle the notation
|
|||
|
* Bob Ten.Dolle as well
|
|||
|
*/
|
|||
|
char *tlcap(char *String)
|
|||
|
{
|
|||
|
static char stri[256];
|
|||
|
int Loop, Strlen;
|
|||
|
|
|||
|
strcpy(stri, String);
|
|||
|
Strlen = strlen(stri);
|
|||
|
|
|||
|
/*
|
|||
|
* Automatic do the first character
|
|||
|
*/
|
|||
|
stri[0] = toupper(stri[0]);
|
|||
|
|
|||
|
for(Loop = 1; Loop < Strlen; Loop++) {
|
|||
|
stri[Loop] = tolower(stri[Loop]);
|
|||
|
if (( stri[Loop] == ' ') || (stri[Loop] == '.')) {
|
|||
|
/*
|
|||
|
* This is a space charracter, increase the counter
|
|||
|
* and convert the next character to uppercase.
|
|||
|
*/
|
|||
|
Loop++;
|
|||
|
stri[Loop] = toupper(stri[Loop]);
|
|||
|
}
|
|||
|
}
|
|||
|
return stri;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Hilite "Word" in string, this is done by inserting ANSI
|
|||
|
* Hilite characters in the string.
|
|||
|
*/
|
|||
|
char *Hilite(char *str, char *Word)
|
|||
|
{
|
|||
|
char *pos;
|
|||
|
char *new;
|
|||
|
char *old;
|
|||
|
int t;
|
|||
|
|
|||
|
new = strdup(str);
|
|||
|
old = strdup(str);
|
|||
|
tl(new);
|
|||
|
|
|||
|
if ((pos = strstr(new,Word)) == NULL)
|
|||
|
return(str);
|
|||
|
|
|||
|
str = realloc(str,strlen(new)+200);
|
|||
|
strcpy(str,"\0");
|
|||
|
|
|||
|
while (( pos = strstr(new,Word)) != NULL) {
|
|||
|
*pos = '\0';
|
|||
|
t = strlen(new);
|
|||
|
strncat(str,old,t);
|
|||
|
strcat(str,"[1;37m");
|
|||
|
old+=t;
|
|||
|
strncat(str,old,strlen(Word));
|
|||
|
strcat(str,"[0;37m");
|
|||
|
old+=strlen(Word);
|
|||
|
new = new+t+strlen(Word);
|
|||
|
}
|
|||
|
strcat(str,old);
|
|||
|
return(str);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Replace spaces is a string with underscore characters.
|
|||
|
*/
|
|||
|
void Addunderscore(char *temp)
|
|||
|
{
|
|||
|
int i;
|
|||
|
|
|||
|
for(i = 0; i < strlen(temp); i++) {
|
|||
|
if (*(temp + i) == '\0')
|
|||
|
break;
|
|||
|
if (*(temp + i) == ' ')
|
|||
|
*(temp + i) = '_';
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Find & Replace string in a string
|
|||
|
*/
|
|||
|
void strreplace(char *sStr, char *sFind, char *sReplace)
|
|||
|
{
|
|||
|
char sNewstr[81]="";
|
|||
|
char *posStr, *posFind;
|
|||
|
int iPos, iLen, iCounter;
|
|||
|
|
|||
|
posStr=sStr;
|
|||
|
if(( posFind = strstr(sStr, sFind)) != NULL) {
|
|||
|
iPos = (int)(posFind - posStr);
|
|||
|
strncpy(sNewstr, sStr, iPos);
|
|||
|
strcat(sNewstr, sReplace);
|
|||
|
iPos+= strlen(sFind);
|
|||
|
iLen = strlen(sNewstr);
|
|||
|
for (iCounter=0; iCounter < (strlen(sStr) - iPos); iCounter++)
|
|||
|
sNewstr[iCounter + iLen] = sStr[iCounter + iPos];
|
|||
|
sNewstr[iCounter+1+iLen] = '\0';
|
|||
|
strcpy(sStr, sNewstr);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Converts to HH:MM
|
|||
|
*/
|
|||
|
char *StrTimeHM(time_t date)
|
|||
|
{
|
|||
|
static char ttime[6];
|
|||
|
struct tm *l_d;
|
|||
|
|
|||
|
l_d = localtime(&date);
|
|||
|
snprintf(ttime, 6, "%02d:%02d", l_d->tm_hour, l_d->tm_min);
|
|||
|
return ttime;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Returns HH:MM:SS
|
|||
|
*/
|
|||
|
char *StrTimeHMS(time_t date)
|
|||
|
{
|
|||
|
static char ttime[9];
|
|||
|
struct tm *l_d;
|
|||
|
|
|||
|
l_d = localtime(&date);
|
|||
|
snprintf(ttime, 9, "%02d:%02d:%02d", l_d->tm_hour, l_d->tm_min, l_d->tm_sec);
|
|||
|
return ttime;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Get the current local time, returns HH:MM
|
|||
|
*/
|
|||
|
char *GetLocalHM()
|
|||
|
{
|
|||
|
static char gettime[15];
|
|||
|
time_t T_Now;
|
|||
|
|
|||
|
T_Now = time(NULL);
|
|||
|
snprintf(gettime, 15, "%s", StrTimeHM(T_Now));
|
|||
|
return(gettime);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Get the current local time, returns HH:MM:SS
|
|||
|
*/
|
|||
|
char *GetLocalHMS()
|
|||
|
{
|
|||
|
static char gettime[15];
|
|||
|
time_t T_Now;
|
|||
|
|
|||
|
T_Now = time(NULL);
|
|||
|
snprintf(gettime, 15, "%s", StrTimeHMS(T_Now));
|
|||
|
return(gettime);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Returns date as MM-DD-YYYY
|
|||
|
*/
|
|||
|
char *StrDateMDY(time_t *Clock)
|
|||
|
{
|
|||
|
struct tm *tm;
|
|||
|
static char cdate[12];
|
|||
|
|
|||
|
tm = localtime(Clock);
|
|||
|
snprintf(cdate, 12, "%02d-%02d-%04d", tm->tm_mon+1, tm->tm_mday, tm->tm_year+1900);
|
|||
|
return(cdate);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Returns DD-MM-YYYY
|
|||
|
*/
|
|||
|
char *StrDateDMY(time_t date)
|
|||
|
{
|
|||
|
static char tdate[15];
|
|||
|
struct tm *l_d;
|
|||
|
|
|||
|
l_d = localtime(&date);
|
|||
|
snprintf(tdate, 15, "%02d-%02d-%04d", l_d->tm_mday, l_d->tm_mon+1, l_d->tm_year+1900);
|
|||
|
return tdate;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* This function returns the date for today, to test against other functions
|
|||
|
* DD-MM-YYYY (DAY-MONTH-YEAR)
|
|||
|
*/
|
|||
|
char *GetDateDMY()
|
|||
|
{
|
|||
|
static char tdate[15];
|
|||
|
struct tm *l_d;
|
|||
|
time_t T_Now;
|
|||
|
|
|||
|
T_Now = time(NULL);
|
|||
|
l_d = localtime(&T_Now);
|
|||
|
snprintf(tdate, 15, "%02d-%02d-%04d", l_d->tm_mday,l_d->tm_mon+1,l_d->tm_year+1900);
|
|||
|
return(tdate);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
char *OsName()
|
|||
|
{
|
|||
|
#ifdef __linux__
|
|||
|
return (char *)"GNU/Linux";
|
|||
|
#elif __FreeBSD__
|
|||
|
return (char *)"FreeBSD";
|
|||
|
#elif __NetBSD__
|
|||
|
return (char *)"NetBSD";
|
|||
|
#elif __OpenBSD__
|
|||
|
return (char *)"OpenBSD";
|
|||
|
#else
|
|||
|
#error "Unknown target OS"
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
char *OsCPU()
|
|||
|
{
|
|||
|
#ifdef __i386__
|
|||
|
return (char *)"i386";
|
|||
|
#elif __x86_64__
|
|||
|
return (char *)"x86_64";
|
|||
|
#elif __PPC__
|
|||
|
return (char *)"PPC";
|
|||
|
#elif __sparc__
|
|||
|
return (char *)"Sparc";
|
|||
|
#elif __alpha__
|
|||
|
return (char *)"Alpha";
|
|||
|
#elif __hppa__
|
|||
|
return (char *)"HPPA";
|
|||
|
#elif __arm__
|
|||
|
return (char *)"ARM";
|
|||
|
#else
|
|||
|
#error "Unknown CPU"
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Return universal tearline, note if OS and CPU are
|
|||
|
* unknown, the tearline is already 39 characters.
|
|||
|
*/
|
|||
|
char *TearLine()
|
|||
|
{
|
|||
|
static char tearline[41];
|
|||
|
|
|||
|
snprintf(tearline, 41, "--- MBSE BBS v%s (%s-%s)", VERSION, OsName(), OsCPU());
|
|||
|
return tearline;
|
|||
|
}
|
|||
|
|
|||
|
|