lotos123/
lotos123/datafiles/conffiles/
lotos123/datafiles/counters/
lotos123/datafiles/fonts/
lotos123/datafiles/helpfiles/
lotos123/datafiles/killmsgs/
lotos123/datafiles/mapfiles/
lotos123/datafiles/motds/motd1/
lotos123/datafiles/motds/motd2/
lotos123/datafiles/pictfiles/
lotos123/datafiles/plfiles/
lotos123/datafiles/plfiles/helpfiles/
lotos123/datafiles/screens/
lotos123/datafiles/textfiles/
lotos123/datafiles/trfiles/
lotos123/datafiles/votefiles/
lotos123/datafiles/votefiles/1/
lotos123/datafiles/votefiles/2/
lotos123/src/plugins/
lotos123/userfiles/
lotos123/userfiles/bin/
/* vi: set ts=4 sw=4 ai: */
/*
 * s_string.c
 *
 *   Lotos v1.2.3  : (c) 1999-2003 Pavol Hluchy (Lopo)
 *   last update   : 30.1.2003
 *   email         : lotos@losys.sk
 *   homepage      : lotos.losys.sk
 */

#ifndef __S_STRING_C__
#define __S_STRING_C__ 1

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdarg.h>
#include <ctype.h>

#include "define.h"
#include "prototypes.h"
#include "obj_sys.h"
#include "s_string.h"


/*** Attempt to get '\n' terminated line of input from a character
     mode client else store data read so far in user buffer. ***/
int get_charclient_line(UR_OBJECT user, char *inpstr, int len)
{
	int l;

	set_crash();
	for (l=0;l<len;++l) {
  /* see if delete entered */
		if (inpstr[l]==8 || inpstr[l]==127) {
			if (user->buffpos) {
				user->buffpos--;
				if (user->terminal.checho) write_user(user,"\b \b");
				}
			continue;
			}
		user->buff[user->buffpos]=inpstr[l];
  /* See if end of line */
		if (inpstr[l]<32 || user->buffpos+2==ARR_SIZE) {
			terminate(user->buff);
			strcpy(inpstr,user->buff);
			if (user->terminal.checho) write_user(user,"\n");
			return 1;
			}
		user->buffpos++;
		}
	if (user->terminal.checho
	    && ((user->login!=LOGIN_PASSWD && user->login!=LOGIN_CONFIRM)
		    || (amsys->password_echo || user->show_pass)
			)
		)
		write(user->socket,inpstr,len);
	return 0;
}


/*** Put string terminate char. at first char < 32 ***/
void terminate(char *str)
{
	int i;

	set_crash();
	for (i=0;i<ARR_SIZE;++i)
		if (*(str+i)<32) {
			*(str+i)=0;
			return;
			} 
	str[i-1]=0;
}


/*** Get words from sentence. This function prevents the words in the 
     sentence from writing off the end of a word array element. This is
     difficult to do with sscanf() hence I use this function instead. ***/
int wordfind(char *inpstr)
{
	int wn=0,wpos=0;

	set_crash();
	do {
		while(*inpstr<33) if (!*inpstr++) return wn;
		while(*inpstr>32 && wpos<WORD_LEN-1) {
			word[wn][wpos]=*inpstr++; 
			wpos++;
			}
		word[wn][wpos]='\0';
		wn++;
		wpos=0;
		} while (wn<MAX_WORDS);
	return wn-1;
}


/*** clear word array etc. ***/
void clear_words()
{
	int w;

	set_crash();
	for (w=0;w<MAX_WORDS;++w) word[w][0]='\0';
	word_count=0;
}


/** check to see if string given is YES or NO **/
int yn_check(char *wd)
{
	set_crash();
	if (!strcmp(wd,"YES")) return 1;
	if (!strcmp(wd,"NO")) return 0;
	if (!strcmp(wd, "ANO")) return 1;
	if (!strcmp(wd, "NIE")) return 0;
	return -1;
}


/** check to see if string given is ON or OFF **/
int onoff_check(char *wd)
{
	set_crash();
	if (!strcmp(wd,"ON")) return 1;
	if (!strcmp(wd,"OFF")) return 0;
	if (!strcmp(wd, "ZAP")) return 1;
	if (!strcmp(wd, "VYP")) return 0;
	return -1;
}


