operator "abort added to NXSL
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 5 May 2014 16:25:11 +0000 (19:25 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 5 May 2014 16:25:11 +0000 (19:25 +0300)
ChangeLog
doc/nxsl.npp.styling.xml
include/nxsl.h
src/libnxsl/libnxsl.h
src/libnxsl/parser.l
src/libnxsl/parser.y
src/libnxsl/program.cpp
src/libnxsl/vm.cpp

index 2413f48..5a24f30 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,7 @@
 - STP (Spanning Tree Protocol) information used for topology discovery
 - Information source for interface peers (CDP, STP, etc.) shown in console
 - New NXSL function inList
+- New NXSL operator abort
 - New methods in NXSL class Node: enableAgent, enableConfigurationPoll,
   enableIcmp, enableSnmp, enableStatusPoll, enableTopologyPoll
 - Fixed server crash if SNMP proxy unavailable
index 3e9fc06..5f388fb 100644 (file)
@@ -24,7 +24,7 @@
             <Keywords name="Folders in comment, open"></Keywords>
             <Keywords name="Folders in comment, middle"></Keywords>
             <Keywords name="Folders in comment, close"></Keywords>
-            <Keywords name="Keywords1">array break case const continue default do else exit for foreach global if ilike imatch like match print println return sub switch use while</Keywords>
+            <Keywords name="Keywords1">abort array break case const continue default do else exit for foreach global if ilike imatch like match print println return sub switch use while</Keywords>
             <Keywords name="Keywords2">classof int32 int64 real string typeof uint32 uint64</Keywords>
             <Keywords name="Keywords3">FALSE false TRUE true NULL null</Keywords>
             <Keywords name="Keywords4"></Keywords>
index 15efd4e..c900e7f 100644 (file)
@@ -73,6 +73,7 @@
 #define NXSL_ERR_NO_SUCH_STAT_PARAM       29
 #define NXSL_ERR_NO_SUCH_METHOD           30
 #define NXSL_ERR_NO_SUCH_CONSTANT         31
+#define NXSL_ERR_EXECUTION_ABORTED        32
 
 /**
  * Special return codes for external functions
index 5d974bf..f9560dc 100644 (file)
@@ -117,6 +117,7 @@ typedef void *yyscan_t;
 #define OPCODE_DEC_ELEMENT    64
 #define OPCODE_INCP_ELEMENT   65
 #define OPCODE_DECP_ELEMENT   66
+#define OPCODE_ABORT          67
 
 class NXSL_Compiler;
 
index b013aa8..63b392f 100644 (file)
@@ -34,42 +34,43 @@ static void LexerError(const char *pszMsg, yyscan_t scanner);
 
 %%
 
-<INITIAL>"array"       return T_ARRAY;
-<INITIAL>"break"       return T_BREAK;
-<INITIAL>"case"                return T_CASE;
-<INITIAL>"const"  return T_CONST;
-<INITIAL>"continue"    return T_CONTINUE;
-<INITIAL>"default"     return T_DEFAULT;
-<INITIAL>"do"          return T_DO;
-<INITIAL>"else"                return T_ELSE;
-<INITIAL>"exit"                return T_EXIT;
+<INITIAL>"abort"    return T_ABORT;
+<INITIAL>"array"    return T_ARRAY;
+<INITIAL>"break"    return T_BREAK;
+<INITIAL>"case"     return T_CASE;
+<INITIAL>"const"    return T_CONST;
+<INITIAL>"continue" return T_CONTINUE;
+<INITIAL>"default"  return T_DEFAULT;
+<INITIAL>"do"       return T_DO;
+<INITIAL>"else"     return T_ELSE;
+<INITIAL>"exit"     return T_EXIT;
 <INITIAL>"FALSE"    return T_FALSE;
 <INITIAL>"false"    return T_FALSE;
-<INITIAL>"for"         return T_FOR;
-<INITIAL>"foreach"     return T_FOREACH;
-<INITIAL>"global"      return T_GLOBAL;
-<INITIAL>"if"          return T_IF;
-<INITIAL>"ilike"       return T_ILIKE;
-<INITIAL>"imatch"      return T_IMATCH;
-<INITIAL>"int32"       return T_TYPE_INT32;
-<INITIAL>"int64"       return T_TYPE_INT64;
-<INITIAL>"like"                return T_LIKE;
-<INITIAL>"match"       return T_MATCH;
-<INITIAL>"NULL"                return T_NULL;
-<INITIAL>"null"                return T_NULL;
-<INITIAL>"print"       return T_PRINT;
-<INITIAL>"println"     return T_PRINTLN;
-<INITIAL>"real"                return T_TYPE_REAL;
-<INITIAL>"return"      return T_RETURN;
-<INITIAL>"string"      return T_TYPE_STRING;
-<INITIAL>"sub"         return T_SUB;
-<INITIAL>"switch"      return T_SWITCH;
-<INITIAL>"TRUE"                return T_TRUE;
-<INITIAL>"true"                return T_TRUE;
-<INITIAL>"uint32"      return T_TYPE_UINT32;
-<INITIAL>"uint64"      return T_TYPE_UINT64;
-<INITIAL>"use"         return T_USE;
-<INITIAL>"while"       return T_WHILE;
+<INITIAL>"for"      return T_FOR;
+<INITIAL>"foreach"  return T_FOREACH;
+<INITIAL>"global"   return T_GLOBAL;
+<INITIAL>"if"       return T_IF;
+<INITIAL>"ilike"    return T_ILIKE;
+<INITIAL>"imatch"   return T_IMATCH;
+<INITIAL>"int32"    return T_TYPE_INT32;
+<INITIAL>"int64"    return T_TYPE_INT64;
+<INITIAL>"like"     return T_LIKE;
+<INITIAL>"match"    return T_MATCH;
+<INITIAL>"NULL"     return T_NULL;
+<INITIAL>"null"     return T_NULL;
+<INITIAL>"print"    return T_PRINT;
+<INITIAL>"println"  return T_PRINTLN;
+<INITIAL>"real"     return T_TYPE_REAL;
+<INITIAL>"return"   return T_RETURN;
+<INITIAL>"string"   return T_TYPE_STRING;
+<INITIAL>"sub"      return T_SUB;
+<INITIAL>"switch"   return T_SWITCH;
+<INITIAL>"TRUE"     return T_TRUE;
+<INITIAL>"true"     return T_TRUE;
+<INITIAL>"uint32"   return T_TYPE_UINT32;
+<INITIAL>"uint64"   return T_TYPE_UINT64;
+<INITIAL>"use"      return T_USE;
+<INITIAL>"while"    return T_WHILE;
 
 <INITIAL>{identifier}  { yylval->valStr = strdup(yytext); return T_IDENTIFIER; }
 <INITIAL>{compound_ident} { yylval->valStr = strdup(yytext); return T_COMPOUND_IDENTIFIER; }
index 8c2f5e2..a0900c9 100644 (file)
@@ -36,6 +36,7 @@ int yylex(YYSTYPE *lvalp, yyscan_t scanner);
        NXSL_Instruction *pInstruction;
 }
 
+%token T_ABORT
 %token T_ARRAY
 %token T_BREAK
 %token T_CASE
@@ -620,7 +621,11 @@ SimpleStatement:
 ;
 
 SimpleStatementKeyword:
-       T_EXIT
+       T_ABORT
+{
+       $$ = new NXSL_Instruction(pLexer->getCurrLine(), OPCODE_ABORT);
+}
+|      T_EXIT
 {
        $$ = new NXSL_Instruction(pLexer->getCurrLine(), OPCODE_EXIT);
 }
index 2c45a57..6fcdaa2 100644 (file)
@@ -49,7 +49,7 @@ const char *g_nxslCommandMnemonic[] =
        "ESET", "ASET", "NAME", "FOREACH", "NEXT",
        "GLOBAL", "GARRAY", "JZP", "JNZP", "ADDARR",
        "AGETS", "CALL", "CASE", "EINC", "EDEC",
-   "EINCP", "EDECP"
+   "EINCP", "EDECP", "ABORT"
 };
 
 /**
index 0d706ec..b4bacf9 100644 (file)
@@ -27,7 +27,7 @@
 /**
  * Constants
  */
-#define MAX_ERROR_NUMBER         31
+#define MAX_ERROR_NUMBER         32
 #define CONTROL_STACK_LIMIT      32768
 
 /**
@@ -70,7 +70,8 @@ static const TCHAR *s_runtimeErrorMessage[MAX_ERROR_NUMBER] =
        _T("Statistical data for given instance is not collected yet"),
        _T("Requested statistical parameter does not exist"),
        _T("Unknown object's method"),
-   _T("Constant not defined")
+   _T("Constant not defined"),
+   _T("Execution aborted")
 };
 
 /**
@@ -896,6 +897,28 @@ void NXSL_VM::execute()
             error(NXSL_ERR_DATA_STACK_UNDERFLOW);
          }
          break;
+      case OPCODE_ABORT:
+                       if (m_pDataStack->getSize() > 0)
+         {
+            pValue = (NXSL_Value *)m_pDataStack->pop();
+            if (pValue->isInteger())
+            {
+               error(pValue->getValueAsInt32());
+            }
+            else if (pValue->isNull())
+            {
+               error(NXSL_ERR_EXECUTION_ABORTED);
+            }
+            else
+            {
+               error(NXSL_ERR_NOT_INTEGER);
+            }
+         }
+         else
+         {
+            error(NXSL_ERR_DATA_STACK_UNDERFLOW);
+         }
+         break;
       case OPCODE_ADD:
       case OPCODE_SUB:
       case OPCODE_MUL: