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
		
			
				
	
	
		
			2035 lines
		
	
	
		
			48 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			2035 lines
		
	
	
		
			48 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* r4driver.c   (c)Copyright Sequiter Software Inc., 1991-1994.  All rights reserved. */
 | 
						|
 | 
						|
#include "d4all.h"
 | 
						|
 | 
						|
#ifndef S4UNIX
 | 
						|
#ifdef __TURBOC__
 | 
						|
#pragma hdrstop
 | 
						|
#endif
 | 
						|
#ifndef S4WINDOWS
 | 
						|
#include <conio.h>
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4TEMP
 | 
						|
#include "t4test.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#include <time.h>
 | 
						|
 | 
						|
 | 
						|
#ifndef S4UNIX
 | 
						|
#ifndef S4IBMOS2
 | 
						|
#ifndef __TURBOC__
 | 
						|
#include <sys\locking.h>
 | 
						|
#define S4LOCKING
 | 
						|
#endif
 | 
						|
#ifdef __ZTC__
 | 
						|
extern int  errno ;
 | 
						|
#endif
 | 
						|
#ifdef _MSC_VER
 | 
						|
#include <sys\types.h>
 | 
						|
#include <sys\locking.h>
 | 
						|
#endif
 | 
						|
#ifdef __TURBOC__
 | 
						|
/*      extern int cdecl errno ; */
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
#include <sys\stat.h>
 | 
						|
#include <share.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4MACINTOSH
 | 
						|
#include <unix.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include <fcntl.h>
 | 
						|
#include <errno.h>
 | 
						|
 | 
						|
#ifdef S4DO_ERRNO
 | 
						|
extern int errno ;
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#define ABS(x)                ((x<0)?-1*(x):x)
 | 
						|
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
 | 
						|
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
extern HINSTANCE hInst;
 | 
						|
#endif
 | 
						|
 | 
						|
