/*
 * This file is part of some an snmp query application.
 * This file contains a function to print variable values.
 *
 * Copyright 1990 by the Massachusetts Institute of Technology.
 *
 * For copying and distribution information, please see the file
 * <mit-copyright.h>.
 *
 * Tom Coppeto
 * MIT Network Services
 * 15 April 1990
 *
 *    $Source: /afs/net.mit.edu/tools/src/simon/RCS/print.c,v $
 *    $Author: tom $
 *    $Locker:  $
 *    $Log:	print.c,v $
 * Revision 1.4  91/04/22  10:13:37  tom
 * added hardware addr hack
 * 
 * Revision 1.3  91/04/22  09:47:49  tom
 * used unsigned chars
 * 
 * Revision 1.2  91/02/21  13:56:30  tom
 * /
 * 
 * Revision 1.1  90/07/20  21:17:40  tom
 * Initial revision
 * 
 *
 */

#ifndef lint
static char *rcsid = "$Header: /afs/net.mit.edu/tools/src/simon/RCS/print.c,v 1.4 91/04/22 10:13:37 tom Exp $";
#endif

#include <simon.h>
#include <mit-copyright.h>


int
print_value(val, fp, addr)
     objval *val;
     FILE   *fp;
     int    addr;  /* hack away */
{ 
  int  printable;
  int  i, j;
  char *c;

  if(!val)
    { 
      fprintf(fp,"no value to print");
      return(0);
    }

  if(addr)
    {
      for(i=0; i < val->value.str.len; i++)
        printf("%2x ", (val->value.str.str[i] & 0xff));
      return(0);
    }

  switch(val->type) 
    {	    
    case CNTR:
      if(stuff.dispmode & COMMA)
	fprintf(fp, "%s", format_number(val->value.cntr, NULL));
      else
	fprintf(fp, "%u", val->value.cntr);
      break;
      
    case EMPTY:
      fprintf(fp, "NULL");
      break;

    case GAUGE:      
      fprintf(fp, "%u", val->value.gauge);
      break;

    case INT:
      if(stuff.dispmode & COMMA)
	fprintf(fp, "%s", format_number(val->value.intgr, NULL));
      else
	fprintf(fp, "%d", val->value.intgr);
      break;
      
    case IPADD:
      fprintf(fp, "%s", inet_ntoa(val->value.ipadd));
      break;

    case OBJ:
      for(i=0; i < val->value.obj.ncmp; i++)
	fprintf(fp, "%d ", val->value.obj.cmp[i]);
      break;

    case OPAQUE:
      fprintf(fp,"unprintable (opaque)");
      break;
      
    case STR:
      printable = 1;
      i = 0;
      while((i < val->value.str.len) && (val->value.str.str[i] != '\0'))
	{
	  if(!isprint(val->value.str.str[i]) && 
	      !isspace(val->value.str.str[i]))
	    printable = 0;
	  ++i;
	}
      if((c = rindex(val->value.str.str, '\n')) && !*(c+1))
	*c = '\0';
      if (printable)
	fprintf(fp, "%s", val->value.str.str);
      else
	for (i = 0; i < val->value.str.len; i++) 
	  fprintf(fp, " 0x%02x", (unsigned char) val->value.str.str[i]);
      break;

    case TIME:
      i = val->value.time/100;
      j = i/86400;
      if(j > 0)
	fprintf(fp, "%d day%s ", j, j > 1 ? "s" : "");
      i = i%86400;
      j = i/3600;
      if(j > 0)
	fprintf(fp, "%d hr%s. ", j, j > 1 ? "s" : "");
      i = i%3600;
      j = i/60;
      if(j > 0)
	fprintf(fp, "%d min. ", j);
      i = i%60;
      fprintf(fp, "%d sec.", i);
      break;

    default:
      fprintf(fp,"unknown value type");
      break;
  }
  return(0);
}
