/*
 * This file is part of an snmp query application.
 * This file contains variable utilities.
 *
 * 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/var_utils.c,v $
 *    $Author: tom $
 *    $Locker:  $
 *    $Log:	var_utils.c,v $
 * Revision 1.4  91/02/21  13:55:15  tom
 * *** empty log message ***
 * 
 * Revision 1.3  90/07/25  10:32:59  tom
 * aded utilities to convert from numeric to symbolic variable and vice-versa
 * 
 * Revision 1.2  90/07/20  23:46:17  tom
 * compiler warning
 * 
 * Revision 1.1  90/07/20  21:17:53  tom
 * Initial revision
 * 
 *
 */

#ifndef lint
static char *rcsid = "$Header: /afs/net.mit.edu/tools/src/simon/RCS/var_utils.c,v 1.4 91/02/21 13:55:15 tom Exp $";
#endif

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


static char lbuf[BUF_SIZE];




char *
var_str(a, b)
     char *a;
     char *b;
{
  char *mark;
  char *marc;

  if(!a)
    return(b);
  else
    if(!b)
      return(a);
  
  mark = a;
  marc = mark;
  while(*a && *b)
    {
      if(*a != *b)
	return(mark);
      if(*a == '_')
	{
	  mark = marc;
	  marc = a;
	}
      ++a;
      ++b;
    }
  return(mark);
}




char *
common_prefix(a, b, c)
     char *a;
     char *b;
     char *c;
{
  char *mark;

  mark = a;
  while(*a && *b && *c)
    {
      if(*a != *b)
	break;
      if(*a != *c)
	break;
      mark = a;
      ++a;
      ++b;
      ++c;
    }
  
  if(mark && (*mark == '_'))
    --mark;
  return(mark);
}



char *
truncate(var)
     char *var;
{
  char *marc;
  char *mark;

  if(!var)
    return(var);

  mark = marc = var;
  while(*var)
    {
      if(*var == '_')
	{
	  mark = marc;
	  marc = var;
	}
      ++var;
    }
  return(mark);
}



char *
symtonumstr(var)
     char *var;
{
  objident oid;
  strng    str;

  str.str = var;
  str.len = strlen(var);
  if(symtonum(&str, &oid) < 0)
    return((char *) NULL);

  return(numtostr(&oid));
}




numtonum(name, oid)
     strng *name;        
     objident *oid;      
{
  char  *c;
  char  *s;

  if(!name->str)
   return(ERROR);
  if(!oid)
   return(ERROR);

  oid->ncmp = 0; 
  s = name->str;

  while(*s != '\0')
    {
      if(c = index(s, '.'))
	*c++ = '\0';

      oid->cmp[(oid->ncmp)++] = (u_long) atol(s);
      if(!c)
	return(SUCCESS);
      
      s = c;
      *(c-1) = '.'; 
    }
   return(SUCCESS);
}



char *
numtostr(oid)
     objident *oid;      
{
  static char buf[BUF_SIZE];
  char num[LABEL_SIZE];
  char  *c;
  int   i = 0;

  if(!oid)
   return((char *) NULL);

  *buf = '\0';
  i = 0;
  while(i < oid->ncmp)
    {
      sprintf(num, "%d.", oid->cmp[i]);
      strcat(buf, num);
      ++i;      
    }
  if(c = rindex(buf, '.'))
    *c = '\0';
  return(buf);
}



char *
numstrtosym(var)
     char *var;
{
  objident oid;
  strng vname;

  if(var == (char *) NULL)
    return((char *) NULL);

  vname.str = var;
  vname.len = strlen(var);
  if(numtonum(&vname, &oid) != SUCCESS)
    return((char *) NULL);

  bzero(&vname, sizeof(vname));
  if(numtosym(&oid, &vname) < 0)
    return((char *) NULL);

  return(vname.str);
}





char *
numtostring(var)
     char *var;
{
  char *c;
  int  i = 0;

  if(!var)
    return((char *) NULL);

  bzero(lbuf, sizeof(lbuf));
  while(var && *var)
    {
      if(!isdigit(*var))
	{
	  ++var;
	  continue;
	}
      
      if(c = index(var, '.'))
	*c++ = '\0';
      
      lbuf[i++] = (char) atoi(var);
      var = c;
    }
  return(lbuf);
}



char *
get_instance(var, type)
     char *var;
{
  char *c;

  if(type == STR)
    return(numtostring(rindex(var, '_')));
  else
    if(c = rindex(var, '_')) 
      return(c+1);
    else
      return(c);
}

