home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / borland / jnfb88.arc / READRX.ARC / CUSTLIST.C < prev    next >
Text File  |  1987-09-24  |  4KB  |  99 lines

  1. /* custlist.c: reports name and total sales from custlist.rxd */
  2. /* Written for small model of Turbo C by K. Porter */
  3.  
  4. /* INCLUDE FILES */
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <dir.h>
  8. #include <reflex.h>       /* Separate Reflex structure definitions */
  9.  
  10. /* DEFINE CONSTANTS */
  11. #define  outdev    "PRN"                   /* report output device */
  12. #define  dbname    "CUSTLIST.RXD"        /* Reflex file to process */
  13. #define  EJECT     12                        /* printer page eject */
  14.  
  15. /* LOCAL FUNCTION PROTOTYPE */
  16. void   report ( void );
  17.  
  18. /* GLOBAL INPUT FILE */
  19. FILE           *db;
  20.  
  21. main ()
  22. {
  23. long           fpos;                              /* file position */
  24. unsigned       d;                                 /* misc variable */
  25.  
  26. /* OPEN FILES */
  27.   d = 0;
  28.   lst = fopen ( outdev, "w" );                      /* open output */
  29.   cputs ( "\nGenerating sales report from Reflex data base:\n" );
  30.   db = fopen ( dbname, "r" );
  31.   if ( db != NULL ) {
  32.     setvbuf ( db, NULL, _IONBF, 0 );       /* make file unbuffered */
  33.            /* ---- verify that file is open and a Reflex data base */
  34.     fseek ( db, 88L, SEEK_SET );  /* point to size of control info */
  35.     fread ( &fpos, sizeof (long), 1, db );               /* get it */
  36.     fseek ( db, 0L, SEEK_SET );                /* repoint to start */
  37.                               /* ---- put control info on the heap */
  38.     base = (unsigned) malloc ((unsigned) fpos);   /* allocate node */
  39.     head = (DFHDR*) base;                    /* set header pointer */
  40.     d = fread (((char*)(base)), sizeof (char), ((int)(fpos)), db);
  41.   }
  42.   if ( db == NULL || d == 0 ) {                   /* error handler */
  43.     printf ( "Error accessing file %s\n", dbname );
  44.     printf ( "File is %s open, items read = %u\n",
  45.         (db==NULL ? "not" : ""), d);
  46.     exit (1);
  47.   } else
  48.     if ( strcmp ( head->stamp, RXID ) != 0 ) {
  49.       printf ( "\n\nFile %s is not a Reflex data base\n", dbname );
  50.       exit (1);                        /* exit with condition code */
  51.     }
  52.  
  53. /* INITIALIZE POINTERS TO CONTROL INFO */
  54. #include <inptrrxd.i>
  55.  
  56. /* PRODUCE REPORT BY READING DATA BASE */
  57.   report ();
  58.  
  59. /* END OF JOB */
  60.   putc ( EJECT, lst );                               /* eject page */
  61.   close ( lst );                                  /* close printer */
  62.   free ( head );                          /* deallocate heap space */
  63. } /* ---------------- End of main() ------------------------------ */
  64.  
  65. void  report (void)                             /* generate report */
  66. {
  67. long     fptr, text;          /* file pointers: main and text pool */
  68. double   sales;                               /* total sales field */
  69. unsigned recs;                       /* loop counter for # records */
  70. int      reclen, tofs, n;            /* record length, text offset */
  71. char     ch, name[80];        /* character, string for text output */
  72.  
  73.   fputs ( "     SALES REPORT FROM CUSTLIST.RXD:\n", lst );
  74.   fptr = (descr+2)->dfAddr + 2;           /* start of first record */
  75.   for ( recs = 0; recs < mast->totalRecs; recs++ ) {
  76.     fseek ( db, fptr, SEEK_SET );          /* point to next record */
  77.     fread ( &reclen, sizeof(int), 1, db );           /* get length */
  78.     fptr += 2;                       /* advance to start of header */
  79.     fseek ( db, (fptr + 8), SEEK_SET );      /* skip to name field */
  80.     fread ( &tofs, sizeof(int), 1, db );        /* get text offset */
  81.     if ( tofs < 2 )
  82.       fprintf ( "\n     %s", (tofs) ? "ERROR" : "NULL");
  83.     else {
  84.       text = fptr + tofs;                  /* point to name string */
  85.       fseek ( db, text, SEEK_SET );                    /* go to it */
  86.       n = 0;
  87.       do {
  88.         fread ( &ch, sizeof(char), 1, db );       /* get next char */
  89.         name[n++] = ch;
  90.       } while ( ch );                           /* until null char */
  91.       fprintf ( lst, "\n     %-30s", name );         /* print name */
  92.       fseek ( db, (fptr + 18), SEEK_SET );        /* skip to sales */
  93.       fread ( &sales, sizeof(double), 1, db );         /* get data */
  94.       fprintf ( lst, "    %12.2fl", sales );           /* print it */
  95.     }
  96.     fptr += reclen;                      /* advance to next record */
  97.   }
  98. }
  99.