home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 387b.lha / dice_v2.02 / lib / time / strftime.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-05-30  |  3.6 KB  |  146 lines

  1.  
  2. /*
  3.  *  STRFTIME.C
  4.  */
  5.  
  6. #include <time.h>
  7. #include <string.h>
  8.  
  9. static char *AbMonth[12] = { "Jan","Feb","Mar","Apr","May","Jun","Jul",
  10.                  "Aug","Sep","Oct","Nov","Dec"
  11.                 };
  12.  
  13. static char *FuMonth[12] = { "January", "February", "March", "April", "May",
  14.                  "June", "July", "August", "September", "October",
  15.                  "November", "December"
  16.                 };
  17.  
  18. static char *AbDow[12] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
  19.  
  20. static char *FuDow[12] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
  21.                "Friday", "Saturday"
  22.             };
  23.  
  24.  
  25. size_t
  26. strftime(buf, max, fmt, tm)
  27. char *buf;
  28. size_t max;
  29. const char *fmt;
  30. const struct tm *tm;
  31. {
  32.     short i = 0;
  33.  
  34.     buf[i] = 0;
  35.  
  36.     while (*fmt) {
  37.     char *ptr;
  38.  
  39.     i += strlen(buf + i);
  40.  
  41.     if (*fmt != '%') {
  42.         buf[i++] = *fmt++;
  43.         continue;
  44.     }
  45.     ptr = buf + i;
  46.     fmt += 2;
  47.     switch(fmt[-1]) {
  48.     case '%':
  49.         strcpy(ptr, "%");
  50.         break;
  51.     case 'a':   /*  abbreviated name for dow    */
  52.         strcpy(ptr, AbDow[tm->tm_wday]);
  53.         break;
  54.     case 'A':   /*  full name for dow           */
  55.         strcpy(ptr, FuDow[tm->tm_wday]);
  56.         break;
  57.     case 'b':   /*  abbreviated name for month  */
  58.         strcpy(ptr, AbMonth[tm->tm_mon]);
  59.         break;
  60.     case 'B':   /*  full name for month         */
  61.         strcpy(ptr, FuMonth[tm->tm_mon]);
  62.         break;
  63.     case 'c':   /*  default rep for date & time */
  64.         sprintf(ptr, "%s %s %02d %02d:%02d:%02d %d",
  65.         AbDow[tm->tm_wday], AbMonth[tm->tm_mon], tm->tm_mday,
  66.         tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_year + 1900
  67.         );
  68.         break;
  69.     case 'd':   /*  day of month as integer 01-31   */
  70.         sprintf(ptr, "%02d", tm->tm_mday);
  71.         break;
  72.     case 'H':   /*  hour as integer 00-23       */
  73.         sprintf(ptr, "%02d", tm->tm_hour);
  74.         break;
  75.     case 'I':   /*  hour as integer 01-12       */
  76.         sprintf(ptr, "%02d", (tm->tm_hour % 12) + 1);
  77.         break;
  78.     case 'j':   /*  day of year as int 001-366  */
  79.         sprintf(ptr, "%03d", tm->tm_yday);
  80.         break;
  81.     case 'm':   /*  month as integer 01-12      */
  82.         sprintf(ptr, "%02d", tm->tm_mon);
  83.         break;
  84.     case 'M':   /*  minute as integer 00-59     */
  85.         sprintf(ptr, "%02d", tm->tm_min);
  86.         break;
  87.     case 'p':   /*  'AM' or 'PM'                */
  88.         if (tm->tm_hour >= 12) {
  89.         strcpy(ptr, "PM");
  90.         } else {
  91.         strcpy(ptr, "AM");
  92.         }
  93.         break;
  94.     case 'S':   /*  the second as an int 00-59  */
  95.         sprintf(ptr, "%02d", tm->tm_sec);
  96.         break;
  97.     case 'U':   /*  week of year as int 00-53, regard sunday as first day in week   */
  98.         {
  99.         int bdiw = tm->tm_yday - tm->tm_wday;    /* beginning of week */
  100.         if (bdiw < 0)
  101.             bdiw = 0;
  102.         else
  103.             bdiw = bdiw / 7;
  104.         sprintf(ptr, "%02d", bdiw);
  105.         }
  106.         break;
  107.     case 'w':   /*  day of week as int 0-6, sunday == 0 */
  108.         sprintf(ptr, "%d", tm->tm_wday);
  109.         break;
  110.     case 'W':   /*  day of week as int 0-6, monday == 0 */
  111.         {
  112.         int dowmon = tm->tm_wday - 1;
  113.         if (dowmon < 0)
  114.             dowmon += 7;
  115.         sprintf(ptr, "%d", dowmon);
  116.         }
  117.         break;
  118.     case 'x':   /*  the locale's default rep for date   */
  119.         sprintf(ptr, "%s %s %02d",
  120.         AbDow[tm->tm_wday], AbMonth[tm->tm_mon], tm->tm_mday
  121.         );
  122.         break;
  123.     case 'X':   /*  the locale's default rep for time   */
  124.         sprintf(ptr, "%02d:%02d:%02d",
  125.         tm->tm_hour, tm->tm_min, tm->tm_sec
  126.         );
  127.         break;
  128.     case 'y':   /*  year within the century 00-99       */
  129.         sprintf(ptr, "%02d", tm->tm_year % 100);
  130.         break;
  131.     case 'Y':   /*  the full year, including century    */
  132.         sprintf(ptr, "%04d", tm->tm_year + 1900);
  133.         break;
  134.     case 'Z':   /*  the name of the time zone or ""     */
  135.         strcpy(ptr, "");
  136.         break;
  137.     default:
  138.         strcpy(ptr, "%?");
  139.         break;
  140.     }
  141.     }
  142.     i += strlen(buf + i);
  143.     return(i);
  144. }
  145.  
  146.