NXSL interpreter and API code reorganized
authorVictor Kirhenshtein <victor@netxms.org>
Sun, 1 Jan 2006 21:36:13 +0000 (21:36 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Sun, 1 Jan 2006 21:36:13 +0000 (21:36 +0000)
.gitattributes
include/nxsl.h
include/nxsl_classes.h [copied from src/libnxsl/libnxsl.h with 64% similarity]
src/libnxsl/libnxsl.dsp
src/libnxsl/libnxsl.h
src/libnxsl/program.cpp
src/nxscript/nxscript.cpp
src/nxscript/nxscript.dsp

index a7f243a..2b7dbc1 100644 (file)
@@ -163,6 +163,7 @@ include/nxlog.h -text
 include/nxnt.h -text
 include/nxqueue.h -text
 include/nxsl.h -text
+include/nxsl_classes.h -text
 include/nxsm_ext.h -text
 include/nxsnmp.h -text
 include/nxtools.h -text
index b7a8c79..d28ab00 100644 (file)
 
 
 //
+// Various defines
+//
+
+#define MAX_FUNCTION_NAME  64
+
+
+//
 // Script execution errors
 //
 
 
 
 //
+// Exportable classes
+//
+
+#ifdef __cplusplus
+#include <nxsl_classes.h>
+#endif
+
+
+//
 // Script handle
 //
 
similarity index 64%
copy from src/libnxsl/libnxsl.h
copy to include/nxsl_classes.h
index 4c3d217..7dff66b 100644 (file)
@@ -1,7 +1,6 @@
 /* 
 ** 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
 ** along with this program; if not, write to the Free Software
 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 **
-** $module: libnxsl.h
+** $module: nxsl_classes.h
 **
 **/
 
-#ifndef _libnxsl_h_
-#define _libnxsl_h_
-
-#include <nms_common.h>
-#include <nms_threads.h>
-#include <nms_util.h>
-#include <nxsl.h>
-#include <FlexLexer.h>
-
-union YYSTYPE;
-
-
-//
-// Various defines
-//
-
-#define INVALID_ADDRESS    ((DWORD)0xFFFFFFFF)
-#define MAX_STRING_SIZE    8192
-#define MAX_FUNCTION_NAME  64
-
-
-//
-// Instruction opcodes
-//
-
-#define OPCODE_NOP            0
-#define OPCODE_RETURN         1
-#define OPCODE_JMP            2
-#define OPCODE_CALL           3
-#define OPCODE_CALL_EXTERNAL  4
-#define OPCODE_PUSH_CONSTANT  5
-#define OPCODE_PUSH_VARIABLE  6
-#define OPCODE_EXIT           7
-#define OPCODE_POP            8
-#define OPCODE_SET            9
-#define OPCODE_ADD            10
-#define OPCODE_SUB            11
-#define OPCODE_MUL            12
-#define OPCODE_DIV            13
-#define OPCODE_REM            14
-#define OPCODE_EQ             15
-#define OPCODE_NE             16
-#define OPCODE_LT             17
-#define OPCODE_LE             18
-#define OPCODE_GT             19
-#define OPCODE_GE             20
-#define OPCODE_BIT_AND        21
-#define OPCODE_BIT_OR         22
-#define OPCODE_BIT_XOR        23
-#define OPCODE_AND            24
-#define OPCODE_OR             25
-#define OPCODE_LSHIFT         26
-#define OPCODE_RSHIFT         27
-#define OPCODE_RET_NULL       28
-#define OPCODE_JZ             29
-#define OPCODE_PRINT          30
-#define OPCODE_CONCAT         31
-#define OPCODE_BIND           32
-#define OPCODE_INC            33
-#define OPCODE_DEC            34
-#define OPCODE_NEG            35
-#define OPCODE_NOT            36
-#define OPCODE_BIT_NOT        37
+#ifndef _nxsl_classes_h_
+#define _nxsl_classes_h_
 
 
 //
@@ -97,60 +35,10 @@ union YYSTYPE;
 
 
 //
-// Function structure
-//
-
-struct NXSL_Function
-{
-   char m_szName[MAX_FUNCTION_NAME];
-   DWORD m_dwAddr;
-};
-
-
-//
-// External function structure
-//
-
-class NXSL_Value;
-
-struct NXSL_ExtFunction
-{
-   char m_szName[MAX_FUNCTION_NAME];
-   int (* m_pfHandler)(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
-   int m_iNumArgs;   // Number of arguments or -1 fo variable number
-};
-
-
-//
-// Environment for NXSL program
-//
-
-class NXSL_Environment
-{
-private:
-   DWORD m_dwNumFunctions;
-   NXSL_ExtFunction *m_pFunctionList;
-
-   FILE *m_pStdIn;
-   FILE *m_pStdOut;
-
-public:
-   NXSL_Environment();
-   ~NXSL_Environment();
-
-   void SetIO(FILE *pIn, FILE *pOut) { m_pStdIn = pIn; m_pStdOut = pOut; }
-   FILE *GetStdIn(void) { return m_pStdIn; }
-   FILE *GetStdOut(void) { return m_pStdOut; }
-
-   NXSL_ExtFunction *FindFunction(char *pszName);
-};
-
-
-//
 // Simple stack class
 //
 
-class NXSL_Stack
+class LIBNXSL_EXPORTABLE NXSL_Stack
 {
 private:
    int m_nStackSize;
@@ -174,7 +62,7 @@ public:
 // Variable or constant value
 //
 
-class NXSL_Value
+class LIBNXSL_EXPORTABLE NXSL_Value
 {
 protected:
    DWORD m_dwFlags;
@@ -211,10 +99,58 @@ public:
 
 
 //
+// Function structure
+//
+
+struct NXSL_Function
+{
+   char m_szName[MAX_FUNCTION_NAME];
+   DWORD m_dwAddr;
+};
+
+
+//
+// External function structure
+//
+
+struct NXSL_ExtFunction
+{
+   char m_szName[MAX_FUNCTION_NAME];
+   int (* m_pfHandler)(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
+   int m_iNumArgs;   // Number of arguments or -1 fo variable number
+};
+
+
+//
+// Environment for NXSL program
+//
+
+class LIBNXSL_EXPORTABLE NXSL_Environment
+{
+private:
+   DWORD m_dwNumFunctions;
+   NXSL_ExtFunction *m_pFunctionList;
+
+   FILE *m_pStdIn;
+   FILE *m_pStdOut;
+
+public:
+   NXSL_Environment();
+   ~NXSL_Environment();
+
+   void SetIO(FILE *pIn, FILE *pOut) { m_pStdIn = pIn; m_pStdOut = pOut; }
+   FILE *GetStdIn(void) { return m_pStdIn; }
+   FILE *GetStdOut(void) { return m_pStdOut; }
+
+   NXSL_ExtFunction *FindFunction(char *pszName);
+};
+
+
+//
 // Runtime variable information
 //
 
-class NXSL_Variable
+class LIBNXSL_EXPORTABLE NXSL_Variable
 {
 protected:
    TCHAR *m_pszName;
@@ -236,7 +172,7 @@ public:
 // Varable system
 //
 
-class NXSL_VariableSystem
+class LIBNXSL_EXPORTABLE NXSL_VariableSystem
 {
 protected:
    DWORD m_dwNumVariables;
@@ -256,7 +192,7 @@ public:
 // Single execution instruction
 //
 
-class NXSL_Instruction
+class LIBNXSL_EXPORTABLE NXSL_Instruction
 {
    friend class NXSL_Program;
 
@@ -286,7 +222,7 @@ public:
 // Class representing compiled NXSL program
 //
 
-class NXSL_Program
+class LIBNXSL_EXPORTABLE NXSL_Program
 {
 protected:
    NXSL_Environment *m_pEnv;
@@ -333,63 +269,4 @@ public:
 };
 
 
-//
-// Modified lexer class
-//
-
-class NXSL_Compiler;
-
-class NXSL_Lexer : public yyFlexLexer
-{
-protected:
-   int m_nSourceSize;
-   int m_nSourcePos;
-   char *m_pszSourceCode;
-   NXSL_Compiler *m_pCompiler;
-
-   int m_nCurrLine;
-   int m_nCommentLevel;
-   int m_nStrSize;
-   char m_szStr[MAX_STRING_SIZE];
-   YYSTYPE *m_plval;
-   BOOL m_bErrorState;
-
-       virtual int LexerInput(char *pBuffer, int nMaxSize);
-   virtual void LexerError(const char *pszMsg);
-
-public:
-       NXSL_Lexer(NXSL_Compiler *pCompiler, TCHAR *pszCode);
-       virtual ~NXSL_Lexer();
-
-   virtual int yylex(void);
-   void SetLvalPtr(YYSTYPE *plval) { m_plval = plval; }
-
-   int GetCurrLine(void) { return m_nCurrLine; }
-
-   void SetErrorState(void) { m_bErrorState = TRUE; }
-   BOOL IsErrorState(void) { return m_bErrorState; }
-};
-
-
-//
-// Compiler class
-//
-
-class NXSL_Compiler
-{
-protected:
-   TCHAR *m_pszErrorText;
-   NXSL_Lexer *m_pLexer;
-
-public:
-   NXSL_Compiler(void);
-   ~NXSL_Compiler();
-
-   NXSL_Program *Compile(TCHAR *pszSourceCode);
-   void Error(const char *pszMsg);
-
-   TCHAR *GetErrorText(void) { return CHECK_NULL(m_pszErrorText); }
-};
-
-
 #endif
index 42869ce..d2b3d98 100644 (file)
@@ -181,6 +181,10 @@ SOURCE=..\..\include\nxsl.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\include\nxsl_classes.h
+# End Source File
+# Begin Source File
+
 SOURCE=.\parser.tab.hpp
 # End Source File
 # Begin Source File
index 4c3d217..1d0fbc4 100644 (file)
@@ -39,7 +39,6 @@ union YYSTYPE;
 
 #define INVALID_ADDRESS    ((DWORD)0xFFFFFFFF)
 #define MAX_STRING_SIZE    8192
-#define MAX_FUNCTION_NAME  64
 
 
 //
@@ -87,253 +86,6 @@ union YYSTYPE;
 
 
 //
-// Value flags
-//
-
-#define VALUE_IS_NULL         ((DWORD)0x0001)
-#define VALUE_STRING_IS_VALID ((DWORD)0x0002)
-#define VALUE_IS_NUMERIC      ((DWORD)0x0004)
-#define VALUE_IS_REAL         ((DWORD)0x0008)
-
-
-//
-// Function structure
-//
-
-struct NXSL_Function
-{
-   char m_szName[MAX_FUNCTION_NAME];
-   DWORD m_dwAddr;
-};
-
-
-//
-// External function structure
-//
-
-class NXSL_Value;
-
-struct NXSL_ExtFunction
-{
-   char m_szName[MAX_FUNCTION_NAME];
-   int (* m_pfHandler)(int argc, NXSL_Value **argv, NXSL_Value **ppResult);
-   int m_iNumArgs;   // Number of arguments or -1 fo variable number
-};
-
-
-//
-// Environment for NXSL program
-//
-
-class NXSL_Environment
-{
-private:
-   DWORD m_dwNumFunctions;
-   NXSL_ExtFunction *m_pFunctionList;
-
-   FILE *m_pStdIn;
-   FILE *m_pStdOut;
-
-public:
-   NXSL_Environment();
-   ~NXSL_Environment();
-
-   void SetIO(FILE *pIn, FILE *pOut) { m_pStdIn = pIn; m_pStdOut = pOut; }
-   FILE *GetStdIn(void) { return m_pStdIn; }
-   FILE *GetStdOut(void) { return m_pStdOut; }
-
-   NXSL_ExtFunction *FindFunction(char *pszName);
-};
-
-
-//
-// Simple stack class
-//
-
-class NXSL_Stack
-{
-private:
-   int m_nStackSize;
-   int m_nStackPos;
-   void **m_ppData;
-
-public:
-   NXSL_Stack(void);
-   ~NXSL_Stack();
-
-   void Push(void *pData);
-   void *Pop(void);
-   void *Peek(void);
-   void **PeekList(int nLevel) { return &m_ppData[m_nStackPos - nLevel]; }
-
-   int Size(void) { return m_nStackPos; }
-};
-
-
-//
-// Variable or constant value
-//
-
-class NXSL_Value
-{
-protected:
-   DWORD m_dwFlags;
-   DWORD m_dwStrLen;
-   char *m_pszValStr;
-   int m_iValInt;
-   double m_dValFloat;
-
-   void UpdateNumbers(void);
-   void UpdateString(void);
-
-public:
-   NXSL_Value(void);
-   NXSL_Value(NXSL_Value *);
-   NXSL_Value(int nValue);
-   NXSL_Value(double dValue);
-   NXSL_Value(char *pszValue);
-   ~NXSL_Value();
-
-   BOOL IsNull(void) { return (m_dwFlags & VALUE_IS_NULL) ? TRUE : FALSE; }
-   BOOL IsNumeric(void) { return (m_dwFlags & VALUE_IS_NUMERIC) ? TRUE : FALSE; }
-   BOOL IsReal(void) { return (m_dwFlags & VALUE_IS_REAL) ? TRUE : FALSE; }
-   char *GetValueAsString(DWORD *pdwLen);
-   char *GetValueAsCString(void);
-   int GetValueAsInt(void);
-   double GetValueAsReal(void);
-
-   void Concatenate(char *pszString, DWORD dwLen);
-   void Increment(void);
-   void Decrement(void);
-   void Negate(void);
-   void Set(int nValue);
-};
-
-
-//
-// Runtime variable information
-//
-
-class NXSL_Variable
-{
-protected:
-   TCHAR *m_pszName;
-   NXSL_Value *m_pValue;
-
-public:
-   NXSL_Variable(TCHAR *pszName);
-   NXSL_Variable(TCHAR *pszName, NXSL_Value *pValue);
-   NXSL_Variable(NXSL_Variable *pSrc);
-   ~NXSL_Variable();
-
-   TCHAR *Name(void) { return m_pszName; }
-   NXSL_Value *Value(void) { return m_pValue; }
-   void Set(NXSL_Value *pValue);
-};
-
-
-//
-// Varable system
-//
-
-class NXSL_VariableSystem
-{
-protected:
-   DWORD m_dwNumVariables;
-   NXSL_Variable **m_ppVariableList;
-
-public:
-   NXSL_VariableSystem(void);
-   NXSL_VariableSystem(NXSL_VariableSystem *pSrc);
-   ~NXSL_VariableSystem();
-
-   NXSL_Variable *Find(TCHAR *pszName);
-   NXSL_Variable *Create(TCHAR *pszName, NXSL_Value *pValue = NULL);
-};
-
-
-//
-// Single execution instruction
-//
-
-class NXSL_Instruction
-{
-   friend class NXSL_Program;
-
-protected:
-   int m_nOpCode;
-   union
-   {
-      NXSL_Value *m_pConstant;
-      char *m_pszString;
-      DWORD m_dwAddr;
-   } m_operand;
-   int m_nStackItems;
-   int m_nSourceLine;
-
-public:
-   NXSL_Instruction(int nLine, int nOpCode);
-   NXSL_Instruction(int nLine, int nOpCode, NXSL_Value *pValue);
-   NXSL_Instruction(int nLine, int nOpCode, char *pszString);
-   NXSL_Instruction(int nLine, int nOpCode, char *pszString, int nStackItems);
-   NXSL_Instruction(int nLine, int nOpCode, DWORD dwAddr);
-   NXSL_Instruction(int nLine, int nOpCode, int nStackItems);
-   ~NXSL_Instruction();
-};
-
-
-//
-// Class representing compiled NXSL program
-//
-
-class NXSL_Program
-{
-protected:
-   NXSL_Environment *m_pEnv;
-
-   NXSL_Instruction **m_ppInstructionSet;
-   DWORD m_dwCodeSize;
-   DWORD m_dwCurrPos;
-
-   DWORD m_dwSubLevel;
-   NXSL_Stack *m_pDataStack;
-   NXSL_Stack *m_pCodeStack;
-   int m_nBindPos;
-
-   NXSL_VariableSystem *m_pConstants;
-   NXSL_VariableSystem *m_pGlobals;
-   NXSL_VariableSystem *m_pLocals;
-
-   DWORD m_dwNumFunctions;
-   NXSL_Function *m_pFunctionList;
-
-   int m_nErrorCode;
-   TCHAR *m_pszErrorText;
-
-   void Execute(void);
-   void DoUnaryOperation(int nOpCode);
-   void DoBinaryOperation(int nOpCode);
-   void Error(int nError);
-
-   NXSL_Variable *FindOrCreateVariable(TCHAR *pszName);
-
-public:
-   NXSL_Program(void);
-   ~NXSL_Program();
-
-   BOOL AddFunction(char *pszName, DWORD dwAddr, char *pszError);
-   void ResolveFunctions(void);
-   void AddInstruction(NXSL_Instruction *pInstruction);
-   void ResolveLastJump(int nOpCode);
-
-   int Run(NXSL_Environment *pEnv);
-
-   void Dump(FILE *pFile);
-   TCHAR *GetErrorText(void) { return m_pszErrorText; }
-};
-
-
-//
 // Modified lexer class
 //
 
index 7bfc872..7e75a5e 100644 (file)
@@ -518,11 +518,14 @@ void NXSL_Program::Execute(void)
             char *pszText;
             DWORD dwLen;
 
-            pszText = pValue->GetValueAsString(&dwLen);
-            if (pszText != NULL)
-               fwrite(pszText, dwLen, 1, stdout);
-            else
-               fputs("(null)", stdout);
+            if (m_pEnv->GetStdOut() != NULL)
+            {
+               pszText = pValue->GetValueAsString(&dwLen);
+               if (pszText != NULL)
+                  fwrite(pszText, dwLen, 1, m_pEnv->GetStdOut());
+               else
+                  fputs("(null)", m_pEnv->GetStdOut());
+            }
             delete pValue;
          }
          else
index d6f9c79..d4cfc11 100644 (file)
@@ -65,7 +65,8 @@ int main(int argc, char *argv[])
 {
    char *pszSource, szError[1024];
    DWORD dwSize;
-   NXSL_SCRIPT hScript;
+   NXSL_Program *pScript;
+   NXSL_Environment *pEnv;
 
    printf("NetXMS Scripting Host  Version " NETXMS_VERSION_STRING "\n"
           "Copyright (c) 2005 Victor Kirhenshtein\n\n");
@@ -77,15 +78,17 @@ int main(int argc, char *argv[])
    }
 
    pszSource = LoadFile(argv[1], &dwSize);
-   hScript = NXSLCompile(pszSource, szError, 1024);
-   if (hScript != NULL)
+   pScript = (NXSL_Program *)NXSLCompile(pszSource, szError, 1024);
+   if (pScript != NULL)
    {
-      NXSLDump(hScript, stdout);
-      if (NXSLRun(hScript) == -1)
+      pScript->Dump(stdout);
+      pEnv = new NXSL_Environment;
+      pEnv->SetIO(stdin, stdout);
+      if (pScript->Run(pEnv) == -1)
       {
-         printf("%s\n", NXSLGetRuntimeError(hScript));
+         printf("%s\n", pScript->GetErrorText());
       }
-      NXSLDestroy(hScript);
+      delete pScript;
    }
    else
    {
index a5fbfd7..efec052 100644 (file)
@@ -129,6 +129,10 @@ SOURCE=..\..\include\nxsl.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\include\nxsl_classes.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\include\unicode.h
 # End Source File
 # End Group