home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9202 / borhot / dostime.c < prev    next >
C/C++ Source or Header  |  1991-11-28  |  3KB  |  89 lines

  1. /* ------------------------------------------------------ */
  2. /*                    DOSTIME.C                           */
  3. /*              A time conversion Routine                 */
  4. /*            (c) 1990 Borland International              */
  5. /*                 All rights reserved.                   */
  6. /* ------------------------------------------------------ */
  7. /*  veröffentlicht in: DOS toolbox 1'91/92                */
  8. /* ------------------------------------------------------ */
  9.  
  10. /*
  11.   The following code demonstrates a interesting technique
  12.   for converting the DOS date/time stamp as provided by an
  13.   'ffblk' structure to ASCIIZ. This code compiles with
  14.   ANSI C or C++ compiler. Read the comments carefully since
  15.   they provide insight into the method used.
  16. */
  17.  
  18. #include <dir.h>     // for ffblk and findfirst()
  19. #include <stdio.h>   // for sprintf()
  20.  
  21. struct ffblk xffblk;
  22.  
  23. #pragma warn -par    // we know that argc is never used!
  24.  
  25. // ------------------------------------------------------ *
  26. int main(int argc, char **argv)
  27. {
  28.   char times[9],
  29.        dates[9];
  30.  
  31.   /*
  32.      Create a 'fdate' structure of bit fields and a 'd'
  33.      pointer instance of this structure that maps the bit
  34.      fields over the date member of the 'xffblk' instance
  35.      of the 'ffblk' structure provided by DOS.H. Kind'a
  36.      like a post facto union. This permits us to refer to
  37.      the day, month and year bits of the DOS FCB by name.
  38.   */
  39.   typedef struct fdate {
  40.     unsigned day   : 5;  // 5 bits to represent the day
  41.     unsigned month : 4;  // 4 bits for the month
  42.     unsigned year  : 7;  // 7 bits for the years since 1980
  43.   } fdate;
  44.  
  45.   // Make an instance that overlays 'xxfblk.ff_fdate'
  46.   fdate *d = (fdate*) &(xffblk.ff_fdate);
  47.  
  48.   /* In a C++ program this could be simplified into:
  49.   struct fdate {
  50.     unsigned day   : 5;
  51.     unsigned month : 4;
  52.     unsigned year  : 7;
  53.   } *d = (fdate*) &(xffblk.ff_date);
  54.  
  55.     by observing that structures are always types and
  56.     the structures tag (i.e., 'fdate') is available as
  57.     soon as it is declared.
  58.   */
  59.  
  60.   // Ditto for the seconds, minutes and hour bits of
  61.   // the time member.
  62.  
  63.   typedef struct ftime {
  64.     unsigned sec   : 5;   // 5 bits for the seconds
  65.     unsigned min   : 6;   // 6 bits for the minutes
  66.     unsigned hour  : 5;   // 5 bits for the hours
  67.   } ftime;
  68.  
  69.   // make an instance that overlays 'xxfblk.ff_ftime'
  70.   ftime *t = (ftime*) &(xffblk.ff_ftime);
  71.  
  72.   /*
  73.     Load 'xffblk' with info about this program
  74.     (executing program is always contained in first
  75.     argv array ASCIIZ string).
  76.   */
  77.   findfirst(*argv, &xffblk, 0xFF);
  78.  
  79.   // Format time and date using named bit fields & print.
  80.   sprintf(times, "%02u:%02u:%02u", t->hour, t->min, t->sec);
  81.   sprintf(dates, "%02u-%02u-%02u", d->month, d->day,
  82.                                    d->year+80);
  83.   printf("%s created:  %s %s\n", *argv, dates, times);
  84.   return 0;
  85. } // end of main()
  86. /* ------------------------------------------------------ */
  87. /*                 Ende von DOSTIME.C                     */
  88.  
  89.