Many different types of programs can be enhanced by the use of graphical
information. Often, this graphical information can take the form of
horizontal bar graphs.

An easy way to draw horizontal bars in door programs written with
OpenDoors, is to use the od_repeat() function. Not only does od_repeat()
allow you to easily form a bar by repeating a particular character the
specified number of times, but it is also a very efficient way to do so.
od_repeat() will take advantage of terminal emulation optimizations,
when available. For instance, a character can be repeated any number of
times with AVATAR by sending a short 3-byte sequence that specifies the
character and number of times to repeat.

How do you calculate the number of character to use to form a bar in
your graph? The DrawHorizontalBar() function, which is provided below,
will do this calculation for you. Simply provide the value to be
represented by this bar, the minimum and maximum possible values, and
the maximum number of character to use to draw the bar. For example, if
you are graphing percentages (which could range from 0% to 100%), and
wanted the graph to fit in a space of 40 columns, you would use:

    DrawHorizontalBar(nPercent, 0, 100, 40);

The included tip1.c is a complete program which demonstrates the
DrawHorizontalBar() function as called from another function that will
create complete horizontal bar graphs. This second function,
DrawGraphOfPercentages(), takes an array of titles, and array of values
corresponding to each title, and draws a complete bar graph from this
information.


/* Function to draw a horizontal bar, given a value, the minimum and maximum */
/* possible values, and the number of characters the horizontal bar should   */
/* extended for the maximum value.                                           */
void DrawHorizontalBar(int nValue, int nMinValue, int nMaxValue,
   int nMaxChars)
{
   /* Determine lenght of bar */
   int nBarChars = ((nValue - nMinValue) * nMaxChars) / nMaxValue;

   if(od_control.user_ansi || od_control.user_avatar)
   {
      /* If ANSI or AVATAR graphics are available, assume that IBM extended */
      /* ASCII is also available. This function uses character 220 to form  */
      /* bars that are 1/2 the height of the line. You might also want to   */
      /* try character 119, which will form bars that are the entire height */
      /* of the line.                                                       */
      od_repeat(220, nBarChars);
   }
   else
   {
      /* In ASCII mode, the bar is formed by the '=' character. */
      od_repeat('=', nBarChars);
   }
}
