[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] strftime()



From: Alexander Hartmut Kluth <alexanderkluth@xxxxxx>

+ strftime() hinzugefügt
+ enum's und nen const-Array hinzugefügt, die das Leben leichter machen

Signed-off-by: Alexander Hartmut Kluth <alexanderkluth@xxxxxx>
---
 src/modules/include/time.h     |    2 +
 src/modules/lib/stdlibc/time.c |  233 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 235 insertions(+), 0 deletions(-)

diff --git a/src/modules/include/time.h b/src/modules/include/time.h
index 4ee4b2e..b6c928e 100644
--- a/src/modules/include/time.h
+++ b/src/modules/include/time.h
@@ -46,6 +46,8 @@ struct tm {
 
 time_t time(time_t* t);
 
+size_t strftime(char *str, size_t maxs, const char *datestr, const struct tm *tm);
+
 #ifndef CONFIG_LIBC_NO_STUBS
 /// Datum und Uhrzeit in einen String umwandeln
 char* ctime(const time_t* time_ptr);
diff --git a/src/modules/lib/stdlibc/time.c b/src/modules/lib/stdlibc/time.c
index 76e82d0..70b4902 100644
--- a/src/modules/lib/stdlibc/time.c
+++ b/src/modules/lib/stdlibc/time.c
@@ -46,6 +46,27 @@ static char* asctime_buf = "Wed Jun 42 13:37:42 1337\n";
 static char* ctime_string = "Wed Jun 42 13:37:42 1337\n";
 #endif
 
+enum {
+	   aJan, aFeb, aMar, aApr, aMay, aJun, aJul, aAug, aSep, aOct, aNov, aDec,
+	   Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec,
+	   aSun, aMon, aTue, aWed, aThu, aFri, aSat,
+	   Sun, Mon, Tue, Wed, Thu, Fri, Sat,
+	   Local_time, Local_date, DFL_FMT,
+	   AM, PM, DATE_FMT,
+	   LAST
+};
+
+static const char * __time[] = {
+	"Jan","Feb","Mar","Apr","May","Jun","Jul", "Aug", "Sep","Oct", "Nov", "Dec",
+	"January", "February", "March","April",
+	"May","June", "July", "August", "September",
+	"October", "November", "December",
+	"Sun","Mon", "Tue", "Wed","Thu", "Fri","Sat",
+	"Sunday","Monday","Tuesday","Wednesday", "Thursday","Friday","Saturday",
+	"%H:%M:%S","%m/%d/%y", "%a %b %d %H:%M:%S %Y",
+	"AM", "PM", "%a %b %e %T %Z %Y", NULL
+};
+
 /**
  * Unix-Timestamp aus der aktuellen Zeit generieren.
  *
@@ -128,3 +149,215 @@ time_t mktime(struct tm* time_ptr)
 
 #endif
 
+/**
+ * Erzeugt einen String anhand eines Datumsformats aus einer bestimmten
+ * Anzahl Zeichen.
+ *
+ * TODO: %z für Zeitzone, %c und %C für lokalisierte Datums- und Zeitformat,
+ *       %x und %X für lokalisiertes Datums-, bzw. Zeitformat
+ *
+ * @param str Pointer auf einen String
+ * @param maxs Maximal zu erzeugende Anzahl an Zeichen
+ * @param datestr Pointer auf den Datumsformatstring
+ * @param tm Struktur auf aktuelle Datums- und Zeitangaben
+ *
+ * @return 0 bei Misserfolg, ansonsten Anzahl erzeugter Zeichen
+ **/
+size_t strftime(char *str, size_t maxs, const char *datestr, const struct tm *tm)
+{
+    char i, c;
+    size_t size = 0, n;
+    char *nstr;
+    char dflcase[] = "%?";
+
+    // TODO: Aktuelle Zeit ermitteln
+    if (datestr == NULL) {
+        nstr = "";
+    }
+
+    // Datumsformatstring parsen
+    while ((c = *datestr++) != '\0') {
+        if (c != '%') {
+            if (++size >= maxs) {
+                return 0;
+            }
+       
+            *str++ = c;
+            continue;
+        }
+
+        switch (*datestr++) {
+            case '%':	
+                nstr = "%";
+                break;
+			
+            case 'a':	// Abgekürzter Wochentagsname
+                nstr = (char *)__time[aSun + tm->tm_wday];
+                break;
+			
+            case 'A':	// Wochentagsname
+                nstr = (char *)__time[Sun + tm->tm_wday];
+                break;
+			
+			case 'b':	// Abgekürzter Montatsname
+		    case 'h':
+                nstr = (char *)__time[aJan + tm->tm_mon];
+                break;
+			
+			
+            case 'B':	// Monatsname
+                nstr = (char *)__time[Jan + tm->tm_mon];
+                
+                if ((n = strftime(str, maxs-size, nstr, tm)) == 0) {
+                    return 0;
+                }
+			
+                str += n;
+                size += n;
+                break;
+			
+            case 'd':	// Tagesnummer
+                //p = itoa(tm->tm_mday, nstr, 2);
+                break;
+			
+            case 'D':
+                nstr = "%m/%d/%y";
+                if ((n = strftime(str, maxs-size, nstr, tm)) == 0) {
+                    return 0;
+                }
+			
+                str += n;
+                size += n;
+                break;
+			
+            case 'e':
+                itoa(tm->tm_mday, nstr, 2);
+                if (tm->tm_mday < 10) {
+                    nstr[0] = ' ';
+                }
+
+                break;
+			
+            case 'H':	// 24-Stunden
+                itoa(tm->tm_hour, nstr, 2);
+                 break;
+			
+            case 'I':	// 12-Stunden
+                if ((i = tm->tm_hour % 12) == 0)
+                i = 12;
+                itoa(i, nstr, 2);
+                break;
+			
+            case 'j':	// Julianisches Datum
+                itoa(tm->tm_yday + 1, nstr, 3);
+            break;
+			
+            case 'm':	// Monats-Nummer
+                itoa(tm->tm_mon + 1, nstr, 2);
+                break;
+			
+            case 'M':	// Minute
+                itoa(tm->tm_min, nstr, 2);
+                break;
+			
+            case 'n':	// Newline 
+                nstr = "\n";
+                break;
+			
+            case 'p':	// AM oder PM 
+                if (tm->tm_hour >= 12)
+                    nstr = (char *)__time[PM];
+                else
+                    nstr = (char *)__time[AM];
+                break;
+			
+            case 'r':
+                if (tm->tm_hour >= 12)
+                    nstr = "%I:%M:%S PM";
+                else
+                    nstr = "%I:%M:%S AM";
+				
+                if ((n = strftime(str, maxs-size, nstr, tm)) == 0) {
+                    return 0;
+                }
+			
+                str += n;
+                size += n;
+                break;
+			
+            case 'R':
+                nstr = "%H:%M";
+                if ((n = strftime(str, maxs-size, nstr, tm)) == 0) {
+                    return 0;
+                }
+			
+                str += n;
+                size += n;
+                break;
+			
+            case 'S':	// Sekunden 
+                //p = itoa(tm->tm_sec, nstr, 2);
+                break;
+			
+            case 't':	// Tabulator
+                nstr = "\t";
+                break;
+			
+            case 'T':
+                nstr = "%H:%M:%S";
+                if ((n = strftime(str, maxs-size, nstr, tm)) == 0) {
+                    return 0;
+                }
+			
+                str += n;
+                size += n;
+                break;
+			
+            case 'U':	// Tagesnummer des Jahres, bei Sonntag als 1. Tag
+                itoa((tm->tm_yday - tm->tm_wday + 7)/7, nstr, 2);
+                break;
+			
+            case 'w':	// Wochentagsnummer
+                itoa(tm->tm_wday, nstr, 1);
+                break;
+			
+            case 'W':	// Tagesnummer des Jahres, bei Montag als 1. Tag
+                if ((i = 8 - tm->tm_wday) == 8) {
+                    i = 1;
+                }
+                itoa((tm->tm_yday + i)/7, nstr, 2);
+                break;
+			
+			
+            case 'y':	// Jahr in Form von "xx"
+                itoa(tm->tm_year, nstr, 2);
+                break;
+			
+            case 'Y':	// Jahr in Form von "xxxx"
+                itoa(1900 + tm->tm_year, nstr, 4);
+                break;
+
+            default:
+                dflcase[1] = *(datestr - 1);
+                nstr = (char *)dflcase;
+                break;
+
+			continue;
+        }
+		
+        n = strlen(nstr);
+        
+        if ((size += n) >= maxs) {
+            return 0;
+		}
+        
+        strcpy(str, nstr);
+        str += n;
+    }
+    
+    *str = '\0';
+    return size;
+}
+
+
+
-- 
1.6.0.4