/** check to see if string given is OFF, MIN or MAX **/
int minmax_check(char *wd)
{
	set_crash();
	if (!strcmp(wd,"OFF")) return SBOFF;
	if (!strcmp(wd,"MIN")) return SBMIN;
	if (!strcmp(wd,"MAX")) return SBMAX;
	if (!strcmp(wd, "VYP")) return SBOFF;
	return -1;
}


/** check to see if string given is OFF, AUTO, MANUAL **/
int resolve_check(char *wd)
{
	set_crash();
	if (!strcmp(wd,"OFF")) return 0;
	if (!strcmp(wd,"AUTO")) return 1;
	if (!strcmp(wd,"MANUAL")) return 2;
	if (!strcmp(wd, "VYP")) return 0;
	return -1;
}


/*** Tell telnet not to echo characters - for password entry ***/
void echo_off(UR_OBJECT user)
{
	set_crash();
	if (amsys->password_echo || user->show_pass) return;
	vwrite_user(user,"%c%c%c",255,251,1);
}


/*** Tell telnet to echo characters ***/
void echo_on(UR_OBJECT user)
{
	set_crash();
	if (amsys->password_echo || user->show_pass) return;
	vwrite_user(user,"%c%c%c",255,252,1);
}


/*** Return pos. of second word in inpstr ***/
char *remove_first(char *inpstr)
{
	char *pos=inpstr;

	set_crash();
	while (*pos<33 && *pos) ++pos;
	while(*pos>32) ++pos;
	while(*pos<33 && *pos) ++pos;
	return pos;
}


/*** See if string contains any swearing ***/
int contains_swearing(char *str)
{
	char *s;
	int i;

	set_crash();
	if ((s=(char *)malloc(strlen(str)+1))==NULL) {
		write_syslog(ERRLOG,1,"Chyba pri alokacii pamate v contains_swearing().\n");
		return 0;
		}
	strcpy(s,str);
	strtolower(s); 
	i=0;
	while (swear_words[i][0]!='*') {
		if (strstr(s,swear_words[i])) {
			free(s);
			return 1;
			}
		++i;
		}
	/* check to see if it contains a fake pueblo command from another user. */
	if (strstr(s,"</xch_mudtext>")) {
		free(s);
		return 1;
		}
	if (strstr(s,"this world is pueblo") && strstr(s,"enhanced")) {
		free(s);
		return 1;
		}
	free(s);
	return 0;
}


/* go through the given string and replace any of the words found in the
   swear_words array with the default swear censor, *swear_censor
   */
char *censor_swear_words(char *has_swears)
{
	int i=0;
	char *clean=has_swears;

	set_crash();
	while (swear_words[i][0]!='*') {
		while (has_swears!=NULL) {
			clean=has_swears;
			has_swears=replace_swear(clean, swear_words[i]);
			}
		++i;
		has_swears=clean;
		}
	return clean;
}


/*** Convert string to upper case ***/
void strtoupper(char *str)
{
	set_crash();
	while (*str) {
		*str=toupper(*str);
		str++;
		}
}


/*** Convert string to lower case ***/
void strtolower(char *str)
{
	set_crash();
	while (*str) {
		*str=tolower(*str);
		str++;
		}
}


/*** Returns 1 if string is a positive number ***/
int is_number(char *str)
{
	set_crash();
	while (*str)
		if (!isdigit(*str++)) return 0;
	return 1;
}


/*** Peforms the same as strstr, in that it returns a pointer to the first occurence
     of pat in str - except that this is performed case insensitive
     ***/
char *istrstr(char *str, char *pat)
{
	char *pptr, *sptr, *start;
	int  slen, plen;

	set_crash();
	slen=strlen(str);
	plen=strlen(pat);
	for (start=(char *)str,pptr=(char *)pat;slen>=plen;start++,slen--) {
  /* find start of pattern in string */
		while (toupper(*start)!=toupper(*pat)) {
			start++;  slen--;
    /* if pattern longer than string */
			if (slen<plen) return(NULL);
			}
		sptr=start;
		pptr=(char *)pat;
		while (toupper(*sptr)==toupper(*pptr)) {
			sptr++;  pptr++;
    /* if end of pattern then pattern was found */
			if (*pptr=='\0') return (start);
			} /* end while */
		} /* end for */
	return(NULL);
}


