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
 |