strftime: Add support for %s (seconds since epoch)
* libc/time/strftime.c (__strftime): add support for %s (seconds from Unix epoch). Fix whitespaces. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
		
				
					committed by
					
						 Corinna Vinschen
						Corinna Vinschen
					
				
			
			
				
	
			
			
			
						parent
						
							cf51db8baa
						
					
				
				
					commit
					6090952296
				
			| @@ -1,3 +1,8 @@ | |||||||
|  | 2015-10-26  Brian Inglis  <Brian.Inglis@SystematicSw.ab.ca> | ||||||
|  |  | ||||||
|  | 	* libc/time/strftime.c (__strftime): add support for %s (seconds from | ||||||
|  | 	Unix epoch).  Fix whitespaces. | ||||||
|  |  | ||||||
| 2015-10-19  Nick Clifton  <nickc@redhat.com> | 2015-10-19  Nick Clifton  <nickc@redhat.com> | ||||||
|  |  | ||||||
| 	* libc/include/sys/_intsup.h: Add support for 16-bit and 20-bit | 	* libc/include/sys/_intsup.h: Add support for 16-bit and 20-bit | ||||||
|   | |||||||
| @@ -166,6 +166,10 @@ notations, the result is an empty string. [tm_sec, tm_min, tm_hour] | |||||||
| o %R | o %R | ||||||
| The 24-hour time, to the minute.  Equivalent to "%H:%M". [tm_min, tm_hour] | The 24-hour time, to the minute.  Equivalent to "%H:%M". [tm_min, tm_hour] | ||||||
|  |  | ||||||
|  | o %s | ||||||
|  | The time elapsed, in seconds, since the start of the Unix epoch at | ||||||
|  | 1970-01-01 00:00:00 UTC. | ||||||
|  |  | ||||||
| o %S | o %S | ||||||
| The second, formatted with two digits (from `<<00>>' to `<<60>>').  The | The second, formatted with two digits (from `<<00>>' to `<<60>>').  The | ||||||
| value 60 accounts for the occasional leap second. [tm_sec] | value 60 accounts for the occasional leap second. [tm_sec] | ||||||
| @@ -1109,6 +1113,74 @@ recurse: | |||||||
| 			  tim_p->tm_hour, tim_p->tm_min); | 			  tim_p->tm_hour, tim_p->tm_min); | ||||||
|           CHECK_LENGTH (); |           CHECK_LENGTH (); | ||||||
|           break; |           break; | ||||||
|  | 	case CQ('s'): | ||||||
|  | /* | ||||||
|  |  * From: | ||||||
|  |  * The Open Group Base Specifications Issue 7 | ||||||
|  |  * IEEE Std 1003.1, 2013 Edition | ||||||
|  |  * Copyright (c) 2001-2013 The IEEE and The Open Group | ||||||
|  |  * XBD Base Definitions | ||||||
|  |  * 4. General Concepts | ||||||
|  |  * 4.15 Seconds Since the Epoch | ||||||
|  |  * A value that approximates the number of seconds that have elapsed since the | ||||||
|  |  * Epoch. A Coordinated Universal Time name (specified in terms of seconds | ||||||
|  |  * (tm_sec), minutes (tm_min), hours (tm_hour), days since January 1 of the year | ||||||
|  |  * (tm_yday), and calendar year minus 1900 (tm_year)) is related to a time | ||||||
|  |  * represented as seconds since the Epoch, according to the expression below. | ||||||
|  |  * If the year is <1970 or the value is negative, the relationship is undefined. | ||||||
|  |  * If the year is >=1970 and the value is non-negative, the value is related to a | ||||||
|  |  * Coordinated Universal Time name according to the C-language expression, where | ||||||
|  |  * tm_sec, tm_min, tm_hour, tm_yday, and tm_year are all integer types: | ||||||
|  |  * tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 + | ||||||
|  |  *     (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 - | ||||||
|  |  *     ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400 | ||||||
|  |  * OR | ||||||
|  |  * ((((tm_year-69)/4 - (tm_year-1)/100 + (tm_year+299)/400 + | ||||||
|  |  *         (tm_year-70)*365 + tm_yday)*24 + tm_hour)*60 + tm_min)*60 + tm_sec | ||||||
|  |  */ | ||||||
|  | /* modified from %z case by hoisting offset outside if block and initializing */ | ||||||
|  | 	  { | ||||||
|  | 	    long offset = 0;	/* offset < 0 => W of GMT, > 0 => E of GMT: | ||||||
|  | 				   subtract to get UTC */ | ||||||
|  |  | ||||||
|  | 	    if (tim_p->tm_isdst >= 0) | ||||||
|  | 	      { | ||||||
|  | 		TZ_LOCK; | ||||||
|  | 		if (!tzset_called) | ||||||
|  | 		  { | ||||||
|  | 		    _tzset_unlocked (); | ||||||
|  | 		    tzset_called = 1; | ||||||
|  | 		  } | ||||||
|  |  | ||||||
|  | #if defined (__CYGWIN__) | ||||||
|  | 		/* Cygwin must check if the application has been built with or | ||||||
|  | 		   without the extra tm members for backward compatibility, and | ||||||
|  | 		   then use either that or the old method fetching from tzinfo. | ||||||
|  | 		   Rather than pulling in the version check infrastructure, we | ||||||
|  | 		   just call a Cygwin function. */ | ||||||
|  | 		extern long __cygwin_gettzoffset (const struct tm *tmp); | ||||||
|  | 		offset = __cygwin_gettzoffset (tim_p); | ||||||
|  | #elif defined (__TM_GMTOFF) | ||||||
|  | 		offset = tim_p->__TM_GMTOFF; | ||||||
|  | #else | ||||||
|  | 		__tzinfo_type *tz = __gettzinfo (); | ||||||
|  | 		/* The sign of this is exactly opposite the envvar TZ.  We | ||||||
|  | 		   could directly use the global _timezone for tm_isdst==0, | ||||||
|  | 		   but have to use __tzrule for daylight savings.  */ | ||||||
|  | 		offset = -tz->__tzrule[tim_p->tm_isdst > 0].offset; | ||||||
|  | #endif | ||||||
|  | 		TZ_UNLOCK; | ||||||
|  | 	      } | ||||||
|  | 	    len = snprintf (&s[count], maxsize - count, CQ("%lld"), | ||||||
|  | 			    (((((long long)tim_p->tm_year - 69)/4 | ||||||
|  | 				- (tim_p->tm_year - 1)/100 | ||||||
|  | 				+ (tim_p->tm_year + 299)/400 | ||||||
|  | 				+ (tim_p->tm_year - 70)*365 + tim_p->tm_yday)*24 | ||||||
|  | 			      + tim_p->tm_hour)*60 + tim_p->tm_min)*60 | ||||||
|  | 			    + tim_p->tm_sec - offset); | ||||||
|  | 	    CHECK_LENGTH (); | ||||||
|  | 	  } | ||||||
|  |           break; | ||||||
| 	case CQ('S'): | 	case CQ('S'): | ||||||
| #ifdef _WANT_C99_TIME_FORMATS | #ifdef _WANT_C99_TIME_FORMATS | ||||||
| 	  if (alt != CQ('O') || !*alt_digits | 	  if (alt != CQ('O') || !*alt_digits | ||||||
| @@ -1442,6 +1514,7 @@ const struct test  Vec0[] = { | |||||||
| 	{ CQ("%p"), 2+1, EXP(CQ("AM")) }, | 	{ CQ("%p"), 2+1, EXP(CQ("AM")) }, | ||||||
| 	{ CQ("%r"), 11+1, EXP(CQ("09:53:47 AM")) }, | 	{ CQ("%r"), 11+1, EXP(CQ("09:53:47 AM")) }, | ||||||
| 	{ CQ("%R"), 5+1, EXP(CQ("09:53")) }, | 	{ CQ("%R"), 5+1, EXP(CQ("09:53")) }, | ||||||
|  | 	{ CQ("%s"), 2+1, EXP(CQ("1230648827")) }, | ||||||
| 	{ CQ("%S"), 2+1, EXP(CQ("47")) }, | 	{ CQ("%S"), 2+1, EXP(CQ("47")) }, | ||||||
| 	{ CQ("%t"), 1+1, EXP(CQ("\t")) }, | 	{ CQ("%t"), 1+1, EXP(CQ("\t")) }, | ||||||
| 	{ CQ("%T"), 8+1, EXP(CQ("09:53:47")) }, | 	{ CQ("%T"), 8+1, EXP(CQ("09:53:47")) }, | ||||||
| @@ -1502,6 +1575,7 @@ const struct test  Vec1[] = { | |||||||
| 	{ CQ("%p"), 2+1, EXP(CQ("PM")) }, | 	{ CQ("%p"), 2+1, EXP(CQ("PM")) }, | ||||||
| 	{ CQ("%r"), 11+1, EXP(CQ("11:01:13 PM")) }, | 	{ CQ("%r"), 11+1, EXP(CQ("11:01:13 PM")) }, | ||||||
| 	{ CQ("%R"), 5+1, EXP(CQ("23:01")) }, | 	{ CQ("%R"), 5+1, EXP(CQ("23:01")) }, | ||||||
|  | 	{ CQ("%s"), 2+1, EXP(CQ("1215054073")) }, | ||||||
| 	{ CQ("%S"), 2+1, EXP(CQ("13")) }, | 	{ CQ("%S"), 2+1, EXP(CQ("13")) }, | ||||||
| 	{ CQ("%t"), 1+1, EXP(CQ("\t")) }, | 	{ CQ("%t"), 1+1, EXP(CQ("\t")) }, | ||||||
| 	{ CQ("%T"), 8+1, EXP(CQ("23:01:13")) }, | 	{ CQ("%T"), 8+1, EXP(CQ("23:01:13")) }, | ||||||
|   | |||||||
| @@ -1,6 +1,8 @@ | |||||||
| What's new: | What's new: | ||||||
| ----------- | ----------- | ||||||
|  |  | ||||||
|  | - strftime(3) supports %s (seconds since Epoch) now. | ||||||
|  |  | ||||||
| - posix_madvise(POSIX_MADV_WILLNEED) now utilizes OS functionality available | - posix_madvise(POSIX_MADV_WILLNEED) now utilizes OS functionality available | ||||||
|   starting with Windows 8/Server 2012.  Still a no-op on older systems. |   starting with Windows 8/Server 2012.  Still a no-op on older systems. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,3 +1,7 @@ | |||||||
|  | 2015-10-27  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
|  | 	* new-features.xml (ov-new2.3): Document strftime %s addition. | ||||||
|  |  | ||||||
| 2015-10-22  Corinna Vinschen  <corinna@vinschen.de> | 2015-10-22  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
| 	* posix.xml (std-iso): New section. | 	* posix.xml (std-iso): New section. | ||||||
|   | |||||||
| @@ -8,6 +8,10 @@ | |||||||
|  |  | ||||||
| <itemizedlist mark="bullet"> | <itemizedlist mark="bullet"> | ||||||
|  |  | ||||||
|  | <listitem><para> | ||||||
|  | strftime(3) supports %s (seconds since Epoch) now. | ||||||
|  | </para></listitem> | ||||||
|  |  | ||||||
| <listitem><para> | <listitem><para> | ||||||
| posix_madvise(POSIX_MADV_WILLNEED) now utilizes OS functionality available | posix_madvise(POSIX_MADV_WILLNEED) now utilizes OS functionality available | ||||||
| starting with Windows 8/Server 2012. | starting with Windows 8/Server 2012. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user