Preliminary grammar for scripting language
authorVictor Kirhenshtein <victor@netxms.org>
Sun, 11 Dec 2005 23:46:19 +0000 (23:46 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Sun, 11 Dec 2005 23:46:19 +0000 (23:46 +0000)
15 files changed:
.gitattributes
include/nxsl.h [new file with mode: 0644]
src/libnxsl/compiler.cpp [new file with mode: 0644]
src/libnxsl/lexer.cpp [new file with mode: 0644]
src/libnxsl/libnxsl.dsp [new file with mode: 0644]
src/libnxsl/libnxsl.dsw [new file with mode: 0644]
src/libnxsl/libnxsl.h [new file with mode: 0644]
src/libnxsl/main.cpp [new file with mode: 0644]
src/libnxsl/parser.l [new file with mode: 0644]
src/libnxsl/parser.y [new file with mode: 0644]
src/libnxsl/program.cpp [new file with mode: 0644]
src/nxscript/nxscript.cpp [new file with mode: 0644]
src/nxscript/nxscript.dsp [new file with mode: 0644]
src/nxscript/nxscript.dsw [new file with mode: 0644]
src/nxscript/nxscript.h [new file with mode: 0644]

index 29546c3..7abf6e3 100644 (file)
@@ -161,6 +161,7 @@ include/nximage.h -text
 include/nxlog.h -text
 include/nxnt.h -text
 include/nxqueue.h -text
+include/nxsl.h -text
 include/nxsnmp.h -text
 include/nxtools.h -text
 include/nxwinui.h -text
@@ -789,6 +790,15 @@ src/libnxcl/server.cpp -text
 src/libnxcl/session.cpp -text
 src/libnxcl/snmptrap.cpp -text
 src/libnxcl/users.cpp -text
+src/libnxsl/compiler.cpp -text
+src/libnxsl/lexer.cpp -text
+src/libnxsl/libnxsl.dsp -text
+src/libnxsl/libnxsl.dsw -text
+src/libnxsl/libnxsl.h -text
+src/libnxsl/main.cpp -text
+src/libnxsl/parser.l -text
+src/libnxsl/parser.y -text
+src/libnxsl/program.cpp -text
 src/libnxsnmp/Makefile.am -text
 src/libnxsnmp/ber.cpp -text
 src/libnxsnmp/libnxsnmp.dsp -text
@@ -823,6 +833,10 @@ src/nxreport/nxreport.cpp -text
 src/nxreport/nxreport.dsp -text
 src/nxreport/nxreport.dsw -text
 src/nxreport/nxreport.h -text
+src/nxscript/nxscript.cpp -text
+src/nxscript/nxscript.dsp -text
+src/nxscript/nxscript.dsw -text
+src/nxscript/nxscript.h -text
 src/server/Makefile.am -text
 src/server/core/.cvsignore -text
 src/server/core/Makefile.am -text
diff --git a/include/nxsl.h b/include/nxsl.h
new file mode 100644 (file)
index 0000000..a8af7b9
--- /dev/null
@@ -0,0 +1,59 @@
+/* 
+** NetXMS - Network Management System
+** Copyright (C) 2005 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
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: nxsl.h
+**
+**/
+
+#ifndef _nxsl_h_
+#define _nxsl_h_
+
+#ifdef _WIN32
+#ifdef LIBNXSL_EXPORTS
+#define LIBNXSL_EXPORTABLE __declspec(dllexport)
+#else
+#define LIBNXSL_EXPORTABLE __declspec(dllimport)
+#endif
+#else    /* _WIN32 */
+#define LIBNXSL_EXPORTABLE
+#endif
+
+
+//
+// Class representing compiled NXSL program
+//
+
+class LIBNXSL_EXPORTABLE NXSL_Program
+{
+public:
+   NXSL_Program(void);
+   ~NXSL_Program();
+
+   int Run(void);
+};
+
+
+//
+// Functions
+//
+
+NXSL_Program LIBNXSL_EXPORTABLE *NXSLCompileScript(TCHAR *pszSource,
+                                                   TCHAR *pszError, int nBufSize);
+
+
+#endif
diff --git a/src/libnxsl/compiler.cpp b/src/libnxsl/compiler.cpp
new file mode 100644 (file)
index 0000000..a6a78e0
--- /dev/null
@@ -0,0 +1,107 @@
+/* 
+** NetXMS - Network Management System
+** NetXMS Scripting Language Interpreter
+** Copyright (C) 2005 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
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: compiler.cpp
+**
+**/
+
+#include "libnxsl.h"
+
+
+//
+// Externals
+//
+
+extern "C" int yyparse(void *, void *);
+extern "C" int yydebug;
+
+
+//
+// Constructor
+//
+
+NXSL_Compiler::NXSL_Compiler(void)
+{
+   m_pszErrorText = NULL;
+   m_pLexer = NULL;
+}
+
+
+//
+// Destructor
+//
+
+NXSL_Compiler::~NXSL_Compiler()
+{
+   safe_free(m_pszErrorText);
+   delete m_pLexer;
+}
+
+
+//
+// Error handler
+//
+
+void NXSL_Compiler::Error(const char *pszMsg)
+{
+   char szText[1024];
+
+   snprintf(szText, 1024, "Error in line %d: %s", m_pLexer->GetCurrLine(), pszMsg);
+   safe_free(m_pszErrorText);
+#ifdef UNICODE
+   nLen = strlen(szText) + 1;
+   m_pszErrorText = (WCHAR *)malloc(nLen * sizeof(WCHAR));
+   MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szText,
+                       -1, m_pszErrorText, nLen, NULL, NULL);
+#else
+   m_pszErrorText = strdup(szText);
+#endif
+}
+
+
+//
+// Compile source code
+//
+
+NXSL_Program *NXSL_Compiler::Compile(TCHAR *pszSourceCode)
+{
+   NXSL_Program *pResult;
+
+   m_pLexer = new NXSL_Lexer(this, pszSourceCode);
+yydebug=1;
+   if (yyparse(m_pLexer, this) == 0)
+   {
+      pResult = new NXSL_Program;
+   }
+   else
+   {
+      pResult = NULL;
+   }
+   return pResult;
+}
+
+
+//
+// yyerror() for parser
+//
+
+extern "C" void yyerror(void *pLexer, void *pCompiler, char *pszText)
+{
+   ((NXSL_Compiler *)pCompiler)->Error(pszText);
+}
diff --git a/src/libnxsl/lexer.cpp b/src/libnxsl/lexer.cpp
new file mode 100644 (file)
index 0000000..ccbb5ea
--- /dev/null
@@ -0,0 +1,99 @@
+/* 
+** NetXMS - Network Management System
+** NetXMS Scripting Language Interpreter
+** Copyright (C) 2005 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
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: lexer.cpp
+**
+**/
+
+#include "libnxsl.h"
+#include "parser.tab.h"
+
+
+//
+// Constructor for our lexer class
+//
+
+NXSL_Lexer::NXSL_Lexer(NXSL_Compiler *pCompiler, TCHAR *pszCode)
+           :yyFlexLexer(NULL, NULL)
+{
+#ifdef UNICODE
+   m_nSourceSize = wcslen(pszCode);
+   m_pszSourceCode = (char *)malloc(m_nSourceSize + 1);
+   WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK | WC_DEFAULTCHAR, pszCode,
+                       -1, m_pszSourceCode, m_nSourceSize + 1, NULL, NULL);
+#else
+   m_pszSourceCode = strdup(pszCode);
+   m_nSourceSize = strlen(pszCode);
+#endif
+   m_nCurrLine = 1;
+   m_nSourcePos = 0;
+   m_pCompiler = pCompiler;
+}
+
+
+//
+// Destructor
+//
+
+NXSL_Lexer::~NXSL_Lexer()
+{
+   safe_free(m_pszSourceCode);
+}
+
+
+//
+// Alternative input method
+//
+
+int NXSL_Lexer::LexerInput(char *pBuffer, int nMaxSize)
+{
+   int nBytes;
+
+   if (m_nSourcePos < m_nSourceSize)
+   {
+      nBytes = min(nMaxSize, m_nSourceSize - m_nSourcePos);
+      memcpy(pBuffer, &m_pszSourceCode[m_nSourcePos], nBytes);
+      m_nSourcePos += nBytes;
+   }
+   else
+   {
+      nBytes = 0;   // EOF
+   }
+   return nBytes;
+}
+
+
+//
+// Overrided error handler
+//
+
+void NXSL_Lexer::LexerError(const char *pszMsg)
+{
+   m_pCompiler->Error(pszMsg);
+}
+
+
+//
+// yylex() for Bison
+//
+
+extern "C" int yylex(YYSTYPE *lvalp, void *pLexer)
+{
+   return ((NXSL_Lexer *)pLexer)->yylex();
+}
diff --git a/src/libnxsl/libnxsl.dsp b/src/libnxsl/libnxsl.dsp
new file mode 100644 (file)
index 0000000..8b12ad3
--- /dev/null
@@ -0,0 +1,238 @@
+# Microsoft Developer Studio Project File - Name="libnxsl" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libnxsl - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "libnxsl.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "libnxsl.mak" CFG="libnxsl - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "libnxsl - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libnxsl - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "libnxsl - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBNXSL_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBNXSL_EXPORTS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+
+!ELSEIF  "$(CFG)" == "libnxsl - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBNXSL_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBNXSL_EXPORTS" /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy files
+PostBuild_Cmds=copy Debug\libnxsl.dll ..\..\bin
+# End Special Build Tool
+
+!ENDIF 
+
+# Begin Target
+
+# Name "libnxsl - Win32 Release"
+# Name "libnxsl - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\compiler.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\lex.yy.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\lexer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\main.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\parser.tab.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\program.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\libnxsl.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\include\netxms-regex.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\include\netxms-version.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\nms_common.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\nms_threads.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\nms_util.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\nxqueue.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\nxsl.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\parser.tab.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\unicode.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# Begin Group "Parser Files"
+
+# PROP Default_Filter "l;y"
+# Begin Source File
+
+SOURCE=.\parser.l
+
+!IF  "$(CFG)" == "libnxsl - Win32 Release"
+
+# Begin Custom Build - Compiling $(InputPath)
+InputPath=.\parser.l
+
+"lex.yy.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       flex -Bf8+ -olex.yy.cpp $(InputPath)
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "libnxsl - Win32 Debug"
+
+# Begin Custom Build - Compiling $(InputPath)
+InputPath=.\parser.l
+
+"lex.yy.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       flex -Bf8+ -olex.yy.cpp $(InputPath)
+
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\parser.y
+
+!IF  "$(CFG)" == "libnxsl - Win32 Release"
+
+# Begin Custom Build - Compiling $(InputPath)
+InputPath=.\parser.y
+
+BuildCmds= \
+       bison -b parser -d -t -v $(InputPath)
+
+"parser.tab.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+   $(BuildCmds)
+
+"parser.tab.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+   $(BuildCmds)
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "libnxsl - Win32 Debug"
+
+# Begin Custom Build - Compiling $(InputPath)
+InputPath=.\parser.y
+
+BuildCmds= \
+       bison -b parser -d -t -v $(InputPath)
+
+"parser.tab.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+   $(BuildCmds)
+
+"parser.tab.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+   $(BuildCmds)
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/src/libnxsl/libnxsl.dsw b/src/libnxsl/libnxsl.dsw
new file mode 100644 (file)
index 0000000..6827bc0
--- /dev/null
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "libnxsl"=.\libnxsl.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/src/libnxsl/libnxsl.h b/src/libnxsl/libnxsl.h
new file mode 100644 (file)
index 0000000..342bf86
--- /dev/null
@@ -0,0 +1,84 @@
+/* 
+** NetXMS - Network Management System
+** NetXMS Scripting Language Interpreter
+** Copyright (C) 2005 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
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: libnxsl.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>
+
+
+//
+// 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;
+
+       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);
+
+   int GetCurrLine(void) { return m_nCurrLine; }
+};
+
+
+//
+// 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
diff --git a/src/libnxsl/main.cpp b/src/libnxsl/main.cpp
new file mode 100644 (file)
index 0000000..213378a
--- /dev/null
@@ -0,0 +1,59 @@
+/* 
+** NetXMS - Network Management System
+** NetXMS Scripting Language Interpreter
+** Copyright (C) 2005 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
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: main.cpp
+**
+**/
+
+#include "libnxsl.h"
+
+
+//
+// Interface to compiler
+//
+
+NXSL_Program LIBNXSL_EXPORTABLE *NXSLCompileScript(TCHAR *pszSource,
+                                                   TCHAR *pszError, int nBufSize)
+{
+   NXSL_Compiler compiler;
+   NXSL_Program *pResult;
+
+   pResult = compiler.Compile(pszSource);
+   if (pResult == NULL)
+   {
+      nx_strncpy(pszError, compiler.GetErrorText(), nBufSize);
+   }
+   return pResult;
+}
+
+
+//
+// DLL entry point
+//
+
+#ifdef _WIN32
+
+BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
+{
+   if (dwReason == DLL_PROCESS_ATTACH)
+      DisableThreadLibraryCalls(hInstance);
+   return TRUE;
+}
+
+#endif   /* _WIN32 */
diff --git a/src/libnxsl/parser.l b/src/libnxsl/parser.l
new file mode 100644 (file)
index 0000000..87cdbee
--- /dev/null
@@ -0,0 +1,54 @@
+%option noyywrap
+%option yyclass="NXSL_Lexer"
+
+%x COMMENT
+
+whitespace     [[:blank:]\t]+
+identifier     [A-Za-z_][A-Za-z_0-9]*
+integer                [0-9]+
+
+%{
+
+#include "libnxsl.h"
+#include "parser.tab.h"
+
+%}
+
+%%
+
+<INITIAL>"else"                return T_ELSE;
+<INITIAL>"if"          return T_IF;
+<INITIAL>"return"      return T_RETURN;
+<INITIAL>"sub"         return T_SUB;
+
+<INITIAL>{identifier}  { return T_IDENTIFIER; }
+<INITIAL>{integer}     { return T_INTEGER; }
+
+<INITIAL>"=="  return T_EQ;
+<INITIAL>"!="  return T_NE;
+<INITIAL>"<="  return T_LE;
+<INITIAL>">="  return T_GE;
+<INITIAL>"<<"  return T_LSHIFT;
+<INITIAL>">>"  return T_RSHIFT;
+<INITIAL>"{"   return '{';
+<INITIAL>"}"   return '}';
+<INITIAL>"("   return '(';
+<INITIAL>")"   return ')';
+<INITIAL>";"   return ';';
+<INITIAL>"+"   return '+';
+<INITIAL>"-"   return '-';
+<INITIAL>"*"   return '*';
+<INITIAL>"/"   return '/';
+<INITIAL>"%"   return '%';
+<INITIAL>"="   return '=';
+<INITIAL>"!"   return '!';
+<INITIAL>"^"   return '^';
+<INITIAL>"~"   return '~';
+<INITIAL>\n    m_nCurrLine++;
+<INITIAL>{whitespace}  ;
+
+<INITIAL>"/*"  { m_nCommentLevel = 1; BEGIN COMMENT; }
+<COMMENT>"/*"  m_nCommentLevel++;
+<COMMENT>"*/"  { m_nCommentLevel--; if (m_nCommentLevel == 0) BEGIN INITIAL; }
+<COMMENT>\n    m_nCurrLine++;
+<COMMENT>.     ;
diff --git a/src/libnxsl/parser.y b/src/libnxsl/parser.y
new file mode 100644 (file)
index 0000000..4c4f371
--- /dev/null
@@ -0,0 +1,190 @@
+%{
+
+#define YYERROR_VERBOSE
+#define YYDEBUG                        1
+
+#include <nms_common.h>
+#include "parser.tab.h"
+
+void yyerror(void *pLexer, void *pCompiler, char *pszText);
+int yylex(YYSTYPE *lvalp, void *pLexer);
+
+%}
+
+%expect                1
+%pure-parser
+%lex-param     {void *pLexer}
+%parse-param   {void *pLexer}
+%parse-param   {void *pCompiler}
+
+%token T_ELSE
+%token T_FUNCTION
+%token T_IDENTIFIER
+%token T_IF
+%token T_INTEGER
+%token T_RETURN
+%token T_STRING
+%token T_SUB
+
+%left T_OR
+%left T_AND
+%left '|'
+%left '^'
+%left '&'
+%left T_NE T_EQ
+%left '<' T_LE '>' T_GE
+%left T_LSHIFT T_RSHIFT
+%left '+' '-'
+%left '*' '/' '%'
+%right '='
+%right T_INC T_DEC '!' '~'
+
+
+%%
+
+Script:
+       Module
+|      Expression
+;
+
+Module:
+       ModuleComponent Module
+|      ModuleComponent
+;
+
+ModuleComponent:
+       Function
+;
+
+Function:
+       T_SUB T_IDENTIFIER '(' ParameterDeclaration Block
+;
+
+ParameterDeclaration:
+       IdentifierList ')'
+|      ')'
+;
+
+IdentifierList:
+       T_IDENTIFIER ',' IdentifierList
+|      T_IDENTIFIER
+;
+
+Block:
+       '{' StatementList '}'
+|      '{' '}'
+;
+
+StatementList:
+       StatementOrBlock StatementList
+|      StatementOrBlock
+;      
+
+StatementOrBlock:
+       Statement
+|      Block
+;
+
+Statement:
+       Expression ';'
+|      BuiltinStatement
+|      ';'
+;
+
+Expression:
+       '(' Expression ')'
+|      T_IDENTIFIER '=' Expression
+|      UnaryOperation Expression
+|      Operand BinaryOperation Expression
+{
+printf("binary op: %d\n", $2);
+}
+|      Operand
+;
+
+Operand:
+       FunctionCall
+|      T_IDENTIFIER
+|      Constant
+;
+
+/*PrefixOperation:
+       IncrementOrDecrement
+|
+;
+
+PostfixOperation:
+       IncrementOrDecrement
+|
+;
+
+
+IncrementOrDecrement:
+       T_INC
+|      T_DEC
+;*/
+
+UnaryOperation:
+       '!'
+|      '~'
+|      '-'
+;
+
+BinaryOperation:
+       '+' { $$ = 1; }
+|      '-' { $$ = 3; }
+|      '*' { $$ = 2; }
+|      '/' { $$ = 4; }
+|      '%'
+|      T_EQ
+|      T_NE
+|      '<'
+|      T_LE
+|      '>'
+|      T_GE
+|      '&'
+|      '|'
+|      '^'
+|      T_AND
+|      T_OR
+|      T_LSHIFT
+|      T_RSHIFT
+;
+
+BuiltinStatement:
+       ReturnStatement ';'
+|      IfStatement
+;
+
+ReturnStatement:
+       T_RETURN Expression
+|      T_RETURN
+;
+
+IfStatement:
+       T_IF '(' Expression ')' {printf("if body\n"); } IfBody
+;
+
+IfBody:
+       StatementOrBlock
+|      StatementOrBlock ElseStatement
+;
+
+ElseStatement:
+       T_ELSE StatementOrBlock
+;
+
+FunctionCall:
+       T_IDENTIFIER '(' ParameterList ')'
+|      T_IDENTIFIER '(' ')'
+;
+
+ParameterList:
+       Expression ',' ParameterList
+|      Expression
+;
+
+Constant:
+       T_STRING
+|      T_INTEGER
+;
diff --git a/src/libnxsl/program.cpp b/src/libnxsl/program.cpp
new file mode 100644 (file)
index 0000000..74dc30f
--- /dev/null
@@ -0,0 +1,42 @@
+/* 
+** NetXMS - Network Management System
+** NetXMS Scripting Language Interpreter
+** Copyright (C) 2005 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
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: program.cpp
+**
+**/
+
+#include "libnxsl.h"
+
+
+//
+// Constructor
+//
+
+NXSL_Program::NXSL_Program(void)
+{
+}
+
+
+//
+// Destructor
+//
+
+NXSL_Program::~NXSL_Program(void)
+{
+}
diff --git a/src/nxscript/nxscript.cpp b/src/nxscript/nxscript.cpp
new file mode 100644 (file)
index 0000000..ac9ff0d
--- /dev/null
@@ -0,0 +1,82 @@
+/* 
+** NetXMS - Network Management System
+** NetXMS Scripting Host
+** Copyright (C) 2005 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
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: nxscript.cpp
+**
+**/
+
+#include "nxscript.h"
+
+
+static char *LoadFile(char *pszFileName, DWORD *pdwFileSize)
+{
+   int fd, iBufPos, iNumBytes, iBytesRead;
+   char *pBuffer = NULL;
+   struct stat fs;
+
+   fd = open(pszFileName, O_RDONLY | O_BINARY);
+   if (fd != -1)
+   {
+      if (fstat(fd, &fs) != -1)
+      {
+         pBuffer = (char *)malloc(fs.st_size + 1);
+         if (pBuffer != NULL)
+         {
+            *pdwFileSize = fs.st_size;
+            for(iBufPos = 0; iBufPos < fs.st_size; iBufPos += iBytesRead)
+            {
+               iNumBytes = min(16384, fs.st_size - iBufPos);
+               if ((iBytesRead = read(fd, &pBuffer[iBufPos], iNumBytes)) < 0)
+               {
+                  free(pBuffer);
+                  pBuffer = NULL;
+                  break;
+               }
+            }
+         }
+      }
+      close(fd);
+   }
+   return pBuffer;
+}
+
+
+//
+// main()
+//
+
+int main(int argc, char *argv[])
+{
+   char *pszSource, szError[1024];
+   DWORD dwSize;
+   NXSL_Program *pScript;
+
+   pszSource = LoadFile(argv[1], &dwSize);
+   pScript = NXSLCompileScript(pszSource, szError, 1024);
+   if (pScript != NULL)
+   {
+      printf("Compiled successfuly\n");
+      delete pScript;
+   }
+   else
+   {
+      printf("%s\n", szError);
+   }
+   return 0;
+}
diff --git a/src/nxscript/nxscript.dsp b/src/nxscript/nxscript.dsp
new file mode 100644 (file)
index 0000000..a5fbfd7
--- /dev/null
@@ -0,0 +1,140 @@
+# Microsoft Developer Studio Project File - Name="nxscript" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=nxscript - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "nxscript.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "nxscript.mak" CFG="nxscript - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "nxscript - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "nxscript - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "nxscript - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libnetxms.lib libnxsl.lib ws2_32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\libnetxms\Release" /libpath:"..\libnxsl\Release"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy files
+PostBuild_Cmds=copy Release\nxscript.exe C:\NetXMS\bin
+# End Special Build Tool
+
+!ELSEIF  "$(CFG)" == "nxscript - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libnetxms.lib libnxsl.lib ws2_32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\libnetxms\Debug" /libpath:"..\libnxsl\Debug"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy files
+PostBuild_Cmds=copy Debug\nxscript.exe ..\..\bin
+# End Special Build Tool
+
+!ENDIF 
+
+# Begin Target
+
+# Name "nxscript - Win32 Release"
+# Name "nxscript - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\nxscript.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\include\nms_common.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\nms_cscp.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\nms_threads.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\nms_util.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\nxscript.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\nxsl.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\unicode.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/src/nxscript/nxscript.dsw b/src/nxscript/nxscript.dsw
new file mode 100644 (file)
index 0000000..888328f
--- /dev/null
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "nxscript"=.\nxscript.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/src/nxscript/nxscript.h b/src/nxscript/nxscript.h
new file mode 100644 (file)
index 0000000..fc08772
--- /dev/null
@@ -0,0 +1,31 @@
+/* 
+** NetXMS - Network Management System
+** NetXMS Scripting Host
+** Copyright (C) 2005 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
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: nxscript.h
+**
+**/
+
+#ifndef _nxscript_h_
+#define _nxscript_h_
+
+#include <nms_common.h>
+#include <getopt.h>
+#include <nxsl.h>
+
+#endif