summaryrefslogtreecommitdiff
path: root/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'common.c')
-rw-r--r--common.c217
1 files changed, 217 insertions, 0 deletions
diff --git a/common.c b/common.c
new file mode 100644
index 0000000..8f1c52a
--- /dev/null
+++ b/common.c
@@ -0,0 +1,217 @@
+#include <time.h>
+
+#include <glcdskin/type.h>
+#include <glcdskin/string.h>
+
+#include <vdr/plugin.h>
+#include <string.h>
+
+#include "strfct.h"
+
+#if APIVERSNUM < 10503
+#include <locale.h>
+
+static char* locID[] = {
+ "en_US", //" English",
+ "de_DE", // "Deutsch",
+ "sl_SI", // "Slovenski",
+ "it_IT", // "Italiano",
+ "nl_NL", // "Nederlands",
+ "pt_PT", // "Português",
+ "fr_FR", // "Français",
+ "no_NO", // "Norsk",
+ "fi_FI", // "suomi", Finnish (this is not a typo - it's really lowercase!)
+ "pl_PL", // "Polski",
+ "es_ES", // "Español",
+ "el_GR", // "ÅëëçíéêÜ", Greek
+ "sv_SE", // "Svenska",
+ "ro_RO", // "Românã",
+ "hu_HU", // "Magyar",
+ "ca_ES", // "Català",
+ "ru_RU", // "ÀãááÚØÙ", Russian
+ "hr_HR", // "Hrvatski",
+ "et_EE", // "Eesti",
+ "da_DK", // "Dansk",
+ "cs_CZ" // "Èesky", Czech
+};
+#endif
+
+
+GLCD::cType TimeType(time_t Time, const std::string &Format)
+{
+ static char result[1000];
+ struct tm tm_r, *tm;
+ tm = localtime_r(&Time, &tm_r);
+
+ if (Time > 0)
+ {
+ if (Format.length() > 0)
+ {
+// for vdr < 1.5.x: force locale for correct language output. for >= 1.5.x: system locale should be fine
+#if APIVERSNUM < 10503
+ setlocale(LC_TIME, ( Setup.OSDLanguage < (int)(sizeof(locID)/sizeof(char*)) ) ? locID[Setup.OSDLanguage] : "en_US" );
+#endif
+ strftime(result, sizeof(result), Format.c_str(), tm);
+
+ GLCD::cType r = result;
+ return r;
+ } else
+ return Time;
+ }
+ return false;
+}
+
+GLCD::cType DurationType(int Index, const std::string &Format, double framesPerSecFactor = 1.0)
+{
+ static char result[1000];
+ if (Index > 0)
+ {
+ if (Format.length() > 0)
+ {
+ uint update = 0;
+ const char *ptr = Format.c_str();
+ char *res = result;
+ enum { normal, format } state = normal;
+ int n = 0;
+
+ int f = (Index % (int)framesPerSecFactor) + 1;
+ int s = (Index / (int)framesPerSecFactor);
+
+ int m = s / 60 % 60;
+ int h = s / 3600;
+ s %= 60;
+ while (*ptr && res < result + sizeof(result))
+ {
+ switch (state)
+ {
+ case normal:
+ if (*ptr == '%')
+ state = format;
+ else
+ *(res++) = *ptr;
+ break;
+
+ case format:
+ switch (*ptr)
+ {
+ case 'H':
+ n = snprintf(res, sizeof(result) - (res - result), "%02d", h);
+ break;
+
+ case 'k':
+ n = snprintf(res, sizeof(result) - (res - result), "% 2d", h);
+ break;
+
+ case 'M':
+ n = snprintf(res, sizeof(result) - (res - result), "%02d", m);
+ update = 1000*60;
+ break;
+
+ case 'm':
+ n = snprintf(res, sizeof(result) - (res - result), "%d", m + (h * 60));
+ update = 1000*60;
+ break;
+
+ case 'S':
+ n = snprintf(res, sizeof(result) - (res - result), "%02d", s);
+ update = 1000;
+ break;
+
+ case 'f':
+ n = snprintf(res, sizeof(result) - (res - result), "%d", f);
+ update = 1000;
+ break;
+
+ case '%':
+ n = 1;
+ *res = '%';
+ break;
+ }
+ res += n;
+ state = normal;
+ break;
+ }
+ ++ptr;
+ }
+
+ GLCD::cType r = result;
+ r.SetUpdate(update);
+ return r;
+ } else
+ return (int)Index;
+ }
+ return false;
+}
+
+int ParanoiaStrcmp(const char *s1, const char *s2)
+{
+ if (! s1 || ! s2)
+ return -1;
+
+ // s1 must be under 'our' control (and thus valid), s2 may be a string w/ unexpected content
+ size_t n = strlen(s1);
+
+ int rv = strncmp(s1, s2, n);
+ if (rv == 0)
+ return (s2[n] == '\0') ? 0 : -1;
+ else
+ return rv;
+}
+
+const std::string SplitText(const std::string &Text, const std::string &Delim, bool firstPart = true) {
+ size_t found = Text.find(Delim);
+
+ if (found != std::string::npos) {
+ return (firstPart) ? Text.substr(0, found) : Text.substr(found + Delim.size());
+ }
+ return (firstPart) ? Text : NULL;
+}
+
+const std::string SplitToken(const std::string &Token, const struct GLCD::tSkinAttrib Attrib, bool extSplit) {
+ if (Attrib.Type == GLCD::aClean) {
+ if (extSplit) {
+ std::string Text = SplitText(Token, " - ", true);
+
+ // also cut leading index numbers, eg: "1 Menu" -> "Menu"
+ size_t pos = 0;
+ bool exitw = false;
+ bool valid = true;
+
+ while (!exitw && valid && pos < Text.size()-1) {
+ if (Text[pos] == ' ') {
+ pos++;
+ } else {
+ valid = (isdigit(Text[pos]) || Text[pos] == ' ' || Text[pos] == '\t') ? true : false;
+ exitw = true;
+ }
+ }
+
+ exitw = false;
+ while (!exitw && valid && pos < Text.size()-1) {
+ if (isdigit(Text[pos])) {
+ pos++;
+ } else {
+ valid = (Text[pos] == ' ' || Text[pos] == '\t') ? true : false;
+ exitw = true;
+ }
+ }
+
+ exitw = false;
+ while (!exitw && valid && pos < Text.size()-1) {
+ if (Text[pos] == ' ') {
+ pos++;
+ } else {
+ exitw = true;
+ }
+ }
+
+ if (valid && Text[pos] == '\t')
+ pos++;
+ return trim( (valid) ? Text.substr(pos) : Text );
+ }
+ return SplitText(Token, " - ", true);
+ } else if (Attrib.Type == GLCD::aRest) {
+ return SplitText(Token, " - ", false);
+ }
+ return Token;
+}