string repeat_str(string ch, int n) {
        int i;
        string tmp;
        if (n<0) return "";
        tmp = "";
        for (i=0;i<n;i++) tmp += ch;
        return tmp;
}

string format_mixed(mixed data, int len) {
	int n;
	string tmp;

	if (!data || intp(data) ) {
		tmp = data+" ";
		n = strlen(tmp);
		if (n>len) return repeat_str("*",len);
		return (repeat_str(" ",len-n)+tmp);
	}

	if (stringp(data)) {
		n = strlen(data);
		if (n>len) return data[0..len-4]+" ..";
		return data[0..n-1]+repeat_str(" ",len-n);
	}

	if (objectp(data)) {
		tmp = file_name(data);
		n = strlen(tmp);
		if (n>len) return tmp[0..len-4]+" ..";
		return tmp[0..n-1]+repeat_str(" ",len-n);
	}

	/* error */
	return repeat_str("X",len);
}

string center_mixed(mixed data, int len) {
	int n, left, right;
	string tmp;

	if (!data || intp(data) ) {
		tmp = data+"";
		n = strlen(tmp);
		if (n>len) return repeat_str("*",len);
		left = (len-n)/2;
		right = len - left - n;
		return (repeat_str(" ",left)+tmp+repeat_str(" ",right));
	}

	if (stringp(data)) {
		n = strlen(data);
		if (n>len) return data[0..len-4]+" ..";
		left = (len-n)/2;
		right = len - left - n;
		return (repeat_str(" ",left)+tmp+repeat_str(" ",right));
	}

	if (objectp(data)) {
                tmp = file_name(data);
                n = strlen(tmp);
                if (n>len) return tmp[0..len-4]+" ..";
		left = (len-n)/2;
                right = len - left - n;
                return (repeat_str(" ",left)+tmp+repeat_str(" ",right));
        }

        /* error */
        return repeat_str("X",len);
}

string SubStr(string str, string orig, string new) {
	string ret, front, back, tmp;
	if (!str || str=="" ) return "";
	tmp = "%s"+orig+"%s";
	ret="";
	while(sscanf(str, tmp, front, back)) {
		if(!back) back="";
		ret+= front+new;
		str=back;
	}
	return ret+str;
}