added NXSL functions index and rindex
authorVictor Kirhenshtein <victor@netxms.org>
Thu, 12 Aug 2010 08:17:10 +0000 (08:17 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Thu, 12 Aug 2010 08:17:10 +0000 (08:17 +0000)
doc/manuals/netxms_user_manual.odt
include/netxms-version.h
src/libnxsl/env.cpp
src/libnxsl/functions.cpp

index 804f738..79bd35e 100644 (file)
Binary files a/doc/manuals/netxms_user_manual.odt and b/doc/manuals/netxms_user_manual.odt differ
index 505c80c..d05c8df 100644 (file)
@@ -32,7 +32,7 @@
 #define NETXMS_VERSION_MINOR        1
 #define NETXMS_VERSION_BUILD        0
 #define NETXMS_VERSION_HOTFIX       0
-#define NETXMS_VERSION_STRING       _T("1.1.0-rc12")
+#define NETXMS_VERSION_STRING       _T("1.1.0")
 
 
 //
index 30bcfb4..df02b77 100644 (file)
@@ -34,6 +34,7 @@ int F_d2x(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *prog
 int F_exit(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_exp(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_gmtime(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
+int F_index(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_left(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_length(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_localtime(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
@@ -45,6 +46,7 @@ int F_max(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *prog
 int F_min(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_pow(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_right(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
+int F_rindex(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_rtrim(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_strftime(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_substr(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
@@ -70,6 +72,7 @@ static NXSL_ExtFunction m_builtinFunctions[] =
        { "d2x", F_d2x, -1 },
    { "exp", F_exp, 1 },
    { "gmtime", F_gmtime, -1 },
+   { "index", F_index, -1 },
    { "left", F_left, -1 },
    { "length", F_length, 1 },
    { "localtime", F_localtime, -1 },
@@ -81,6 +84,7 @@ static NXSL_ExtFunction m_builtinFunctions[] =
    { "min", F_min, -1 },
    { "pow", F_pow, 2 },
    { "right", F_right, -1 },
+   { "rindex", F_rindex, -1 },
        { "rtrim", F_rtrim, 1 },
        { "strftime", F_strftime, -1 },
        { "substr", F_substr, -1 },
index b4181d3..2f50883 100644 (file)
@@ -895,3 +895,104 @@ int F_trace(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *pr
        *ppResult = new NXSL_Value();
        return 0;
 }
+
+
+//
+// Common implementation for index and rindex functions
+//
+
+static int F_index_rindex(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program, bool reverse)
+{
+       if ((argc != 2) && (argc != 3))
+               return NXSL_ERR_INVALID_ARGUMENT_COUNT;
+
+       if (!argv[0]->isString() || !argv[1]->isString())
+               return NXSL_ERR_NOT_STRING;
+
+       DWORD strLength, substrLength;
+       const TCHAR *str = argv[0]->getValueAsString(&strLength);
+       const TCHAR *substr = argv[1]->getValueAsString(&substrLength);
+
+       int start;
+       if (argc == 3)
+       {
+               if (!argv[2]->isInteger())
+                       return NXSL_ERR_NOT_INTEGER;
+
+               start = argv[2]->getValueAsInt32();
+               if (start > 0)
+               {
+                       start--;
+                       if (reverse && (start > (int)strLength - (int)substrLength))
+                               start = (int)strLength - (int)substrLength;
+               }
+               else
+               {
+                       start = reverse ? (int)strLength - (int)substrLength : 0;
+               }
+       }
+       else
+       {
+               start = reverse ? (int)strLength - (int)substrLength : 0;
+       }
+
+       int index = 0;  // 0 = not found
+       if ((substrLength < strLength) && (substrLength > 0))
+       {
+               if (reverse)
+               {
+                       for(int i = start; i >= 0; i--)
+                       {
+                               if (!memcmp(&str[i], substr, substrLength * sizeof(TCHAR)))
+                               {
+                                       index = i + 1;
+                                       break;
+                               }
+                       }
+               }
+               else
+               {
+                       for(int i = start; i < (int)(strLength - substrLength); i++)
+                       {
+                               if (!memcmp(&str[i], substr, substrLength * sizeof(TCHAR)))
+                               {
+                                       index = i + 1;
+                                       break;
+                               }
+                       }
+               }
+       }
+       else if ((substrLength == strLength) && (substrLength > 0))
+       {
+               index = !memcmp(str, substr, substrLength * sizeof(TCHAR)) ? 1 : 0;
+       }
+
+       *ppResult = new NXSL_Value((LONG)index);
+       return 0;
+}
+
+
+//
+// index(string, substring, [position])
+// Returns the position of the first occurrence of SUBSTRING in STRING at or after POSITION.
+// If you don't specify POSITION, the search starts at the beginning of STRING. If SUBSTRING
+// is not found, returns 0.
+//
+
+int F_index(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program)
+{
+       return F_index_rindex(argc, argv, ppResult, program, false);
+}
+
+
+//
+// rindex(string, substring, [position])
+// Returns the position of the last occurrence of SUBSTRING in STRING at or before POSITION.
+// If you don't specify POSITION, the search starts at the end of STRING. If SUBSTRING
+// is not found, returns 0.
+//
+
+int F_rindex(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program)
+{
+       return F_index_rindex(argc, argv, ppResult, program, true);
+}