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

  1. /* showrxd.c: Displays fixed information about Reflex data bases */
  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"                          /* output device */
  12. #define  EJECT     12                        /* printer page eject */
  13.  
  14. /* LOCAL FUNCTION PROTOTYPES */
  15. void     showMast (char name[], MASTREC *mast);
  16. void     showHead (DFHDR *head);
  17. void     showSort (SORTSPEC *srt);
  18. void     showName (unsigned offset);
  19. void     showField (unsigned nf, FLDDESC *fld);
  20.  
  21. main ()
  22. {
  23. char           fname[MAXPATH],                         /* filename */
  24.                drive[MAXDRIVE], dir[MAXDIR],         /* components */
  25.                name[MAXFILE], ext[MAXEXT];
  26. long           fpos;                              /* file position */
  27. unsigned       d;                                 /* misc variable */
  28. FILE           *db;                               /* database file */
  29.  
  30.  
  31.  
  32. /* OPEN FILES */
  33.   d = 0;
  34.   lst = fopen ( OUTDEV, "w" );                      /* open output */
  35.   cputs ( "\nName of Reflex data base? " );
  36.   gets ( fname );                                  /* get filename */
  37.   fnsplit ( fname, drive, dir, name, ext );      /* split filename */
  38.   if ( !strlen ( ext ))
  39.      strcpy ( ext, ".RXD" );    /* if no extension, make it ".RXD" */
  40.   fnmerge ( fname, drive, dir, name, ext );      /* and reassemble */
  41.   db = fopen ( fname, "r" );
  42.   if ( db != NULL ) {
  43.     setvbuf ( db, NULL, _IONBF, 0 );       /* make file unbuffered */
  44.            /* ---- verify that file is open and a Reflex data base */
  45.     fseek ( db, 88L, SEEK_SET );  /* point to size of control info */
  46.     fread ( &fpos, sizeof (long), 1, db );               /* get it */
  47.     fseek ( db, 0L, SEEK_SET );                /* repoint to start */
  48.                               /* ---- put control info on the heap */
  49.     base = (unsigned) malloc ((unsigned) fpos);   /* allocate node */
  50.     head = (DFHDR*) base;                    /* set header pointer */
  51.     d = fread (((char*)(base)), sizeof (char), ((int)(fpos)), db);
  52.   }
  53.   if ( db == NULL || d == 0 ) {                   /* error handler */
  54.     printf ( "Error accessing file %s\n", fname );
  55.     printf ( "File is %s open, items read = %u\n",
  56.         (db==NULL ? "not" : ""), d);
  57.     exit (1);
  58.   } else
  59.     if ( strcmp ( head->stamp, RXID ) != 0 ) {
  60.       printf ( "\n\nFile %s is not a Reflex data base\n", fname );
  61.       exit (1);                        /* exit with condition code */
  62.     }
  63.  
  64. /* INITIALIZE POINTERS TO CONTROL INFO */
  65. #include <inptrrxd.i>
  66.  
  67. /* SHOW INFORMATION ABOUT DATA BASE */
  68.   showMast (fname, mast);                    /* show master record */
  69.   showHead (head);                           /* list header record */
  70.   showSort (sort);                       /* show global sort specs */
  71.   showField (nflds, dtable);             /* show field descriptors */
  72.  
  73. /* END OF JOB */
  74.   putc ( EJECT, lst );                               /* eject page */
  75.   close ( lst );                                  /* close printer */
  76.   free ( head );                          /* deallocate heap space */
  77. } /* ---------------- End of main() ------------------------------ */
  78.  
  79. void  showMast (char name[], MASTREC *mast)  /* show master record */
  80. {
  81.   fprintf ( lst, "Control information for Reflex data base %s:\n",
  82.       name );
  83.   fprintf ( lst, "  Total records      %d\n",
  84.       mast->totalRecs );
  85.   fprintf ( lst, "  Filtered records   %d\n",
  86.       mast->filtRecs );
  87.   fprintf ( lst, "  Number of fields   %d\n", nflds );
  88. } /* ------------------------ */
  89.  
  90. void  showHead (DFHDR *head)                 /* list header record */
  91. {
  92.   fputs ( "\nHeader record contents:\n", lst );
  93.   fprintf ( lst, "  Size of header          %d\n", head->hdrSz );
  94.   fprintf ( lst, "  Reflex identifier       %s\n", head->stamp );
  95.   fprintf ( lst, "  Corruption indicator    %s\n",
  96.       (head->dirty) ? "Corrupt" : "Clean" );
  97.   fprintf ( lst, "  View version level      %d\n", head->verViews );
  98.   fprintf ( lst, "  Modeling version level  %d\n", head->verModels );
  99.   fprintf ( lst, "  Raw data version level  %d\n", head->verData );
  100.   fprintf ( lst, "  Recalc necessary        %s\n",
  101.       (head->fRecalc) ? "Yes" : "No" );
  102.   fputs ( "  Screen type             ", lst );
  103.   switch ( head->screenType ) {
  104.     case 0: fputs ( "IBM CGA", lst ); break;
  105.     case 1: fputs ( "Hercules", lst ); break;
  106.     case 2: fputs ( "IBM 3270 PC APA", lst ); break;
  107.     case 3: fputs ( "IBM EGA", lst ); break;
  108.     case 4: fputs ( "IBM PGC", lst ); break;
  109.     case 5: fputs ( "AT&T 6300 Series", lst ); break;
  110.     case 6: fputs ( "Sigma 400", lst ); break;
  111.     case 7: fputs ( "STB SuperRes 400", lst ); break;
  112.     default: fputs( "(Unknown)", lst );
  113.   }
  114.   putc ( '\n', lst );
  115.   fprintf ( lst, "  File checksum           %X\n", head->checkSum );
  116.   fputs ( "  Reserved field          (38 unused bytes)\n", lst );
  117.   fprintf ( lst, "  Section descriptors     %d\n", head->sectionCt );
  118. } /* ------------------------ */
  119.  
  120. void  showSort (SORTSPEC *srt)           /* show global sort specs */
  121. {
  122. unsigned  n, p;
  123. FLDSORTSPEC  *spec;
  124. FLDDESC      *fld;
  125.  
  126.   fputs ( "\nGlobal sort specifications by precedence:\n", lst );
  127.   for ( n = 0; n < 6; n++ ) {
  128.     spec = srt + n;                     /* point to next sort spec */
  129.     if ( spec->fldType == 0x7F && spec->isAscending ) {
  130.       if ( spec == srt )
  131.         fputs ( "  (None)\n", lst );
  132.       break;                          /* quit on terminator (0xFF) */
  133.     } else
  134.         if ( spec->fieldID <= nflds ) {              /* show order */
  135.           fprintf ( lst, "  %s  Field ", (spec->isAscending)
  136.               ? "Ascending: " : "Descending:" );
  137.  
  138.                     /* Note: We have to follow a chain of references
  139.                        to find the field name. spec->fieldID gives
  140.                        the field descriptor record #, whose first
  141.                        field is an offset into the fieldname pool,
  142.                        from which we can print the name */
  143.  
  144.           fld = dtable + spec->fieldID;    /* point to field descr */
  145.           p = fld->nameOffset;          /* get name offset in pool */
  146.           showName ( p );                              /* print it */
  147.         }
  148.   }
  149. } /* ------------------------ */
  150.  
  151. void  showName (unsigned offset)   /* print pool field name to lst */
  152. {
  153. char   *name;
  154.  
  155.   name = (char *) pool + offset;         /* node address of string */
  156.   fputs ( name, lst );
  157.   putc ( '\n', lst );
  158. } /* ------------------------ */
  159.  
  160. void  showField (unsigned nf, FLDDESC *fld)
  161. {                                        /* list field descriptors */
  162. FLDDESC   *f;
  163. unsigned  n;
  164.  
  165.   fprintf ( lst, "\n%u Field Descriptors:", nf );
  166.   for ( n = 0; n < nf; n++ ) {     /* loop thru table for nf items */
  167.     f = fld + n;                       /* point to next descriptor */
  168.     fputs ( "\n  Field name:      ", lst );
  169.     showName ( f->nameOffset );                 /* list field name */
  170.     fputs ( "  Data type:       ", lst );
  171.     switch ( f->dataType ) {                     /* show data type */
  172.       case 0: fputs ( "Untyped\n", lst ); break;
  173.       case 1: fputs ( "Text\n", lst ); break;
  174.       case 2: fputs ( "Repeating text\n", lst ); break;
  175.       case 3: fputs ( "Date\n", lst );
  176.               fputs ( "  Format:          ", lst );
  177.               switch ( f->precision & 0x07 ) {      /* date format */
  178.                 case 0:
  179.                 case 1: fputs ( "MM/DD/YY\n", lst ); break;
  180.                 case 2: fputs ( "MM/YY\n", lst ); break;
  181.                 case 3: fputs ( "DD-Mon-YY\n", lst ); break;
  182.                 case 4: fputs ( "Mon-YY\n", lst ); break;
  183.                 case 5: fputs ( "Month DD, YYYY\n", lst );
  184.               }
  185.               break;
  186.       case 4: fputs ( "Numeric\n", lst );
  187.               fprintf ( lst, "  Precision        %d\n",
  188.                   (( f->precision & 0xF8 ) >> 3 ));
  189.               fputs ( "  Format           ", lst );
  190.               switch ( f->precision & 0x07 ) {   /* numeric format */
  191.                 case 0: fputs ( "General\n", lst ); break;
  192.                 case 1: fputs ( "Fixed (-XXX.YY)\n", lst ); break;
  193.                 case 2: fputs ( "Scientific (-X.YYe+ZZ)\n", lst );
  194.                         break;
  195.                 case 3: fputs ( "General\n", lst ); break;
  196.                 case 4: fputs ( "Currency ($X,XXX.YY)\n", lst );
  197.                         break;
  198.                 case 5: fputs ( "Financial (X,XXX.YY)\n", lst );
  199.               }
  200.               break;
  201.       case 5: fputs ( "Integer\n", lst ); break;
  202.     }
  203.     fprintf ( lst, "  Field offset     %u\n", f->fldOffset );
  204.   }
  205. } /* ------------------------ */