home *** CD-ROM | disk | FTP | other *** search
/ CD Shareware Magazine 1996 December / CD_shareware_12-96.iso / DOS / Programa / CCDL122.ZIP / CLIBS / TIME / STRFTIME.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-07  |  4.6 KB  |  190 lines

  1. #include <time.h> 
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5.  
  6. static char *_days[7] = { "Sun", "Mon","Tue","Wed","Thu","Fri","Sat" };
  7. static char *_months[12] = { "Jan", "Feb", "Mar","Apr","May","Jun",
  8.             "Jul","Aug","Sep","Oct","Nov","Dec" };
  9. static char *_ampm[2] = { "am", "pm" };
  10. static char *_ldays[7] = { "Sunday", "Monday","Tuesday","Wednesday","Thursday",
  11.         "Friday","Saturday" };
  12. static char *_lmonths[12] = { "January", "February", "March","April","May","June",
  13.         "July","August","September","October","November","December" };
  14.  
  15. static int pstr(char *str,char *astr, int maxsize, int *cursize)
  16. {
  17.     int l;
  18.     if (*cursize > maxsize)
  19.         return 1;
  20.     l = strlen(astr);
  21.     str += *cursize;
  22.     while (*cursize < maxsize-1 && l) {
  23.         *str++ = *astr++;
  24.         (*cursize)++;
  25.         l--;
  26.     }
  27.     *str = 0;
  28.     if (l)
  29.         return 1;
  30.     return 0;
  31. }
  32. static int pchar(char *str,char astr, int maxsize, int *cursize)
  33. {
  34.     if (*cursize > maxsize)
  35.         return 1;
  36.     str += *cursize;
  37.     *str++ = astr;
  38.     (*cursize)++;
  39.     *str = 0;
  40.     return 0;
  41. }
  42. static int pnum(char *str, int num, int fwidth, int maxsize, int *cursize)
  43. {
  44.     char buf[11],*p = &buf[9];
  45.     int i;
  46.     for (i=0; i < 10; i++)
  47.         buf[i] = '0';
  48.     buf[10] = 0;
  49.     while (num) {
  50.         *p-- = (char)(num %10)+'0';
  51.         num = (char)(num / 10);
  52.     }
  53.     return(pstr(str,buf+10-fwidth,maxsize,cursize));
  54. }
  55. size_t strftime(char *str, size_t maxsize, const char *format_string,
  56.                 const struct tm *t)
  57. {
  58.     int i,rv = 0;
  59.     for (i=0; i < strlen(format_string); i++) {
  60.         if (format_string[i] == '%') {
  61.             i++;
  62.             switch(format_string[i]) {
  63.                 case 'a':
  64.                     if (pstr(str,_days[t->tm_wday],maxsize,&rv))
  65.                         return 0;
  66.                     break;
  67.                 case 'A':
  68.                     if (pstr(str,_ldays[t->tm_wday],maxsize,&rv))
  69.                         return 0;
  70.                     break;
  71.                 case 'b':
  72.                     if (pstr(str,_months[t->tm_mon],maxsize,&rv))
  73.                         return 0;
  74.                     break;
  75.                 case 'B':
  76.                     if (pstr(str,_lmonths[t->tm_mon],maxsize,&rv))
  77.                         return 0;
  78.                     break;
  79.                 case 'c':
  80.                     if (pnum(str,t->tm_mday,2,maxsize,&rv))
  81.                         return 0;
  82.                     if (pstr(str," ",maxsize,&rv))
  83.                         return 0;
  84.                     if (pnum(str,t->tm_hour,2,maxsize,&rv))
  85.                         return 0;
  86.                     if (pstr(str,":",maxsize,&rv))
  87.                         return 0;
  88.                     if (pnum(str,t->tm_min,2,maxsize,&rv))
  89.                         return 0;
  90.                     if (pstr(str,":",maxsize,&rv))
  91.                         return 0;
  92.                     if (pnum(str,t->tm_sec,2,maxsize,&rv))
  93.                         return 0;
  94.                     if (pstr(str," ",maxsize,&rv))
  95.                         return 0;
  96.                     if (pnum(str,t->tm_year+1900,4,maxsize,&rv))
  97.                         return 0;
  98.                     break;
  99.                 case 'd':
  100.                     if (pnum(str,t->tm_mday,2,maxsize,&rv))
  101.                         return 0;
  102.                     break;
  103.                 case 'H':
  104.                     if (pnum(str,t->tm_hour,2,maxsize,&rv))
  105.                         return 0;
  106.                     break;
  107.                 case 'i':
  108.                     if (pnum(str,t->tm_hour%12+1,2,maxsize,&rv))
  109.                         return 0;
  110.                     break;
  111.                 case 'j':
  112.                     if (pnum(str,t->tm_yday,3,maxsize,&rv))
  113.                         return 0;
  114.                     break;
  115.                 case 'm':
  116.                     if (pnum(str,t->tm_mon,2,maxsize,&rv))
  117.                         return 0;
  118.                     break;
  119.                 case 'M':
  120.                     if (pnum(str,t->tm_min,2,maxsize,&rv))
  121.                         return 0;
  122.                     break;
  123.                 case 'P':
  124.                     if (pstr(str,_ampm[t->tm_hour/12],maxsize,&rv))
  125.                         return 0;
  126.                     break;
  127.                 case 'S':
  128.                     if (pnum(str,t->tm_sec,2,maxsize,&rv))
  129.                         return 0;
  130.                     break;
  131.                 case 'U':
  132.                     /* This should start with the first sunday */
  133.                     if (pnum(str,(t->tm_yday-1+(7-t->tm_wday))/7,2,maxsize,&rv))
  134.                         return 0;
  135.                     break;
  136.                 case 'w':
  137.                     if (pnum(str,t->tm_wday,1,maxsize,&rv))
  138.                         return 0;
  139.                     break;
  140.                 case 'W':
  141.                     /* This should start with the first monday */
  142.                     if (pnum(str,(t->tm_yday-1+(7-t->tm_wday))/7,2,maxsize,&rv))
  143.                         return 0;
  144.                     break;
  145.                 case 'x':
  146.                     if (pnum(str,t->tm_mday,2,maxsize,&rv))
  147.                         return 0;
  148.                     if (pstr(str," ",maxsize,&rv))
  149.                         return 0;
  150.                     if (pnum(str,t->tm_year+1900,4,maxsize,&rv))
  151.                         return 0;
  152.                     break;
  153.                 case 'X':
  154.                     if (pnum(str,t->tm_hour,2,maxsize,&rv))
  155.                         return 0;
  156.                     if (pstr(str,":",maxsize,&rv))
  157.                         return 0;
  158.                     if (pnum(str,t->tm_min,2,maxsize,&rv))
  159.                         return 0;
  160.                     if (pstr(str,":",maxsize,&rv))
  161.                         return 0;
  162.                     if (pnum(str,t->tm_sec,2,maxsize,&rv))
  163.                         return 0;
  164.                     break;
  165.                 case 'y':
  166.                     if (pnum(str,t->tm_year %100,2,maxsize,&rv))
  167.                         return 0;
  168.                     break;
  169.                 case 'Y':
  170.                     if (pnum(str,t->tm_year+1900,4,maxsize,&rv))
  171.                         return 0;
  172.                     break;
  173.                 case 'z':
  174.                     if (pstr(str,TZNAME,maxsize,&rv))
  175.                         return 0;
  176.                     break;
  177.                 default:
  178.                     if (pchar(str,format_string[i],maxsize,&rv))
  179.                         return 0;
  180.                     
  181.             }
  182.         }
  183.         else {
  184.             if (pchar(str,format_string[i],maxsize,&rv))
  185.                 return 0;
  186.         }
  187.     }
  188.     return(rv);
  189.     
  190. }