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
2145 lines
52 KiB
C
Executable File
2145 lines
52 KiB
C
Executable File
/*r4save.c (c)Copyright Sequiter Software Inc., 1991-1994.
|
|
All rights reserved */
|
|
|
|
#include "d4all.h"
|
|
|
|
int file_version;
|
|
LIST4 name_list;
|
|
|
|
#define CREP_MASKOLD 0xA5
|
|
|
|
void sort4calc_list( REPORT4 *report )
|
|
{
|
|
EXPR4CALC *calc_on, *calc_next;
|
|
EXPR4 *expr;
|
|
LIST4 temp_list;
|
|
CODE4 *code_base = report->code_base;
|
|
int texpr_error;
|
|
|
|
memcpy( &temp_list, &code_base->calc_list, sizeof(LIST4) );
|
|
memset( &code_base->calc_list, 0, sizeof(LIST4) );
|
|
|
|
texpr_error = code_base->expr_error;
|
|
code_base->expr_error = 0;
|
|
|
|
while ( temp_list.n_link > 0 )
|
|
{
|
|
/* step through all calcs in the test list */
|
|
calc_on = (EXPR4CALC *)l4first( &temp_list );
|
|
while( calc_on )
|
|
{
|
|
calc_next = (EXPR4CALC *)l4next( &temp_list, calc_on );
|
|
expr = NULL;
|
|
/* try re-parsing the current expression */
|
|
expr = expr4parse( report->relate->data, expr4source(calc_on->expr) );
|
|
|
|
if( expr )
|
|
{
|
|
expr4free( expr );
|
|
l4remove( &temp_list, calc_on );
|
|
l4add( &code_base->calc_list, calc_on );
|
|
}
|
|
|
|
calc_on = calc_next;
|
|
}
|
|
|
|
}
|
|
|
|
code_base->expr_error = texpr_error;
|
|
}
|
|
|
|
int save4long( FILE4SEQ_WRITE *seq, long *lval )
|
|
{
|
|
#ifdef S4BYTE_SWAP
|
|
S4LONG tval;
|
|
|
|
tval = x4reverse_long( (void *)lval );
|
|
return file4seq_write( seq, &tval, sizeof(tval) );
|
|
#else
|
|
return file4seq_write( seq, lval, sizeof(long) );
|
|
#endif
|
|
|
|
}
|
|
|
|
int save4short( FILE4SEQ_WRITE *seq, short *sval )
|
|
{
|
|
#ifdef S4BYTE_SWAP
|
|
short tval;
|
|
|
|
tval = x4reverse_short( (void *)sval );
|
|
return file4seq_write( seq, &tval, sizeof(tval) );
|
|
#else
|
|
return file4seq_write( seq, sval, sizeof(short) );
|
|
#endif
|
|
}
|
|
|
|
int ret4long( FILE4SEQ_READ *seq, long *lval )
|
|
{
|
|
#ifdef S4BYTE_SWAP
|
|
int file_int ;
|
|
|
|
file_int = file4seq_read( seq, lval, sizeof(S4LONG) ) ;
|
|
if( file_int < sizeof(S4LONG) ) return -1;
|
|
*lval = x4reverse_long( (void *)lval );
|
|
return file_int ;
|
|
#else
|
|
return file4seq_read( seq, lval, sizeof(S4LONG) );
|
|
#endif
|
|
|
|
}
|
|
|
|
int ret4short( FILE4SEQ_READ *seq, short *sval )
|
|
{
|
|
#ifdef S4BYTE_SWAP
|
|
int file_int ;
|
|
|
|
file_int = file4seq_read( seq, sval, sizeof(short) ) ;
|
|
if( file_int < sizeof(short) ) return -1;
|
|
*sval = x4reverse_short( (void *)sval );
|
|
return file_int ;
|
|
#else
|
|
return file4seq_read( seq, sval, sizeof(short) );
|
|
#endif
|
|
}
|
|
|
|
int save4string( FILE4SEQ_WRITE *seq, char *string )
|
|
{
|
|
long str_len;
|
|
|
|
#ifdef S4WINDOWS
|
|
str_len = (long)lstrlen( string );
|
|
#else
|
|
str_len = (long)strlen( string );
|
|
#endif
|
|
|
|
if( save4long( seq, &str_len ) < 0 )
|
|
return -1;
|
|
if( file4seq_write( seq, string, (unsigned)(str_len + 1) ) < 0 )
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION retrieve4string( FILE4SEQ_READ *seq, char *string, int string_len )
|
|
{
|
|
long str_len;
|
|
|
|
if( ret4long( seq, &str_len ) < sizeof(str_len) )
|
|
return -1;
|
|
|
|
|
|
if( str_len >= string_len )
|
|
{
|
|
e4( seq->file->code_base, e4result, E4_RESULT_INT );
|
|
return -1;
|
|
}
|
|
file4seq_read( seq, string, (unsigned)(str_len + 1) );
|
|
return (int)str_len;
|
|
}
|
|
|
|
char *retrieve4string_alloc( FILE4SEQ_READ *seq )
|
|
{
|
|
long str_len;
|
|
char *ret_string;
|
|
|
|
if( ret4long( seq, &str_len ) < sizeof(str_len) )
|
|
return NULL;
|
|
|
|
ret_string = (char *)u4alloc_free( seq->file->code_base, str_len+1 );
|
|
if( !ret_string )
|
|
return NULL;
|
|
|
|
if( file4seq_read( seq, ret_string, (unsigned)(str_len+1) ) < (unsigned)(str_len+1) )
|
|
{
|
|
u4free( ret_string );
|
|
return NULL;
|
|
}
|
|
|
|
return ret_string;
|
|
}
|
|
|
|
DATA4 S4PTR* S4FUNCTION relate4lookup_data( RELATE4 *relate, char *dname )
|
|
{
|
|
RELATE4 *relate_on;
|
|
|
|
relate_on = relate;
|
|
|
|
while( relate_on != NULL )
|
|
{
|
|
#ifdef S4WINDOWS
|
|
if( lstrcmp( dname, d4alias(relate_on->data) ) == 0 )
|
|
#else
|
|
if( strcmp( dname, d4alias(relate_on->data) ) == 0 )
|
|
#endif
|
|
return relate_on->data;
|
|
relate4next( &relate_on );
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
int S4FUNCTION report4save_object( FILE4SEQ_WRITE *seq, OBJ4 *obj )
|
|
{
|
|
long lval;
|
|
char out_buf[25], bname[13];
|
|
OBJ4 *obj_on;
|
|
S4LONG x, y, w, h;
|
|
short sval;
|
|
|
|
x = (obj->x <= 0 )?1:obj->x;
|
|
y = (obj->y <= 0 )?1:obj->y;
|
|
w = (obj->w <= 0 )?1:obj->w;
|
|
h = (obj->h <= 0 )?1:obj->h;
|
|
|
|
#ifdef S4BYTE_SWAP
|
|
x = x4reverse_long((void *)&x);
|
|
y = x4reverse_long((void *)&y);
|
|
w = x4reverse_long((void *)&w);
|
|
h = x4reverse_long((void *)&h);
|
|
#endif
|
|
|
|
if( save4long( seq, &(x) ) < 0 ||
|
|
save4long( seq, &(y) ) < 0 ||
|
|
save4long( seq, &(w) ) < 0 ||
|
|
save4long( seq, &(h) ) < 0 )
|
|
return -1;
|
|
|
|
lval = (long)obj->num_chars;
|
|
if( save4long( seq, &lval ) < 0 ||
|
|
save4short( seq, &(obj->is_active) ) < 0 ||
|
|
save4short( seq, &(obj->is_first) ) < 0 ||
|
|
save4short( seq, &(obj->alignment) ) < 0 ||
|
|
save4short( seq, &(obj->numeric_type) ) < 0 ||
|
|
save4short( seq, &(obj->display_zero) ) < 0 ||
|
|
save4short( seq, &(obj->dec) ) < 0 ||
|
|
save4short( seq, &(obj->use_brackets) ) < 0 ||
|
|
save4short( seq, &(obj->leading_zero) ) < 0 )
|
|
return -1;
|
|
|
|
if( obj->display_once_expr )
|
|
{
|
|
if( save4string( seq, expr4source(obj->display_once_expr) ) < 0 )
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
if( save4string( seq, "" ) < 0 )
|
|
return -1;
|
|
}
|
|
|
|
if( obj->date_format )
|
|
{
|
|
if( save4string( seq, obj->date_format ) < 0 )
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
if( save4string( seq, "" ) < 0 )
|
|
return -1;
|
|
}
|
|
|
|
if( obj->wintext )
|
|
{
|
|
if( save4string( seq, obj->wintext ) < 0 )
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
if( save4string( seq, "wintext" ) < 0 )
|
|
return -1;
|
|
}
|
|
|
|
if( save4string( seq, obj->style->name )< 0 )
|
|
return -1;
|
|
|
|
if( file4seq_write( seq, &(obj->lookahead), sizeof(obj->lookahead) ) < 0 )
|
|
return -1;
|
|
|
|
lval = (long)obj->obj_type_num;
|
|
if( save4long( seq, &lval ) < 0 )
|
|
return -1;
|
|
|
|
if( strlen(obj->field_name) == 0 )
|
|
{
|
|
sval = 0;
|
|
save4short( seq, &sval );
|
|
}
|
|
else
|
|
{
|
|
sval = 1;
|
|
save4short( seq, &sval );
|
|
save4string( seq, obj->field_name );
|
|
sval = obj->field_type;
|
|
save4short( seq, &sval );
|
|
sval = obj->field_len;
|
|
save4short( seq, &sval );
|
|
sval = obj->field_dec;
|
|
save4short( seq, &sval );
|
|
}
|
|
|
|
switch( obj->obj_type_num )
|
|
{
|
|
case obj4type_bitmap1:
|
|
u4ncpy( bname, obj->area->report->report_name, 9 );
|
|
sprintf( bname+strlen(bname), ".b%2d", obj->area->report->bitmaps++ );
|
|
#ifdef S4WINDOWS
|
|
#ifndef S4WIN32
|
|
if( (WriteDIB( bname, (HANDLE)obj->data )) != NULL )
|
|
save4string( seq, bname );
|
|
else
|
|
#endif
|
|
#endif
|
|
save4string( seq, "" );
|
|
break;
|
|
|
|
case obj4type_bitmap3:
|
|
case obj4type_field:
|
|
#ifdef S4WINDOWS
|
|
wsprintf( out_buf, "%s|%s", f4name((FIELD4 *)obj->data), d4alias(((FIELD4 *)obj->data)->data) );
|
|
#else
|
|
sprintf( out_buf, "%s|%s", f4name((FIELD4 *)obj->data), d4alias(((FIELD4 *)obj->data)->data) );
|
|
#endif
|
|
if( save4string( seq, out_buf ) < 0 )
|
|
return -1;
|
|
break;
|
|
|
|
case obj4type_expr:
|
|
if( save4string( seq, expr4source( (EXPR4 *)obj->data ) ) < 0 )
|
|
return -1;
|
|
break;
|
|
|
|
case obj4type_total:
|
|
if( save4string( seq, ((TOTAL4 *)obj->data)->calc_ptr->name ) < 0 )
|
|
return -1;
|
|
break;
|
|
|
|
case obj4type_calc:
|
|
if( save4string( seq, ((EXPR4CALC *)obj->data)->name ) < 0 )
|
|
return -1;
|
|
break;
|
|
|
|
case obj4type_text:
|
|
case obj4type_hline:
|
|
case obj4type_vline:
|
|
case obj4type_frame:
|
|
case obj4type_bitmap2:
|
|
if( save4string( seq, "data" ) < 0 )
|
|
return -1;
|
|
break;
|
|
|
|
}
|
|
|
|
lval = obj->contained.n_link;
|
|
save4long( seq, &lval );
|
|
obj_on = (OBJ4 *)l4first( &obj->contained );
|
|
while( obj_on )
|
|
{
|
|
report4save_object( seq, obj_on );
|
|
obj_on = (OBJ4 *)l4next( &obj->contained, obj_on );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION report4save_area( FILE4SEQ_WRITE *seq, AREA4 *area )
|
|
{
|
|
OBJ4 *obj_on;
|
|
short num_objs;
|
|
|
|
if( area->suppression_condition )
|
|
{
|
|
if( save4string( seq, expr4source( area->suppression_condition ) ) < 0 )
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
if( save4string( seq, " " ) < 0 )
|
|
return -1;
|
|
}
|
|
|
|
if( save4long( seq, &area->height ) < 0 ||
|
|
save4short( seq, &area->is_header ) < 0 ||
|
|
save4short( seq, &area->is_active ) < 0 ||
|
|
save4short( seq, &area->allow_pagebreaks ) < 0 )
|
|
return -1;
|
|
|
|
num_objs = area->objects.n_link;
|
|
if( save4short( seq, &num_objs ) < 0 )
|
|
return -1;
|
|
|
|
obj_on =(OBJ4 *)l4first( &area->objects );
|
|
while( obj_on )
|
|
{
|
|
if( report4save_object( seq, obj_on ) < 0 )
|
|
{
|
|
e4describe( area->report->code_base, e4rep_save, E4_REP_SOBJ, 0, 0 );
|
|
return -2;
|
|
}
|
|
obj_on = (OBJ4 *)l4next( &area->objects, obj_on );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION report4save_group( FILE4SEQ_WRITE *seq, GROUP4 *group )
|
|
{
|
|
AREA4 *area_on;
|
|
short sval;
|
|
int rc;
|
|
|
|
save4string( seq, group->group_label );
|
|
|
|
if( group->reset_expression )
|
|
save4string( seq, expr4source( group->reset_expression ) );
|
|
else
|
|
save4string( seq, "" );
|
|
|
|
if( save4short( seq, &group->title_summary ) < 0)
|
|
return -1;
|
|
if( save4short( seq, &group->position ) < 0)
|
|
return -1;
|
|
if( save4short( seq, &group->is_active ) < 0)
|
|
return -1;
|
|
if( save4short( seq, &group->swap_header ) < 0)
|
|
return -1;
|
|
if( save4short( seq, &group->swap_footer ) < 0)
|
|
return -1;
|
|
if( save4short( seq, &group->repeat_header ) < 0)
|
|
return -1;
|
|
if( save4short( seq, &group->reset_page ) < 0 )
|
|
return -1;
|
|
if( save4short( seq, &group->reset_pagenum ) < 0)
|
|
return -1;
|
|
|
|
sval = group->header_areas.n_link;
|
|
if( save4short( seq, &sval ) < 0 )
|
|
return -1;
|
|
area_on = (AREA4 *)l4first( &group->header_areas );
|
|
while( area_on )
|
|
{
|
|
if( (rc = report4save_area( seq, area_on )) < 0 )
|
|
{
|
|
if( rc == -1 )
|
|
e4describe( group->report->code_base, e4rep_save, E4_REP_SAREA, 0, 0 );
|
|
return -2;
|
|
}
|
|
area_on = (AREA4 *)l4next( &group->header_areas, area_on );
|
|
}
|
|
|
|
sval = group->footer_areas.n_link;
|
|
if( save4short( seq, &sval ) < 0 )
|
|
return -1;
|
|
area_on = (AREA4 *)l4first( &group->footer_areas );
|
|
while( area_on )
|
|
{
|
|
if( report4save_area( seq, area_on ) < 0 )
|
|
{
|
|
if( rc == -1 )
|
|
e4describe( group->report->code_base, e4rep_save, E4_REP_SAREA, 0, 0 );
|
|
return -2;
|
|
}
|
|
area_on = (AREA4 *)l4next( &group->footer_areas, area_on );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION report4save_style( FILE4SEQ_WRITE *seq, STYLE4 *style )
|
|
{
|
|
short sval;
|
|
R4BYTE bval;
|
|
|
|
save4string( seq, style->name );
|
|
|
|
bval = R4GETRVALUE( style->color );
|
|
if( file4seq_write( seq, &bval, sizeof(bval) ) < 0 )
|
|
return -1;
|
|
|
|
bval = R4GETGVALUE( style->color );
|
|
if( file4seq_write( seq, &bval, sizeof(bval) ) < 0 )
|
|
return -1;
|
|
|
|
bval = R4GETBVALUE( style->color );
|
|
if( file4seq_write( seq, &bval, sizeof(bval) ) < 0 )
|
|
return -1;
|
|
|
|
sval = style->point_size;
|
|
if( save4short( seq, &sval ) < 0 )
|
|
return -1;
|
|
|
|
if( save4short( seq, (short *)&(style->lfont.lfHeight) ) < 0 ||
|
|
save4short( seq, (short *)&(style->lfont.lfWidth) ) < 0 ||
|
|
save4short( seq, (short *)&(style->lfont.lfEscapement) ) < 0 ||
|
|
save4short( seq, (short *)&(style->lfont.lfOrientation) ) < 0 ||
|
|
save4short( seq, (short *)&(style->lfont.lfWeight) ) < 0 )
|
|
return -1;
|
|
|
|
if( file4seq_write( seq, &(style->lfont.lfItalic), sizeof(style->lfont.lfItalic) ) < 0 ||
|
|
file4seq_write( seq, &(style->lfont.lfUnderline), sizeof(style->lfont.lfUnderline) ) < 0 ||
|
|
file4seq_write( seq, &(style->lfont.lfStrikeOut), sizeof(style->lfont.lfStrikeOut) ) < 0 ||
|
|
file4seq_write( seq, &(style->lfont.lfCharSet), sizeof(style->lfont.lfCharSet) ) < 0 ||
|
|
file4seq_write( seq, &(style->lfont.lfOutPrecision), sizeof(style->lfont.lfOutPrecision) ) < 0 ||
|
|
file4seq_write( seq, &(style->lfont.lfClipPrecision), sizeof(style->lfont.lfClipPrecision) ) < 0 ||
|
|
file4seq_write( seq, &(style->lfont.lfQuality), sizeof(style->lfont.lfQuality) ) < 0 ||
|
|
file4seq_write( seq, &(style->lfont.lfPitchAndFamily), sizeof(style->lfont.lfPitchAndFamily) ) < 0 ||
|
|
save4string( seq, (char *)(style->lfont.lfFaceName) ) < 0 )
|
|
return -1;
|
|
|
|
if( save4short( seq, &(style->codes_before_len) ) < 0 ||
|
|
file4seq_write( seq, (style->codes_before), style->codes_before_len ) < 0 ||
|
|
save4short( seq, &(style->codes_after_len) ) < 0 ||
|
|
file4seq_write( seq, (style->codes_after), style->codes_after_len ) < 0 )
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION report4save_calc( FILE4SEQ_WRITE *seq, EXPR4CALC *calc )
|
|
{
|
|
short sval;
|
|
|
|
if( calc->total )
|
|
sval = 1;
|
|
else
|
|
sval = 0;
|
|
if( save4short( seq, &sval ) < 0 )
|
|
return -1;
|
|
|
|
if( save4string( seq, calc->name ) < 0 ||
|
|
save4string( seq, expr4source( calc->expr ) ) < 0 )
|
|
return -1;
|
|
|
|
if( calc->total )
|
|
{
|
|
if( calc->total->reset_expression )
|
|
sval = 1;
|
|
else
|
|
sval = 0;
|
|
if( save4short( seq, &sval ) < 0 )
|
|
return -1;
|
|
|
|
if( calc->total->reset_expression )
|
|
if( save4string( seq, expr4source(calc->total->reset_expression) ) < 0 )
|
|
return -1;
|
|
|
|
if( calc->total->add_condition )
|
|
sval = 1;
|
|
else
|
|
sval = 0;
|
|
if( save4short( seq, &sval ) < 0 )
|
|
return -1;
|
|
|
|
if( calc->total->add_condition )
|
|
if( save4string(seq, expr4source( calc->total->add_condition) ) < 0 )
|
|
return -1;
|
|
|
|
sval = calc->total->logcon;
|
|
if( save4short( seq, &sval ) < 0 )
|
|
return -1;
|
|
|
|
sval = calc->total->total_type;
|
|
if( save4short( seq, &sval ) < 0 )
|
|
return -1;
|
|
|
|
if( calc->total->lookahead )
|
|
sval = 1;
|
|
else
|
|
sval = 0;
|
|
if( save4short( seq, &sval ) < 0 )
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION report4save_report( REPORT4 *report, FILE4SEQ_WRITE *seq )
|
|
{
|
|
short sval;
|
|
GROUP4 *group_on;
|
|
STYLE4 *style_on;
|
|
EXPR4CALC *calc_on;
|
|
int rc;
|
|
|
|
sort4calc_list( report );
|
|
|
|
save4string( seq, report->report_name );
|
|
if( report->report_caption )
|
|
rc = save4string( seq, report->report_caption );
|
|
else
|
|
rc = save4string( seq, "" );
|
|
|
|
if( rc < 0 )
|
|
return -1;
|
|
|
|
report->margin_top = (report->margin_top > 32000 )?0:report->margin_top;
|
|
report->margin_top = (report->margin_left > 32000 )?0:report->margin_left;
|
|
report->margin_top = (report->margin_right > 32000 )?0:report->margin_right;
|
|
report->margin_bottom = (report->margin_bottom > 32000 )?0:report->margin_bottom;
|
|
|
|
if( save4long( seq, &report->report_width ) < 0 )
|
|
return -1;
|
|
if( save4long( seq, &report->margin_top ) < 0 )
|
|
return -1;
|
|
if( save4long( seq, &report->margin_bottom ) < 0 )
|
|
return -1;
|
|
if( save4long( seq, &report->margin_left ) < 0 )
|
|
return -1;
|
|
if( save4long( seq, &report->margin_right ) < 0 )
|
|
return -1;
|
|
|
|
sval = report->code_base->calc_list.n_link;
|
|
if( save4short( seq, &sval ) < 0 )
|
|
return -1;
|
|
|
|
calc_on = (EXPR4CALC *)l4first( &report->code_base->calc_list );
|
|
while( calc_on )
|
|
{
|
|
if( report4save_calc( seq, calc_on ) < 0 )
|
|
{
|
|
e4describe( report->code_base, e4rep_save, E4_REP_SCALC, calc_on->name, 0 );
|
|
return -2;
|
|
}
|
|
calc_on = (EXPR4CALC *)l4next( &report->code_base->calc_list, calc_on );
|
|
}
|
|
|
|
sval = report->styles.n_link;
|
|
if( save4short( seq, &sval ) < 0 )
|
|
return -1;
|
|
|
|
style_on = (STYLE4 *)l4first( &report->styles );
|
|
while( style_on )
|
|
{
|
|
if( report4save_style( seq, style_on ) < 0 )
|
|
{
|
|
e4describe( report->code_base, e4rep_save, E4_REP_SSTYLE, style_on->name, 0 );
|
|
return -2;
|
|
}
|
|
style_on = (STYLE4 *)l4next( &report->styles, style_on);
|
|
}
|
|
|
|
if( (rc = report4save_group( seq, report->page_header_footer )) < 0 )
|
|
{
|
|
if( rc == -1 )
|
|
e4describe( report->code_base, e4rep_save, E4_REP_SPHF, 0, 0 );
|
|
return -2;
|
|
}
|
|
|
|
sval = report->groups.n_link;
|
|
if( save4short( seq, &sval ) < 0 )
|
|
return -1;
|
|
|
|
group_on = (GROUP4 *)l4first( &report->groups );
|
|
while( group_on )
|
|
{
|
|
if( (rc = report4save_group( seq, group_on )) < 0 )
|
|
{
|
|
if( rc == -1 )
|
|
e4describe( report->code_base, e4rep_save, E4_REP_SGROUP, 0, 0 );
|
|
return -2;
|
|
}
|
|
group_on = (GROUP4 *)l4next( &report->groups, group_on );
|
|
}
|
|
|
|
if( file4seq_write( seq, report->currency_symbol, sizeof( report->currency_symbol ) ) < 0 )
|
|
return -1;
|
|
if( file4seq_write( seq, &report->thousand_separator, sizeof( report->thousand_separator ) ) < 0 )
|
|
return -1;
|
|
if( file4seq_write( seq, &report->decimal_point, sizeof( report->decimal_point ) ) < 0 )
|
|
return -1;
|
|
if( save4short( seq, &report->pgbrk_title ) < 0 )
|
|
return -1;
|
|
if( save4short( seq, &report->hard_resets_flag ) < 0 )
|
|
return -1;
|
|
|
|
if( save4long( seq, &report->sensitivity_x ) < 0 )
|
|
return -1;
|
|
|
|
if( save4long( seq, &report->sensitivity_y ) < 0 )
|
|
return -1;
|
|
|
|
if( !report->output_group && !report->dfile_name )
|
|
{
|
|
sval = 0;
|
|
save4short( seq, &sval );
|
|
}
|
|
else
|
|
{
|
|
sval = 1;
|
|
save4short( seq, &sval );
|
|
save4string( seq, report->output_group->group_label );
|
|
save4string( seq, report->dfile_name );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int relate4save_relate( RELATE4 *relate, FILE4SEQ_WRITE *seq, int path )
|
|
{
|
|
RELATE4 *relate_on;
|
|
INDEX4 *index_on;
|
|
TAG4 *tag_on;
|
|
char name_buf[25];
|
|
short code;
|
|
int rc, ttype;
|
|
short indcount;
|
|
|
|
for( relate_on = relate; relate_on != 0; )
|
|
{
|
|
if( !path )
|
|
{
|
|
u4name_piece( name_buf, sizeof(name_buf), relate_on->data->file.name, FALSE, TRUE );
|
|
rc = save4string( seq, name_buf );
|
|
}
|
|
else
|
|
rc = save4string( seq, relate_on->data->file.name );
|
|
|
|
if( rc < 0 )
|
|
return -1;
|
|
|
|
rc = save4string( seq, d4alias( relate_on->data ) );
|
|
if( rc < 0 )
|
|
return -1;
|
|
|
|
if( save4short( seq, (short *)&(relate_on->match_len) ) < 0 ||
|
|
save4short( seq, (short *)&(relate_on->relation_type) ) < 0 ||
|
|
save4short( seq, (short *)&(relate_on->sort_type) ) < 0 ||
|
|
save4short( seq, (short *)&(relate_on->error_action) ) < 0 )
|
|
return -1;
|
|
|
|
ttype = report4index_type();
|
|
|
|
indcount = 0;
|
|
if( r4ndx == ttype || r4cli == ttype )
|
|
{
|
|
index_on = (INDEX4 *)l4first( &relate_on->data->indexes );
|
|
while( index_on )
|
|
{
|
|
indcount += index_on->tags.n_link;
|
|
index_on = (INDEX4 *)l4next( &relate_on->data->indexes, index_on );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
indcount = relate_on->data->indexes.n_link;
|
|
}
|
|
|
|
if( save4short( seq, (short *)&indcount ) < 0 )
|
|
return -1;
|
|
|
|
index_on = (INDEX4 *)l4first( &relate_on->data->indexes );
|
|
while( index_on )
|
|
{
|
|
if( r4ndx == ttype || r4cli == ttype )
|
|
{
|
|
for( tag_on = 0;; )
|
|
{
|
|
tag_on = (TAG4 *)l4next( &index_on->tags, tag_on );
|
|
if( tag_on == NULL )
|
|
break;
|
|
if( !path )
|
|
{
|
|
u4name_piece( name_buf, sizeof(name_buf), tag_on->file.name, FALSE, TRUE );
|
|
rc = save4string( seq, name_buf );
|
|
}
|
|
else
|
|
rc = save4string( seq, tag_on->file.name );
|
|
|
|
if( rc < 0 )
|
|
return -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( !path )
|
|
{
|
|
u4name_piece( name_buf, sizeof(name_buf), index_on->file.name, FALSE, TRUE );
|
|
rc = save4string( seq, name_buf );
|
|
}
|
|
else
|
|
rc = save4string( seq, index_on->file.name );
|
|
|
|
if( rc < 0 )
|
|
return -1;
|
|
}
|
|
index_on = (INDEX4 *)l4next( &relate_on->data->indexes, index_on );
|
|
}
|
|
|
|
if( !relate_on->master )
|
|
{
|
|
tag_on = d4tag_selected( relate_on->data );
|
|
if( tag_on )
|
|
rc = save4string( seq, tag_on->alias );
|
|
else
|
|
rc = save4string( seq, "\0" );
|
|
if( rc < 0 )
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
if( relate_on->data_tag != NULL )
|
|
rc = save4string( seq, relate_on->data_tag->alias );
|
|
else
|
|
rc = save4string( seq, "\0" );
|
|
if( rc < 0 )
|
|
return -1;
|
|
}
|
|
|
|
if( relate_on->master_expr != 0 )
|
|
rc = save4string( seq, expr4source( relate_on->master_expr ) );
|
|
else
|
|
rc = save4string( seq, "\0" );
|
|
|
|
if( rc < 0 )
|
|
return -1;
|
|
|
|
code = relate4next( &relate_on );
|
|
if( save4short( seq, &code ) < 0 )
|
|
return -1;
|
|
}
|
|
|
|
if( relate->relation->expr_source )
|
|
rc = save4string( seq, relate->relation->expr_source );
|
|
else
|
|
rc = save4string( seq, "\0" );
|
|
|
|
if( rc < 0 )
|
|
return -1;
|
|
|
|
if( relate->relation->sort_source )
|
|
rc = save4string( seq, relate->relation->sort_source );
|
|
else
|
|
rc = save4string( seq, "\0" );
|
|
|
|
if( rc < 0 )
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION report4retrieve_object( FILE4SEQ_READ *seq, AREA4 *area )
|
|
{
|
|
long lval;
|
|
long x, y, w, h, num_chars, obj_type_num;
|
|
short is_active, is_first, lookahead, i, sval;
|
|
short alignment, numeric_type, display_zero, dec;
|
|
short use_brackets, leading_zero;
|
|
char *wintext, *data, style_name[20], *fname;
|
|
char *dname, date_format[20], *dexpr_source;
|
|
EXPR4CALC *calc;
|
|
FIELD4 *field;
|
|
OBJ4 *obj;
|
|
STYLE4 *style;
|
|
DATA4 *d4;
|
|
EXPR4 *expr, *dexpr;
|
|
int j;
|
|
char field_name[11], field_type = 0;
|
|
short field_len = 0, field_dec = 0;
|
|
POUT4OBJ oobj;
|
|
|
|
field_name[0] = '\0';
|
|
obj = NULL;
|
|
|
|
if( ret4long( seq, &x ) < sizeof(x) ||
|
|
ret4long( seq, &y ) < sizeof(y) ||
|
|
ret4long( seq, &w ) < sizeof(w) ||
|
|
ret4long( seq, &h ) < sizeof(h) )
|
|
return -1;
|
|
|
|
if( ret4long( seq, &num_chars ) < sizeof(num_chars) ||
|
|
ret4short( seq, &is_active ) < sizeof(is_active) ||
|
|
ret4short( seq, &is_first ) < sizeof(is_first) ||
|
|
ret4short( seq, &alignment ) < sizeof(alignment) ||
|
|
ret4short( seq, &numeric_type ) < sizeof(numeric_type) ||
|
|
ret4short( seq, &display_zero ) < sizeof(display_zero) ||
|
|
ret4short( seq, &dec ) < sizeof(dec) ||
|
|
ret4short( seq, &use_brackets ) < sizeof(use_brackets) ||
|
|
ret4short( seq, &leading_zero ) < sizeof(leading_zero) )
|
|
return -1;
|
|
|
|
dexpr_source = retrieve4string_alloc( seq );
|
|
if( !dexpr_source )
|
|
return -1;
|
|
|
|
if( dexpr_source[0] == '\0' )
|
|
{
|
|
u4free( dexpr_source );
|
|
dexpr_source = NULL;
|
|
}
|
|
else
|
|
report4nchange( seq->file->code_base, &dexpr_source, 1, strlen(dexpr_source) );
|
|
|
|
if( retrieve4string( seq, date_format, sizeof(date_format) ) < 0 )
|
|
return -1;
|
|
|
|
wintext = retrieve4string_alloc( seq );
|
|
if( !wintext )
|
|
return -1;
|
|
if( wintext[0] == '\0' )
|
|
{
|
|
u4free( wintext );
|
|
wintext = NULL;
|
|
}
|
|
|
|
if( retrieve4string( seq, style_name, sizeof(style_name) ) < 0 )
|
|
return -1;
|
|
style = style4lookup( area->report, style_name );
|
|
if( !style )
|
|
{
|
|
u4free( wintext );
|
|
return -1;
|
|
}
|
|
|
|
if( ret4short( seq, &lookahead ) < sizeof(lookahead) ||
|
|
ret4long( seq, &obj_type_num ) < sizeof(obj_type_num) )
|
|
{
|
|
u4free( wintext );
|
|
return -1;
|
|
}
|
|
|
|
if( file_version >= 0x25 )
|
|
{
|
|
ret4short( seq, &sval );
|
|
if( sval )
|
|
{
|
|
retrieve4string( seq, field_name, sizeof(field_name) );
|
|
ret4short( seq, &sval );
|
|
field_type = (char)sval;
|
|
ret4short( seq, &sval );
|
|
field_len = sval;
|
|
ret4short( seq, &sval );
|
|
field_dec = sval;
|
|
}
|
|
}
|
|
|
|
data = retrieve4string_alloc( seq );
|
|
if( !data )
|
|
{
|
|
u4free( wintext );
|
|
return -1;
|
|
}
|
|
if( data[0] == '\0' )
|
|
{
|
|
u4free( data );
|
|
data = NULL;
|
|
}
|
|
|
|
switch( obj_type_num )
|
|
{
|
|
case obj4type_bitmap1:
|
|
if( !data )
|
|
goto ObjErr1;
|
|
#ifdef S4WINDOWS
|
|
obj = obj4bitmapStaticCreate( area, GetDIB((LPSTR)data, area->report->code_base), x, y, w, h );
|
|
if( !obj )
|
|
goto ObjErr1;
|
|
#else
|
|
u4free( data );
|
|
data = NULL;
|
|
#endif
|
|
break;
|
|
|
|
case obj4type_bitmap2:
|
|
#ifdef S4WINDOWS
|
|
obj = obj4bitmapFileCreate( area, wintext, x, y, w, h );
|
|
u4free( wintext );
|
|
wintext = NULL;
|
|
if( !obj )
|
|
goto ObjErr1;
|
|
#endif
|
|
break;
|
|
|
|
case obj4type_bitmap3:
|
|
#ifdef S4WINDOWS
|
|
if( !data )
|
|
goto ObjErr1;
|
|
report4nchange( area->report->code_base, &data, 1, strlen(data) );
|
|
fname = dname = data;
|
|
for( i = 0; (unsigned)i < strlen(data); i++ )
|
|
if( data[i] == '|' )
|
|
{
|
|
data[i] = '\0';
|
|
dname = data+i+1;
|
|
break;
|
|
}
|
|
if( (d4 = relate4lookup_data( area->report->relate, dname )) == NULL ||
|
|
(field = d4field( d4, fname )) == NULL )
|
|
goto ObjErr1;
|
|
obj = obj4bitmapFieldCreate( area, field, x, y, w, h );
|
|
if( !obj )
|
|
goto ObjErr1;
|
|
#endif
|
|
break;
|
|
|
|
case obj4type_field: /* field */
|
|
report4nchange( area->report->code_base, &data, 1, strlen(data) );
|
|
fname = dname = data;
|
|
for( i = 0; (unsigned)i < strlen(data); i++ )
|
|
if( data[i] == '|' )
|
|
{
|
|
data[i] = '\0';
|
|
dname = data+i+1;
|
|
break;
|
|
}
|
|
if( (d4 = relate4lookup_data( area->report->relate, dname )) == NULL ||
|
|
(field = d4field( d4, fname )) == NULL )
|
|
goto ObjErr1;
|
|
if( (obj = obj4fieldCreate( area, field, x, y, w, h )) == NULL )
|
|
goto ObjErr1;
|
|
break;
|
|
|
|
case obj4type_expr: /* Expression */
|
|
report4nchange( area->report->code_base, &data, 1, strlen(data) );
|
|
expr = expr4parse( area->report->relate->data, data );
|
|
if( !expr )
|
|
goto ObjErr1;
|
|
|
|
if( (obj = obj4exprCreate( area, expr, x, y, w, h )) == NULL )
|
|
goto ObjErr1;
|
|
break;
|
|
|
|
case obj4type_total: /* TOTAL */
|
|
calc = expr4calc_lookup( seq->file->code_base, (char *)data, strlen((char *)data) );
|
|
if( !calc || !calc->total )
|
|
goto ObjErr1;
|
|
|
|
obj = obj4totalCreate( area, calc->total, x, y, w, h );
|
|
if( !obj )
|
|
goto ObjErr1;
|
|
break;
|
|
|
|
case obj4type_calc: /* Calculation */
|
|
calc = expr4calc_lookup( seq->file->code_base, (char *)data, strlen((char *)data) );
|
|
if( !calc )
|
|
goto ObjErr1;
|
|
obj = obj4calcCreate( area, calc, x, y, w, h );
|
|
if( !obj )
|
|
goto ObjErr1;
|
|
break;
|
|
|
|
case obj4type_text:
|
|
obj = obj4textCreate( area, NULL, x, y, w, h );
|
|
if( !obj )
|
|
goto ObjErr1;
|
|
break;
|
|
|
|
case obj4type_hline:
|
|
obj = obj4lineCreate( area, 0, x, y, w );
|
|
if( !obj )
|
|
goto ObjErr1;
|
|
obj4lineWidth( obj, h );
|
|
break;
|
|
|
|
case obj4type_vline:
|
|
obj = obj4lineCreate( area, 1, x, y, h );
|
|
if( !obj )
|
|
goto ObjErr1;
|
|
obj4lineWidth( obj, w );
|
|
break;
|
|
|
|
case obj4type_frame:
|
|
obj = obj4frameCreate( area, x, y, w, h );
|
|
if( !obj )
|
|
goto ObjErr1;
|
|
break;
|
|
|
|
}
|
|
|
|
if( obj )
|
|
{
|
|
if( wintext )
|
|
obj->wintext = wintext;
|
|
obj->style = style;
|
|
obj->lookahead = lookahead;
|
|
obj->obj_type_num = (int)obj_type_num;
|
|
obj->num_chars = (int)num_chars;
|
|
obj->alignment = alignment;
|
|
obj->numeric_type = numeric_type;
|
|
obj->display_zero = display_zero;
|
|
obj->dec = dec;
|
|
obj->use_brackets = use_brackets;
|
|
obj->leading_zero = leading_zero;
|
|
obj->field_len = field_len;
|
|
obj->field_dec = field_dec;
|
|
obj->field_type = field_type;
|
|
strcpy( obj->field_name, field_name );
|
|
}
|
|
|
|
if( strlen(field_name) > 0 && obj != NULL )
|
|
{
|
|
oobj = (POUT4OBJ)u4alloc_free( area->report->code_base, sizeof(OUT4OBJ) );
|
|
oobj->obj = obj;
|
|
l4add( &area->report->output_objs, oobj );
|
|
}
|
|
|
|
if( strlen(date_format) > 0 && obj != NULL )
|
|
{
|
|
obj->date_format = (char *)u4alloc_free( area->report->code_base, strlen(date_format)+1 );
|
|
strcpy( obj->date_format, date_format );
|
|
}
|
|
|
|
if( dexpr_source )
|
|
{
|
|
if( obj != NULL )
|
|
{
|
|
dexpr = expr4parse( area->report->relate->data, dexpr_source );
|
|
if( !dexpr )
|
|
{
|
|
obj->display_once = 0;
|
|
obj->display_once_expr = NULL;
|
|
obj->last_display_val = NULL;
|
|
e4set( area->report->code_base, 0 );
|
|
}
|
|
else
|
|
{
|
|
obj->display_once = 1;
|
|
obj->display_once_expr = dexpr;
|
|
}
|
|
}
|
|
u4free( dexpr_source );
|
|
}
|
|
|
|
if( data )
|
|
u4free( data );
|
|
|
|
ret4long( seq, &lval );
|
|
for( j = 0; j < lval; j++ )
|
|
{
|
|
report4retrieve_object( seq, area );
|
|
}
|
|
|
|
return 0;
|
|
|
|
ObjErr1:
|
|
if( wintext )
|
|
u4free( wintext );
|
|
|
|
if( data )
|
|
u4free( data );
|
|
return -2;
|
|
}
|
|
|
|
int S4FUNCTION report4retrieve_area_foo( FILE4SEQ_READ *seq, GROUP4 *group, char *buffer )
|
|
{
|
|
AREA4 *area;
|
|
short is_header, is_active, allow_pagebreaks, num_objs, i;
|
|
long height;
|
|
int rc;
|
|
char *cptr;
|
|
|
|
if (retrieve4string( seq, buffer, 1023 ) < 0 )
|
|
return -1;
|
|
c4trim_n( buffer, 1023 );
|
|
|
|
if( ret4long( seq, &height ) < sizeof(height) ||
|
|
ret4short( seq, &is_header ) < sizeof(is_header) ||
|
|
ret4short( seq, &is_active ) < sizeof(is_active) ||
|
|
ret4short( seq, &allow_pagebreaks ) < sizeof(allow_pagebreaks) )
|
|
return -1;
|
|
|
|
cptr = buffer;
|
|
report4nchange( group->report->code_base, &cptr, 0, 1024 );
|
|
|
|
area = area4create( group, height, is_header, (strlen(buffer)>0)?buffer:NULL );
|
|
if( !area )
|
|
{
|
|
return -2;
|
|
}
|
|
|
|
area->is_active = is_active;
|
|
area->allow_pagebreaks = allow_pagebreaks;
|
|
|
|
if( ret4short( seq, &num_objs ) < sizeof(num_objs) )
|
|
return -1;
|
|
|
|
for( i = 0; i < num_objs; i++ )
|
|
if( (rc = report4retrieve_object( seq, area )) < 0 )
|
|
{
|
|
if( rc == -1 )
|
|
{
|
|
e4describe( group->report->code_base, e4rep_ret, E4_REP_ROBJ, 0, 0 );
|
|
return -2;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION report4retrieve_area( FILE4SEQ_READ *seq, GROUP4 *group )
|
|
{
|
|
int retvalue;
|
|
char *buffer;
|
|
|
|
buffer = (char *) u4alloc_free( seq->file->code_base, 1024 );
|
|
if( !buffer )
|
|
return -1;
|
|
|
|
retvalue = report4retrieve_area_foo( seq, group, buffer );
|
|
|
|
u4free( buffer );
|
|
|
|
return retvalue;
|
|
}
|
|
|
|
int S4FUNCTION report4retrieve_group_foo( FILE4SEQ_READ *seq, REPORT4 *report, char *buffer )
|
|
{
|
|
short sval, i, group_type;
|
|
char group_label[27], *cptr;
|
|
GROUP4 *group;
|
|
int rc;
|
|
|
|
retrieve4string( seq, group_label, sizeof(group_label) );
|
|
|
|
retrieve4string( seq, buffer, 1023 );
|
|
c4trim_n( buffer, 1024 );
|
|
cptr = buffer;
|
|
report4nchange( report->code_base, &cptr, 0, 1024 );
|
|
|
|
ret4short( seq, &group_type );
|
|
|
|
if( group_type == 0 )
|
|
group = group4create( report, group_label, (strlen(buffer)>0)?buffer:NULL );
|
|
else
|
|
group = report->title_summary;
|
|
if( !group )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
group->title_summary = group_type;
|
|
|
|
ret4short( seq, &group->position );
|
|
ret4short( seq, &group->is_active );
|
|
ret4short( seq, &group->swap_header );
|
|
ret4short( seq, &group->swap_footer );
|
|
ret4short( seq, &group->repeat_header );
|
|
ret4short( seq, &group->reset_page );
|
|
ret4short( seq, &group->reset_pagenum );
|
|
|
|
|
|
ret4short( seq, &sval );
|
|
for( i = 0; i < sval; i++ )
|
|
{
|
|
if( (rc = report4retrieve_area( seq, group )) < 0 )
|
|
{
|
|
if( rc == -1 )
|
|
e4describe( report->code_base, e4rep_ret, E4_REP_RHAREA, group->group_label, 0 );
|
|
group4free( group );
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
ret4short( seq, &sval );
|
|
for( i = 0; i < sval; i++ )
|
|
{
|
|
if( (rc = report4retrieve_area( seq, group )) < 0 )
|
|
{
|
|
if( rc == -1 )
|
|
e4describe( report->code_base, e4rep_ret, E4_REP_RFAREA, group->group_label, 0 );
|
|
group4free( group );
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
if( group != report->title_summary )
|
|
{
|
|
l4remove( &report->groups, group );
|
|
l4add( &report->groups, group );
|
|
}
|
|
|
|
i = 1;
|
|
group = (PGROUP4)l4last( &report->groups );
|
|
while( group )
|
|
{
|
|
group->position = i++;
|
|
group = (PGROUP4)l4prev( &report->groups, group );
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION report4retrieve_group( FILE4SEQ_READ *seq, REPORT4 *report )
|
|
{
|
|
int retvalue;
|
|
char *buffer;
|
|
|
|
buffer = (char *) u4alloc_free( seq->file->code_base, 1024 );
|
|
if( !buffer )
|
|
return -1;
|
|
|
|
retvalue = report4retrieve_group_foo( seq, report, buffer );
|
|
|
|
u4free( buffer );
|
|
|
|
return retvalue;
|
|
}
|
|
|
|
|
|
int S4FUNCTION report4retrieve_hdr_ftr_foo( FILE4SEQ_READ *seq, REPORT4 *report, char *buffer )
|
|
{
|
|
short sval, i, group_type;
|
|
char group_label[27], *cptr;
|
|
GROUP4 *group;
|
|
int rc;
|
|
|
|
retrieve4string( seq, group_label, sizeof(group_label) );
|
|
retrieve4string( seq, buffer, 1023 );
|
|
c4trim_n( buffer, 1024 );
|
|
cptr = buffer;
|
|
report4nchange( report->code_base, &cptr, 0, 1024 );
|
|
|
|
ret4short( seq, &group_type );
|
|
group = report->page_header_footer;
|
|
if( !group )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
group->header_footer = 1;
|
|
|
|
ret4short( seq, &group->position );
|
|
ret4short( seq, &group->is_active );
|
|
ret4short( seq, &group->swap_header );
|
|
ret4short( seq, &group->swap_footer );
|
|
ret4short( seq, &group->repeat_header );
|
|
ret4short( seq, &group->reset_page );
|
|
ret4short( seq, &group->reset_pagenum );
|
|
|
|
|
|
ret4short( seq, &sval );
|
|
for( i = 0; i < sval; i++ )
|
|
{
|
|
if( (rc = report4retrieve_area( seq, group )) < 0 )
|
|
{
|
|
if( rc == -1 )
|
|
e4describe( report->code_base, e4rep_ret, E4_REP_RHAREA, group->group_label, 0 );
|
|
group4free( group );
|
|
report->page_header_footer = NULL;
|
|
return -2;
|
|
}
|
|
}
|
|
|
|
ret4short( seq, &sval );
|
|
for( i = 0; i < sval; i++ )
|
|
{
|
|
if( (rc = report4retrieve_area( seq, group )) < 0 )
|
|
{
|
|
if( rc == -1 )
|
|
e4describe( report->code_base, e4rep_ret, E4_REP_RFAREA, group->group_label, 0 );
|
|
group4free( group );
|
|
report->page_header_footer = NULL;
|
|
return -2;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION report4retrieve_page_header_footer( FILE4SEQ_READ *seq, REPORT4 *report )
|
|
{
|
|
int retvalue;
|
|
char *buffer;
|
|
|
|
buffer = (char *) u4alloc_free( seq->file->code_base, 1024 );
|
|
if( !buffer )
|
|
return -1;
|
|
|
|
retvalue = report4retrieve_hdr_ftr_foo( seq, report, buffer );
|
|
|
|
u4free( buffer );
|
|
|
|
return retvalue;
|
|
}
|
|
|
|
|
|
PSTYLE4 S4FUNCTION report4retrieve_style( FILE4SEQ_READ *seq, REPORT4 *report )
|
|
{
|
|
char name[20];
|
|
STYLE4 *style;
|
|
short codes_before_len, codes_after_len;
|
|
R4BYTE rval, gval, bval;
|
|
short point_size;
|
|
R4LOGFONT lfont;
|
|
int rc;
|
|
|
|
rc = retrieve4string( seq, name, sizeof(name) );
|
|
if( rc < 0 )
|
|
return NULL;
|
|
|
|
if( file4seq_read( seq, &rval, sizeof(rval) ) < sizeof(rval) ||
|
|
file4seq_read( seq, &gval, sizeof(gval) ) < sizeof(gval) ||
|
|
file4seq_read( seq, &bval, sizeof(bval) ) < sizeof(bval) ||
|
|
ret4short( seq, &point_size ) < sizeof(point_size) )
|
|
return NULL;
|
|
|
|
if( ret4short( seq, (short *)&(lfont.lfHeight) ) < sizeof(lfont.lfHeight) ||
|
|
ret4short( seq, (short *)&(lfont.lfWidth) ) < sizeof(lfont.lfWidth) ||
|
|
ret4short( seq, (short *)&(lfont.lfEscapement) ) < sizeof(lfont.lfEscapement) ||
|
|
ret4short( seq, (short *)&(lfont.lfOrientation) ) < sizeof(lfont.lfOrientation) ||
|
|
ret4short( seq, (short *)&(lfont.lfWeight) ) < sizeof(lfont.lfWeight) )
|
|
return NULL;
|
|
|
|
if( file4seq_read( seq, &(lfont.lfItalic), sizeof(lfont.lfItalic) ) < sizeof(lfont.lfItalic) ||
|
|
file4seq_read( seq, &(lfont.lfUnderline), sizeof(lfont.lfUnderline) ) < sizeof(lfont.lfUnderline) ||
|
|
file4seq_read( seq, &(lfont.lfStrikeOut), sizeof(lfont.lfStrikeOut) ) < sizeof(lfont.lfStrikeOut) ||
|
|
file4seq_read( seq, &(lfont.lfCharSet), sizeof(lfont.lfCharSet) ) < sizeof(lfont.lfCharSet) ||
|
|
file4seq_read( seq, &(lfont.lfOutPrecision), sizeof(lfont.lfOutPrecision) ) < sizeof(lfont.lfOutPrecision) ||
|
|
file4seq_read( seq, &(lfont.lfClipPrecision), sizeof(lfont.lfClipPrecision) ) < sizeof(lfont.lfClipPrecision) ||
|
|
file4seq_read( seq, &(lfont.lfQuality), sizeof(lfont.lfQuality) ) < sizeof(lfont.lfQuality) ||
|
|
file4seq_read( seq, &(lfont.lfPitchAndFamily), sizeof(lfont.lfPitchAndFamily) ) < sizeof(lfont.lfPitchAndFamily) )
|
|
return NULL;
|
|
|
|
rc = retrieve4string( seq, (char *)lfont.lfFaceName, LF_FACESIZE );
|
|
if( rc < 0 )
|
|
return NULL;
|
|
|
|
#ifdef S4WINDOWS
|
|
style = style4create( report, &lfont, name, R4RGB(rval,gval,bval), point_size );
|
|
if( !style )
|
|
return NULL;
|
|
#else
|
|
style = style4create( report, name, 0, NULL, 0, NULL );
|
|
if( !style )
|
|
return NULL;
|
|
style->color = R4RGB(rval,gval,bval);
|
|
style->point_size = point_size;
|
|
memcpy( &style->lfont, &lfont, sizeof(R4LOGFONT) );
|
|
#endif
|
|
|
|
ret4short( seq, &codes_before_len );
|
|
style->codes_before_len = codes_before_len;
|
|
if( codes_before_len )
|
|
{
|
|
style->codes_before = (char *)u4alloc( codes_before_len );
|
|
if( !style->codes_before )
|
|
{
|
|
u4free( style );
|
|
return NULL;
|
|
}
|
|
file4seq_read( seq, (style->codes_before), codes_before_len );
|
|
}
|
|
else
|
|
style->codes_before = NULL;
|
|
|
|
|
|
ret4short( seq, &codes_after_len );
|
|
style->codes_after_len = codes_after_len;
|
|
if( codes_after_len )
|
|
{
|
|
style->codes_after = (char *)u4alloc( codes_after_len );
|
|
if( !style->codes_after )
|
|
{
|
|
u4free( style );
|
|
u4free( style->codes_before );
|
|
return NULL;
|
|
}
|
|
file4seq_read( seq, (style->codes_after), codes_after_len );
|
|
}
|
|
else
|
|
style->codes_after = NULL;
|
|
|
|
return style;
|
|
}
|
|
|
|
int S4FUNCTION report4retrieve_calc( FILE4SEQ_READ *seq, REPORT4 *report )
|
|
{
|
|
EXPR4 *expr;
|
|
EXPR4CALC *calc;
|
|
TOTAL4 *total;
|
|
|
|
char name[20], *expr_src = NULL, *reset_expr_src = NULL, *con_src = NULL;
|
|
short is_total, has_reset, total_type, lookahead, has_con, logcon;
|
|
|
|
if( ret4short( seq, &is_total ) < sizeof(is_total) ||
|
|
retrieve4string( seq, name, sizeof(name) ) < 0 )
|
|
return -1;
|
|
|
|
expr_src = retrieve4string_alloc( seq );
|
|
if( !expr_src )
|
|
return -1;
|
|
|
|
report4nchange( report->code_base, &expr_src, 1, strlen(expr_src) );
|
|
|
|
if( is_total )
|
|
{
|
|
if( ret4short( seq, &has_reset ) < sizeof(has_reset) )
|
|
{
|
|
u4free(expr_src);
|
|
return -1;
|
|
}
|
|
if( has_reset )
|
|
{
|
|
reset_expr_src = retrieve4string_alloc( seq );
|
|
if( !reset_expr_src )
|
|
{
|
|
u4free( expr_src );
|
|
return -1;
|
|
}
|
|
report4nchange( report->code_base, &reset_expr_src, 1, strlen(reset_expr_src) );
|
|
}
|
|
|
|
|
|
if( file_version >= 0x24 )
|
|
{
|
|
if( ret4short( seq, &has_con ) < sizeof( has_con ) )
|
|
{
|
|
u4free( expr_src );
|
|
if( reset_expr_src ) u4free( reset_expr_src );
|
|
return -1;
|
|
}
|
|
if( has_con )
|
|
{
|
|
con_src = retrieve4string_alloc( seq );
|
|
if( !con_src )
|
|
{
|
|
u4free( expr_src );
|
|
if( reset_expr_src ) u4free( reset_expr_src );
|
|
return -1;
|
|
}
|
|
report4nchange( report->code_base, &con_src, 1, strlen(con_src) );
|
|
}
|
|
ret4short( seq, &logcon );
|
|
}
|
|
|
|
if( ret4short( seq, &total_type ) < sizeof(total_type) )
|
|
{
|
|
u4free( expr_src );
|
|
if( reset_expr_src ) u4free( reset_expr_src );
|
|
return -1;
|
|
}
|
|
|
|
if( file_version >= 0x22 )
|
|
{
|
|
if( ret4short( seq, &lookahead ) < sizeof(lookahead) )
|
|
{
|
|
u4free( expr_src );
|
|
if( reset_expr_src ) u4free( reset_expr_src );
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
total = total4create( report, name, expr_src, total_type, NULL );
|
|
if( !total )
|
|
{
|
|
u4free( expr_src );
|
|
if( reset_expr_src )
|
|
u4free( reset_expr_src );
|
|
return -2;
|
|
}
|
|
total->reset_expression = (EXPR4 *)reset_expr_src;
|
|
total->lookahead = lookahead;
|
|
total->logcon = logcon;
|
|
total->add_condition = (EXPR4 *)con_src;
|
|
}
|
|
else
|
|
{
|
|
expr = expr4parse( report->relate->data, expr_src );
|
|
if( expr )
|
|
{
|
|
calc = expr4calc_create( report->code_base, expr, name );
|
|
if( !calc )
|
|
{
|
|
expr4free( expr );
|
|
u4free( expr_src );
|
|
return -2;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
u4free( expr_src );
|
|
return -2;
|
|
}
|
|
}
|
|
|
|
|
|
u4free( expr_src );
|
|
return 0;
|
|
|
|
}
|
|
|
|
REPORT4 * S4FUNCTION report4retrieve_report_foo( FILE4SEQ_READ *seq,
|
|
RELATE4 *relate, char *buffer )
|
|
{
|
|
REPORT4 *report;
|
|
short sval;
|
|
int i, rc;
|
|
EXPR4CALC *calc;
|
|
EXPR4 *expr;
|
|
char ogroup_label[26];
|
|
|
|
report = report4init( relate );
|
|
if( !report )
|
|
return NULL;
|
|
|
|
style4free( report, (STYLE4 *)l4first( &report->styles ) );
|
|
|
|
if( retrieve4string( seq, buffer, 1024 ) < 0 )
|
|
{
|
|
report4free( report, 1, 1 );
|
|
return NULL;
|
|
}
|
|
report->report_name = (char *)u4alloc_er( report->code_base, strlen(buffer)+1 );
|
|
if( !report->report_name )
|
|
{
|
|
report4free( report, 1, 1 );
|
|
return NULL;
|
|
}
|
|
#ifdef S4WINDOWS
|
|
lstrcpy( report->report_name, buffer );
|
|
#else
|
|
strcpy( report->report_name, buffer );
|
|
#endif
|
|
|
|
report->report_file_name = (char *)u4alloc_er( report->code_base, strlen(seq->file->name)+1 );
|
|
if( !report->report_file_name )
|
|
{
|
|
report4free( report, 1, 1 );
|
|
return NULL;
|
|
}
|
|
#ifdef S4WINDOWS
|
|
lstrcpy( report->report_file_name, seq->file->name );
|
|
#else
|
|
strcpy( report->report_file_name, seq->file->name );
|
|
#endif
|
|
|
|
if( retrieve4string( seq, buffer, 1024 ) < 0 )
|
|
{
|
|
report4free( report, 1, 1 );
|
|
return NULL;
|
|
}
|
|
report->report_caption = (char *)u4alloc_er( report->code_base, strlen(buffer)+1 );
|
|
if( !report->report_caption )
|
|
{
|
|
report4free( report, 1, 1 );
|
|
return NULL;
|
|
}
|
|
#ifdef S4WINDOWS
|
|
lstrcpy( report->report_caption, buffer );
|
|
#else
|
|
strcpy( report->report_caption, buffer );
|
|
#endif
|
|
|
|
|
|
if( file_version >= 0x26 )
|
|
{
|
|
ret4long( seq, &report->report_width );
|
|
ret4long( seq, &report->margin_top );
|
|
ret4long( seq, &report->margin_bottom );
|
|
ret4long( seq, &report->margin_left );
|
|
ret4long( seq, &report->margin_right );
|
|
report->margin_top = (report->margin_top > 32000 )?0:report->margin_top;
|
|
report->margin_top = (report->margin_left > 32000 )?0:report->margin_left;
|
|
report->margin_top = (report->margin_right > 32000 )?0:report->margin_right;
|
|
report->margin_bottom = (report->margin_bottom > 32000 )?0:report->margin_bottom;
|
|
}
|
|
|
|
if( ret4short( seq, &sval ) < sizeof(sval) )
|
|
return NULL;
|
|
for( i = 0; i < sval; i++ )
|
|
if( (rc = report4retrieve_calc( seq, report )) < 0 )
|
|
{
|
|
e4describe( report->code_base, e4rep_ret, E4_REP_RCALC, 0, 0 );
|
|
if( rc == -1 )
|
|
{
|
|
report4free( report, 1, 1 );
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
calc = (EXPR4CALC *)l4first( &relate->code_base->calc_list );
|
|
while( calc )
|
|
{
|
|
if( calc->total && calc->total->reset_expression )
|
|
{
|
|
expr = expr4parse( relate->data, (char *)calc->total->reset_expression );
|
|
u4free( calc->total->reset_expression );
|
|
calc->total->reset_expression = expr;
|
|
}
|
|
if( calc->total && calc->total->add_condition )
|
|
{
|
|
expr = expr4parse( relate->data, (char *)calc->total->add_condition );
|
|
u4free( calc->total->add_condition );
|
|
calc->total->add_condition = expr;
|
|
}
|
|
calc = (EXPR4CALC *)l4next( &relate->code_base->calc_list, calc );
|
|
}
|
|
|
|
ret4short( seq, &sval );
|
|
for( i = 0; i < sval; i++ )
|
|
if( (report4retrieve_style( seq, report )) == NULL )
|
|
{
|
|
e4describe( report->code_base, e4rep_ret, E4_REP_RSTYLE, 0, 0 );
|
|
report4free( report, 1, 1 );
|
|
return NULL;
|
|
}
|
|
report->active_style = (STYLE4 *)l4first( &report->styles );
|
|
|
|
if( (rc = report4retrieve_page_header_footer( seq, report )) < 0 )
|
|
{
|
|
if( rc == -1 )
|
|
e4describe( report->code_base, e4rep_ret, E4_REP_RPHF, 0, 0 );
|
|
report4free( report, 1, 1 );
|
|
return NULL;
|
|
}
|
|
|
|
ret4short( seq, &sval );
|
|
for( i = 0; i < sval; i++ )
|
|
if( (rc = report4retrieve_group( seq, report )) < 0 )
|
|
{
|
|
if( rc == -1 )
|
|
e4describe( report->code_base, e4rep_ret, E4_REP_RGROUP, 0, 0 );
|
|
report4free( report, 1, 1 );
|
|
return NULL;
|
|
}
|
|
|
|
file4seq_read( seq, report->currency_symbol, sizeof( report->currency_symbol ) );
|
|
file4seq_read( seq, &report->thousand_separator, sizeof( report->thousand_separator ) );
|
|
file4seq_read( seq, &report->decimal_point, sizeof( report->decimal_point ) );
|
|
|
|
if( file_version < 0x26 )
|
|
{
|
|
ret4long( seq, &report->report_width );
|
|
ret4long( seq, &report->margin_top );
|
|
ret4long( seq, &report->margin_bottom );
|
|
ret4long( seq, &report->margin_left );
|
|
ret4long( seq, &report->margin_right );
|
|
}
|
|
|
|
if( file_version >= (int)0x21 )
|
|
{
|
|
ret4short( seq, &report->pgbrk_title );
|
|
ret4short( seq, &report->hard_resets_flag );
|
|
}
|
|
|
|
if( file_version >= (int)0x23 )
|
|
{
|
|
ret4long( seq, &report->sensitivity_x );
|
|
report->sensitivity_x = (report->sensitivity_x > 5000)?0:report->sensitivity_x;
|
|
ret4long( seq, &report->sensitivity_y );
|
|
report->sensitivity_y = (report->sensitivity_y > 5000)?0:report->sensitivity_y;
|
|
}
|
|
|
|
if( file_version >= 0x25 )
|
|
{
|
|
ret4short( seq, &sval );
|
|
if( sval )
|
|
{
|
|
retrieve4string( seq, ogroup_label, sizeof(ogroup_label) );
|
|
report->output_group = report4groupLookup(report, ogroup_label );
|
|
report->dfile_name = retrieve4string_alloc( seq );
|
|
}
|
|
}
|
|
return report;
|
|
}
|
|
|
|
REPORT4 * S4FUNCTION report4retrieve_report( FILE4SEQ_READ *seq, RELATE4 *relate )
|
|
{
|
|
char *buffer;
|
|
REPORT4 *retvalue;
|
|
|
|
buffer = (char *) u4alloc_free( seq->file->code_base, 1024 );
|
|
if( !buffer )
|
|
return NULL;
|
|
|
|
retvalue = report4retrieve_report_foo( seq, relate, buffer );
|
|
|
|
u4free( buffer );
|
|
return retvalue;
|
|
}
|
|
|
|
int S4FUNCTION report4save_foo( REPORT4 *report, char *file_name, int path,
|
|
char *buf, char *name_buf )
|
|
{
|
|
CODE4 *c4;
|
|
FILE4 file;
|
|
FILE4SEQ_WRITE seq;
|
|
int create_error, safety, rc;
|
|
|
|
if( !report || !file_name || file_name[0] == '\0' )
|
|
return -1;
|
|
|
|
c4 = report->code_base;
|
|
report->bitmaps = 0;
|
|
|
|
u4ncpy( name_buf, file_name, 512 );
|
|
u4name_ext( name_buf, 512, "REP", 0 );
|
|
create_error = c4->create_error;
|
|
safety = c4->safety;
|
|
|
|
c4->create_error = 0;
|
|
c4->safety = 0;
|
|
|
|
if( (rc = file4create( &file, c4, name_buf, 1 )) != 0 )
|
|
{
|
|
e4describe( report->code_base, e4rep_save, E4_REP_SFILE, 0, 0 );
|
|
e4set( c4, 0 );
|
|
c4->create_error = create_error;
|
|
c4->safety = safety;
|
|
return rc;
|
|
}
|
|
|
|
file4seq_write_init( &seq, &file, 0L, buf, 2048 );
|
|
|
|
name_buf[0] = CREP_MASK;
|
|
name_buf[1] = VERSION_MASK;
|
|
file4seq_write( &seq, name_buf, 2 );
|
|
|
|
if( relate4save_relate( report->relate, &seq, (report->pathnames == 1 || path == 1)) )
|
|
{
|
|
e4describe( report->code_base, e4rep_save, E4_REP_SREL, 0, 0 );
|
|
file4seq_write_flush( &seq );
|
|
file4close( &file );
|
|
return -1;
|
|
}
|
|
|
|
if( report->report_name != NULL )
|
|
u4free( report->report_name );
|
|
|
|
report->report_name = (char *)u4alloc_er( report->code_base, 10 );
|
|
if( !report->report_name )
|
|
return -1;
|
|
|
|
u4name_piece( report->report_name, 10, report->report_file_name, 0, 0 );
|
|
#ifndef S4UNIX
|
|
c4upper( report->report_name );
|
|
#endif
|
|
|
|
if( report4save_report( report, &seq ) < 0 )
|
|
{
|
|
|
|
return -1;
|
|
}
|
|
|
|
file4seq_write_flush( &seq );
|
|
file4close( &file );
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION report4save( REPORT4 *report, char *file_name, int path )
|
|
{
|
|
char *buf, *name_buf;
|
|
int retvalue;
|
|
|
|
buf = (char *) u4alloc_free( report->code_base, 2048 );
|
|
if( !buf )
|
|
return -1;
|
|
|
|
name_buf = (char *) u4alloc_free( report->code_base, 512 );
|
|
if( !name_buf )
|
|
{
|
|
u4free( buf );
|
|
return -1;
|
|
}
|
|
|
|
retvalue = report4save_foo( report, file_name, path, buf, name_buf );
|
|
|
|
u4free( buf );
|
|
u4free( name_buf );
|
|
|
|
return retvalue;
|
|
}
|
|
|
|
REPORT4 * S4FUNCTION report4retrieve2(CODE4 *c4, char *file_name, int open_files,
|
|
char *pathname, char *buf, char *name_buf )
|
|
{
|
|
FILE4 file;
|
|
FILE4SEQ_READ seq;
|
|
REPORT4 *report = NULL;
|
|
RELATE4 *relate = NULL;
|
|
int auto_open, create_error, expr_error, open_error;
|
|
int m1, m2, m3;
|
|
|
|
if( !c4 || !file_name || file_name[0] == '\0' )
|
|
return NULL;
|
|
|
|
if( c4->num_reports > 0 )
|
|
{
|
|
e4describe( c4, e4rep_ret, E4_REP_RNUM, 0, 0 );
|
|
return NULL;
|
|
}
|
|
|
|
auto_open = c4->auto_open;
|
|
create_error = c4->create_error;
|
|
expr_error = c4->expr_error;
|
|
open_error = c4->open_error;
|
|
|
|
c4->auto_open = c4->create_error = c4->expr_error = c4->open_error = 0;
|
|
|
|
u4ncpy( name_buf, file_name, 512 );
|
|
u4name_ext( name_buf, 512, "REP", 0 );
|
|
#ifndef S4UNIX
|
|
c4upper( name_buf );
|
|
#endif
|
|
|
|
if( file4open( &file, c4, name_buf, 1 ) != 0 )
|
|
{
|
|
e4set( c4, 0 );
|
|
return NULL;
|
|
}
|
|
|
|
file4seq_read_init( &seq, &file, 0L, buf, 2048 );
|
|
|
|
if( file4seq_read( &seq, name_buf, 2 ) < 2 )
|
|
{
|
|
file4close( &file );
|
|
return NULL;
|
|
}
|
|
|
|
m1 = name_buf[0];
|
|
m2 = name_buf[1];
|
|
|
|
m3 = m1 & CREP_MASK;
|
|
|
|
if( m3 != CREP_MASK )
|
|
{
|
|
file4close( &file );
|
|
c4->open_error = open_error;
|
|
c4->expr_error = expr_error;
|
|
c4->create_error = create_error;
|
|
c4->auto_open = auto_open;
|
|
|
|
e4describe( c4, e4rep_ret, E4_REP_RFILE, 0, 0 );
|
|
return NULL;
|
|
}
|
|
|
|
if( m2 < (char)START_VERSION_MASK || m2 > (char)VERSION_MASK )
|
|
{
|
|
file4close( &file );
|
|
c4->open_error = open_error;
|
|
c4->expr_error = expr_error;
|
|
c4->create_error = create_error;
|
|
c4->auto_open = auto_open;
|
|
e4describe( c4, e4rep_ret, E4_REP_RFILE2, 0, 0 );
|
|
return NULL;
|
|
}
|
|
|
|
file_version = (int)m2;
|
|
|
|
relate = relate4retrieve_relate( &seq, open_files, pathname );
|
|
if( !relate )
|
|
{
|
|
file4close( &file );
|
|
c4->open_error = open_error;
|
|
c4->expr_error = expr_error;
|
|
c4->create_error = create_error;
|
|
c4->auto_open = auto_open;
|
|
report4free_name_list();
|
|
return NULL;
|
|
}
|
|
report = report4retrieve_report( &seq, relate );
|
|
c4->open_error = open_error;
|
|
c4->expr_error = expr_error;
|
|
c4->create_error = create_error;
|
|
c4->auto_open = auto_open;
|
|
if( report && report->default_date_format )
|
|
strcpy( c4->date_format, report->default_date_format );
|
|
file4close( &file );
|
|
report4free_name_list();
|
|
return report;
|
|
}
|
|
|
|
REPORT4 * S4FUNCTION report4retrieve(CODE4 *c4, char *file_name,
|
|
int open_files, char *pathname )
|
|
{
|
|
char *buf, *name_buf;
|
|
REPORT4 *retvalue;
|
|
|
|
buf = (char *) u4alloc_free( c4, 2048 );
|
|
if( !buf )
|
|
return NULL;
|
|
|
|
name_buf = (char *) u4alloc_free( c4, 512 );
|
|
if( !name_buf )
|
|
{
|
|
u4free( buf );
|
|
return NULL;
|
|
}
|
|
|
|
retvalue = report4retrieve2( c4, file_name, open_files, pathname, buf, name_buf );
|
|
|
|
u4free( buf );
|
|
u4free( name_buf );
|
|
|
|
return retvalue;
|
|
}
|
|
|
|
RELATE4 * S4FUNCTION relate4retrieve2( CODE4 *c4, char *file_name,
|
|
int open_files, char *pathname, char *buf, char *name_buf )
|
|
{
|
|
FILE4 file;
|
|
FILE4SEQ_READ seq;
|
|
RELATE4 *relate;
|
|
int auto_open, create_error, expr_error, open_error;
|
|
int m1, m2, m3;
|
|
|
|
auto_open = c4->auto_open;
|
|
create_error = c4->create_error;
|
|
expr_error = c4->expr_error;
|
|
open_error = c4->open_error;
|
|
|
|
u4ncpy( name_buf, file_name, 512 );
|
|
u4name_ext( name_buf, 512, "REL", 0 );
|
|
#ifndef S4UNIX
|
|
c4upper( name_buf );
|
|
#endif
|
|
|
|
if( file4open( &file, c4, name_buf, 1 ) != 0 )
|
|
{
|
|
e4set( c4, 0 );
|
|
report4free_name_list();
|
|
return NULL;
|
|
}
|
|
|
|
file4seq_read_init( &seq, &file, 0L, buf, 2048 );
|
|
|
|
file4seq_read( &seq, name_buf, 2 );
|
|
m1 = name_buf[0];
|
|
m2 = name_buf[1];
|
|
|
|
m3 = m1 & CREP_MASK;
|
|
|
|
if( m3 != CREP_MASK )
|
|
{
|
|
e4describe( c4, e4rep_ret, E4_REP_RFILE, 0, 0 );
|
|
return NULL;
|
|
}
|
|
|
|
if( m2 < (char)START_VERSION_MASK || m2 > (char)VERSION_MASK )
|
|
{
|
|
e4describe( c4, e4rep_ret, E4_REP_RFILE2, 0, 0 );
|
|
return NULL;
|
|
}
|
|
|
|
file_version = m2;
|
|
relate = relate4retrieve_relate( &seq, open_files, pathname );
|
|
|
|
c4->open_error = open_error;
|
|
c4->expr_error = expr_error;
|
|
c4->create_error = create_error;
|
|
c4->auto_open = auto_open;
|
|
file4close( &file );
|
|
report4free_name_list();
|
|
return relate;
|
|
}
|
|
|
|
RELATE4 * S4FUNCTION relate4retrieve(CODE4 *c4, char *file_name,
|
|
int open_files, char *pathname )
|
|
{
|
|
char *buf, *name_buf;
|
|
RELATE4* retvalue;
|
|
|
|
buf = (char *) u4alloc_free( c4, 2048 );
|
|
if( !buf )
|
|
return (RELATE4*)NULL;
|
|
|
|
name_buf = (char *) u4alloc_free( c4, 512 );
|
|
if( !name_buf )
|
|
{
|
|
u4free( buf );
|
|
return (RELATE4*)NULL;
|
|
}
|
|
|
|
retvalue = relate4retrieve2( c4, file_name, open_files, pathname, buf, name_buf );
|
|
|
|
u4free( buf );
|
|
u4free( name_buf );
|
|
|
|
return retvalue;
|
|
}
|
|
|
|
|
|
int S4FUNCTION relate4save2( RELATE4 *relate, char *file_name,
|
|
int save_paths, char *buf, char *name_buf )
|
|
{
|
|
CODE4 *c4;
|
|
FILE4 file;
|
|
FILE4SEQ_WRITE seq;
|
|
int create_error, safety, rc;
|
|
|
|
c4 = relate->code_base;
|
|
|
|
u4ncpy( name_buf, file_name, 512 );
|
|
u4name_ext( name_buf, 512, "REL", 0 );
|
|
create_error = c4->create_error;
|
|
safety = c4->safety;
|
|
|
|
c4->create_error = 0;
|
|
c4->safety = 0;
|
|
|
|
if( (rc = file4create( &file, c4, name_buf, 1 )) != 0 )
|
|
{
|
|
e4set( c4, 0 );
|
|
c4->create_error = create_error;
|
|
c4->safety = safety;
|
|
return rc;
|
|
}
|
|
|
|
file4seq_write_init( &seq, &file, 0L, buf, 2048 );
|
|
|
|
name_buf[0] = CREP_MASK;
|
|
name_buf[1] = VERSION_MASK;
|
|
|
|
file4seq_write( &seq, name_buf, 2 );
|
|
|
|
if( relate4save_relate( relate, &seq, save_paths ) )
|
|
{
|
|
file4seq_write_flush( &seq );
|
|
file4close( &file );
|
|
return -1;
|
|
}
|
|
|
|
file4seq_write_flush( &seq );
|
|
file4close( &file );
|
|
return 0;
|
|
}
|
|
|
|
int S4FUNCTION relate4save(RELATE4 *relate, char *file_name, int save_paths )
|
|
{
|
|
char *buf, *name_buf;
|
|
int retvalue;
|
|
|
|
buf = (char *) u4alloc_free( relate->code_base, 2048 );
|
|
if( !buf )
|
|
return -1;
|
|
|
|
name_buf = (char *) u4alloc_free( relate->code_base, 512 );
|
|
if( !name_buf )
|
|
{
|
|
u4free( buf );
|
|
return -1;
|
|
}
|
|
|
|
retvalue = relate4save2( relate, file_name, save_paths, buf, name_buf );
|
|
|
|
u4free( buf );
|
|
u4free( name_buf );
|
|
|
|
return retvalue;
|
|
}
|
|
|
|
|
|
#ifdef S4VB_DOS
|
|
|
|
RELATE4 * relate4retrieve_v ( CODE4 *c4, char *file_name, int open_files, char *data_path_name )
|
|
{
|
|
char buf[257];
|
|
|
|
u4vtoc(buf, sizeof(buf), data_path_name) ;
|
|
|
|
return relate4retrieve( c4, c4str(file_name), open_files, buf ) ;
|
|
}
|
|
|
|
int relate4save_v ( RELATE4 *r4, char *file_name, int save_paths )
|
|
{
|
|
return relate4save( r4, c4str(file_name), save_paths ) ;
|
|
}
|
|
|
|
|
|
PREPORT4 S4FUNCTION report4retrieve_v( CODE4 *c4, char *file_name, int open_files, char *data_path )
|
|
{
|
|
char buf[257];
|
|
|
|
u4vtoc( buf, sizeof(buf), data_path );
|
|
|
|
return report4retrieve( c4, c4str(file_name), open_files, buf );
|
|
}
|
|
|
|
int report4save_v( REPORT4 *report, char *file_name, int save_paths )
|
|
{
|
|
return report4save( report, c4str(file_name), save_paths ) ;
|
|
}
|
|
|
|
#endif
|