campo-sirio/cb5/r4obj.c
alex a0f5e0898b This commit was generated by cvs2svn to compensate for changes in r975,
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
1995-02-06 15:33:45 +00:00

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 );
}