/*** Take the string 'inpstr' and replace any occurence of 'old' with
     the string 'new'
     ***/
char *replace_string(char *inpstr, char *old, char *new)
{
	int old_len,new_len;
	char *x,*y;

	set_crash();
	if (NULL==(x=(char *)istrstr(inpstr,old))) return x;
	old_len=strlen(old);
	new_len=strlen(new);
	memmove(y=x+new_len,x+old_len,strlen(x+old_len)+1);
	memcpy(x,new,new_len);
	return inpstr;
}


/*** Searches string s1 for string s2 ***/
int s_instr(char *s1, char *s2)
{
	int f,g;

	set_crash();
	for (f=0;*(s1+f);++f) {
		for (g=0;;++g) {
			if (*(s2+g)=='\0' && g>0) return f;
			if (*(s2+g)!=*(s1+f+g)) break;
			}
		}
	return -1;
}


/* used to copy out a chuck of text in macros */
void midcpy(char *strf, char *strt, int fr, int to)
{
	int f;

	set_crash();
	for (f=fr;f<=to;++f) {
		if (!strf[f]) { strt[f-fr]='\0';  return; }
		strt[f-fr]=strf[f];
		}
	strt[f-fr]='\0';
}


/*** Get ordinal value of a date and return the string ***/
char *ordinal_text(int num)
{
	char *ords[]={"th","st","nd","rd"};

	set_crash();
	if (((num%=100)>9 && num<20) || (num%=10)>3) num=0;
	return ords[num];
}


/*** Date string for board messages, mail, .who and .allclones, etc ***/
char *long_date(int which)
{
	static char dstr[80];
	int ap, hour;

	set_crash();
	if (thour>=12) {
		(thour>12) ? (hour=(int)thour-12) : (hour=12);
		ap=1;
		}
	else {
		(!thour) ? (hour=12) : (hour=(int)thour);
		ap=0;
		}
	if (which) sprintf(dstr, "v %s %d %s %d o %02d:%02d%s", day[twday], tmday, month[tmonth], (int)tyear, hour, (int)tmin, !ap?"":"pm");
	else sprintf(dstr, "[ %s %d %s %d o %02d:%02d%s ]",day[twday], tmday, month[tmonth], (int)tyear, hour, (int)tmin, !ap?"":"pm");
	return dstr;
}


/* takes string str and determines what smiley type it should have.  The type is then
   stored in 'type'.  The smiley type is determind by the last 2 characters in str.
*/
void smiley_type(char *str, char *type)
{
	set_crash();
	switch (str[strlen(str)-1]) {
		case '?':
			strcpy(type,"ask");
			break;
		case '!':
			strcpy(type,"exclaim");
			break;
		case ')':
			if (str[strlen(str)-2]==':') strcpy(type,"smile");
			else if (str[strlen(str)-2]=='=') strcpy(type,"smile");
			else if (str[strlen(str)-2]==';') strcpy(type,"wink");
			else if (str[strlen(str)-2]=='8') strcpy(type,"glaze");
			else strcpy(type,"say");
			break;
		case '(':
			if (str[strlen(str)-2]==':' || str[strlen(str)-2]=='=') strcpy(type,"frown");
			else strcpy(type,"say");
			break;
		case ':':
			if (str[strlen(str)-2]=='(') strcpy(type,"smile");
			else if (str[strlen(str)-2]==')') strcpy(type,"frown");
			else strcpy(type,"say");
			break;
		case '=':
			if (str[strlen(str)-2]=='(') strcpy(type,"smile");
			else if (str[strlen(str)-2]==')') strcpy(type,"frown");
			else strcpy(type,"say");
			break;
		case ';':
			if (str[strlen(str)-2]=='(') strcpy(type,"wink");
			else if (str[strlen(str)-2]==')') strcpy(type,"frown");
			else strcpy(type,"say");
			break;
		case '8':
			if (str[strlen(str)-2]=='(') strcpy(type,"gaze");
			else strcpy(type,"say");
			break;
		default :
			strcpy(type,"say");
			break;
  }
}


