]> www.wagner.pp.ru Git - oss/catdoc.git/blob - compat/strftime.c
Recreated CVS repository from working copy
[oss/catdoc.git] / compat / strftime.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <time.h>
4 #include "strftime.h"
5
6 static const char *monthAbbr[]={
7         "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
8 size_t strftime(char *s,size_t max, const char *format,
9                 const struct tm *tm) {
10         size_t i=0,j=0;
11         while(j<max && format[i]) {
12                 if (format[i]!='%') {
13                         s[j]=format[i];
14                         i++;j++;
15                 } else {
16                         i++;
17                         switch (format[i]) {
18                                 case '%': s[j++]='%';break;
19                                 case 'm': if ((j+2) >=max) return 0;
20                                                   j+=sprintf(s+j,"%02d",tm->tm_mon+1);
21                                                   break;                  
22                                 case 'd': if ((j+2) >=max) return 0;
23                                                   j+=sprintf(s+j,"%02d",tm->tm_mday);
24                                                   break;
25                                 case 'y': if ((j+2) >=max) return 0;
26                                                   j+=sprintf(s+j,"%02d",tm->tm_year%100);
27                                                   break;
28                                 case 'Y': if ((j+4) >=max) return 0;
29                                                   j+=sprintf(s+j,"%d",tm->tm_year+1900);          
30                                                   break;
31                                 case 'b': if ((j+3)>=max) return 0;
32                                                          strcpy(s+j,monthAbbr[tm->tm_mon]); 
33                                                          j+=3;
34                                                   break;
35                                 case 'l': if ((j+2) >= max) return 0;
36                                                           { int hour = tm->tm_hour;
37                                                                   if (hour>12) hour -=12;
38                                                                   if (hour == 0) hour = 12;
39                                                                   j+=sprintf(s+j,"%2d",hour);
40                                                                   break;
41                                                           }
42                                 case 'p':  if ((j+2) >= max) return 0;
43                                                   if (tm->tm_hour >11) {
44                                                           strcpy(s+j,"PM");
45                                                   } else {
46                                                           strcpy(s+j,"AM");
47                                                   }
48                                                    j+=2;
49                                                   break;
50                                 case 'H':  if ((j+2) >= max) return 0;
51                                                    j+=sprintf(s+j,"%02d",tm->tm_hour);
52                                                         break;     
53                                 case 'M':if ((j+2) >= max) return 0;
54                                                    j+=sprintf(s+j,"%02d",tm->tm_min);
55                                                         break;
56                                 case 'S':if ((j+2) >= max) return 0;
57                                                    j+=sprintf(s+j,"%02d",tm->tm_sec);
58                                                         break;
59                                 default:                        
60                                                         ;
61                         }
62                         i++;
63                 }       
64         }
65         if (j>=max) return 0;
66         else {
67                 s[j]=0;
68                 return j;
69         }
70 }