int report4calc_page_height( REPORT4 *report )
 | 
						|
{
 | 
						|
  int retval;
 | 
						|
  AREA4 *area_on;
 | 
						|
 | 
						|
  if( report->for_dbf )
 | 
						|
    return 31000;
 | 
						|
 | 
						|
  retval = (int)(report->dev_page_height - report->dev_margin_bottom);
 | 
						|
  area_on = (AREA4 *)l4first( &report->page_header_footer->footer_areas );
 | 
						|
  while( area_on )
 | 
						|
  {
 | 
						|
    if( area_on->suppression_condition )
 | 
						|
    {
 | 
						|
      if( !expr4true( area_on->suppression_condition ) )
 | 
						|
        retval -= area_on->height_dev;
 | 
						|
    }
 | 
						|
    else
 | 
						|
      retval -= area_on->height_dev;
 | 
						|
    area_on = (AREA4 *)l4next( &report->page_header_footer->footer_areas, area_on );
 | 
						|
  }
 | 
						|
 | 
						|
  return retval;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
#ifdef __cplusplus
 | 
						|
int report4output_group_headers( GROUP4 *group, HDC hDC, GROUP4 *group_first, int use_break )
 | 
						|
#else
 | 
						|
  int report4output_group_headers(group, hDC, group_first, use_break )
 | 
						|
  GROUP4 *group ;
 | 
						|
  HDC hDC ;
 | 
						|
  GROUP4 *group_first ;
 | 
						|
  int use_break  ;
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifdef __cplusplus
 | 
						|
  int report4output_group_headers( GROUP4 *group, PAGE4 *hDC, GROUP4 *group_first, int use_break )
 | 
						|
#else
 | 
						|
  int report4output_group_headers(group, hDC, group_first, use_break )
 | 
						|
  GROUP4 *group ;
 | 
						|
  PAGE4 *hDC ;
 | 
						|
  GROUP4 *group_first ;
 | 
						|
  int use_break  ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
{
 | 
						|
  REPORT4 *report = group->report;
 | 
						|
  AREA4 *area_on = report->area_on, *garea_on;
 | 
						|
  int   aflag, area_height;
 | 
						|
 | 
						|
  if( group->title_summary )
 | 
						|
    group->tsdone = 1;
 | 
						|
 | 
						|
  aflag = 0;
 | 
						|
  garea_on = (PAREA4)l4first( &group->header_areas );
 | 
						|
  while( garea_on )
 | 
						|
  {
 | 
						|
    if( garea_on == area_on )
 | 
						|
      aflag = 1;
 | 
						|
 | 
						|
    garea_on = (PAREA4)l4next( &group->header_areas, garea_on );
 | 
						|
  }
 | 
						|
 | 
						|
  if( !aflag )
 | 
						|
    area_on = NULL;
 | 
						|
 | 
						|
  if( (group->reset_page || group->reset_pagenum || group->swap_header) &&
 | 
						|
     (group == group_first || report->hard_resets_flag) &&
 | 
						|
     report->first )
 | 
						|
  {
 | 
						|
    if( !group->reset_flag )
 | 
						|
    {
 | 
						|
      group->reset_flag = 1;
 | 
						|
      report4output_pgfooter( report, hDC );
 | 
						|
      report->group_on = group;
 | 
						|
      report->group_first = group_first;
 | 
						|
      report->area_on = NULL;
 | 
						|
      report->in_header = 1;
 | 
						|
      return 0;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
      group->reset_flag = 0;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  if( !area_on )
 | 
						|
    area_on = (AREA4 *)l4first( &group->header_areas );
 | 
						|
 | 
						|
  while( area_on )
 | 
						|
  {
 | 
						|
    if( !report->broken )
 | 
						|
      area_height = area_on->height_dev + report->ypos;
 | 
						|
    else
 | 
						|
      if( report->broken == 2 )
 | 
						|
        area_height = (area_on->height_dev - report->break_height) + report->ypos;
 | 
						|
      else
 | 
						|
        if( report->broken == 1 )
 | 
						|
          area_height = report->break_height + report->ypos;
 | 
						|
 | 
						|
    if( area_height > report->disp_bottom )
 | 
						|
    {
 | 
						|
      if( area_on->allow_pagebreaks )
 | 
						|
      {
 | 
						|
        report->break_height = report4output_area_break( area_on );
 | 
						|
        if( report->break_height )
 | 
						|
        {
 | 
						|
          report->broken = 1;
 | 
						|
          report4output_area( area_on, hDC, 1 );
 | 
						|
        }
 | 
						|
      }
 | 
						|
      report4output_pgfooter( report, hDC );
 | 
						|
      report->group_on = group;
 | 
						|
      report->group_first = group_first;
 | 
						|
      report->area_on = area_on;
 | 
						|
      report->in_header = 1;
 | 
						|
      return 0;
 | 
						|
    }
 | 
						|
 | 
						|
    report4output_area( area_on, hDC, use_break );
 | 
						|
 | 
						|
    area_on = (AREA4 *)l4next( &group->header_areas, area_on );
 | 
						|
  }
 | 
						|
 | 
						|
  if( group->title_summary && group->report->pgbrk_title &&
 | 
						|
     group->header_areas.n_link > 0 )
 | 
						|
  {
 | 
						|
    report->group_on = (PGROUP4)l4next( &group->report->groups, group  );
 | 
						|
    report->group_first = group_first;
 | 
						|
    report->area_on = NULL;
 | 
						|
    report->in_header = 1;
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
 | 
						|
  return 1;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
#ifdef __cplusplus
 | 
						|
int report4output_group_footers(GROUP4 *group, HDC hDC, GROUP4 *group_first )
 | 
						|
#else
 | 
						|
  int report4output_group_footers(group, hDC, group_first )
 | 
						|
  GROUP4 *group ;
 | 
						|
  HDC hDC ;
 | 
						|
  GROUP4 *group_first  ;
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifdef __cplusplus
 | 
						|
  int report4output_group_footers(GROUP4 *group, PAGE4 *hDC, GROUP4 *group_first )
 | 
						|
#else
 | 
						|
  int report4output_group_footers(group, hDC, group_first )
 | 
						|
  GROUP4 *group ;
 | 
						|
  PAGE4 *hDC ;
 | 
						|
  GROUP4 *group_first  ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
{
 | 
						|
  long theight;
 | 
						|
  REPORT4 *report = group->report;
 | 
						|
  AREA4 *area_on = report->area_on, *harea;
 | 
						|
  int area_height;
 | 
						|
 | 
						|
 | 
						|
  if( !area_on )
 | 
						|
    area_on = (AREA4 *)l4first( &group->footer_areas );
 | 
						|
 | 
						|
  harea = area_on;
 | 
						|
  theight = 0;
 | 
						|
  while( harea )
 | 
						|
  {
 | 
						|
    if( !harea->suppression_condition || expr4true(harea->suppression_condition) )
 | 
						|
      theight += harea->height_dev;
 | 
						|
    harea = (PAREA4)l4next( &group->footer_areas, harea );
 | 
						|
  }
 | 
						|
 | 
						|
  if( group->swap_footer )
 | 
						|
    if( (report->page_header_footer &&
 | 
						|
         report->page_header_footer->footer_areas.n_link > 0) || report->ypos < report->disp_bottom - theight )
 | 
						|
      if( group == group_first || report->hard_resets_flag ||
 | 
						|
         ( group_first == report->title_summary && group == (PGROUP4)l4next( &report->groups, report->title_summary)) )
 | 
						|
      {
 | 
						|
        report4output_swapped_footer( group, hDC );
 | 
						|
 | 
						|
        report->group_on = (GROUP4 *)l4prev( &report->groups, group );
 | 
						|
        if( report->group_on == report->title_summary )
 | 
						|
        {
 | 
						|
          if( !report->end_report )
 | 
						|
          {
 | 
						|
            report->group_on = (PGROUP4)l4next( &report->groups, report->group_on );
 | 
						|
            report->in_header = 1;
 | 
						|
            report4swap_old_rec( report );
 | 
						|
            report->group_first = NULL;
 | 
						|
          }
 | 
						|
          else
 | 
						|
          {
 | 
						|
            if( report->group_on->footer_areas.n_link <= 0 )
 | 
						|
              report->end_report = 2;
 | 
						|
            report->in_header = 0;
 | 
						|
            report->group_first = group_first;
 | 
						|
          }
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
          report->in_header = 0;
 | 
						|
          report->group_first = group_first;
 | 
						|
        }
 | 
						|
        report->area_on = NULL;
 | 
						|
        return 0;
 | 
						|
      }
 | 
						|
 | 
						|
  while( area_on )
 | 
						|
  {
 | 
						|
    if( !report->broken )
 | 
						|
      area_height = area_on->height_dev + report->ypos;
 | 
						|
    else
 | 
						|
      if( report->broken == 2 )
 | 
						|
        area_height = (area_on->height_dev - report->break_height) + report->ypos;
 | 
						|
      else
 | 
						|
        if( report->broken == 1 )
 | 
						|
          area_height = report->break_height + report->ypos;
 | 
						|
 | 
						|
 | 
						|
    if( area_height > report->disp_bottom )
 | 
						|
    {
 | 
						|
      report->break_height = report4output_area_break( area_on );
 | 
						|
      if( report->break_height )
 | 
						|
      {
 | 
						|
        report->broken = 1;
 | 
						|
        report4output_area( area_on, hDC, 1 );
 | 
						|
      }
 | 
						|
 | 
						|
      report4output_pgfooter( report, hDC );
 | 
						|
 | 
						|
      report->group_on = group;
 | 
						|
      report->group_first = group_first;
 | 
						|
      report->area_on = area_on;
 | 
						|
      report->in_header = 0;
 | 
						|
      return 0;
 | 
						|
    }
 | 
						|
    report4output_area( area_on, hDC, 1 );
 | 
						|
    area_on = (AREA4 *)l4next( &group->footer_areas, area_on );
 | 
						|
  }
 | 
						|
  return 1;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
#ifdef __cplusplus
 | 
						|
int S4FUNCTION report4generatePage(PREPORT4 report, HDC hDC )
 | 
						|
#else
 | 
						|
  int S4FUNCTION report4generatePage(report, hDC )
 | 
						|
  PREPORT4 report ;
 | 
						|
  HDC hDC  ;
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifdef __cplusplus
 | 
						|
  int S4FUNCTION report4generatePage( PREPORT4 report )
 | 
						|
#else
 | 
						|
  int S4FUNCTION report4generatePage(report )
 | 
						|
  PREPORT4 report  ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
{
 | 
						|
  GROUP4 *group_first, *group_on;
 | 
						|
  TOTAL4 *total_on;
 | 
						|
  int rc, flag;
 | 
						|
 | 
						|
#ifndef S4WINDOWS
 | 
						|
  PAGE4 *hDC;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4DEBUG
 | 
						|
  if( !report  )
 | 
						|
    return -1;
 | 
						|
#ifdef S4WINDOWS
 | 
						|
  if( !hDC && !report->for_dbf )
 | 
						|
    return -1;
 | 
						|
#endif
 | 
						|
  if( report->code_base->error_code < 0 )
 | 
						|
    return -1;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef S4WINDOWS
 | 
						|
  hDC = &report->page_buf;
 | 
						|
#ifdef S4NO_CHSIZE
 | 
						|
  file4change_size( &report->page_buf.file_buf, 0L );
 | 
						|
#else
 | 
						|
  chsize( report->page_buf.file_buf.hand, 0L );
 | 
						|
#endif
 | 
						|
  file4seq_write_init( &hDC->seq_wr, &hDC->file_buf, 0L, hDC->fmem_buf, sizeof(hDC->fmem_buf) );
 | 
						|
#endif
 | 
						|
 | 
						|
  if( report->end_report == 2 )
 | 
						|
    return 2;
 | 
						|
 | 
						|
  report->code_base->pageno++;
 | 
						|
  report->page_count++;
 | 
						|
 | 
						|
  report->ypos = report->dev_margin_top;
 | 
						|
 | 
						|
  report->disp_bottom = report4calc_page_height( report );
 | 
						|
 | 
						|
  group_first = report->group_first;
 | 
						|
  group_on = report->group_on;
 | 
						|
  flag = report->in_header;
 | 
						|
 | 
						|
  if( group_on && group_on->reset_pagenum )
 | 
						|
    report->code_base->pageno = 1;
 | 
						|
 | 
						|
  if( report->tdone == 0 )
 | 
						|
  {
 | 
						|
    report->tdone = 1;
 | 
						|
    total_on = (TOTAL4 *)l4first( &report->code_base->total_list );
 | 
						|
    while( total_on )
 | 
						|
    {
 | 
						|
      if( !total_on->obj || !total_on->obj->lookahead )
 | 
						|
        total4value_update( total_on );
 | 
						|
      total_on = (TOTAL4 *)l4next( &report->code_base->total_list, total_on );
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  if( group_first == NULL && group_on == report->title_summary )
 | 
						|
  {
 | 
						|
    if( group_on->lookahead )
 | 
						|
      report4evaluate_lookahead( group_on );
 | 
						|
 | 
						|
    if( (report4output_group_headers( group_on, hDC, group_first, 1 )) == 0 )
 | 
						|
      goto GOODRET;
 | 
						|
    report->first = group_on->position;
 | 
						|
 | 
						|
    group_on = (GROUP4 *)l4next( &report->groups, group_on );
 | 
						|
  }
 | 
						|
 | 
						|
  if( !group_on || (group_on && !group_on->swap_header) )
 | 
						|
    report4output_pgheader( report, hDC );
 | 
						|
  else
 | 
						|
  {
 | 
						|
    if( flag )
 | 
						|
    {
 | 
						|
      report4output_group_headers( group_on, hDC, group_first, 1 );
 | 
						|
      group_on = (GROUP4 *)l4next( &report->groups, group_on );
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  if( report->code_base->pageno > 1 )
 | 
						|
    report4output_repeat_headers( report, hDC, group_first );
 | 
						|
 | 
						|
  while( 1 )
 | 
						|
  {
 | 
						|
    report->disp_bottom = report4calc_page_height( report );
 | 
						|
 | 
						|
    if( flag )
 | 
						|
    {
 | 
						|
      if( report->tdone == 0 )
 | 
						|
      {
 | 
						|
        report->tdone = 1;
 | 
						|
        total_on = (TOTAL4 *)l4first( &report->code_base->total_list );
 | 
						|
        while( total_on )
 | 
						|
        {
 | 
						|
          if( !total_on->obj || !total_on->obj->lookahead )
 | 
						|
            total4value_update( total_on );
 | 
						|
          total_on = (TOTAL4 *)l4next( &report->code_base->total_list, total_on );
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      if( !group_on )
 | 
						|
        group_on = (GROUP4 *)l4first( &report->groups );
 | 
						|
      if( group_on->title_summary && group_on->tsdone > 0 )
 | 
						|
        group_on = (PGROUP4)l4next( &report->groups, group_on );
 | 
						|
      while( group_on )
 | 
						|
      {
 | 
						|
        if( group_on->lookahead )
 | 
						|
          report4evaluate_lookahead( group_on );
 | 
						|
 | 
						|
        if( (report4output_group_headers( group_on, hDC, group_first, 1 )) == 0 )
 | 
						|
          goto GOODRET;
 | 
						|
        report->first = group_on->position;
 | 
						|
 | 
						|
        group_on = (GROUP4 *)l4next( &report->groups, group_on );
 | 
						|
      }
 | 
						|
 | 
						|
      report4make_old_rec( report );
 | 
						|
 | 
						|
      while( (rc = relate4skip( report->relate, 1L )) == 0 )
 | 
						|
      {
 | 
						|
        report->tdone = 0;
 | 
						|
        group_first = report4calc_first_change_group( report );
 | 
						|
 | 
						|
        if( group_first )
 | 
						|
          break;
 | 
						|
        else
 | 
						|
        {
 | 
						|
          report4make_old_rec( report );
 | 
						|
 | 
						|
          if( report->tdone == 0 )
 | 
						|
          {
 | 
						|
            report->tdone = 1;
 | 
						|
            total_on = (TOTAL4 *)l4first( &report->code_base->total_list );
 | 
						|
            while( total_on )
 | 
						|
            {
 | 
						|
              if( !total_on->obj || !total_on->obj->lookahead )
 | 
						|
                total4value_update( total_on );
 | 
						|
              total_on = (TOTAL4 *)l4next( &report->code_base->total_list, total_on );
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      if( rc == r4eof )
 | 
						|
      {
 | 
						|
        group_first = (GROUP4 *)l4first( &report->groups );
 | 
						|
        report->end_report = 1;
 | 
						|
      }
 | 
						|
 | 
						|
      if( group_first == NULL )
 | 
						|
        group_first = (GROUP4 *)l4first( &report->groups );
 | 
						|
 | 
						|
      if( group_first->position == 0 && group_first->footer_areas.n_link == 0 )
 | 
						|
        group_first = (GROUP4 *)l4next( &report->groups, group_first );
 | 
						|
 | 
						|
      report4swap_old_rec( report );
 | 
						|
    }
 | 
						|
 | 
						|
    report->tdone = 1;
 | 
						|
 | 
						|
    flag = 1;
 | 
						|
 | 
						|
    report->area_on = NULL;
 | 
						|
 | 
						|
    if( !group_on )
 | 
						|
      group_on = (GROUP4 *)l4last( &report->groups );
 | 
						|
 | 
						|
    while( group_on )
 | 
						|
    {
 | 
						|
      if( (report4output_group_footers( group_on, hDC, group_first )) == 0 )
 | 
						|
      {
 | 
						|
        if( group_on == group_first && report->end_report == 1 && report->broken != 2)
 | 
						|
        {
 | 
						|
          report->end_report = 2;
 | 
						|
          report->tdone = 0;
 | 
						|
        }
 | 
						|
 | 
						|
        if( report->for_dbf && report->output_group == group_on )
 | 
						|
        {
 | 
						|
          file4seq_write( &report->dfile_seq, d4record(report->data_file),
 | 
						|
                         (unsigned)(d4record_width(report->data_file)) );
 | 
						|
          report->rcount++;
 | 
						|
        }
 | 
						|
        goto GOODRET;
 | 
						|
      }
 | 
						|
 | 
						|
      if( report->for_dbf && report->output_group == group_on )
 | 
						|
      {
 | 
						|
        file4seq_write( &report->dfile_seq, d4record(report->data_file),
 | 
						|
                       (unsigned)(d4record_width(report->data_file)) );
 | 
						|
        report->rcount++;
 | 
						|
      }
 | 
						|
 | 
						|
      if( group_on == group_first )
 | 
						|
        break;
 | 
						|
      group_on = (GROUP4 *)l4prev( &report->groups, group_on );
 | 
						|
    }
 | 
						|
 | 
						|
    if( report->end_report == 1)
 | 
						|
    {
 | 
						|
      report->end_report = 2;
 | 
						|
      report4output_pgfooter( report, hDC );
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    report->tdone = 0;
 | 
						|
    report4swap_old_rec( report );
 | 
						|
  }
 | 
						|
 GOODRET:
 | 
						|
#ifndef S4WINDOWS
 | 
						|
  file4seq_write_flush( &report->page_buf.seq_wr );
 | 
						|
  report->page_buf.first_read = 0;
 | 
						|
#endif
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
#ifdef __cplusplus
 | 
						|
int report4output_area(PAREA4 area, HDC hDC, int use_break )
 | 
						|
#else
 | 
						|
  int report4output_area(area, hDC, use_break )
 | 
						|
  PAREA4 area ;
 | 
						|
  HDC hDC ;
 | 
						|
  int use_break  ;
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifdef __cplusplus
 | 
						|
  int report4output_area(PAREA4 area, PAGE4 *hDC, int use_break )
 | 
						|
#else
 | 
						|
  int report4output_area(area, hDC, use_break )
 | 
						|
  PAREA4 area ;
 | 
						|
  PAGE4 *hDC ;
 | 
						|
  int use_break  ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
{
 | 
						|
  OBJ4 *obj_on;
 | 
						|
  int suppress = 0;
 | 
						|
 | 
						|
  if( area->suppression_condition )
 | 
						|
  {
 | 
						|
    suppress = expr4true( area->suppression_condition );
 | 
						|
  }
 | 
						|
 | 
						|
  if( suppress )
 | 
						|
  {
 | 
						|
    if ( area->height_dev > area->report->break_height )
 | 
						|
    {
 | 
						|
      area->report->broken = 0;
 | 
						|
      area->report->break_height = 0L;
 | 
						|
    }
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
 | 
						|
  obj_on = (OBJ4 *)l4first( &area->objects );
 | 
						|
  while( obj_on )
 | 
						|
  {
 | 
						|
    if( area->report->broken == 0 || use_break == 0 )
 | 
						|
    {
 | 
						|
      report4output_object( obj_on, hDC );
 | 
						|
    }
 | 
						|
    else
 | 
						|
      if( area->report->broken == 1 )
 | 
						|
      {
 | 
						|
        if( obj_on->dev_y <= area->report->break_height )
 | 
						|
        {
 | 
						|
          report4output_object( obj_on, hDC );
 | 
						|
        }
 | 
						|
      }
 | 
						|
      else
 | 
						|
        if( area->report->broken == 2 )
 | 
						|
        {
 | 
						|
          if( obj_on->dev_y >= area->report->break_height )
 | 
						|
          {
 | 
						|
            report4output_object( obj_on, hDC );
 | 
						|
          }
 | 
						|
        }
 | 
						|
    obj_on = (OBJ4 *)l4next( &area->objects, obj_on );
 | 
						|
  }
 | 
						|
 | 
						|
  if( area->report->broken == 1 )
 | 
						|
  {
 | 
						|
    area->report->broken = 2;
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
 | 
						|
  if( area->report->broken == 2 )
 | 
						|
  {
 | 
						|
    if( area->report->for_dbf )
 | 
						|
    {
 | 
						|
      area->report->ypos = 0;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
      area->report->ypos += (area->height_dev - area->report->break_height );
 | 
						|
    }
 | 
						|
    area->report->broken = 0; area->report->break_height = 0L;
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
 | 
						|
  if( area->report->for_dbf )
 | 
						|
    area->report->ypos = 0;
 | 
						|
  else
 | 
						|
    area->report->ypos += area->height_dev;
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
#ifdef __cplusplus
 | 
						|
int report4output_object(POBJ4 obj, HDC hDC )
 | 
						|
#else
 | 
						|
  int report4output_object(obj, hDC )
 | 
						|
  POBJ4 obj ;
 | 
						|
  HDC hDC  ;
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifdef __cplusplus
 | 
						|
  int report4output_object(POBJ4 obj, PAGE4 *hDC )
 | 
						|
#else
 | 
						|
  int report4output_object(obj, hDC )
 | 
						|
  POBJ4 obj ;
 | 
						|
  PAGE4 *hDC  ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
{
 | 
						|
  REPORT4 *report;
 | 
						|
  char *output_ptr, *cptr;
 | 
						|
  long len;
 | 
						|
  int offset_break;
 | 
						|
  OBJ4 *obj_on;
 | 
						|
#ifdef S4WINDOWS
 | 
						|
  PBITMAPINFO pbmi;
 | 
						|
  HANDLE hDIB;
 | 
						|
  HPEN hpen;
 | 
						|
  HBRUSH hbrush;
 | 
						|
  LOGBRUSH lbrush;
 | 
						|
  RECT rect;
 | 
						|
  UINT alignment;
 | 
						|
  POINT pt;
 | 
						|
  int lwidth, sdc;
 | 
						|
#else
 | 
						|
  long lval, obj_len, data_len;
 | 
						|
  int  i;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4DEBUG
 | 
						|
  if( !obj || (!hDC && !obj->area->report->for_dbf) )
 | 
						|
  {
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
#endif
 | 
						|
 | 
						|
  report = obj->area->report;
 | 
						|
  if( report->output_code != 1 )
 | 
						|
    if( !(report->start_page == 0 && report->end_page == 0) )
 | 
						|
      if( report->page_count < report->start_page || report->page_count > report->end_page )
 | 
						|
        return(0);
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
  SetBkMode( hDC, TRANSPARENT );
 | 
						|
#endif
 | 
						|
 | 
						|
  if( report->code_base->error_code < 0 )
 | 
						|
    return -1;
 | 
						|
 | 
						|
  output_ptr = NULL;
 | 
						|
 | 
						|
  if( report->broken == 2 )
 | 
						|
    offset_break = (int)report->break_height;
 | 
						|
  else
 | 
						|
    offset_break = 0;
 | 
						|
 | 
						|
  if( obj->display_once && obj->display_once_expr && obj->last_display_val )
 | 
						|
  {
 | 
						|
    len = expr4vary( obj->display_once_expr, &cptr );
 | 
						|
    if( memcmp(obj->last_display_val, cptr, (int)len ) == 0 )
 | 
						|
      return 0;
 | 
						|
 | 
						|
    memcpy( obj->last_display_val, cptr, (int)len );
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  switch( obj->obj_type_num )
 | 
						|
  {
 | 
						|
#ifdef S4WINDOWS
 | 
						|
  case obj4type_bitmap3:
 | 
						|
    if( report->for_dbf )
 | 
						|
      break;
 | 
						|
    if( !obj->lookahead )
 | 
						|
      obj4evaluate( obj );
 | 
						|
    if( obj->eval_text )
 | 
						|
    {
 | 
						|
      hDIB = GetDIB( obj->eval_text, obj->area->report->code_base );
 | 
						|
      if( !hDIB )
 | 
						|
        break;
 | 
						|
 | 
						|
      pbmi = (PBITMAPINFO)GlobalLock(hDIB);
 | 
						|
      StretchDIBits( hDC, (int)(obj->dev_x + report->dev_margin_left),
 | 
						|
                    (int)(obj->dev_y + report->ypos - offset_break),
 | 
						|
                    (int)(obj->dev_w), (int)(obj->dev_h),
 | 
						|
                    0, 0, (int)pbmi->bmiHeader.biWidth, (int)pbmi->bmiHeader.biHeight,
 | 
						|
                    (LPSTR)FindDIBBits((LPSTR)pbmi), pbmi, DIB_RGB_COLORS, SRCCOPY );
 | 
						|
      GlobalUnlock( hDIB );
 | 
						|
      GlobalFree( hDIB );
 | 
						|
 | 
						|
    }
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_bitmap1:
 | 
						|
  case obj4type_bitmap2:
 | 
						|
    if( report->for_dbf )
 | 
						|
      break;
 | 
						|
    pbmi = (PBITMAPINFO)GlobalLock((HANDLE)obj->data);
 | 
						|
    StretchDIBits( hDC, (int)(obj->dev_x + report->dev_margin_left),
 | 
						|
                  (int)(obj->dev_y + report->ypos - offset_break),
 | 
						|
                  (int)obj->dev_w, (int)obj->dev_h,
 | 
						|
                  0, 0, (int)pbmi->bmiHeader.biWidth, (int)pbmi->bmiHeader.biHeight,
 | 
						|
                  (LPSTR)FindDIBBits((LPSTR)pbmi), pbmi, DIB_RGB_COLORS, SRCCOPY );
 | 
						|
    GlobalUnlock((HANDLE)obj->data);
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_hline:
 | 
						|
  case obj4type_vline:
 | 
						|
  case obj4type_frame:
 | 
						|
    if( report->for_dbf )
 | 
						|
      break;
 | 
						|
    sdc = SaveDC( hDC );
 | 
						|
    SetMapMode( hDC, MM_HIENGLISH );
 | 
						|
    SetMapMode( hDC, MM_ANISOTROPIC );
 | 
						|
    pt.x = obj->dec;
 | 
						|
    LPtoDP( hDC, &pt, 1 );
 | 
						|
    lwidth = pt.x;
 | 
						|
    RestoreDC( hDC, sdc );
 | 
						|
 | 
						|
    hbrush = NULL;
 | 
						|
    hpen = NULL;
 | 
						|
    if( obj->style )
 | 
						|
    {
 | 
						|
      lbrush.lbColor = obj->style->color;
 | 
						|
      lbrush.lbStyle = BS_SOLID;
 | 
						|
      lbrush.lbHatch = 0L;
 | 
						|
      hbrush = CreateBrushIndirect( &lbrush );
 | 
						|
      hpen = CreatePen( PS_SOLID, lwidth, obj->style->color );
 | 
						|
    }
 | 
						|
    if( hbrush && hpen )
 | 
						|
    {
 | 
						|
      SelectObject( hDC, hbrush );
 | 
						|
      SelectObject( hDC, hpen );
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
      SelectObject( hDC, GetStockObject(BLACK_PEN) );
 | 
						|
      SelectObject( hDC, GetStockObject(BLACK_BRUSH) );
 | 
						|
    }
 | 
						|
 | 
						|
    if( obj->obj_type_num == obj4type_hline )
 | 
						|
    {
 | 
						|
      MoveToEx( hDC, (int)(obj->dev_x + report->dev_margin_left), (int)(obj->dev_y + obj->dev_h/2 + report->ypos - offset_break), NULL );
 | 
						|
      LineTo( hDC, (int)(obj->dev_x + obj->dev_w + report->dev_margin_left), (int)(obj->dev_y + obj->dev_h/2 + report->ypos - offset_break) );
 | 
						|
    }
 | 
						|
    if( obj->obj_type_num == obj4type_vline )
 | 
						|
    {
 | 
						|
      MoveToEx( hDC, (int)(obj->dev_x + obj->dev_w/2 + report->dev_margin_left), (int)(obj->dev_y + report->ypos - offset_break), NULL );
 | 
						|
      LineTo( hDC, (int)(obj->dev_x + obj->dev_w/2 + report->dev_margin_left), (int)(obj->dev_y + obj->dev_h + report->ypos - offset_break) );
 | 
						|
    }
 | 
						|
 | 
						|
    if( obj->obj_type_num == obj4type_frame )
 | 
						|
    {
 | 
						|
 | 
						|
      if( !obj->display_zero )
 | 
						|
        SelectObject( hDC, GetStockObject( WHITE_BRUSH ) );
 | 
						|
 | 
						|
      if( obj->alignment == 0 )
 | 
						|
      {
 | 
						|
        Rectangle( hDC, (int)(obj->dev_x + report->dev_margin_left + 1 + (lwidth/2)),
 | 
						|
                  (int)(obj->dev_y + report->ypos - offset_break + 1 + (lwidth/2)),
 | 
						|
                  (int)(obj->dev_x + obj->dev_w + report->dev_margin_left - (lwidth/2)),
 | 
						|
                  (int)(obj->dev_y + obj->dev_h + report->ypos - offset_break - (lwidth/2)) );
 | 
						|
      }
 | 
						|
      else
 | 
						|
      {
 | 
						|
        RoundRect( hDC, (int)(obj->dev_x + report->dev_margin_left + 1 + (lwidth/2)),
 | 
						|
                  (int)(obj->dev_y + report->ypos - offset_break + 1 + (lwidth/2)),
 | 
						|
                  (int)(obj->dev_x + obj->dev_w + report->dev_margin_left - (lwidth/2)),
 | 
						|
                  (int)(obj->dev_y + obj->dev_h + report->ypos - offset_break - (lwidth/2)),
 | 
						|
                  20, 20 );
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    SelectObject( hDC, GetStockObject(BLACK_PEN) );
 | 
						|
    SelectObject( hDC, GetStockObject(BLACK_BRUSH) );
 | 
						|
    if( hbrush )
 | 
						|
      DeleteObject( hbrush );
 | 
						|
    if( hpen )
 | 
						|
      DeleteObject( hpen );
 | 
						|
    len = 0;
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_text:
 | 
						|
    if( report->for_dbf )
 | 
						|
    {
 | 
						|
      if( obj->field )
 | 
						|
        f4assign( obj->field, obj->wintext );
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    output_ptr = obj->wintext;
 | 
						|
    len = lstrlen( obj->wintext );
 | 
						|
    if( len > 0 )
 | 
						|
    {
 | 
						|
      if( obj->style )
 | 
						|
      {
 | 
						|
        if( report->output_code == 1 )
 | 
						|
          SelectObject( hDC, obj->style->screen_font );
 | 
						|
        else
 | 
						|
          SelectObject( hDC, obj->style->printer_font );
 | 
						|
        SetTextColor( hDC, obj->style->color );
 | 
						|
      }
 | 
						|
 | 
						|
      rect.left   = (int)(obj->dev_x + report->dev_margin_left);
 | 
						|
      rect.top    = (int)(obj->dev_y + report->ypos - offset_break);
 | 
						|
      rect.right  = rect.left + (int)obj->dev_w;
 | 
						|
      rect.bottom = rect.top + (int)obj->dev_h;
 | 
						|
 | 
						|
      switch( obj->alignment )
 | 
						|
      {
 | 
						|
      case justify4left:
 | 
						|
        alignment = DT_LEFT;
 | 
						|
        break;
 | 
						|
      case justify4right:
 | 
						|
        alignment = DT_RIGHT;
 | 
						|
        break;
 | 
						|
      case justify4center:
 | 
						|
        alignment = DT_CENTER;
 | 
						|
        break;
 | 
						|
      }
 | 
						|
 | 
						|
      DrawText( hDC, output_ptr, (int)len, &rect, DT_WORDBREAK | alignment | DT_NOPREFIX );
 | 
						|
    }
 | 
						|
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_total:
 | 
						|
    if( report->for_dbf )
 | 
						|
    {
 | 
						|
      if( obj->field )
 | 
						|
        switch( ((PTOTAL4)obj->data)->total_type )
 | 
						|
        {
 | 
						|
        case total4lowest:
 | 
						|
          f4assign_double( obj->field, ((PTOTAL4)obj->data)->low );
 | 
						|
          break;
 | 
						|
 | 
						|
        case total4highest:
 | 
						|
          f4assign_double( obj->field, ((PTOTAL4)obj->data)->high );
 | 
						|
          break;
 | 
						|
 | 
						|
        case total4count:
 | 
						|
          f4assign_long( obj->field, ((PTOTAL4)obj->data)->count );
 | 
						|
          break;
 | 
						|
 | 
						|
        case total4sum:
 | 
						|
          f4assign_double( obj->field, ((PTOTAL4)obj->data)->total );
 | 
						|
          break;
 | 
						|
 | 
						|
        case total4average:
 | 
						|
          f4assign_double( obj->field, (((PTOTAL4)obj->data)->total/((PTOTAL4)obj->data)->count) );
 | 
						|
          break;
 | 
						|
 | 
						|
        }
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  case obj4type_expr:
 | 
						|
  case obj4type_field:
 | 
						|
  case obj4type_calc:
 | 
						|
    if( report->for_dbf )
 | 
						|
    {
 | 
						|
      if( !obj->lookahead )
 | 
						|
        obj4evaluate( obj );
 | 
						|
 | 
						|
      if( obj->field )
 | 
						|
        switch( f4type(obj->field) )
 | 
						|
        {
 | 
						|
        case r4str:
 | 
						|
        case r4date:
 | 
						|
          f4assign( obj->field, obj->eval_text );
 | 
						|
          break;
 | 
						|
 | 
						|
        case r4log:
 | 
						|
          f4assign_char( obj->field, *(obj->eval_text) );
 | 
						|
          break;
 | 
						|
 | 
						|
        case r4num:
 | 
						|
          f4assign_double( obj->field, obj->dval );
 | 
						|
          break;
 | 
						|
        }
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    if( !obj->lookahead )
 | 
						|
      obj4evaluate( obj );
 | 
						|
 | 
						|
    if( obj->eval_text )
 | 
						|
    {
 | 
						|
      if( obj->style )
 | 
						|
      {
 | 
						|
        if( report->output_code == 1 )
 | 
						|
          SelectObject( hDC, obj->style->screen_font );
 | 
						|
        else
 | 
						|
          SelectObject( hDC, obj->style->printer_font );
 | 
						|
        SetTextColor( hDC, obj->style->color );
 | 
						|
      }
 | 
						|
 | 
						|
      rect.left   = (int)(obj->dev_x + report->dev_margin_left);
 | 
						|
      rect.top    = (int)(obj->dev_y + report->ypos - offset_break);
 | 
						|
      rect.right  = rect.left + (int)obj->dev_w;
 | 
						|
      rect.bottom = rect.top + (int)obj->dev_h;
 | 
						|
 | 
						|
      switch( obj->alignment )
 | 
						|
      {
 | 
						|
      case justify4left:
 | 
						|
        alignment = DT_LEFT;
 | 
						|
        break;
 | 
						|
      case justify4right:
 | 
						|
        alignment = DT_RIGHT;
 | 
						|
        break;
 | 
						|
      case justify4center:
 | 
						|
        alignment = DT_CENTER;
 | 
						|
        break;
 | 
						|
      }
 | 
						|
 | 
						|
      DrawText( hDC, obj->eval_text, obj->eval_len-1, &rect, DT_WORDBREAK | alignment | DT_NOPREFIX );
 | 
						|
 | 
						|
    }
 | 
						|
    break;
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
  case obj4type_text:
 | 
						|
    if( report->for_dbf )
 | 
						|
    {
 | 
						|
      if( obj->field )
 | 
						|
        f4assign( obj->field, obj->wintext );
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    output_ptr = obj->wintext;
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_total:
 | 
						|
    if( obj->field && report->for_dbf )
 | 
						|
    {
 | 
						|
      switch( ((PTOTAL4)obj->data)->total_type )
 | 
						|
      {
 | 
						|
      case total4lowest:
 | 
						|
        f4assign_double( obj->field, ((PTOTAL4)obj->data)->low );
 | 
						|
        break;
 | 
						|
 | 
						|
      case total4highest:
 | 
						|
        f4assign_double( obj->field, ((PTOTAL4)obj->data)->high );
 | 
						|
        break;
 | 
						|
 | 
						|
      case total4count:
 | 
						|
        f4assign_long( obj->field, ((PTOTAL4)obj->data)->count );
 | 
						|
        break;
 | 
						|
 | 
						|
      case total4sum:
 | 
						|
        f4assign_double( obj->field, ((PTOTAL4)obj->data)->total );
 | 
						|
        break;
 | 
						|
      }
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  case obj4type_expr:
 | 
						|
  case obj4type_field:
 | 
						|
  case obj4type_calc:
 | 
						|
    if( report->for_dbf )
 | 
						|
    {
 | 
						|
      if( !obj->lookahead )
 | 
						|
        obj4evaluate( obj );
 | 
						|
      if( obj->field )
 | 
						|
        switch( f4type(obj->field) )
 | 
						|
        {
 | 
						|
        case r4str:
 | 
						|
        case r4date:
 | 
						|
          f4assign( obj->field, obj->eval_text );
 | 
						|
          break;
 | 
						|
 | 
						|
        case r4log:
 | 
						|
          f4assign_char( obj->field, *(obj->eval_text) );
 | 
						|
          break;
 | 
						|
 | 
						|
        case r4num:
 | 
						|
          f4assign_double( obj->field, obj->dval );
 | 
						|
          break;
 | 
						|
        }
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    if( !obj->lookahead )
 | 
						|
      obj4evaluate( obj );
 | 
						|
 | 
						|
    if( obj->eval_text )
 | 
						|
      output_ptr = obj->eval_text;
 | 
						|
    else
 | 
						|
      output_ptr = NULL;
 | 
						|
    break;
 | 
						|
#endif
 | 
						|
  }
 | 
						|
 | 
						|
#ifndef S4WINDOWS
 | 
						|
 | 
						|
  file4seq_write( &hDC->seq_wr, &obj->obj_type_num, sizeof(short) );
 | 
						|
 | 
						|
  obj_len = 5*sizeof(long) + 2*sizeof(short);
 | 
						|
  switch( obj->obj_type_num )
 | 
						|
  {
 | 
						|
  case obj4type_text:
 | 
						|
    obj_len += strlen(obj->wintext);
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_frame:
 | 
						|
    obj_len += 2;
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_hline:
 | 
						|
  case obj4type_vline:
 | 
						|
    break;
 | 
						|
 | 
						|
  default:
 | 
						|
    obj_len += (obj->eval_len - 1);
 | 
						|
    break;
 | 
						|
  }
 | 
						|
  file4seq_write( &hDC->seq_wr, &obj_len, sizeof(obj_len) );
 | 
						|
 | 
						|
  lval = obj->dev_x + report->dev_margin_left;
 | 
						|
  file4seq_write( &hDC->seq_wr, &lval, sizeof(lval) );
 | 
						|
  lval = obj->dev_y + report->ypos - offset_break;
 | 
						|
  file4seq_write( &hDC->seq_wr, &lval, sizeof(lval) );
 | 
						|
  file4seq_write( &hDC->seq_wr, &obj->dev_w, sizeof(obj->dev_w) );
 | 
						|
  file4seq_write( &hDC->seq_wr, &obj->dev_h, sizeof(obj->dev_h) );
 | 
						|
  file4seq_write( &hDC->seq_wr, &obj->alignment, sizeof(obj->alignment) );
 | 
						|
 | 
						|
  if( obj->style )
 | 
						|
  {
 | 
						|
    file4seq_write( &hDC->seq_wr, &obj->style->position, sizeof(obj->style->position) );
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    i = 0;
 | 
						|
    file4seq_write( &hDC->seq_wr, &i, sizeof(short) );
 | 
						|
  }
 | 
						|
 | 
						|
  switch( obj->obj_type_num )
 | 
						|
  {
 | 
						|
  case obj4type_text:
 | 
						|
    data_len = strlen(obj->wintext);
 | 
						|
    file4seq_write( &hDC->seq_wr, &data_len, sizeof(data_len) );
 | 
						|
    file4seq_write( &hDC->seq_wr, obj->wintext, (unsigned)data_len );
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_frame:
 | 
						|
    data_len = 2;
 | 
						|
    file4seq_write( &hDC->seq_wr, &data_len, sizeof(data_len) );
 | 
						|
    file4seq_write( &hDC->seq_wr, &obj->display_zero, 1 );
 | 
						|
    file4seq_write( &hDC->seq_wr, &obj->alignment, 1 );
 | 
						|
    break;
 | 
						|
 | 
						|
  case obj4type_hline:
 | 
						|
  case obj4type_vline:
 | 
						|
    data_len = 0;
 | 
						|
    file4seq_write( &hDC->seq_wr, &data_len, sizeof(data_len) );
 | 
						|
    break;
 | 
						|
 | 
						|
  default:
 | 
						|
    data_len = obj->eval_len - 1;
 | 
						|
    file4seq_write( &hDC->seq_wr, &data_len, sizeof(data_len) );
 | 
						|
    file4seq_write( &hDC->seq_wr, obj->eval_text, (unsigned)data_len );
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
  obj_on = (OBJ4 *)l4first( &obj->contained );
 | 
						|
  while( obj_on )
 | 
						|
  {
 | 
						|
#ifdef S4WINDOWS
 | 
						|
    report4output_object( obj_on, hDC );
 | 
						|
#else
 | 
						|
    report4output_object( obj_on, hDC );
 | 
						|
#endif
 | 
						|
    obj_on = (OBJ4 *)l4next( &obj->contained, obj_on );
 | 
						|
  }
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
GROUP4 * S4FUNCTION report4calc_first_change_group( REPORT4 *report )
 | 
						|
{
 | 
						|
  GROUP4 *group_on, *change_group = NULL;
 | 
						|
  char  *ptr ;
 | 
						|
  int len ;
 | 
						|
 | 
						|
  group_on = (GROUP4 *)l4first( &report->groups );
 | 
						|
  if( group_on->title_summary )
 | 
						|
    group_on = (GROUP4 *)l4next( &report->groups, group_on );
 | 
						|
  while( group_on )
 | 
						|
  {
 | 
						|
    if( !group_on->reset_expression && !change_group )
 | 
						|
      change_group = group_on;
 | 
						|
 | 
						|
    if( group_on->reset_expression )
 | 
						|
    {
 | 
						|
      len = expr4vary( group_on->reset_expression, &ptr );
 | 
						|
      if( memcmp(group_on->last_reset_value, ptr, len) != 0 && !change_group )
 | 
						|
        change_group = group_on;
 | 
						|
 | 
						|
      memcpy( group_on->last_reset_value, ptr, len );
 | 
						|
    }
 | 
						|
    group_on = (GROUP4 *)l4next( &report->groups, group_on );
 | 
						|
  }
 | 
						|
 | 
						|
  return change_group;
 | 
						|
}
 | 
						|
 | 
						|
int report4alloc_records( REPORT4 *report )
 | 
						|
{
 | 
						|
  RELATE4 *relate_on;
 | 
						|
 | 
						|
  if( !report )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( report->code_base->error_code < 0 )
 | 
						|
    return -1;
 | 
						|
 | 
						|
  relate_on = &report->relate->relation->relate;
 | 
						|
 | 
						|
  while(relate_on)
 | 
						|
  {
 | 
						|
    if( !relate_on->old_record )
 | 
						|
      relate_on->old_record =
 | 
						|
        (char *)u4alloc_free( report->code_base, relate_on->data->record_width + 1 );
 | 
						|
 | 
						|
    if( relate_on->old_record == NULL )
 | 
						|
    {
 | 
						|
      return -1;
 | 
						|
    }
 | 
						|
 | 
						|
    relate4next(&relate_on);
 | 
						|
  }
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
int report4make_old_rec( REPORT4 *report )
 | 
						|
{
 | 
						|
  RELATE4 *relate;
 | 
						|
 | 
						|
  if( !report )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( report->code_base->error_code < 0 )
 | 
						|
    return -1;
 | 
						|
 | 
						|
  relate = &report->relate->relation->relate;
 | 
						|
 | 
						|
  while(relate)
 | 
						|
  {
 | 
						|
    memcpy(relate->old_record,relate->data->record,relate->data->record_width);
 | 
						|
 | 
						|
    relate4next(&relate);
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
int report4swap_old_rec( REPORT4 *report )
 | 
						|
{
 | 
						|
  RELATE4 *relate_on;
 | 
						|
  char *tempptr;
 | 
						|
  int i;
 | 
						|
 | 
						|
  if( !report )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( report->code_base->error_code < 0 )
 | 
						|
    return -1;
 | 
						|
 | 
						|
  relate_on = &report->relate->relation->relate;
 | 
						|
 | 
						|
  while (relate_on )
 | 
						|
  {
 | 
						|
    tempptr = relate_on->data->record;
 | 
						|
 | 
						|
    relate_on->data->record = relate_on->old_record;
 | 
						|
    relate_on->old_record = tempptr;
 | 
						|
 | 
						|
    if ( relate_on->data->fields_memo != 0 )
 | 
						|
    {
 | 
						|
      for ( i = 0; i < relate_on->data->n_fields_memo ; i++ )
 | 
						|
        relate_on->data->fields_memo[i].status = 1;
 | 
						|
    }
 | 
						|
    relate4next(&relate_on);
 | 
						|
  }
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
int report4output_area_break( AREA4 *area )
 | 
						|
{
 | 
						|
  int test, flag;
 | 
						|
  OBJ4 *obj_on;
 | 
						|
 | 
						|
  if( !area->allow_pagebreaks )
 | 
						|
    return 0;
 | 
						|
 | 
						|
  test = (int)(area->report->disp_bottom - area->report->ypos + 1);
 | 
						|
  flag = 0;
 | 
						|
 | 
						|
  if( area->report->break_height )
 | 
						|
    test += area->report->break_height;
 | 
						|
 | 
						|
  while(  !flag && test > 0 )
 | 
						|
  {
 | 
						|
    flag = 1;
 | 
						|
    test--;
 | 
						|
    obj_on = (OBJ4 *)l4first( &area->objects );
 | 
						|
    while( obj_on )
 | 
						|
    {
 | 
						|
      if( test >=  obj_on->dev_y && test <= obj_on->dev_y+obj_on->dev_h )
 | 
						|
      {
 | 
						|
        flag = 0;
 | 
						|
        test = (int)obj_on->dev_y;
 | 
						|
        obj_on = NULL;
 | 
						|
      }
 | 
						|
      else
 | 
						|
        obj_on = (OBJ4 *)l4next( &area->objects, obj_on );
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return test;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
#ifdef __cplusplus
 | 
						|
void report4output_pgheader(REPORT4 *report, HDC hDC )
 | 
						|
#else
 | 
						|
  void report4output_pgheader(report, hDC )
 | 
						|
  REPORT4 *report ;
 | 
						|
  HDC hDC  ;
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifdef __cplusplus
 | 
						|
  void report4output_pgheader(REPORT4 *report, PAGE4 *hDC )
 | 
						|
#else
 | 
						|
  void report4output_pgheader(report, hDC )
 | 
						|
  REPORT4 *report ;
 | 
						|
  PAGE4 *hDC  ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
{
 | 
						|
  AREA4 *area_on;
 | 
						|
  short broken;
 | 
						|
 | 
						|
  broken = report->broken;
 | 
						|
  report->broken = 0;
 | 
						|
 | 
						|
  area_on = (AREA4 *)l4first( &report->page_header_footer->header_areas );
 | 
						|
  while( area_on )
 | 
						|
  {
 | 
						|
    report4output_area( area_on, hDC, 1 );
 | 
						|
    area_on = (AREA4 *)l4next( &report->page_header_footer->header_areas, area_on );
 | 
						|
 | 
						|
  }
 | 
						|
  report->broken = broken;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
#ifdef __cplusplus
 | 
						|
void report4output_pgfooter(REPORT4 *report, HDC hDC )
 | 
						|
#else
 | 
						|
  void report4output_pgfooter(report, hDC )
 | 
						|
  REPORT4 *report ;
 | 
						|
  HDC hDC  ;
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifdef __cplusplus
 | 
						|
  void report4output_pgfooter(REPORT4 *report, PAGE4 *hDC )
 | 
						|
#else
 | 
						|
  void report4output_pgfooter(report, hDC )
 | 
						|
  REPORT4 *report ;
 | 
						|
  PAGE4 *hDC  ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
{
 | 
						|
  AREA4 *area_on;
 | 
						|
  short broken;
 | 
						|
 | 
						|
  broken = report->broken;
 | 
						|
  report->broken = 0;
 | 
						|
 | 
						|
  report->ypos = report->disp_bottom;
 | 
						|
  area_on = (AREA4 *)l4first( &report->page_header_footer->footer_areas );
 | 
						|
  while( area_on )
 | 
						|
  {
 | 
						|
    report4output_area( area_on, hDC, 1 );
 | 
						|
    area_on = (AREA4 *)l4next( &report->page_header_footer->footer_areas, area_on );
 | 
						|
  }
 | 
						|
  report->broken = broken;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
#ifdef __cplusplus
 | 
						|
void report4output_repeat_headers(REPORT4 *report, HDC hDC, GROUP4 *group_first )
 | 
						|
#else
 | 
						|
  void report4output_repeat_headers(report, hDC, group_first )
 | 
						|
  REPORT4 *report ;
 | 
						|
  HDC hDC ;
 | 
						|
  GROUP4 *group_first  ;
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifdef __cplusplus
 | 
						|
  void report4output_repeat_headers(REPORT4 *report, PAGE4 *hDC, GROUP4 *group_first )
 | 
						|
#else
 | 
						|
  void report4output_repeat_headers(report, hDC, group_first )
 | 
						|
  REPORT4 *report ;
 | 
						|
  PAGE4 *hDC ;
 | 
						|
  GROUP4 *group_first  ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
{
 | 
						|
  GROUP4 *group_on;
 | 
						|
 | 
						|
  if( !report->first )
 | 
						|
    return;
 | 
						|
 | 
						|
  group_on = (GROUP4 *)l4first( &report->groups );
 | 
						|
  while( group_on != group_first )
 | 
						|
  {
 | 
						|
    if( group_on->repeat_header )
 | 
						|
      report4output_group_headers( group_on, hDC, group_first, 0 );
 | 
						|
    group_on = (GROUP4 *)l4next( &report->groups, group_on );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
#ifdef __cplusplus
 | 
						|
void report4output_swapped_footer( GROUP4 *group, HDC hDC )
 | 
						|
#else
 | 
						|
  void report4output_swapped_footer(group, hDC )
 | 
						|
  GROUP4 *group ;
 | 
						|
  HDC hDC  ;
 | 
						|
#endif
 | 
						|
#else
 | 
						|
#ifdef __cplusplus
 | 
						|
  void report4output_swapped_footer( GROUP4 *group, PAGE4 *hDC )
 | 
						|
#else
 | 
						|
  void report4output_swapped_footer(group, hDC )
 | 
						|
  GROUP4 *group ;
 | 
						|
  PAGE4 *hDC  ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
{
 | 
						|
  REPORT4 *report = group->report;
 | 
						|
  AREA4 *area_on;
 | 
						|
  OBJ4 *obj_on;
 | 
						|
  int suppress;
 | 
						|
  long theight;
 | 
						|
 | 
						|
  if( report->page_header_footer->footer_areas.n_link > 0 )
 | 
						|
    report->ypos = report->disp_bottom;
 | 
						|
  else
 | 
						|
  {
 | 
						|
    theight = 0;
 | 
						|
    area_on = (AREA4 *)l4first( &group->footer_areas );
 | 
						|
    while( area_on )
 | 
						|
    {
 | 
						|
      if( !area_on->suppression_condition || expr4true(area_on->suppression_condition) )
 | 
						|
        theight += area_on->height_dev;
 | 
						|
      area_on = (AREA4 *)l4next( &group->footer_areas, area_on );
 | 
						|
    }
 | 
						|
    report->ypos = report->disp_bottom - theight;
 | 
						|
  }
 | 
						|
 | 
						|
  area_on = (AREA4 *)l4first( &group->footer_areas );
 | 
						|
  while( area_on )
 | 
						|
  {
 | 
						|
    suppress = 0;
 | 
						|
    if( area_on->suppression_condition )
 | 
						|
    {
 | 
						|
      suppress = expr4true( area_on->suppression_condition );
 | 
						|
    }
 | 
						|
 | 
						|
    if( suppress )
 | 
						|
    {
 | 
						|
      area_on = (PAREA4)l4next( &group->footer_areas, area_on );
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    obj_on = (OBJ4 *)l4first( &area_on->objects );
 | 
						|
    while( obj_on )
 | 
						|
    {
 | 
						|
      if( report->ypos + obj_on->dev_y + obj_on->dev_h <
 | 
						|
         report->dev_page_height - report->dev_margin_bottom )
 | 
						|
      {
 | 
						|
        report4output_object( obj_on, hDC );
 | 
						|
      }
 | 
						|
 | 
						|
      obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on );
 | 
						|
    }
 | 
						|
    report->ypos += area_on->height_dev;
 | 
						|
    area_on = (AREA4 *)l4next( &group->footer_areas, area_on );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
int S4FUNCTION report4pageInit( PREPORT4 report )
 | 
						|
{
 | 
						|
  int rc, i;
 | 
						|
  int len;
 | 
						|
  TOTAL4 *total_on;
 | 
						|
  GROUP4 *group_on;
 | 
						|
  char   *ptr;
 | 
						|
  PSTYLE4 style;
 | 
						|
#ifndef S4WINDOWS
 | 
						|
  char name_buf[13];
 | 
						|
  int tsafety;
 | 
						|
#endif
 | 
						|
 | 
						|
  if( !report )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  relate4skip_enable( report->relate, 1 );
 | 
						|
 | 
						|
#ifdef S4WINDOWS
 | 
						|
  report->hWnd2 = 0;
 | 
						|
#ifdef S4WIN32
 | 
						|
  report->hWnd2 = CreateWindowEx( WS_EX_TRANSPARENT, "MouseEat", "EatInput",
 | 
						|
                                 WS_POPUP | WS_CAPTION | WS_BORDER | WS_VISIBLE,
 | 
						|
                                 0, 0, 5, 5, report->hWnd, NULL,
 | 
						|
                                 (HINSTANCE)GetWindowLong(report->hWnd, GWL_HINSTANCE), NULL );
 | 
						|
#else
 | 
						|
  report->hWnd2 = CreateWindowEx( WS_EX_TRANSPARENT, "MouseEat", "EatInput",
 | 
						|
                                 WS_POPUP | WS_CAPTION | WS_BORDER | WS_VISIBLE,
 | 
						|
                                 0, 0, 5, 5, report->hWnd, NULL,
 | 
						|
                                 (HINSTANCE)GetWindowWord(report->hWnd, GWW_HINSTANCE), NULL );
 | 
						|
#endif
 | 
						|
 | 
						|
  if( report->hWnd2 )
 | 
						|
  {
 | 
						|
#ifdef S4WIN32
 | 
						|
    SetClassLong( report->hWnd2, GCL_HCURSOR, 0L );
 | 
						|
#else
 | 
						|
    SetClassWord( report->hWnd2, GCW_HCURSOR, 0 );
 | 
						|
#endif
 | 
						|
    SetCursor( LoadCursor(NULL,IDC_WAIT) );
 | 
						|
    SetCapture( report->hWnd2 );
 | 
						|
  }
 | 
						|
#endif
 | 
						|
 | 
						|
  rc = relate4top( report->relate );
 | 
						|
  switch( rc )
 | 
						|
  {
 | 
						|
  case r4terminate:
 | 
						|
  case r4locked:
 | 
						|
  case r4eof:
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
  if( rc < 0 )
 | 
						|
    return -1;
 | 
						|
 | 
						|
  report->tdone = 0;
 | 
						|
  report->page_no = report->page_count = 0;
 | 
						|
 | 
						|
  if( (report4alloc_records( report )) < 0 )
 | 
						|
    return -1;
 | 
						|
 | 
						|
  i = 0;
 | 
						|
  style = (PSTYLE4)l4first( &report->styles );
 | 
						|
  while( style )
 | 
						|
  {
 | 
						|
    style->position = i;
 | 
						|
    i++;
 | 
						|
    style = (PSTYLE4)l4next( &report->styles, style );
 | 
						|
  }
 | 
						|
 | 
						|
  group_on = (GROUP4 *)l4first( &report->groups );
 | 
						|
  while( group_on )
 | 
						|
  {
 | 
						|
    if( group_on->title_summary )
 | 
						|
      group_on->tsdone = 0;
 | 
						|
 | 
						|
    group_on->reset_flag = 0;
 | 
						|
    if( group_on->last_reset_value )
 | 
						|
    {
 | 
						|
      u4free( group_on->last_reset_value );
 | 
						|
      group_on->last_reset_value = NULL;
 | 
						|
    }
 | 
						|
    if( group_on->reset_expression )
 | 
						|
    {
 | 
						|
      len = expr4vary( group_on->reset_expression, &ptr );
 | 
						|
      group_on->last_reset_value = (char *)u4alloc_free( report->code_base, len + 1 );
 | 
						|
      if( group_on->last_reset_value )
 | 
						|
        memcpy( group_on->last_reset_value, ptr, len );
 | 
						|
    }
 | 
						|
    group_on = (GROUP4 *)l4next( &report->groups, group_on );
 | 
						|
  }
 | 
						|
 | 
						|
  total_on = (TOTAL4 *)l4first( &report->code_base->total_list );
 | 
						|
  while( total_on )
 | 
						|
  {
 | 
						|
    if( total_on->last_add_value )
 | 
						|
    {
 | 
						|
      u4free( total_on->last_add_value );
 | 
						|
      total_on->last_add_value = NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    if( total_on->add_condition )
 | 
						|
    {
 | 
						|
      total_on->last_add_value =
 | 
						|
        (char *)u4alloc_free( report->code_base, expr4len(total_on->add_condition)+1 );
 | 
						|
    }
 | 
						|
 | 
						|
    total_on->donce = 0;
 | 
						|
 | 
						|
    if( total_on->last_reset_value )
 | 
						|
    {
 | 
						|
      u4free( total_on->last_reset_value );
 | 
						|
      total_on->last_reset_value = NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    if( total_on->reset_expression )
 | 
						|
    {
 | 
						|
      total_on->last_reset_value = (char *)u4alloc_free( report->code_base, expr4len(total_on->reset_expression)+1 );
 | 
						|
    }
 | 
						|
 | 
						|
    total_on = (TOTAL4 *)l4next( &report->code_base->total_list, total_on );
 | 
						|
  }
 | 
						|
 | 
						|
  report4check_lookahead( report );
 | 
						|
 | 
						|
  report4check_display_once( report );
 | 
						|
 | 
						|
  report->group_on = (GROUP4 *)l4first( &report->groups );
 | 
						|
  report->group_first = NULL;
 | 
						|
  report->area_on = NULL;
 | 
						|
  report->in_header = 1;
 | 
						|
  report->end_report = 0;
 | 
						|
  report->code_base->pageno = 0;
 | 
						|
  report->first = 0;
 | 
						|
 | 
						|
  total_on = (TOTAL4 *) l4first( &report->code_base->total_list );
 | 
						|
  while( total_on )
 | 
						|
  {
 | 
						|
    total4value_reset( total_on );
 | 
						|
    total_on = (TOTAL4 *) l4next( &report->code_base->total_list, total_on );
 | 
						|
  }
 | 
						|
 | 
						|
#ifndef S4WINDOWS
 | 
						|
  report4calc_obj_dev( report );
 | 
						|
  report->dev_page_width = report->report_width + report->margin_right + report->margin_left;
 | 
						|
  report->dev_page_height = report->report_height + report->margin_top + report->margin_bottom;
 | 
						|
 | 
						|
  if( report->output_handle > 0 )
 | 
						|
  {
 | 
						|
    tsafety = report->code_base->safety;
 | 
						|
    report->code_base->safety = 0;
 | 
						|
    if( !report->report_file_name || *report->report_file_name =='\0' )
 | 
						|
      strcpy( name_buf, "crep2.buf" );
 | 
						|
    else
 | 
						|
    {
 | 
						|
      u4name_piece( name_buf, sizeof(name_buf), report->report_file_name, 0, 1 );
 | 
						|
      u4name_ext( name_buf, sizeof(name_buf), "buf", 1 );
 | 
						|
    }
 | 
						|
    if( file4create( &report->page_buf.file_buf, report->code_base, name_buf, 1 ) < 0 )
 | 
						|
    {
 | 
						|
      e4describe( report->code_base, e4rep_out, E4_REP_PFILE, 0, 0 );
 | 
						|
      return -1;
 | 
						|
    }
 | 
						|
    report->code_base->safety = tsafety;
 | 
						|
    file4seq_write_init( &report->page_buf.seq_wr, &report->page_buf.file_buf, 0L,
 | 
						|
                        report->page_buf.fmem_buf, sizeof(report->page_buf.fmem_buf) );
 | 
						|
  }
 | 
						|
#endif
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
int S4FUNCTION report4pageFree( PREPORT4 report )
 | 
						|
{
 | 
						|
  char name_buf[512];
 | 
						|
 | 
						|
  if( !report )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( report->page_buf.object.info != NULL )
 | 
						|
  {
 | 
						|
    u4free( report->page_buf.object.info );
 | 
						|
    report->page_buf.object.info = NULL;
 | 
						|
    report->page_buf.object.info_len = 0;
 | 
						|
  }
 | 
						|
 | 
						|
  if( report->page_buf.mem_buf != NULL )
 | 
						|
  {
 | 
						|
    u4free( report->page_buf.mem_buf );
 | 
						|
    report->page_buf.mem_buf = NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  if( report->page_buf.file_buf.name != NULL )
 | 
						|
  {
 | 
						|
    strcpy( name_buf, report->page_buf.file_buf.name );
 | 
						|
    file4close( &report->page_buf.file_buf );
 | 
						|
    u4remove( name_buf );
 | 
						|
  }
 | 
						|
 | 
						|
  report->page_buf.info_buf_len = 0;
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
POBJECT4 S4FUNCTION report4pageObjNext( PREPORT4 report )
 | 
						|
{
 | 
						|
  long obj_size;
 | 
						|
  POBJECT4 object;
 | 
						|
  FILE4SEQ_READ *file_buf;
 | 
						|
 | 
						|
  if( !report )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  if( report->page_buf.file_buf.name == NULL )
 | 
						|
  {
 | 
						|
    e4describe( report->code_base, e4rep_out, E4_REP_NOBUFPAGE, (char *)0, (char *)0 );
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  if( !report->page_buf.first_read )
 | 
						|
    file4seq_read_init( &report->page_buf.seq_rd, &report->page_buf.file_buf,
 | 
						|
                       0L, report->page_buf.rmem_buf,
 | 
						|
                       sizeof(report->page_buf.rmem_buf) );
 | 
						|
 | 
						|
  file_buf = &report->page_buf.seq_rd;
 | 
						|
 | 
						|
  object = &report->page_buf.object;
 | 
						|
 | 
						|
  if( (file4seq_read( file_buf, &object->objtype, sizeof( object->objtype) )) == 0 )
 | 
						|
    return NULL;
 | 
						|
 | 
						|
  file4seq_read( file_buf, &obj_size, sizeof(obj_size) );
 | 
						|
  file4seq_read( file_buf, &object->x, sizeof(object->x) );
 | 
						|
  file4seq_read( file_buf, &object->y, sizeof(object->y) );
 | 
						|
  file4seq_read( file_buf, &object->w, sizeof(object->w) );
 | 
						|
  file4seq_read( file_buf, &object->h, sizeof(object->h) );
 | 
						|
 | 
						|
  file4seq_read( file_buf, &object->alignment, sizeof(object->alignment) );
 | 
						|
 | 
						|
  file4seq_read( file_buf, &object->style_index, sizeof(object->style_index) );
 | 
						|
 | 
						|
  file4seq_read( file_buf, &object->info_len, sizeof(object->info_len) );
 | 
						|
 | 
						|
  if( report->page_buf.info_buf_len < object->info_len )
 | 
						|
  {
 | 
						|
    if( object->info != NULL )
 | 
						|
    {
 | 
						|
      u4free( object->info );
 | 
						|
      object->info = NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    object->info = (char *)u4alloc_free( report->code_base, object->info_len+1 );
 | 
						|
    if( !object->info )
 | 
						|
    {
 | 
						|
      e4describe( report->code_base, e4rep_out, E4_REP_OBJDATAAL, (char *)0, (char *)0 );
 | 
						|
      return NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    memset( object->info, 0, (int)report->page_buf.info_buf_len );
 | 
						|
    report->page_buf.info_buf_len = object->info_len + 1;
 | 
						|
    if( object->info_len > 0 )
 | 
						|
      file4seq_read( file_buf, object->info, (unsigned)object->info_len );
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    memset( object->info, 0, (int)report->page_buf.info_buf_len );
 | 
						|
    if( object->info_len > 0 )
 | 
						|
      file4seq_read( file_buf, object->info, (unsigned)object->info_len );
 | 
						|
  }
 | 
						|
 | 
						|
  return object;
 | 
						|
}
 | 
						|
 | 
						|
POBJECT4 S4FUNCTION report4pageObjFirst( PREPORT4 report )
 | 
						|
{
 | 
						|
  if( !report )
 | 
						|
  {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  if( report->page_buf.file_buf.name == NULL )
 | 
						|
  {
 | 
						|
    e4describe( report->code_base, e4rep_out, E4_REP_NOBUFPAGE, (char *)0, (char *)0 );
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  file4seq_read_init( &report->page_buf.seq_rd, &report->page_buf.file_buf,
 | 
						|
                     0L, report->page_buf.rmem_buf,
 | 
						|
                     sizeof(report->page_buf.rmem_buf) );
 | 
						|
 | 
						|
  report->page_buf.first_read = 1;
 | 
						|
  return report4pageObjNext( report );
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
#ifndef S4WINDOWS
 | 
						|
void r4place_text( OBJECT4 *object, char *buffer, int lw, char *sbuffer )
 | 
						|
{
 | 
						|
  int ox, oy, oh, ow, lc;
 | 
						|
  int offset, length;
 | 
						|
  char *pbuf, *line, *sbuf, *bpt;
 | 
						|
 | 
						|
  ox = (int)(((float)object->x/100.0)+0.5);
 | 
						|
  oy = (int)(((float)object->y/1000.0)*6.0+0.5);
 | 
						|
  oh = (int)(((float)object->h/1000.0)*6.0+0.5);
 | 
						|
  ow = (int)(((float)object->w/100.0)+0.5);
 | 
						|
 | 
						|
  pbuf = (buffer + ox + oy * lw );
 | 
						|
  if( sbuffer )
 | 
						|
    sbuf = (sbuffer + ox + oy * lw );
 | 
						|
 | 
						|
  if( oh == 1 )
 | 
						|
  {
 | 
						|
    if( ow >= object->info_len && ox + ow <= lw )
 | 
						|
    {
 | 
						|
      offset = 0;
 | 
						|
      if( object->alignment == justify4right )
 | 
						|
        offset = ow - (int)object->info_len;
 | 
						|
 | 
						|
      if( object->alignment == justify4center )
 | 
						|
        offset = (ow - (int)object->info_len)/2;
 | 
						|
 | 
						|
 | 
						|
      memcpy( pbuf + offset, object->info, (int)object->info_len );
 | 
						|
      if( sbuffer )
 | 
						|
        memset( sbuf + offset, object->style_index, (int)object->info_len );
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
      if( ox + ow <= lw )
 | 
						|
        length = ow;
 | 
						|
      else
 | 
						|
        length = lw - ox;
 | 
						|
      memcpy( pbuf, object->info, length );
 | 
						|
      if( sbuffer )
 | 
						|
        memset( sbuf, object->style_index, length );
 | 
						|
    }
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    lc = length = 0;
 | 
						|
    if( ox + ow <= lw )
 | 
						|
      length = ow;
 | 
						|
    else
 | 
						|
      length = lw - ox;
 | 
						|
 | 
						|
    line = strtok( (char *)object->info, "\r\n" );
 | 
						|
    while( line && lc < oh )
 | 
						|
    {
 | 
						|
      if( strlen(line) > (unsigned)length )
 | 
						|
      {
 | 
						|
        while( strlen(line) > (unsigned)length && lc < oh )
 | 
						|
        {
 | 
						|
          bpt = line + length;
 | 
						|
          while( bpt != line && *bpt != ' ' )
 | 
						|
            bpt--;
 | 
						|
 | 
						|
          if( bpt == line )
 | 
						|
            bpt = line + length;
 | 
						|
 | 
						|
          memcpy( pbuf, line, (bpt-line) );
 | 
						|
          if( sbuffer )
 | 
						|
          {
 | 
						|
            memset( sbuf, object->style_index, (bpt-line) );
 | 
						|
            sbuf += lw;
 | 
						|
          }
 | 
						|
          lc++;
 | 
						|
          line += (bpt-line);
 | 
						|
          if( *line == ' ' )
 | 
						|
            line++;
 | 
						|
          pbuf += lw;
 | 
						|
        }
 | 
						|
        memcpy( pbuf, line, strlen(line) );
 | 
						|
        if( sbuffer )
 | 
						|
        {
 | 
						|
          memset( sbuf, object->style_index, strlen(line) );
 | 
						|
          sbuf += lw;
 | 
						|
        }
 | 
						|
        pbuf += lw;
 | 
						|
        lc++;
 | 
						|
 | 
						|
      }
 | 
						|
      else
 | 
						|
      {
 | 
						|
        offset = 0;
 | 
						|
        if( object->alignment == justify4right )
 | 
						|
          offset = length - strlen(line);
 | 
						|
        if( object->alignment == justify4center )
 | 
						|
          offset = (length - strlen(line))/2;
 | 
						|
 | 
						|
        memcpy( pbuf + offset, line, strlen(line) );
 | 
						|
        if( sbuffer )
 | 
						|
        {
 | 
						|
          memset( sbuf + offset, object->style_index, strlen(line) );
 | 
						|
          sbuf += lw;
 | 
						|
        }
 | 
						|
        lc++;
 | 
						|
        pbuf += lw;
 | 
						|
      }
 | 
						|
      line = strtok( NULL, "\r\n" );
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
int report4output_general_dos( PREPORT4 report )
 | 
						|
{
 | 
						|
  OBJECT4 *object;
 | 
						|
  char    *page_buf=NULL, *style_buf=NULL;
 | 
						|
  int     ph, pw, old_style, new_style, offset;
 | 
						|
  long    lpw, lph, i, j;
 | 
						|
  PSTYLE4 style;
 | 
						|
 | 
						|
  report4pageSizeGet( report, &lpw, &lph );
 | 
						|
  pw = (int)(((float)lpw/100.0)+0.5);
 | 
						|
  ph = (int)(((float)lph/1000.0)*6.0+0.5);
 | 
						|
 | 
						|
  page_buf = (char *)u4alloc_free( report->code_base, (pw*ph) );
 | 
						|
  if( !page_buf )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if( report->use_styles )
 | 
						|
  {
 | 
						|
    style_buf = (char *)u4alloc_free( report->code_base, (pw*ph) );
 | 
						|
    if( !style_buf )
 | 
						|
      return -1;
 | 
						|
    memset( style_buf, 0, (pw*ph) );
 | 
						|
  }
 | 
						|
  memset( page_buf, ' ', (pw*ph) );
 | 
						|
 | 
						|
  object = report4pageObjFirst( report );
 | 
						|
 | 
						|
  while( object )
 | 
						|
  {
 | 
						|
    switch( object->objtype )
 | 
						|
    {
 | 
						|
    case obj4type_field:
 | 
						|
    case obj4type_expr:
 | 
						|
    case obj4type_total:
 | 
						|
    case obj4type_calc:
 | 
						|
    case obj4type_text:
 | 
						|
      if( report->use_styles )
 | 
						|
        r4place_text( object, page_buf, pw, style_buf );
 | 
						|
      else
 | 
						|
        r4place_text( object, page_buf, pw, NULL );
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    object = report4pageObjNext( report );
 | 
						|
  }
 | 
						|
 | 
						|
  style = NULL;
 | 
						|
  old_style = 0;
 | 
						|
  for( i = 0; i < ph; i++ )
 | 
						|
  {
 | 
						|
    for( j = 0; j < pw; j++ )
 | 
						|
    {
 | 
						|
      if( report->use_styles )
 | 
						|
      {
 | 
						|
        offset = (int)(i*pw + j);
 | 
						|
#ifdef S4UNIX
 | 
						|
        memcpy( &new_style, style_buf+offset, sizeof(new_style) ) ;
 | 
						|
#else
 | 
						|
        new_style = (int)(*(style_buf+offset));
 | 
						|
#endif
 | 
						|
        if( new_style != old_style )
 | 
						|
        {
 | 
						|
          if( style )
 | 
						|
            write( report->output_handle, style->codes_after, style->codes_after_len );
 | 
						|
          style = style4index( report, new_style );
 | 
						|
          if( style )
 | 
						|
            write( report->output_handle, style->codes_before, style->codes_before_len );
 | 
						|
          old_style = new_style;
 | 
						|
        }
 | 
						|
      }
 | 
						|
      write( report->output_handle, page_buf + (i*pw) + j, 1 );
 | 
						|
    }
 | 
						|
    if( i < ph - 1 )
 | 
						|
      write( report->output_handle, "\r\n", 2 );
 | 
						|
  }
 | 
						|
  if( style )
 | 
						|
    write( report->output_handle, style->codes_after, style->codes_after_len );
 | 
						|
  write( report->output_handle, "\f", 1 );
 | 
						|
 | 
						|
  if( page_buf ) u4free( page_buf );
 | 
						|
  if( style_buf ) u4free( style_buf );
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
int report4output_screen_dos( PREPORT4 report )
 | 
						|
{
 | 
						|
  OBJECT4 *object;
 | 
						|
  char    *page_buf=NULL;
 | 
						|
  int     i, ph, pw;
 | 
						|
 | 
						|
 | 
						|
  pw = (int)(((float)report->dev_page_width/100.0)+0.5);
 | 
						|
  ph = (int)(((float)report->dev_page_height/1000.0)*6.0+0.5);
 | 
						|
 | 
						|
  page_buf = (char *)u4alloc_free( report->code_base, (pw*ph) );
 | 
						|
  if( !page_buf )
 | 
						|
  {
 | 
						|
    return -1;
 | 
						|
  }
 | 
						|
 | 
						|
  memset( page_buf, ' ', (pw*ph) );
 | 
						|
 | 
						|
  object = report4pageObjFirst( report );
 | 
						|
 | 
						|
  while( object )
 | 
						|
  {
 | 
						|
    switch( object->objtype )
 | 
						|
    {
 | 
						|
    case obj4type_field:
 | 
						|
    case obj4type_expr:
 | 
						|
    case obj4type_total:
 | 
						|
    case obj4type_calc:
 | 
						|
    case obj4type_text:
 | 
						|
      r4place_text( object, page_buf, pw, NULL );
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    object = report4pageObjNext( report );
 | 
						|
  }
 | 
						|
  for( i = 0; i < ph; i++ )
 | 
						|
  {
 | 
						|
    write( 1, page_buf+(i*pw), pw-1 );
 | 
						|
    if( i < ph-1 )
 | 
						|
      write( 1, "\r\n", 2 );
 | 
						|
  }
 | 
						|
 | 
						|
#ifdef S4UNIX
 | 
						|
  if( getchar() == 0x1b )
 | 
						|
#else
 | 
						|
#ifndef S4PASCAL_DOS
 | 
						|
    if( getch() == 0x1b )
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
      return -1;
 | 
						|
 | 
						|
  write( 1, "\r\n", 2 );
 | 
						|
  if( page_buf ) u4free( page_buf );
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
int S4FUNCTION report4do( REPORT4 *report )
 | 
						|
{
 | 
						|
  int rc;
 | 
						|
 | 
						|
  if( report4pageInit( report ) < 0 )
 | 
						|
    return -1;
 | 
						|
 | 
						|
  while( (rc = report4generatePage( report )) >= 0 )
 | 
						|
  {
 | 
						|
    if( rc == 2 )
 | 
						|
      break;
 | 
						|
 | 
						|
    if( report->output_handle == 1 )
 | 
						|
    {
 | 
						|
      if( report4output_screen_dos( report ) < 0 )
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    else
 | 
						|
      if( report->output_handle > 1 )
 | 
						|
      {
 | 
						|
        if( report4output_general_dos( report ) < 0 )
 | 
						|
          break;
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
  report4pageFree( report );
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
 |