/* This allows you to center text to a given size.  It will also allow you
   to have markers on the edges of the text, if mark = 1, and the marker must
   be passed if mark = 1. marker is an int - one symbol only.
   Based on code by Mike Irving (Moe - MoeNUTS)
*/
char *center_string(int cstrlen, int mark, char *marker, char *str, ...)
{
	va_list args;
	char text2[ARR_SIZE*2];
	int len=0,spc=0,odd=0,cnt=0;

	set_crash();
/* first build up the string */
vtext[0]='\0';
va_start(args,str);
vsprintf(vtext,str,args);
va_end(args);
/* get size */
cnt=colour_com_count(vtext);
len=strlen(colour_com_strip(vtext));
spc=(int)((cstrlen/2)-(len/2));
odd=((spc+spc+len)-cstrlen);
/* if greater than size given then don't do anything except return */
if (len>cstrlen) return(vtext);
sprintf(text2,"%*.*s%s",spc,spc," ",vtext);
/* if marked, then add spaces on the other side too */
if (mark) {
  /* if markers can't be placed without over-writing text then return */
  if (len>(cstrlen-2)) return(vtext);
  /* if they forgot to pass a marker, use a default one */
  if (!marker) marker="|";
  /* compensate for uneven spaces */
  sprintf(vtext,"%s%*.*s\n",text2,spc-odd,spc-odd," ");
  vtext[0]=marker[0];
  vtext[strlen(vtext)-2]=marker[0];
  }
else {
  strcpy(vtext,text2);
  strcat(vtext,"\n");
  }
return(vtext);
}


/* Centers the text */
char *center(char *string, int clen)
{
	static char text2[ARR_SIZE*2];
	char text3[ARR_SIZE*2];
	int len=0,spc=0;

	set_crash();
	strcpy(text3,string);
	len=strlen(colour_com_strip(text3));
	if (len>clen) {
		strcpy(text2,text3);
		return text2;
		}
	spc=(clen/2)-(len/2);
	sprintf(text2,"%*.*s",spc,spc," ");
	strcat(text2,text3);
	return text2;
}


int is_fnumber(char *str)
{
	int d=0;
	char *tmp=str;

	set_crash();
	if (str[0]=='-') str++;
	while (*str) {
		if (!isdigit(*str++)) {
			if (*(--str)=='.') {
				if (str==tmp) return 0;
				if (*(str-1)=='-') return 0;
				if (!d) d=1;
				else return 0;
				}
			else return 0;
			str++;
			}
		}
	return 1;
}


int is_inumber(char *str)
{
	set_crash();
	if (str[0]=='-') str++;
	while (*str)
		if (!isdigit(*str++)) return 0;
	return 1;
}


char *replace_swear(char *inpstr, char *old)
{
	int i;
	char *x, *y;

	set_crash();
	if (NULL==(x=(char *)istrstr(inpstr, old))) return x;
	for (i=0; i<(strlen(old)-2); i++) memcpy(y=x+1+i, ".", 1);
	return inpstr;
}


void reset_murlist(UR_OBJECT user)
{
	int i;

	set_crash();
	for (i=0; i<MAX_MUSERS; i++)
		user->murlist[i][0]='\0';
}


char * grm_gnd(int typ, int gnd)
{
	set_crash();
	switch (typ) {
		case  1: return ((gnd==0)?"e":((gnd==1)?"y":"a"));
		case  2: return ((gnd==0)?"ca":((gnd==1)?"":"ka"));
		case  3: return ((gnd==0)?"e":((gnd==1)?"":"a"));
		case  4: return ((gnd==0)?"o":((gnd==1)?"":"a"));
		case  5: return ((gnd==0)?"lo":((gnd==1)?"ol":"la"));
		case  6: return ((gnd==0)?"catu":((gnd==1)?"ovi":"ke"));
		case  7: return ((gnd==0)?"lo":((gnd==1)?"iel":"la"));
		case  8: return ((gnd==0)?"to":((gnd==1)?"ho":"ju"));
		case  9: return ((gnd==0)?"ca":((gnd==1)?"a":"ku"));
		case 10: return ((gnd==0)?"oto":((gnd==1)?"ohoto":"uto"));
		default: return NULL;
		}
}


