which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@976 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			1478 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1478 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* r4obj.c   (c)Copyright Sequiter Software Inc., 1991-1994.  All rights reserved. */
 | 
						|
 | 
						|
#include "d4all.h"
 | 
						|
 | 
						|
 | 
						|
/************************************************************
 | 
						|
 *
 | 
						|
 * Function: obj4create()
 | 
						|
 *
 | 
						|
 *  PARAMETERS: AREA4* area - area to own the object
 | 
						|
 *   long x - x coordinate in 1000's of an inch, relative to the upper left
 | 
						|
 *            corner of the area, positive x to the right
 | 
						|
 *   long y - y coordinate in 1000's of an inch, relative to the upper left
 | 
						|
 *            corner of the area, positive y is down
 | 
						|
 *   long w - width of the object in 1000's of an inch
 | 
						|
 *   long h - height of the object in 1000's of an inch
 | 
						|
 *
 | 
						|
 *  DESCRIPTION: low level object creation function
 | 
						|
 *
 | 
						|
 *  RETURNS: pointer to an OBJ4 struct on success, NULL on failure
 | 
						|
 *
 | 
						|
 *  By: Raymond Cypher
 | 
						|
 *
 | 
						|
 *  HISTORY:
 | 
						|
 *
 | 
						|
 */
 | 
						|
OBJ4 * S4FUNCTION   obj4create( AREA4 *area, long x, long y, long w, long h )
 | 
						|
{
 | 
						|
  OBJ4 *obj;
 | 
						|
 | 
						|
  if( x > area->report->report_width || y > area->height ||
 | 
						|
     x < 0 || y < 0 || w < 0 || h < 0 )
 | 
						|
    return NULL;
 | 
						|
 | 
						|
  if( !area )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  /* allocate the OBJ4 structure */
 | 
						|
  obj = (POBJ4)u4alloc_er( area->report->code_base, sizeof( OBJ4 ) );
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    e4describe( area->report->code_base, e4obj_create, E4_REP_OBJMEM, 0, 0 );
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  /* set the internal members */
 | 
						|
  obj->area = area;
 | 
						|
  obj->style = area->report->active_style;
 | 
						|
  if( obj->style == NULL )
 | 
						|
    obj->style = (PSTYLE4)l4first( &area->report->styles );
 | 
						|
  obj->alignment = justify4left;
 | 
						|
  obj->x = x;
 | 
						|
  obj->y = y;
 | 
						|
  obj->w = w;
 | 
						|
  obj->h = h;
 | 
						|
  obj->numeric_type = obj4numNumber;
 | 
						|
  obj->display_zero = 1;
 | 
						|
 | 
						|
  /* add the object to the areas object list */
 | 
						|
  area4add_object( area, obj );
 | 
						|
  return obj;
 | 
						|
}
 | 
						|
 | 
						|
/************************************************************
 | 
						|
 *
 | 
						|
 * Function: obj4free()
 | 
						|
 *
 | 
						|
 *  PARAMETERS: OBJ4* obj - object to be freed
 | 
						|
 *
 | 
						|
 *  DESCRIPTION: releases all the memory associated with the object
 | 
						|
 *
 | 
						|
 *  RETURNS: none
 | 
						|
 *
 | 
						|
 *  By: Raymond Cypher
 | 
						|
 *
 | 
						|
 *  HISTORY:
 | 
						|
 *
 | 
						|
 */
 | 
						|
