/*****************************************************************************
 *
 * $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[45];

    snprintf(tearline, 45, "--- MBSE BBS v%s (%s-%s)", VERSION, OsName(), OsCPU());
    return tearline;
}