/* koncovky podla cisla */
char * grm_num(int typ, int n)
{
	set_crash();
	switch (typ) {
		case  1 : return (((n)>4 || (n)==0)?"":(((n)==1)?"u":"y"));
		case  2 : return (((n)>4 || (n)==0)?"ok":(((n)==1)?"ku":"ky"));
		case  3 : return (((n)>4 || (n)==0)?"ych":(((n)==1)?"u":"e"));
		case  4 : return (((n)>4 || (n)==0)?"kov":(((n)==1)?"ok":"ky"));
		case  5 : return (((n)>4 || (n)==0)?"ov":(((n)==1)?"":"i"));
		case  6 : return (((n)>4 || (n)==0)?"ych":(((n)==1)?"y":"i"));
		case  7 : return (((n)>4 || (n)==0)?"ov":(((n)==1)?"":"y"));
		case  8 : return (((n)>4 || (n)==0)?"":(((n)==1)?"a":"y"));
		case  9 : return (((n)>4 || (n)==0)?"ych":(((n)==1)?"a":"e"));
		case 10 : return (((n)>4 || (n)==0)?"rov":(((n)==1)?"er":"ri"));
		default : return NULL;
		}
}


void split_com_str_num(char *inpstr, int num)
{
	char tmp[ARR_SIZE*2];

	set_crash();
	strcpy(tmp, &inpstr[num]);
	inpstr[num]=' ';
	strcpy(&inpstr[num+1], tmp);
	word_count=wordfind(inpstr);
}


