New NXSL functions: strftime and SecondsToUptime
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 8 Jan 2007 23:53:58 +0000 (23:53 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 8 Jan 2007 23:53:58 +0000 (23:53 +0000)
THANKS
src/libnxsl/env.cpp
src/libnxsl/functions.cpp

diff --git a/THANKS b/THANKS
index 9c728aa..888bdaf 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -5,9 +5,9 @@ Many people have further contributed to NetXMS by reporting problems,
 suggesting various improvements, or submitting actual code. Here is
 a list of these people. Help me keep it complete and exempt of errors.
 
-People from C.T.Co:
-
-Igor Kopman
-Roman Lazarenko
-Victoria Almazova
+People from C.T.Co - for good ideas and system testing:
+  Igor Kopman
+  Roman Lazarenko
+  Victoria Almazova
 
+Edgar Chupit - for many useful patches and ideas
index 07fa7eb..95ec412 100644 (file)
@@ -34,10 +34,12 @@ int F_lower(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_max(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_min(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_pow(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
+int F_strftime(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_typeof(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_upper(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_AddrInRange(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 int F_AddrInSubnet(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
+int F_SecondsToUptime(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
 
 
 //
@@ -52,10 +54,12 @@ static NXSL_ExtFunction m_builtinFunctions[] =
    { "max", F_max, -1 },
    { "min", F_min, -1 },
    { "pow", F_pow, 2 },
+       { "strftime", F_strftime, -1 },
    { "typeof", F_typeof, 1 },
    { "upper", F_upper, 1 },
    { "AddrInRange", F_AddrInRange, 3 },
-   { "AddrInSubnet", F_AddrInSubnet, 3 }
+   { "AddrInSubnet", F_AddrInSubnet, 3 },
+       { "SecondsToUptime", F_SecondsToUptime, 1 }
 };
 
 
index 9ae5f30..387713e 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** NetXMS Scripting Language Interpreter
-** Copyright (C) 2005 Victor Kirhenshtein
+** Copyright (C) 2005, 2006 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -17,7 +17,7 @@
 ** along with this program; if not, write to the Free Software
 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 **
-** $module: functions.cpp
+** File: functions.cpp
 **
 **/
 
@@ -272,3 +272,86 @@ int F_AddrInSubnet(int argc, NXSL_Value **argv, NXSL_Value **ppResult)
    }
    return nRet;
 }
+
+
+//
+// Convert time_t into string
+// PATCH: by Edgar Chupit
+//
+
+int F_strftime(int argc, NXSL_Value **argv, NXSL_Value **ppResult)
+{   
+   char pResult[512];
+   time_t tTime;
+       struct tm *ptm;
+   DWORD dwLen;
+       BOOL bLocalTime;
+
+   if ((argc == 0) || (argc > 3))
+      return NXSL_ERR_INVALID_ARGUMENT_COUNT;
+
+   if (!argv[0]->IsString())
+      return NXSL_ERR_NOT_STRING;
+       if (argc > 1)
+       {
+               if (!argv[1]->IsNumeric() && !argv[1]->IsNull())
+                       return NXSL_ERR_NOT_NUMBER;
+               tTime = (argv[1]->IsNull()) ? time(NULL) : (time_t)argv[1]->GetValueAsUInt64();
+
+               if (argc > 2)
+               {
+                       if (!argv[2]->IsInteger())
+                               return NXSL_ERR_BAD_CONDITION;
+                       bLocalTime = argv[2]->GetValueAsInt32() ? TRUE : FALSE;
+               }
+               else
+               {
+                       // No third argument, assume localtime
+                       bLocalTime = TRUE;
+               }
+       }
+       else
+       {
+               // No second argument
+               tTime = time(NULL);
+       }
+
+   ptm = bLocalTime ? localtime(&tTime) : gmtime(&tTime);
+   dwLen = strftime(pResult, sizeof(pResult) / sizeof(pResult[0]), argv[0]->GetValueAsString(&dwLen), ptm);
+   *ppResult = new NXSL_Value(pResult);   
+   
+   return 0;
+}
+
+
+//
+// Convert seconds since uptime to string
+// PATCH: by Edgar Chupit
+//
+
+int F_SecondsToUptime(int argc, NXSL_Value **argv, NXSL_Value **ppResult)
+{
+   DWORD d, h, n;
+
+   if (!argv[0]->IsNumeric())
+      return NXSL_ERR_NOT_NUMBER;
+
+   QWORD arg = argv[0]->GetValueAsUInt64();
+
+   d = (DWORD)(arg / 86400);
+   arg -= d * 86400;
+   h = (DWORD)(arg / 3600);
+   arg -= h * 3600;
+   n = (DWORD)(arg / 60);
+   arg -= n * 60;
+   if (arg > 0)
+       n++;
+
+   char pResult[MAX_PATH];
+   pResult[0] = 0;
+
+   snprintf(pResult, MAX_PATH, "%u days, %2u:%02u", d, h, n);
+
+   *ppResult = new NXSL_Value(pResult);
+   return 0;
+}