#include "xrmonwatch.h"

#include <stdio.h>
#include <sys/types.h>
#include <netinet/in.h>

char tbuf[10240];
extern char *headerP;
char *inet_ntoa();


char *
format_ether_addr(index, addr, column, rightjustify, txt)
     int index;
     unsigned char *addr;
     int column;
     int rightjustify;
     char *txt;
{
  static char buf[32];

  if(parts[index].state || !column)
    {
      sprintf(buf, "%02x%02x%02x%02x%02x%02x", addr[0] & 0xff, addr[1] & 0xff,
	      addr[2] & 0xff, addr[3] & 0xff, addr[4] & 0xff, addr[5] & 0xff);
      return(format_str(index, buf, column, rightjustify, txt));
    }
  else
    return(txt);
}


char *
format_ip_addr(index, addr, column, rightjustify, txt)
     int index;
     struct in_addr addr;
     int column;
     int rightjustify;
     char *txt;
{
  if(parts[index].state || !column)
    return(format_str(index, inet_ntoa(addr), column, rightjustify, txt));
  else
    return(txt);
}


char *
format_domain_name(index, addr, column, rightjustify, txt)
     int index;
     struct in_addr addr;
     int column;
     int rightjustify;
     char *txt;
{
  struct hostent *hp = (struct hostent *) NULL;
    
  if(parts[index].state || !column)
    {
      if(((addr.S_un.S_un_b.s_b1 == 18) || !column) && 0)
	hp = gethostbyaddr((char *) &addr, 4, AF_INET);
      if(hp)
	return(format_str(index, hp->h_name, column, rightjustify, txt));
      else
	return(format_str(index, inet_ntoa(addr), column, rightjustify, txt));
    }
  else
    return(txt);
}


char *
format_tcp_port(index, p, column, rightjustify, txt)
     int index;
     unsigned int p;
     int column;
     int rightjustify;
     char *txt;
{
  struct servent *serv;

  if(parts[index].state || !column)
    {
      if(serv = getservbyport(p, "tcp"))
	return(format_str(index, serv->s_name, column, rightjustify, txt));
      else
	return(format_uint(index, p, column, rightjustify, txt));
    }
  else
    return(txt);
}


char *
format_udp_port(index, p, column, rightjustify, txt)
     int index;
     unsigned int p;
     int column;
     int rightjustify;
     char *txt;
{
  struct servent *serv;

  if(parts[index].state || !column)
    {
      if(serv = getservbyport(p, "udp"))
	return(format_str(index, serv->s_name, column, rightjustify, txt));
      else
	return(format_uint(index, p, column, rightjustify, txt));
    }
  else
    return(txt);
}

       

char *
format_nstr(index, n, s, column, rightjustify, txt)
     int index;
     int n;
     char *s;
     int column;
     int rightjustify;
     char *txt;
{
  if(parts[index].state || !column)
     {
       if(column)
	 {
	   if(rightjustify)
	     {
	       sprintf(txt, "%*.*s ", parts[index].llength,
		       parts[index].llength, s ? s : "");
	       sprintf(headerP, "%*.*s ", parts[index].llength,
		       parts[index].llength, 
		       str_printString(parts[index].slabel));
	     }
	   else
	     {
	       sprintf(txt, "%-*.*s ", parts[index].llength, 
		       parts[index].llength, s ? s : "");
	       sprintf(headerP, "%-*.*s ", parts[index].llength,
		       parts[index].llength, 
		       str_printString(parts[index].slabel));
	     }
	   headerP += strlen(headerP);
	 }
       else
	 sprintf(txt, "%25s: %-s (%d)\n",  
		 str_printString(parts[index].label), 
		 s ? s : "", n);
       txt += strlen(txt);
     }      
  return(txt);
}


char *
format_str(index, s, column, rightjustify, txt)
     int index;
     char *s;
     int column;
     int rightjustify;
     char *txt;
{

  if(parts[index].state || !column)
     {
       if(column)
	 {
	   if(rightjustify)
	     {
	       sprintf(txt, "%*.*s ", parts[index].llength,
		       parts[index].llength, s ? s : "");
	       sprintf(headerP, "%*.*s ", parts[index].llength,
		       parts[index].llength, 
		       str_printString(parts[index].slabel));
	     }
	   else
	     {
	       sprintf(txt, "%-*.*s ", parts[index].llength, 
		       parts[index].llength, s ? s : "");
	       sprintf(headerP, "%-*.*s ", parts[index].llength,
		       parts[index].llength, 
		       str_printString(parts[index].slabel));
		     }
	   headerP += strlen(headerP);
	 }
       else
	 sprintf(txt, "%25s: %-s\n",  parts[index].label.s, s ? s : "");
       txt += strlen(txt);
     }      
  return(txt);
}


char *
format_int(index, i, column, rightjustify, txt)
     int index;
     int i;
     int column;
     int rightjustify;
     char *txt;
{
  if(parts[index].state || !column)
     {
       if(column)
	 {
	   if(rightjustify)
	     {
	       sprintf(txt, "%*d ", parts[index].llength, i);
	       sprintf(headerP, "%*.*s ", parts[index].llength,
		       parts[index].llength, 
		       str_printString(parts[index].slabel));
	     }
	   else
	     {
	       sprintf(txt, "%-*d ", parts[index].llength, i);
	       sprintf(headerP, "%-*.*s ", parts[index].llength,
		       parts[index].llength, 
		       str_printString(parts[index].slabel));
	     }
	   headerP += strlen(headerP);
	 }
       else
	 sprintf(txt, "%25s: %-d\n",  str_printString(parts[index].label), i);
       txt += strlen(txt);
     }      
  return(txt);
}



char *
format_uint(index, i, column, rightjustify, txt)
     int index;
     unsigned int i;
     int column;
     int rightjustify;
     char *txt;
{
  if(parts[index].state || !column)
    {
      if(column)
	{
	  if(rightjustify)
	    {
	      sprintf(txt, "%*u ",  parts[index].llength, i);
	      sprintf(headerP, "%*.*s ", parts[index].llength,
		      parts[index].llength, 
		      str_printString(parts[index].slabel));
	    }
	  else
	    {
	      sprintf(txt, "%-*u ", parts[index].llength, i);
	      sprintf(headerP, "%-*.*s ", parts[index].llength,
		      parts[index].llength,
		      str_printString(parts[index].slabel));
	    }
	  headerP += strlen(headerP);
	}
      else
	sprintf(txt, "%25s: %-u\n",  str_printString(parts[index].label), i);
      txt += strlen(txt);
    }      
  return(txt);
}




char *
format_uchar(index, i, column, rightjustify, txt)
     int index;
     unsigned char i;
     int column;
     int rightjustify;
     char *txt;
{
  if(parts[index].state || !column)
    {
      if(column)
	{
	  if(rightjustify)
	    {
	      sprintf(txt, "%*u ",  parts[index].llength, i);
	      sprintf(headerP, "%*.*s ", parts[index].llength,
		       parts[index].llength, 
		      str_printString(parts[index].slabel));
	    }
	  else
	    {
	      sprintf(txt, "%-*u ", parts[index].llength, i);
	      sprintf(headerP, "%-*.*s ", parts[index].llength,
		      parts[index].llength,
		      str_printString(parts[index].slabel));
	    }
	  headerP += strlen(headerP);
	}
      else
	sprintf(txt, "%25s: %-u\n",  str_printString(parts[index].label), i);
      txt += strlen(txt);
    }      
  return(txt);
}