/* sklonovanie mena podla padov */
void nick_grm(UR_OBJECT user)
{
	char c1,c2,c3;

	set_crash();
	c1=user->name[strlen(user->name)-1];
	c2=user->name[strlen(user->name)-2];
	c3=user->name[strlen(user->name)-3];

/* 2. pad -> GENITIV */
	strcpy(user->nameg, user->name);
	if (user->gender==0) {
		switch (c1) {
			case 'o' :
			case 'e' : user->nameg[strlen(user->nameg)-1]='u'; break;
			default  : strcat(user->nameg, "tu"); break;
			}
		}

	else if (user->gender==1) {
		switch (c1) {
			case 'o' : user->nameg[strlen(user->nameg)-1]='a'; break;
			case 'r' :
				switch (c2) {
					case 'e' :
						switch (c3) {
							case 't' :
							case 'd' :
								user->nameg[strlen(user->nameg)-2]='\0';
								strcat(user->nameg, "ra");
								break;
							default  : strcat(user->nameg, "a"); break;
							}
						break;
					default  : strcat(user->nameg, "a"); break;
					}
				break;
			case 'y' : strcat(user->nameg, "ho"); break;
			case 'a' : user->nameg[strlen(user->nameg)-1]='u'; break;
			default  : strcat(user->nameg, "a"); break;
			}
			
		}

	else if (user->gender==2) {
		switch (c1) {
			case 'a' : user->nameg[strlen(user->nameg)-1]='u'; break;
			case 'o' : user->nameg[strlen(user->nameg)-1]='a'; break;
			default  : break;
			}
		}

/* 3. pad - DATIV */
	strcpy(user->named, user->name);
	if (user->gender==0) {
		switch (c1) {
			case 'a' : strcat(user->named, "tu"); break;
			default  : strcat(user->named, "u"); break;
			}
		}
	
	if (user->gender==1) {
		switch (c1) {
			case 'o' : strcat(user->named, "vi"); break;
			case 'r' :
				switch (c2) {
					case 'e' :
						switch (c3) {
							case 't' :
							case 'd' :
								user->named[strlen(user->named)-2]='\0';
								strcat(user->named, "rovi");
								break;
							default  : strcat(user->named, "ovi"); break;
							}
						break;
					default  : strcat(user->named, "ovi"); break;
					}
				break;
			case 'y' : strcat(user->named, "mu"); break;
			case 'a' :
				user->named[strlen(user->named)-1]='o';
				strcat(user->named, "vi");
				break;
			default  : strcat(user->named, "ovi"); break;
			}
		}
	
	if (user->gender==2) {
		switch (c1) {
			case 'o' : strcat(user->named, "vi"); break;
			case 'a' :
				switch (c2) {
					case 'c' : user->named[strlen(user->named)-1]='i'; break;
					default  : user->named[strlen(user->named)-1]='e'; break;
					}
				break;
			default  : strcat(user->named, "i"); break;
			}
		}

/* 4. pad - AKUZATIV */
	strcpy(user->namea, user->nameg);

/* 6. pad - LOKAL */
	strcpy(user->namel, user->name);
	if (user->gender==0) {
		switch (c1) {
			case 'e' : user->namel[strlen(user->namel)-1]='i'; break;
			case 'o' : user->namel[strlen(user->namel)-1]='e'; break;
			default  : strcat(user->namel, "ti"); break;
			}
		}
	else if (user->gender==1) {
		switch (c1) {
			case 'o' : strcat(user->namel, "vi"); break;
			case 'r' :
				switch (c2) {
					case 'e' :
						switch (c3) {
							case 't' :
							case 'd' :
								user->namel[strlen(user->namel)-2]='\0';
								strcat(user->namel, "rovi");
								break;
							default  : strcat(user->namel, "ovi"); break;
							}
						break;
					default  : strcat(user->namel, "ovi"); break;
					}
				break;
			case 'y' : strcat(user->namel, "m"); break;
			case 'a' :
				user->namel[strlen(user->namel)-1]='o';
				strcat(user->namel, "vi");
				break;
			default  : strcat(user->namel, "ovi"); break;
			}
		}
	else if (user->gender==2) {
		switch (c1) {
			case 'o' : strcat(user->namel, "vi"); break;
			case 'a' :
				switch (c2) {
					case 'k' :
					case 'n' : user->namel[strlen(user->namel)-1]='e'; break;
					default  : user->namel[strlen(user->namel)-1]='i'; break;
					}
				break;
			default  : strcat(user->namel, "i"); break;
			}
		}

/* 7. pad - INSTRUMENTAL */
	strcpy(user->namei, user->name);
	if (user->gender==0) {
		switch (c1) {
			case 'o' : strcat(user->namei, "m"); break;
			case 'e' :
				switch (c2) {
					case 'c' :
						user->namei[strlen(user->namei)-1]='o';
						strcat(user->namei, "m");
						break;
					case 'i' : user->namei[strlen(user->namei)-1]='m'; break;
					}
				break;
			default  : strcat(user->namei, "tom"); break;
			}
		}
	else if (user->gender==1) {
		switch (c1) {
			case 'y' :
			case 'o' : strcat(user->namei, "m"); break;
			case 'r' :
				switch (c2) {
					case 'e' :
						switch (c3) {
							case 'd' :
							case 't' :
								user->namei[strlen(user->namei)-2]='\0';
								strcat(user->namei, "rom");
								break;
							default  : strcat(user->namei, "om"); break;
							}
						break;
					default  : strcat(user->namei, "om"); break;
					}
				break;
			case 'a' :
				user->namei[strlen(user->namei)-1]='o';
				strcat(user->namei, "m");
				break;
			default  : strcat(user->namei, "om"); break;
			}
		}
	else if (user->gender==2) {
		switch (c1) {
			case 'o' : strcat(user->namei, "m"); break;
			case 'a' :
				user->namei[strlen(user->namei)-1]='\0';
				strcat(user->namei, "ou");
				break;
			default  :
				strcat(user->namei, "ou");
				break;
			}
		}
/* privlastnovaci tvar pre gnd=1 */
	strcpy(user->namex, user->name);
	if (user->gender==0) {
		switch (c1) {
			case 'o' : strcat(user->namex, "v"); break;
			case 'e' :
				user->namex[strlen(user->namex)-1]='\0';
				strcat(user->namex, "ov");
				break;
			case 'a' : strcat(user->namex, "tov"); break;
			}
		}
	else if (user->gender==1) {
		switch (c1) {
			case 'y' : strcat(user->namex, "ho"); break;
			case 'o' : strcat(user->namex, "v"); break;
			case 'r' :
				switch (c2) {
					case 'e' :
						switch (c3) {
							case 'd' :
							case 't' :
								user->namex[strlen(user->namex)-2]='\0';
								strcat(user->namex, "rov");
								break;
							default : strcat(user->namex, "ov"); break;
							};
						break;
					default : strcat(user->namex, "ov"); break;
					};
				break;
			case 'a' :
				user->namex[strlen(user->namex)-1]='\0';
				strcat(user->namex, "ov");
				break;
			default : strcat(user->namex, "ov"); break;
			}
		}
	else if (user->gender==2) {
		switch (c1) {
			case 'a' : user->namex[strlen(user->namex)-1]='\0';
			default :
				strcat(user->namex, "in");
				break;
			}
		}
/* privlastnovaci tvar pre gnd=2 */
	strcpy(user->namey, user->name);
	if (user->gender==0) {
		switch (c1) {
			case 'o' : strcat(user->namey, "va"); break;
			case 'a' : strcat(user->namey, "tova"); break;
			case 'e' :
				user->namex[strlen(user->namey)-2]='\0';
				strcat(user->namey, "ova");
				break;
			}
		}
	else if (user->gender==1) {
		switch (c1) {
			case 'y' : strcat(user->namey, "ho"); break;
			case 'o' : strcat(user->namey, "va"); break;
			case 'r' :
				switch (c2) {
					case 'e' :
						switch (c3) {
							case 'd' :
							case 't' :
								user->namey[strlen(user->namey)-2]='\0';
								strcat(user->namey, "rova");
								break;
							default : strcat(user->namey, "ova"); break;
							};
						break;
					default : strcat(user->namey, "ova"); break;
					};
				break;
			case 'a' :
				user->namey[strlen(user->namey)-1]='\0';
				strcat(user->namey, "ova");
				break;
			default : strcat(user->namey, "ova"); break;
			}
		}
	else if (user->gender==2) {
		switch (c1) {
			case 'a' : user->namey[strlen(user->namey)-1]='\0';
			default :
				strcat(user->namey, "ina");
				break;
			}
		}
/* privlastnovaci tvar pre gnd=0 */
	strcpy(user->namez, user->name);
	if (user->gender==0) {
		switch (c1) {
			case 'o' : strcat(user->namez, "vo"); break;
			case 'a' : strcat(user->namez, "tovo"); break;
			case 'e' :
				user->namez[strlen(user->namez)-2]='\0';
				strcat(user->namez, "ovo");
				break;
			}
		}
	else if (user->gender==1) {
		switch (c1) {
			case 'y' : strcat(user->namez, "ho"); break;
			case 'o' : strcat(user->namez, "ve"); break;
			case 'r' :
				switch (c2) {
					case 'e' :
						switch (c3) {
							case 'd' :
							case 't' :
								user->namez[strlen(user->namez)-2]='\0';
								strcat(user->namez, "rovo");
								break;
							default : strcat(user->namez, "ovo"); break;
							};
						break;
					default : strcat(user->namez, "ovo"); break;
					};
				break;
			case 'a' :
				user->namez[strlen(user->namez)-1]='\0';
				strcat(user->namez, "ovo");
				break;
			default : strcat(user->namez, "ovo"); break;
			}
		}
	else if (user->gender==2) {
		switch (c1) {
			case 'a' : user->namez[strlen(user->namez)-1]='\0';
			default :
				strcat(user->namez, "ino");
				break;
			}
		}
}