void S4FUNCTION   obj4free( OBJ4 *obj )
 | 
						|
{
 | 
						|
  AREA4 *area;
 | 
						|
  OBJ4 *obj_on;
 | 
						|
  LINK4 *link;
 | 
						|
 | 
						|
  area = obj->area;
 | 
						|
 | 
						|
  /* if necessary remove the object from the selected object list */
 | 
						|
  link = (LINK4 *)obj;
 | 
						|
  if( obj->is_active || obj->is_first )
 | 
						|
  {
 | 
						|
    l4remove( &area->report->active_objects, (link+1) );
 | 
						|
    obj->is_active = obj->is_first = 0;
 | 
						|
  }
 | 
						|
 | 
						|
  /* if the object is in a list of objects remove it, it will either be in
 | 
						|
     the object list of an area, or the object list of a containing object */
 | 
						|
  if( !(!link->n && !link->p) )
 | 
						|
    if( obj->container )
 | 
						|
    {
 | 
						|
      l4remove( &obj->container->contained, obj );
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
      l4remove( &area->objects, obj );
 | 
						|
    }
 | 
						|
 | 
						|
  /* if the object being freed contains any objects don't delete them, return
 | 
						|
     them to the parent area */
 | 
						|
  while( (obj_on = (OBJ4 *)l4pop( &obj->contained )) != NULL )
 | 
						|
    area4add_object( area, obj_on );
 | 
						|
 | 
						|
  /* free the associated memory */
 | 
						|
  if( obj->wintext )
 | 
						|
    u4free( obj->wintext );
 | 
						|
 | 
						|
  if( obj->date_format )
 | 
						|
    u4free( obj->date_format );
 | 
						|
 | 
						|
  if( obj->eval_text )
 | 
						|
    u4free( obj->eval_text );
 | 
						|
 | 
						|
  if( obj->display_once_expr )
 | 
						|
    expr4free( obj->display_once_expr );
 | 
						|
 | 
						|
  if( obj->last_display_val )
 | 
						|
    u4free( obj->last_display_val );
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
  if( obj->hWnd )
 | 
						|
    DestroyWindow( obj->hWnd );
 | 
						|
#endif
 | 
						|
 | 
						|
  u4free( obj );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
void S4FUNCTION   obj4fieldFree( OBJ4 *obj )
 | 
						|
{
 | 
						|
  obj4free( obj );
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
POBJ4 S4FUNCTION   obj4fieldCreate( AREA4 *area, FIELD4 *field_ptr, long x, long y, long w, long h )
 | 
						|
{
 | 
						|
  OBJ4 *obj;
 | 
						|
 | 
						|
  if( !area )
 | 
						|
    return NULL;
 | 
						|
 | 
						|
  obj = obj4create( area, x, y, w, h );
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  /* set the data member to the field */
 | 
						|
  obj->data = (void *)field_ptr;
 | 
						|
 | 
						|
  /* set the object type */
 | 
						|
  obj->obj_type_num = obj4type_field;
 | 
						|
 | 
						|
  /* set the default size and alignment */
 | 
						|
  switch( f4type(field_ptr) )
 | 
						|
  {
 | 
						|
  case 'N':
 | 
						|
    obj->alignment = justify4right;
 | 
						|
  case 'D':
 | 
						|
    obj->num_chars = 10;
 | 
						|
    obj->dec = f4decimals( field_ptr );
 | 
						|
    break;
 | 
						|
 | 
						|
  case 'M':
 | 
						|
    obj->num_chars = 42;
 | 
						|
    break;
 | 
						|
 | 
						|
  case 'L':
 | 
						|
    obj->num_chars = 2;
 | 
						|
    break;
 | 
						|
 | 
						|
  case 'C':
 | 
						|
    obj->num_chars = f4len( field_ptr )+2;
 | 
						|
    break;
 | 
						|
 | 
						|
  default:
 | 
						|
    obj->num_chars = 12;
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
  return obj;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
void S4FUNCTION   obj4totalFree( OBJ4 *obj )
 | 
						|
{
 | 
						|
  if( obj->data )
 | 
						|
  {
 | 
						|
    /* a total is always created in conjunction with an object, therefore
 | 
						|
       when we delete the object we delete the total as well */
 | 
						|
    report4deleteCalc( obj->area->report, ((PTOTAL4)obj->data)->calc_ptr );
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  obj4free( obj );
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
POBJ4 S4FUNCTION   obj4totalCreate( AREA4 *area, TOTAL4 *total_ptr, long x, long y, long w, long h )
 | 
						|
{
 | 
						|
  OBJ4 *obj;
 | 
						|
 | 
						|
  if( !area )
 | 
						|
    return NULL;
 | 
						|
 | 
						|
  obj = obj4create( area, x, y, w, h );
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  /* set the data ptr to the total */
 | 
						|
  obj->data = (void *)total_ptr;
 | 
						|
 | 
						|
  /* set the object type */
 | 
						|
  obj->obj_type_num = obj4type_total;
 | 
						|
 | 
						|
  /* set the internal object members */
 | 
						|
  obj->num_chars = 12;
 | 
						|
  obj->alignment = justify4right;
 | 
						|
 | 
						|
  /* set the totals object pointer */
 | 
						|
  total_ptr->obj = obj;
 | 
						|
 | 
						|
  return obj;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
void S4FUNCTION   obj4calcFree( OBJ4 *obj )
 | 
						|
{
 | 
						|
  /* calculations are created independant of objects, therefore we don't
 | 
						|
     delete the associated calculation when the object is deleted. Calc
 | 
						|
     deletion is handled when the report is freed */
 | 
						|
  obj4free( obj );
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
POBJ4 S4FUNCTION   obj4calcCreate( AREA4 *area, EXPR4CALC *calc_ptr, long x, long y, long w, long h )
 | 
						|
{
 | 
						|
  OBJ4 *obj;
 | 
						|
  int type;
 | 
						|
 | 
						|
  if( !area )
 | 
						|
    return NULL;
 | 
						|
 | 
						|
  if( !calc_ptr )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  obj = obj4create( area, x, y, w, h );
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  /* set the data pointer and the object type */
 | 
						|
  obj->data = (void *)calc_ptr;
 | 
						|
  obj->obj_type_num = obj4type_calc;
 | 
						|
 | 
						|
  /* set the default size and alignment */
 | 
						|
  type = expr4type( calc_ptr->expr );
 | 
						|
  switch( type )
 | 
						|
  {
 | 
						|
  case r4num:
 | 
						|
  case r4num_doub:
 | 
						|
    obj->num_chars = 10;
 | 
						|
    obj->alignment = justify4right;
 | 
						|
    break;
 | 
						|
 | 
						|
  case r4date:
 | 
						|
  case r4date_doub:
 | 
						|
    obj->num_chars = strlen( area->report->default_date_format )+2;
 | 
						|
    break;
 | 
						|
 | 
						|
  case r4log:
 | 
						|
    obj->num_chars = 2;
 | 
						|
    break;
 | 
						|
 | 
						|
  default:
 | 
						|
    obj->num_chars = expr4len( calc_ptr->expr )+2;
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
  return obj;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
void S4FUNCTION obj4exprFree( OBJ4 *obj )
 | 
						|
{
 | 
						|
  /* free the expression */
 | 
						|
  expr4free( (EXPR4 *)obj->data );
 | 
						|
  obj4free( obj );
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
POBJ4 S4FUNCTION obj4exprCreate( AREA4 *area, EXPR4 *expr_ptr, long x, long y, long w, long h )
 | 
						|
{
 | 
						|
  OBJ4 *obj;
 | 
						|
 | 
						|
  if( !area )
 | 
						|
    return NULL;
 | 
						|
 | 
						|
  obj = obj4create( area, x, y, w, h );
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  /* set the data pointer and the object type */
 | 
						|
  obj->data = (void *)expr_ptr;
 | 
						|
  obj->obj_type_num = obj4type_expr;
 | 
						|
 | 
						|
  /* set the default length and alignment */
 | 
						|
  obj->num_chars = expr4len( expr_ptr )+2;
 | 
						|
  if( expr4type( expr_ptr ) == r4num || expr4type( expr_ptr ) == r4num_doub )
 | 
						|
    obj->alignment = justify4right;
 | 
						|
 | 
						|
  return obj;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
void S4FUNCTION obj4textFree( OBJ4 *obj )
 | 
						|
{
 | 
						|
  obj4free( obj );
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
POBJ4 S4FUNCTION obj4textCreate( AREA4 *area, char *str_ptr, long x, long y, long w, long h )
 | 
						|
{
 | 
						|
  OBJ4 *obj;
 | 
						|
 | 
						|
  if( !area )
 | 
						|
    return NULL;
 | 
						|
 | 
						|
  obj = obj4create( area, x, y, w, h );
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  if( str_ptr )
 | 
						|
  {
 | 
						|
    /* allocate space to hold the string */
 | 
						|
#ifdef S4WINDOWS
 | 
						|
    obj->wintext = (char *)u4alloc_free( area->report->code_base, lstrlen(str_ptr)+1 );
 | 
						|
#else
 | 
						|
    obj->wintext = (char *)u4alloc_free( area->report->code_base, strlen(str_ptr)+1 );
 | 
						|
#endif
 | 
						|
    if( !obj->wintext )
 | 
						|
    {
 | 
						|
      obj4free( obj );
 | 
						|
      return NULL;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  else
 | 
						|
    obj->wintext = NULL;
 | 
						|
 | 
						|
  /* set the object type */
 | 
						|
  obj->obj_type_num = obj4type_text;
 | 
						|
 | 
						|
  obj->num_chars = 0;
 | 
						|
 | 
						|
  if( str_ptr )
 | 
						|
  {
 | 
						|
#ifdef S4WINDOWS
 | 
						|
    lstrcpy( (char *)obj->wintext, str_ptr );
 | 
						|
#else
 | 
						|
    strcpy( (char *)obj->wintext, str_ptr );
 | 
						|
#endif
 | 
						|
  }
 | 
						|
 | 
						|
  return obj;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
void S4FUNCTION obj4lineFree( OBJ4 *obj )
 | 
						|
{
 | 
						|
  obj4free( obj );
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
POBJ4 S4FUNCTION obj4lineCreate( AREA4 *area, int vertical, long x, long y, long length )
 | 
						|
{
 | 
						|
  OBJ4 *obj;
 | 
						|
 | 
						|
  if( !area )
 | 
						|
    return NULL;
 | 
						|
 | 
						|
  if( vertical )
 | 
						|
    obj = obj4create( area, x, y, 1, length );
 | 
						|
  else
 | 
						|
    obj = obj4create( area, x, y, length, 1 );
 | 
						|
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  /* set the line orientation */
 | 
						|
  obj->alignment = vertical;
 | 
						|
  if( vertical )
 | 
						|
    obj->obj_type_num = obj4type_vline;
 | 
						|
  else
 | 
						|
    obj->obj_type_num = obj4type_hline;
 | 
						|
 | 
						|
  obj->num_chars = 0;
 | 
						|
 | 
						|
  return obj;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
int S4FUNCTION obj4lineWidth( POBJ4 obj, long width )
 | 
						|
{
 | 
						|
  if( !obj || width < 1 )
 | 
						|
    return -1;
 | 
						|
 | 
						|
  if( obj->obj_type_num == obj4type_vline )
 | 
						|
    obj->w = width;
 | 
						|
 | 
						|
  if( obj->obj_type_num == obj4type_hline )
 | 
						|
    obj->h = width;
 | 
						|
 | 
						|
  /* for frames the line width is stored in the num_chars member of OBJ4 */
 | 
						|
  if( obj->obj_type_num == obj4type_frame )
 | 
						|
    obj->num_chars = (int)width+2;
 | 
						|
 | 
						|
  obj->dec = (int)width;
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
void S4FUNCTION obj4frameFree( OBJ4 *obj )
 | 
						|
{
 | 
						|
  obj4free( obj );
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
POBJ4 S4FUNCTION obj4frameCreate( AREA4 *area, long x, long y, long w, long h )
 | 
						|
{
 | 
						|
  OBJ4 *obj;
 | 
						|
 | 
						|
  if( !area )
 | 
						|
    return NULL;
 | 
						|
 | 
						|
  obj = obj4create( area, x, y, w, h );
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  obj->obj_type_num = obj4type_frame;
 | 
						|
 | 
						|
  obj->num_chars = 0;
 | 
						|
  obj->alignment = 0;
 | 
						|
  obj->display_zero = 0;
 | 
						|
 | 
						|
  return obj;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
void S4FUNCTION obj4bitmapStaticFree( POBJ4 obj )
 | 
						|
{
 | 
						|
  if( obj->data )
 | 
						|
  {
 | 
						|
#ifdef S4WINDOWS
 | 
						|
    GlobalFree( (HANDLE)obj->data );
 | 
						|
#endif
 | 
						|
    obj->data = NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  obj4free( obj );
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
POBJ4 S4FUNCTION obj4bitmapStaticCreate( AREA4 *area, HANDLE hDIB, long x, long y, long w, long h )
 | 
						|
{
 | 
						|
  OBJ4 *obj;
 | 
						|
 | 
						|
  if( !area )
 | 
						|
    return NULL;
 | 
						|
 | 
						|
  obj = obj4create( area, x, y, w, h );
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  obj->obj_type_num = obj4type_bitmap1;
 | 
						|
  obj->data = (void far *)hDIB;
 | 
						|
 | 
						|
  obj->num_chars = 0;
 | 
						|
  obj->alignment = 0;
 | 
						|
  obj->display_zero = 0;
 | 
						|
 | 
						|
  return obj;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
void S4FUNCTION obj4bitmapFileFree( POBJ4 obj )
 | 
						|
{
 | 
						|
  if( obj->data )
 | 
						|
  {
 | 
						|
#ifdef S4WINDOWS
 | 
						|
    GlobalFree( (HANDLE)obj->data );
 | 
						|
#endif
 | 
						|
    obj->data = NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  obj4free( obj );
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
POBJ4 S4FUNCTION obj4bitmapFileCreate( AREA4 *area, char *filename, long x, long y, long w, long h )
 | 
						|
{
 | 
						|
  OBJ4 *obj;
 | 
						|
  HANDLE hDIB;
 | 
						|
 | 
						|
  if( !area )
 | 
						|
    return NULL;
 | 
						|
 | 
						|
  if( !filename )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  hDIB = GetDIB( filename, area->report->code_base );
 | 
						|
  if( !hDIB )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  obj = obj4create( area, x, y, w, h );
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  obj->obj_type_num = obj4type_bitmap2;
 | 
						|
#ifdef S4WINDOWS
 | 
						|
  obj->data = (void far *)hDIB;
 | 
						|
#else
 | 
						|
  obj->data = NULL;
 | 
						|
#endif
 | 
						|
  obj->wintext = (char *)u4alloc( strlen(filename)+1 );
 | 
						|
  if( !obj->wintext )
 | 
						|
  {
 | 
						|
    obj4bitmapFileFree( obj );
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    strcpy( obj->wintext, filename );
 | 
						|
  }
 | 
						|
 | 
						|
  obj->num_chars = 0;
 | 
						|
  obj->alignment = 0;
 | 
						|
  obj->display_zero = 0;
 | 
						|
 | 
						|
  return obj;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
void S4FUNCTION obj4bitmapFieldFree( POBJ4 obj )
 | 
						|
{
 | 
						|
  obj4free( obj );
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
/* a bitmap field object is almost identical to a field object, the main
 | 
						|
   difference how it is displayed */
 | 
						|
POBJ4 S4FUNCTION obj4bitmapFieldCreate( AREA4 *area, FIELD4 *field, long x, long y, long w, long h )
 | 
						|
{
 | 
						|
  OBJ4 *obj;
 | 
						|
 | 
						|
  obj = obj4create( area, x, y, w, h );
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  obj->obj_type_num = obj4type_bitmap3;
 | 
						|
  obj->data = field;
 | 
						|
 | 
						|
  obj->wintext = (char *)u4alloc( strlen(f4name(field))+3+strlen(d4alias(field->data)) );
 | 
						|
  if( !obj->wintext )
 | 
						|
  {
 | 
						|
    obj4bitmapFileFree( obj );
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    sprintf( obj->wintext, "%s->%s", d4alias(field->data), f4name(field) );
 | 
						|
  }
 | 
						|
 | 
						|
  obj->num_chars = 0;
 | 
						|
  obj->alignment = 0;
 | 
						|
  obj->display_zero = 0;
 | 
						|
 | 
						|
  return obj;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
/* this is a function for internal use only:  it simply uses a switch
 | 
						|
   statement to pass the object to the appropriate free function */
 | 
						|
void S4FUNCTION obj4delete( OBJ4 *obj )
 | 
						|
{
 | 
						|
#ifdef S4WINDOWS
 | 
						|
  if( obj->hWnd )
 | 
						|
    DestroyWindow( obj->hWnd );
 | 
						|
  obj->hWnd = NULL;
 | 
						|
#endif
 | 
						|
 | 
						|
  switch( obj->obj_type_num )
 | 
						|
  {
 | 
						|
  case obj4type_field:
 | 
						|
    obj4fieldFree( obj );
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_expr:
 | 
						|
    obj4exprFree( obj );
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_total:
 | 
						|
    obj4totalFree( obj );
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_calc:
 | 
						|
    obj4calcFree( obj );
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_text:
 | 
						|
    obj4textFree( obj );
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_hline:
 | 
						|
  case obj4type_vline:
 | 
						|
    obj4lineFree( obj );
 | 
						|
    break;
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
  case obj4type_frame:
 | 
						|
    obj4frameFree( obj );
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_bitmap1:
 | 
						|
    obj4bitmapStaticFree( obj );
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_bitmap2:
 | 
						|
    obj4bitmapFileFree( obj );
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_bitmap3:
 | 
						|
    obj4bitmapFieldFree( obj );
 | 
						|
    break;
 | 
						|
#endif
 | 
						|
 | 
						|
  default:
 | 
						|
    obj4free( obj );
 | 
						|
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/****************************************************************************
 | 
						|
 *  evaluates objects with dynamic values, stores the result in the eval_text
 | 
						|
 *  member of the object structure
 | 
						|
 ****************************************************************************/
 | 
						|
void obj4evaluate( OBJ4 *obj )
 | 
						|
{
 | 
						|
  int len;
 | 
						|
  double d, *d_ptr;
 | 
						|
  char buf[1024], *output_ptr, *result_ptr, *date_format;
 | 
						|
  char date_buf[8] ;
 | 
						|
  REPORT4 *report;
 | 
						|
  EXPR4 *expr;
 | 
						|
#ifdef S4UNIX
 | 
						|
  int temp_int ;
 | 
						|
#endif
 | 
						|
 | 
						|
  if( !obj )
 | 
						|
    return;
 | 
						|
 | 
						|
  report = obj->area->report;
 | 
						|
 | 
						|
  output_ptr = buf;
 | 
						|
 | 
						|
  switch( obj->obj_type_num )
 | 
						|
  {
 | 
						|
    /******************/
 | 
						|
    /* the value is already calculated in the TOTAL4 structures members we
 | 
						|
       simply move this value into the appropriate member of the OBJ4 */
 | 
						|
  case obj4type_total:
 | 
						|
    switch( ((TOTAL4 *)obj->data)->total_type )
 | 
						|
    {
 | 
						|
    case total4lowest:
 | 
						|
      d =  ((TOTAL4 *)obj->data)->low;
 | 
						|
      break;
 | 
						|
 | 
						|
    case total4highest:
 | 
						|
      d = ((TOTAL4 *)obj->data)->high;
 | 
						|
      break;
 | 
						|
 | 
						|
    case total4sum:
 | 
						|
      d = ((TOTAL4 *)obj->data)->total;
 | 
						|
      break;
 | 
						|
 | 
						|
    case total4average:
 | 
						|
      d = ((TOTAL4 *)obj->data)->total/((TOTAL4 *)obj->data)->count;
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    obj->dval = d;
 | 
						|
 | 
						|
    /* if the value comes out to zero and zero display is off set the text
 | 
						|
       to NULL and return */
 | 
						|
    if( (d == 0 || (d < 1 && obj->dec == 0)) && !obj->display_zero )
 | 
						|
    {
 | 
						|
      if( obj->eval_text )
 | 
						|
      {
 | 
						|
        u4free( obj->eval_text );
 | 
						|
        obj->eval_text = NULL;
 | 
						|
        obj->eval_len = 0;
 | 
						|
      }
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    /* convert the double value into text */
 | 
						|
    len = report4conv_double( obj, d, buf );
 | 
						|
    output_ptr = buf;
 | 
						|
 | 
						|
    /* if necessary re-alloc the eval_text member of the OBJ4 */
 | 
						|
    if( obj->eval_text && obj->eval_len < len+1 )
 | 
						|
    {
 | 
						|
      u4free( obj->eval_text );
 | 
						|
      obj->eval_text = NULL;
 | 
						|
      obj->eval_len = 0;
 | 
						|
      obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | 
						|
    }
 | 
						|
 | 
						|
    if( obj->eval_text == NULL )
 | 
						|
      obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | 
						|
 | 
						|
    /* copy the text into the eval_text member and set the length */
 | 
						|
    if( obj->eval_text )
 | 
						|
    {
 | 
						|
      obj->eval_len = len+1;
 | 
						|
      memcpy( obj->eval_text, output_ptr, len+1 );
 | 
						|
    }
 | 
						|
    break;
 | 
						|
 | 
						|
    /******************/
 | 
						|
  case obj4type_expr:
 | 
						|
    len = expr4len( (EXPR4 *)obj->data );
 | 
						|
    if( len > sizeof( buf ) )
 | 
						|
    {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    /* evaluate the expression */
 | 
						|
    len = expr4vary( (EXPR4 *)obj->data, &output_ptr );
 | 
						|
 | 
						|
    switch( expr4type( (EXPR4 *)obj->data ) )
 | 
						|
    {
 | 
						|
 | 
						|
    case r4str:
 | 
						|
      /* simply determine the length of the string */
 | 
						|
#ifdef S4WINDOWS
 | 
						|
      if( lstrlen( output_ptr ) < len )
 | 
						|
        len = lstrlen( output_ptr );
 | 
						|
#else
 | 
						|
      if( strlen( output_ptr ) < (unsigned)len )
 | 
						|
        len = strlen( output_ptr );
 | 
						|
#endif
 | 
						|
      break;
 | 
						|
 | 
						|
    case r4num:
 | 
						|
      /* convert the ascii string to a double */
 | 
						|
      d = c4atod( output_ptr, expr4len((EXPR4 *)obj->data) );
 | 
						|
 | 
						|
      /* if zero and zero display is off break */
 | 
						|
      if( (d == 0 || ( d < 1 && obj->dec == 0 )) && !obj->display_zero )
 | 
						|
      {
 | 
						|
        if( obj->eval_text )
 | 
						|
        {
 | 
						|
          u4free( obj->eval_text );
 | 
						|
          obj->eval_text = NULL;
 | 
						|
          obj->eval_len = 0;
 | 
						|
        }
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      /* convert the double to formatted text */
 | 
						|
      obj->dval = d;
 | 
						|
      len = report4conv_double( obj, d, buf );
 | 
						|
      /* set the output pointer to the buffer with the formatted text */
 | 
						|
      output_ptr = buf;
 | 
						|
      break;
 | 
						|
 | 
						|
    case r4num_doub:
 | 
						|
      d_ptr = (double *)output_ptr;
 | 
						|
 | 
						|
      /* if zero and zero display is off break */
 | 
						|
      if( (*d_ptr == 0 || (*d_ptr < 1 && obj->dec == 0)) && !obj->display_zero )
 | 
						|
      {
 | 
						|
        if( obj->eval_text )
 | 
						|
        {
 | 
						|
          u4free( obj->eval_text );
 | 
						|
          obj->eval_text = NULL;
 | 
						|
          obj->eval_len = 0;
 | 
						|
        }
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      /* set the dval member of the object */
 | 
						|
      obj->dval = *d_ptr;
 | 
						|
 | 
						|
      /* convert to formatted text and set the output pointer */
 | 
						|
      len = report4conv_double( obj, *d_ptr, buf );
 | 
						|
      output_ptr = buf;
 | 
						|
      break;
 | 
						|
 | 
						|
    case r4date_doub:
 | 
						|
      d_ptr = (double *)output_ptr;
 | 
						|
 | 
						|
      /* convert the double to a date and set the output ptr to the
 | 
						|
         buffer holding the date */
 | 
						|
      if( *d_ptr >= 1.0E99 )
 | 
						|
        len = 0;
 | 
						|
      else
 | 
						|
      {
 | 
						|
        date4assign( date_buf, (long)*d_ptr );
 | 
						|
        date4format( date_buf, buf,
 | 
						|
                    (obj->date_format)?obj->date_format:report->default_date_format );
 | 
						|
        len = strlen( buf );
 | 
						|
        output_ptr = buf;
 | 
						|
      }
 | 
						|
 | 
						|
      /* set the objects dval member */
 | 
						|
      obj->dval = *d_ptr;
 | 
						|
      break;
 | 
						|
 | 
						|
    case r4date:
 | 
						|
      if( *output_ptr == ' ' )
 | 
						|
        len = 0 ;
 | 
						|
      else
 | 
						|
      {
 | 
						|
        if( report->for_dbf )
 | 
						|
        {
 | 
						|
          strcpy( buf, output_ptr );
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
          /* format the date and set the output pointer */
 | 
						|
          date_format =  obj->date_format ?
 | 
						|
            obj->date_format : report->default_date_format ;
 | 
						|
          date4format( output_ptr, buf, date_format ) ;
 | 
						|
        }
 | 
						|
        len =  strlen(buf) ;
 | 
						|
        output_ptr = buf;
 | 
						|
      }
 | 
						|
      break ;
 | 
						|
 | 
						|
      /* ********************************************* */
 | 
						|
    case r4log:
 | 
						|
      len = 1;
 | 
						|
#ifdef S4UNIX
 | 
						|
      memcpy( &temp_int, output_ptr, sizeof(temp_int) ) ;
 | 
						|
      if( temp_int == 1)
 | 
						|
#else
 | 
						|
        if( *(int *)output_ptr == 1)
 | 
						|
#endif
 | 
						|
        {
 | 
						|
          obj->dval = 1;
 | 
						|
          sprintf( buf, "T" );
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
          obj->dval = 0;
 | 
						|
          sprintf( buf, "F" );
 | 
						|
        }
 | 
						|
      output_ptr = buf;
 | 
						|
      break ;
 | 
						|
    } /* end of switch statement for expression type */
 | 
						|
 | 
						|
 | 
						|
    /* if there is already space allocated for the eval text but it is
 | 
						|
       too small re-alloc */
 | 
						|
    if( (obj->eval_text && obj->eval_len < len+1) )
 | 
						|
    {
 | 
						|
      u4free( obj->eval_text );
 | 
						|
      obj->eval_text = NULL;
 | 
						|
      obj->eval_len = 0;
 | 
						|
      obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | 
						|
    }
 | 
						|
 | 
						|
    /* if no memory allocated for eval text */
 | 
						|
    if( obj->eval_text == NULL )
 | 
						|
      obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | 
						|
 | 
						|
    /* place the tet into the eval_text member */
 | 
						|
    if( obj->eval_text )
 | 
						|
    {
 | 
						|
      obj->eval_len = len+1;
 | 
						|
      u4ncpy( obj->eval_text, output_ptr, len+1 );
 | 
						|
    }
 | 
						|
    break;
 | 
						|
 | 
						|
    /*********************************************************/
 | 
						|
    /* the calc type of OBJECT is dealt with almost identically to
 | 
						|
       the expression type immediately above */
 | 
						|
  case obj4type_calc:
 | 
						|
    expr = ((EXPR4CALC *)obj->data)->expr;
 | 
						|
 | 
						|
    len = expr4len( expr );
 | 
						|
    if( len > sizeof( buf ) )
 | 
						|
    {
 | 
						|
 | 
						|
    }
 | 
						|
    len = expr4vary( expr, &output_ptr );
 | 
						|
    switch( expr4type( expr ) )
 | 
						|
    {
 | 
						|
 | 
						|
    case r4str:
 | 
						|
#ifdef S4WINDOWS
 | 
						|
      if( lstrlen( output_ptr ) < len )
 | 
						|
        len = lstrlen( output_ptr );
 | 
						|
#else
 | 
						|
      if( strlen( output_ptr ) < (unsigned)len )
 | 
						|
        len = strlen( output_ptr );
 | 
						|
#endif
 | 
						|
      break;
 | 
						|
 | 
						|
    case r4num:
 | 
						|
      d = c4atod( output_ptr, expr4len((EXPR4 *)obj->data) );
 | 
						|
      if( (d == 0 || (d < 1 && obj->dec == 0)) && !obj->display_zero )
 | 
						|
      {
 | 
						|
        if( obj->eval_text )
 | 
						|
        {
 | 
						|
          u4free( obj->eval_text );
 | 
						|
          obj->eval_text = NULL;
 | 
						|
          obj->eval_len = 0;
 | 
						|
        }
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      obj->dval = d;
 | 
						|
      len = report4conv_double( obj, d, buf );
 | 
						|
      output_ptr = buf;
 | 
						|
      break;
 | 
						|
 | 
						|
    case r4num_doub:
 | 
						|
      d_ptr = (double *)output_ptr;
 | 
						|
      if( (*d_ptr == 0 || (*d_ptr < 1 && obj->dec == 0)) && !obj->display_zero )
 | 
						|
      {
 | 
						|
        if( obj->eval_text )
 | 
						|
        {
 | 
						|
          u4free( obj->eval_text );
 | 
						|
          obj->eval_text = NULL;
 | 
						|
          obj->eval_len = 0;
 | 
						|
        }
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      obj->dval = *d_ptr;
 | 
						|
      len = report4conv_double( obj, *d_ptr, buf );
 | 
						|
      output_ptr = buf;
 | 
						|
      break;
 | 
						|
 | 
						|
    case r4date:
 | 
						|
      if( *output_ptr == ' ' )
 | 
						|
        len = 0 ;
 | 
						|
      else
 | 
						|
      {
 | 
						|
        if( report->for_dbf )
 | 
						|
        {
 | 
						|
          strcpy( buf, output_ptr );
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
          date_format =  obj->date_format ?
 | 
						|
            obj->date_format : report->default_date_format ;
 | 
						|
          date4format( output_ptr, buf, date_format ) ;
 | 
						|
        }
 | 
						|
        len =  strlen(buf) ;
 | 
						|
        output_ptr = buf;
 | 
						|
      }
 | 
						|
      break ;
 | 
						|
 | 
						|
    case r4date_doub:
 | 
						|
      d_ptr = (double *)output_ptr;
 | 
						|
      if( *d_ptr >= 1.0E99 )
 | 
						|
        len = 0;
 | 
						|
      else
 | 
						|
      {
 | 
						|
        date4assign( date_buf, (long)*d_ptr );
 | 
						|
        date4format( date_buf, buf,
 | 
						|
                    (obj->date_format)?obj->date_format:report->default_date_format );
 | 
						|
        len = strlen( buf );
 | 
						|
        output_ptr = buf;
 | 
						|
      }
 | 
						|
      obj->dval = *d_ptr;
 | 
						|
      break;
 | 
						|
 | 
						|
    case r4log:
 | 
						|
      len = 1;
 | 
						|
#ifdef S4UNIX
 | 
						|
      memcpy( &temp_int, output_ptr, sizeof(temp_int) ) ;
 | 
						|
      if( temp_int == 1)
 | 
						|
#else
 | 
						|
        if( *(int *)output_ptr == 1)
 | 
						|
#endif
 | 
						|
        {
 | 
						|
          obj->dval = 1;
 | 
						|
          sprintf( buf, "T" );
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
          obj->dval = 0;
 | 
						|
          sprintf( buf, "F" );
 | 
						|
        }
 | 
						|
      output_ptr = buf;
 | 
						|
      break ;
 | 
						|
    }
 | 
						|
 | 
						|
    if( obj->eval_text && obj->eval_len < len+1 )
 | 
						|
    {
 | 
						|
      u4free( obj->eval_text );
 | 
						|
      obj->eval_text = NULL;
 | 
						|
      obj->eval_len = 0;
 | 
						|
      obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | 
						|
    }
 | 
						|
 | 
						|
    if( obj->eval_text == NULL )
 | 
						|
      obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | 
						|
 | 
						|
    if( obj->eval_text )
 | 
						|
    {
 | 
						|
      obj->eval_len = len+1;
 | 
						|
      u4ncpy( obj->eval_text, output_ptr, len+1 );
 | 
						|
    }
 | 
						|
    break;
 | 
						|
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
    /*******************************/
 | 
						|
    /* bitmap referenced by a file name in a data file field */
 | 
						|
  case obj4type_bitmap3:
 | 
						|
    /* get the file name from the field and place it in the
 | 
						|
       eval_text member */
 | 
						|
    result_ptr =  f4memo_ptr((FIELD4 *)obj->data ) ;
 | 
						|
    len =  f4memo_len((FIELD4 *)obj->data ) ;
 | 
						|
    output_ptr = result_ptr;
 | 
						|
 | 
						|
    if( obj->eval_text && obj->eval_len < len+1 )
 | 
						|
    {
 | 
						|
      u4free( obj->eval_text );
 | 
						|
      obj->eval_text = NULL;
 | 
						|
      obj->eval_len = 0;
 | 
						|
      obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | 
						|
    }
 | 
						|
 | 
						|
    if( obj->eval_text == NULL )
 | 
						|
      obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | 
						|
 | 
						|
    if( obj->eval_text )
 | 
						|
    {
 | 
						|
      obj->eval_len = len+1;
 | 
						|
      u4ncpy( obj->eval_text, output_ptr, len+1 );
 | 
						|
      c4trim_n( obj->eval_text, len+1 );
 | 
						|
      obj->eval_len = strlen( obj->eval_text ) + 1;
 | 
						|
    }
 | 
						|
    break;
 | 
						|
#endif
 | 
						|
 | 
						|
    /********************************************************/
 | 
						|
  case obj4type_field:
 | 
						|
    /* get the field contents */
 | 
						|
    result_ptr =  f4memo_ptr((FIELD4 *)obj->data ) ;
 | 
						|
    len =  f4memo_len((FIELD4 *)obj->data ) ;
 | 
						|
 | 
						|
    /* convert the field contents to text if necessary, based on the field
 | 
						|
       type */
 | 
						|
    switch(f4type((FIELD4 *)obj->data) )
 | 
						|
    {
 | 
						|
 | 
						|
    case r4str:
 | 
						|
      output_ptr = result_ptr;
 | 
						|
      break;
 | 
						|
 | 
						|
    case r4num_doub:
 | 
						|
      d = f4double((FIELD4 *)obj->data );
 | 
						|
      if( (d == 0 || (d < 1 && obj->dec == 0)) && !obj->display_zero )
 | 
						|
      {
 | 
						|
        if( obj->eval_text )
 | 
						|
        {
 | 
						|
          u4free( obj->eval_text );
 | 
						|
          obj->eval_text = NULL;
 | 
						|
          obj->eval_len = 0;
 | 
						|
        }
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      obj->dval = d;
 | 
						|
      len = report4conv_double( obj, d, buf ) ;
 | 
						|
      output_ptr = buf;
 | 
						|
      break;
 | 
						|
 | 
						|
    case r4num:
 | 
						|
      d = f4double((FIELD4 *)obj->data );
 | 
						|
      if( (d == 0 || (d < 1 && obj->dec == 0)) && !obj->display_zero )
 | 
						|
      {
 | 
						|
        if( obj->eval_text )
 | 
						|
        {
 | 
						|
          u4free( obj->eval_text );
 | 
						|
          obj->eval_text = NULL;
 | 
						|
          obj->eval_len = 0;
 | 
						|
        }
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      obj->dval = d;
 | 
						|
      len = report4conv_double( obj, d, buf ) ;
 | 
						|
      output_ptr = buf;
 | 
						|
      break ;
 | 
						|
 | 
						|
    case r4date:
 | 
						|
      if( *result_ptr == ' ' )
 | 
						|
      {
 | 
						|
        len = 0 ;
 | 
						|
      }
 | 
						|
      else
 | 
						|
      {
 | 
						|
        if( report->for_dbf )
 | 
						|
        {
 | 
						|
          strcpy( buf, result_ptr );
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
          date4format( result_ptr, buf,
 | 
						|
                      ((obj->date_format)?obj->date_format:obj->area->report->default_date_format) ) ;
 | 
						|
        }
 | 
						|
        len =  strlen(buf) ;
 | 
						|
        output_ptr = buf;
 | 
						|
      }
 | 
						|
      break ;
 | 
						|
 | 
						|
    case r4log:
 | 
						|
      len =  1 ;
 | 
						|
      output_ptr = result_ptr;
 | 
						|
      break ;
 | 
						|
 | 
						|
    default:
 | 
						|
      output_ptr =  result_ptr ;
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    if( obj->eval_text && obj->eval_len < len+1 )
 | 
						|
    {
 | 
						|
      u4free( obj->eval_text );
 | 
						|
      obj->eval_text = NULL;
 | 
						|
      obj->eval_len = 0;
 | 
						|
      obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | 
						|
    }
 | 
						|
 | 
						|
    if( obj->eval_text == NULL )
 | 
						|
      obj->eval_text = (char *)u4alloc_free( obj->area->report->code_base, len+1 );
 | 
						|
 | 
						|
    if( obj->eval_text )
 | 
						|
    {
 | 
						|
      obj->eval_len = len+1;
 | 
						|
      u4ncpy( obj->eval_text, output_ptr, len+1 );
 | 
						|
      c4trim_n( obj->eval_text, len+1 );
 | 
						|
      obj->eval_len = strlen( obj->eval_text ) + 1;
 | 
						|
    }
 | 
						|
    break ;
 | 
						|
  }
 | 
						|
 | 
						|
  return;
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
/****************************************************************************
 | 
						|
 * Sets the alignment of an object to justify4left, justify4right, or justify4center
 | 
						|
 ****************************************************************************/
 | 
						|
int S4FUNCTION obj4justify( POBJ4 obj, int alignment )
 | 
						|
{
 | 
						|
  int temp;
 | 
						|
 | 
						|
  if( obj == NULL )
 | 
						|
    return -1;
 | 
						|
 | 
						|
 | 
						|
  if( !( alignment == justify4left || alignment == justify4right ||
 | 
						|
        alignment == justify4center ) )
 | 
						|
  {
 | 
						|
    e4describe( obj->area->report->code_base, e4parm, E4_REP_OBJAL, 0, 0 );
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  temp = obj->alignment;
 | 
						|
  obj->alignment = alignment;
 | 
						|
 | 
						|
  return temp;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
int S4FUNCTION obj4dateFormat( POBJ4 obj, char S4PTR *date_format )
 | 
						|
{
 | 
						|
  char *temp;
 | 
						|
 | 
						|
  if( obj == NULL )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( date_format != NULL )
 | 
						|
  {
 | 
						|
    temp = (char *)u4alloc( strlen(date_format) + 1 );
 | 
						|
    if( !temp )
 | 
						|
      return -1;
 | 
						|
 | 
						|
    strcpy( temp, date_format );
 | 
						|
    if( obj->date_format != NULL )
 | 
						|
      u4free( obj->date_format );
 | 
						|
    obj->date_format = temp;
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    if( obj->date_format != NULL )
 | 
						|
      u4free( obj->date_format );
 | 
						|
    obj->date_format = NULL;
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
int S4FUNCTION obj4decimals( POBJ4 obj, int decimals )
 | 
						|
{
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  obj->dec = decimals;
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
int S4FUNCTION obj4displayOnce( POBJ4 obj, char S4PTR *expr_string )
 | 
						|
{
 | 
						|
  EXPR4 S4PTR *expr;
 | 
						|
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( !expr_string )
 | 
						|
  {
 | 
						|
    obj->display_once = 0;
 | 
						|
    if( obj->display_once_expr )
 | 
						|
      expr4free( obj->display_once_expr );
 | 
						|
    obj->display_once_expr = NULL;
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    expr = NULL;
 | 
						|
    expr = expr4parse( obj->area->report->relate->data, expr_string );
 | 
						|
    if( !expr )
 | 
						|
    {
 | 
						|
      e4describe( obj->area->report->code_base, e4report, E4_REP_DOEXPR, 0,  0 );
 | 
						|
      return -1;
 | 
						|
    }
 | 
						|
    if( obj->display_once_expr )
 | 
						|
      expr4free( obj->display_once_expr );
 | 
						|
    obj->display_once_expr = expr;
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
int S4FUNCTION obj4displayZero( POBJ4 obj, int display_zero )
 | 
						|
{
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( display_zero < 0 )
 | 
						|
  {
 | 
						|
    e4describe( obj->area->report->code_base, e4parm, E4_REP_ZERO, 0, 0 );
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  obj->display_zero = display_zero;
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
int S4FUNCTION obj4numericType( POBJ4 obj, int numeric_type )
 | 
						|
{
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( !(numeric_type==obj4numNumber || numeric_type==obj4numExponent
 | 
						|
        || numeric_type==obj4numCurrency || numeric_type==obj4numPercent ) )
 | 
						|
  {
 | 
						|
    e4describe( obj->area->report->code_base, e4parm, E4_REP_NTYPE, 0, 0 );
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  obj->numeric_type = numeric_type;
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
int S4FUNCTION obj4leadingZero( POBJ4 obj, int leading_zero )
 | 
						|
{
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( leading_zero < 0 )
 | 
						|
  {
 | 
						|
    e4describe( obj->area->report->code_base, e4parm, E4_REP_LZERO, 0, 0 );
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
 | 
						|
  obj->leading_zero = leading_zero;
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
int S4FUNCTION obj4brackets( POBJ4 obj, int use_brackets )
 | 
						|
{
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( use_brackets < 0 )
 | 
						|
  {
 | 
						|
    e4describe( obj->area->report->code_base, e4parm, E4_REP_BRACK, 0, 0 );
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
 | 
						|
  obj->use_brackets = use_brackets;
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
int S4FUNCTION obj4style( POBJ4 obj, PSTYLE4 style )
 | 
						|
{
 | 
						|
  int flag = 0;
 | 
						|
  PSTYLE4 style_on;
 | 
						|
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  style_on = (PSTYLE4)l4first( &obj->area->report->styles );
 | 
						|
  while( style_on )
 | 
						|
  {
 | 
						|
    if( style == style_on )
 | 
						|
      flag = 1;
 | 
						|
 | 
						|
    style_on = (PSTYLE4)l4next( &obj->area->report->styles, style_on );
 | 
						|
  }
 | 
						|
 | 
						|
  if( !flag && style != NULL )
 | 
						|
  {
 | 
						|
    e4describe( obj->area->report->code_base, e4parm, E4_REP_OSTYLE, 0, 0 );
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  obj->style = style;
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
int S4FUNCTION obj4frameCorners( POBJ4 obj, int rounded )
 | 
						|
{
 | 
						|
  int temp;
 | 
						|
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( rounded < 0 )
 | 
						|
  {
 | 
						|
    e4describe( obj->area->report->code_base, e4parm, E4_REP_FCRN, 0, 0 );
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  temp = (obj->alignment);
 | 
						|
  obj->alignment = (rounded);
 | 
						|
 | 
						|
  return temp;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
int S4FUNCTION obj4frameFill( POBJ4 obj, int fill )
 | 
						|
{
 | 
						|
  int temp;
 | 
						|
 | 
						|
  if( !obj )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( fill < 0 )
 | 
						|
  {
 | 
						|
    e4describe( obj->area->report->code_base, e4parm, E4_REP_FFILL, 0, 0 );
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  temp = obj->display_zero;
 | 
						|
  obj->display_zero = fill;
 | 
						|
 | 
						|
  return temp;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
int S4FUNCTION obj4lookAhead( POBJ4 obj, int lookahead )
 | 
						|
{
 | 
						|
  if( !obj )
 | 
						|
    return -1;
 | 
						|
 | 
						|
  if( lookahead < 0 )
 | 
						|
  {
 | 
						|
    e4describe( obj->area->report->code_base, e4parm, E4_REP_OLOOK, 0, 0 );
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( obj->obj_type_num == obj4type_total )
 | 
						|
  {
 | 
						|
    ((PTOTAL4)obj->data)->lookahead = lookahead;
 | 
						|
  }
 | 
						|
  else
 | 
						|
    obj->lookahead = lookahead;
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* SEE THE CODEREPORTER MANUAL */
 | 
						|
void S4FUNCTION obj4remove( POBJ4 obj )
 | 
						|
{
 | 
						|
  if( obj->container )
 | 
						|
  {
 | 
						|
    l4remove( &obj->container->contained, obj );
 | 
						|
    obj->container = NULL;
 | 
						|
  }
 | 
						|
  else
 | 
						|
    l4remove( &obj->area->objects, obj );
 | 
						|
}
 | 
						|
 |