Logo Search packages:      
Sourcecode: netdiag version File versions  Download package

tally.c

/*  tally.c is part of Statnet */
/* Statnet is protected under the GNU Public License (GPL2). */
/* Author: Jeroen Baekelandt (jeroenb@igwe.vub.ac.be)       */
/* 08FEB98: Scot E. Wilcoxon (sewilco@fieldday.mn.org)     */

/* This function tallies an item in a tally structure. */

#include "stat.h"

int tally (int type_wanted, struct Tally *tally)
{
    int result;
    int index, search_int, value_now;

    result = 0;
    search_int = 0;

    if( tally == (struct Tally *)0 )
      result = 1;       /* flag that could not tally here */
    else
    {  /* if pointer defined */
      if( tally->count != (unsigned int *)0 )
      {  /* if using counter array */
        if( type_wanted <= tally->c_max )
          tally->count[type_wanted]++;
        else
          result = 2;         /* flag that could not tally here */
      }  /* if using counter array */
      else
        result = 3;           /* flag that could not tally here */

      if( result > 0 )
      {  /* if not tallied yet, try an array of types */
        result = 0;

        if( tally->types != (unsigned int *)0 &&
            tally->t_count != (unsigned int *)0 &&
            tally->t_values != (unsigned int *)0 )
        {  /* if using an array of type counters */

              for (index = 0; index < tally->t_max; index++)
                {             /* for all counters */
                  if ((value_now = tally->types[index]) > 0)
                  {           /* if a type to display is defined */
                    if (tally->t_values[value_now] == type_wanted)
                      {       /* if this is the type number which was encountered */
                        tally->t_count[index]++;      /* tally this type */
                        break;
                      }       /* if this is the type number which was encountered */
                  }           /* if a type to display is defined */
                }             /* for all counters */

              if (index >= tally->t_max)
                {             /* if type was not found */
                  for (search_int = 0; search_int < tally->t_max_labels; search_int++)
                  {           /* for all known types */
                    if (type_wanted == tally->t_values[search_int])
                      {       /* if wanted type was found */
                        if (tally->types[tally->t_max - 1] > 0 &&
                          tally->t_count[tally->t_max - 1] > 0)
                        {     /* if last displayed type was in use, add to bottom */
                                tally->t_count[tally->t_max-1] = 1;
                                tally->types[tally->t_max-1] = search_int;    /* remember type index */
                        }     /* if last displayed type was in use, add to bottom */
                        tally->types[tally->t_max - 1] = search_int;
                        tally->t_count[tally->t_max - 1] = 1;           /* tally this type */
                          for (index = tally->t_max-1; index > 0; index--)
                            {             /* sort all displayed types */
                              if (tally->t_count[index] > tally->t_count[index-1] )
                              {  /* if previous count is smaller than this one, shuffle up */
                                int temp_count, temp_type;

                                temp_count = tally->t_count[index];
                                temp_type = tally->types[index];
                                tally->t_count[index] = tally->t_count[index-1];
                                tally->types[index] = tally->types[index-1];
                                tally->t_count[index-1] = temp_count;
                                tally->types[index-1] = temp_type;
                              }  /* if previous count is smaller than this one, shuffle up */
                            }             /* sort all displayed types */
                        break;
                      }       /* if wanted type was found */
                  }           /* for all known types */
                  if( search_int >= tally->t_max_labels )
                        result = 4; /* not tallied */
                }             /* if type was not found */
        }  /* if using an array of type counters */
        else
            result = 5; /* not tallied */
      }  /* if not tallied yet, try an array of types */
    }  /* if pointer defined */

    return result;
}

Generated by  Doxygen 1.6.0   Back to index