static void
DisplayAlabels(bgPtr)
    Bargraph *bgPtr;
{
  register Tk_Window tkwin = bgPtr->tkwin;
  int boolv, awidth;

  char *s, **elt;
  int i, j, nelt, tickoff;
  double d;
  int d_t, d_l;
  Tcl_Interp *interp = bgPtr->interp;
  Tk_FontMetrics afm;

  float *label_adj, label_in[MAX_LAB_ADJ];
  int niter;
  float fret;

  Tk_GetFontMetrics(bgPtr->Atkfont, &afm);

  clear_labelloc(&bgPtr->sp_a);

  label_adj = NULL;             /* have no adjusted positions */
if (bgPtr->orient == ORIENT_VERTICAL) {
    if (bgPtr->n_alabels < MAX_LAB_ADJ) {
      /* We aren't dealing w/ a ridiculous number.  Mangle positions to do
       * avoid overlap as much as possible.
       */
      for (j=0, i = 0; i < bgPtr->n_alabels; i++) {
        s = bgPtr->alabels[i];
        tickoff = 0;
        if (Tcl_SplitList(interp, s, &nelt, &elt) != TCL_ERROR && nelt >= 2) {
          d = limit_dvalue(bgPtr->fromVal,
                              bgPtr->toVal, strtod(elt[0], NULL));
          ValueToPixel(bgPtr, d, 1);
          label_in[j++] = bgPtr->pixval;
        }
      }
      #if 0
	for (j=0, i = 0; i < bgPtr->n_alabels; i++) {
	}
      #endif
      if (j > 1) {
          init_labelloc(&bgPtr->sp_a, bgPtr->wingAlgorithm,
	  		bgPtr->offset.bot_edge-bgPtr->max_height,
                        bgPtr->offset.bot_edge, afm.linespace, j, label_in);
          label_adj = do_labelloc(&bgPtr->sp_a, &niter, &fret);
      }
    }
  }

  /* OK, now do the tick and label stuff */
  for (j = 0, i = 0; i < bgPtr->n_alabels; i++) {
    s = bgPtr->alabels[i];
    tickoff = 0;
    if (Tcl_SplitList(interp, s, &nelt, &elt) == TCL_ERROR) {
      /* ignore this value */
    } else if (nelt >= 2) {
      d = limit_dvalue(bgPtr->fromVal, bgPtr->toVal, strtod(elt[0], NULL));
	d_t = ValueToPixel(bgPtr, d, 1);
      d_l = label_adj ? ((int) label_adj[j++]) : d_t;
      s = elt[1];
      awidth = Tk_TextWidth(bgPtr->Atkfont, s, strlen(s));
      if (bgPtr->orient == ORIENT_VERTICAL) {
	Tk_DrawChars(bgPtr->display, Tk_WindowId(tkwin),
		     bgPtr->alabGC, bgPtr->Atkfont,
		     s, strlen(s),
		     bgPtr->offset.lab_a + bgPtr->alabelPixels - awidth,
		     d_l + afm.descent);
	if (nelt >= 2) {
	  /* Draw a tick if no flag, or flag is true.
	   * (Ignore errors in value).
	   */ 
	   if (nelt == 2) {
	    boolv = 1;
	   } else {
	    Tcl_GetBoolean(interp, elt[2], &boolv);
	   }

	  if (boolv) {
	    /* Draw a tick */
	    bgPtr->ticks[bgPtr->numTicks].x1 = bgPtr->offset.tick_a;
	    bgPtr->ticks[bgPtr->numTicks].x2 = bgPtr->offset.tick_a +
	      bgPtr->tickLength;
	    bgPtr->ticks[bgPtr->numTicks].y1 = d_l;
	      bgPtr->ticks[bgPtr->numTicks].y2 = d_t;
	    bgPtr->numTicks++;
	  }
	}
      } else {
	/* HORIZONTAL */
	Tk_DrawChars(bgPtr->display, Tk_WindowId(tkwin),
		     bgPtr->alabGC, bgPtr->Atkfont,
		     s, strlen(s), d_l - awidth/2,
		     bgPtr->offset.lab_a + afm.ascent);
	if (nelt >= 2) {
	  /* Draw a tick if no flag, or flag is true.
	   * (Ignore errors in value).
	   */ 
	   if (nelt == 2) {
	    boolv = 1;
	   } else {
	    Tcl_GetBoolean(interp, elt[2], &boolv);
	   }

	  if (boolv) {
	    bgPtr->ticks[bgPtr->numTicks].y1 = bgPtr->offset.tick_a;
	    bgPtr->ticks[bgPtr->numTicks].y2 = bgPtr->offset.tick_a + 
	      bgPtr->tickLength;
	    bgPtr->ticks[bgPtr->numTicks].x1 = d_l;
	      bgPtr->ticks[bgPtr->numTicks].x2 = d_t;
	    bgPtr->numTicks++;
	  }
	}
      }
      Tcl_Free((char *) elt);
    }
  }
}
