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