int contains_extension(char *str, int type)
{
	char *s;
	int ok;

	set_crash();
	if ((s=(char *)malloc(strlen(str)+1))==NULL) {
		write_syslog(ERRLOG, 1, "Failed to allocate memory in contains_extention().\n");
		return 0;
		}
	strcpy(s,str);
	strtolower(s); 
	ok=0;
	if (type==0) {  /* Images  (.gif/.jpg) */
		if (strstr(s,".gif")) ok=1;
		if (strstr(s,".jpg")) ok=1;
		if (strstr(s,".jpeg")) ok=1;
		if (ok) { free(s); return 1; }
		}
	if (type==1) {  /* Audio   (.wav/.mid) */
		if (strstr(s,".wav")) ok=1;
		if (strstr(s,".mid")) ok=1;
		if (strstr(s,".midi")) ok=1;
		if (ok) { free(s); return 1; }
		}
	free(s);
	return 0;
}


/*** Fill buff with '\0' ***/
void resetbuff(char *buff) 
{
	int i;

	set_crash();
	for (i=strlen(buff)-1; i>=0; buff[i--]='\0')
	;
} 


/*** Compare two strings (case insensitive) ***/
char stricmp(char *str1, char *str2)
{
	set_crash();
	for ( ; toupper(*str1)==toupper(*str2); str1++,str2++)
		if (*str1=='\0') return 0;
	return (toupper(*str1)-toupper(*str2));
}

      
#endif /* __S_STRING_C__ */