fixed WIndows build error; minor MIB compiler refactoring
authorVictor Kirhenshtein <victor@netxms.org>
Wed, 10 May 2017 15:57:43 +0000 (18:57 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Wed, 10 May 2017 15:57:43 +0000 (18:57 +0300)
include/nms_util.h
src/libnetxms/dir.cpp
src/libnetxms/dirw.cpp
src/snmp/nxmibc/mibparse.cpp
src/snmp/nxmibc/mibparse.h
src/snmp/nxmibc/nxmibc.cpp
src/snmp/nxmibc/parser.y

index be35451..aa74c2c 100644 (file)
@@ -1650,9 +1650,14 @@ typedef struct __CODE_TO_TEXT
 
 #ifdef _WIN32
 
+#define DT_UNKNOWN   0
+#define DT_REG       1
+#define DT_DIR       2
+
 typedef struct dirent
 {
    long            d_ino;  /* inode number (not used by MS-DOS) */
+   unsigned char   d_type; /* file type */
    int             d_namlen;       /* Name length */
    char            d_name[MAX_PATH];    /* file name */
 } _DIRECT;
@@ -1668,6 +1673,7 @@ typedef struct _dir_struc
 typedef struct dirent_w
 {
    long            d_ino;  /* inode number (not used by MS-DOS) */
+   unsigned char   d_type; /* file type */
    int             d_namlen;       /* Name length */
    WCHAR           d_name[MAX_PATH];    /* file name */
 } _DIRECTW;
index fd361a4..7d2410b 100644 (file)
@@ -71,6 +71,7 @@ DIR LIBNETXMS_EXPORTABLE *opendir(const char *path)
 
    p->handle = handle;
    p->dirstr.d_ino = 0;
+   p->dirstr.d_type = (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? DT_DIR : DT_REG;
    strncpy_s(p->dirstr.d_name, MAX_PATH, fd.cFileName, _TRUNCATE);
    p->dirstr.d_namlen = (int)strlen(p->dirstr.d_name);
    return p;
@@ -96,6 +97,7 @@ struct dirent LIBNETXMS_EXPORTABLE *readdir(DIR *p)
       return NULL;
 
    p->dirstr.d_ino++;
+   p->dirstr.d_type = (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? DT_DIR : DT_REG;
    strncpy_s(p->dirstr.d_name, MAX_PATH, fd.cFileName, _TRUNCATE);
    p->dirstr.d_namlen = (int)strlen(p->dirstr.d_name);
    return &p->dirstr;
index 9ee12ad..764c6e1 100644 (file)
@@ -71,6 +71,7 @@ DIRW LIBNETXMS_EXPORTABLE *wopendir(const WCHAR *path)
 
    p->handle = handle;
    p->dirstr.d_ino = 0;
+   p->dirstr.d_type = (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? DT_DIR : DT_REG;
    wcsncpy_s(p->dirstr.d_name, MAX_PATH, fd.cFileName, _TRUNCATE);
    p->dirstr.d_namlen = (int)wcslen(p->dirstr.d_name);
    return p;
@@ -96,6 +97,7 @@ struct dirent_w LIBNETXMS_EXPORTABLE *wreaddir(DIRW *p)
       return NULL;
 
    p->dirstr.d_ino++;
+   p->dirstr.d_type = (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? DT_DIR : DT_REG;
    wcsncpy_s(p->dirstr.d_name, MAX_PATH, fd.cFileName, _TRUNCATE);
    p->dirstr.d_namlen = (int)wcslen(p->dirstr.d_name);
    return &p->dirstr;
index 586b4c6..3d36cde 100644 (file)
@@ -384,17 +384,18 @@ static void BuildMIBTree(SNMP_MIBObject *pRoot, MP_MODULE *pModule)
 /**
  * Interface to parser
  */
-int ParseMIBFiles(int nNumFiles, char **ppszFileList, SNMP_MIBObject **ppRoot)
+int ParseMIBFiles(StringList *fileList, SNMP_MIBObject **ppRoot)
 {
    int i, nRet;
    SNMP_MIBObject *pRoot;
 
    _tprintf(_T("Parsing source files:\n"));
    ObjectArray<MP_MODULE> *pModuleList = new ObjectArray<MP_MODULE>(16, 16, true);
-   for(i = 0; i < nNumFiles; i++)
+   for(i = 0; i < fileList->size(); i++)
    {
-      _tprintf(_T("   %hs\n"), ppszFileList[i]);
-      MP_MODULE *pModule = ParseMIB(ppszFileList[i]);
+      const TCHAR *file = fileList->get(i);
+      _tprintf(_T("   %s\n"), file);
+      MP_MODULE *pModule = ParseMIB(file);
       if (pModule == NULL)
       {
          nRet = SNMP_MPE_PARSE_ERROR;
index 6d9f5f5..4cc9f0c 100644 (file)
@@ -211,7 +211,7 @@ extern "C" {
 #endif
 
 void InitStateStack();
-MP_MODULE *ParseMIB(char *pszFilename);
+MP_MODULE *ParseMIB(const TCHAR *fileName);
 
 #ifdef __cplusplus
 }
index b5a1db6..ebb23c9 100644 (file)
 /**
  * Externals
  */
-int ParseMIBFiles(int nNumFiles, char **ppszFileList, SNMP_MIBObject **ppRoot);
+int ParseMIBFiles(StringList *fileList, SNMP_MIBObject **ppRoot);
 
 /**
  * Static data
  */
 static char m_szOutFile[MAX_PATH] = "netxms.mib";
-static int m_iNumFiles = 0;
-static char **m_ppFileList = NULL;
+static StringList s_fileList;
 static bool s_pauseBeforeExit = false;
 
 /**
@@ -123,45 +122,35 @@ static void Help()
 }
 
 /**
- * Add file to compilation list
- */
-static void AddFileToList(char *pszFile)
-{
-   m_ppFileList = (char **)realloc(m_ppFileList, sizeof(char *) * (m_iNumFiles + 1));
-   m_ppFileList[m_iNumFiles++] = strdup(pszFile);
-}
-
-/**
  * Scan directory for MIB files
  */
-static void ScanDirectory(const char *pszPath, const char *extensions, bool recursive)
+static void ScanDirectory(const TCHAR *path, const StringSet *extensions, bool recursive)
 {
-   DIR *pDir;
-   struct dirent *pFile;
-   char szBuffer[MAX_PATH];
-
-   pDir = opendir(pszPath);
+   _TDIR *pDir = _topendir(path);
    if (pDir != NULL)
    {
-      while(1)
+      while(true)
       {
-         pFile = readdir(pDir);
+         struct _tdirent *pFile = _treaddir(pDir);
          if (pFile == NULL)
             break;
-         if (strcmp(pFile->d_name, ".") && strcmp(pFile->d_name, ".."))
+         if (_tcscmp(pFile->d_name, _T(".")) && _tcscmp(pFile->d_name, _T("..")))
          {
-            snprintf(szBuffer, MAX_PATH, "%s" FS_PATH_SEPARATOR_A "%s", pszPath, pFile->d_name);
-            if (recursive && pFile->d_type == DT_DIR)
+            TCHAR szBuffer[MAX_PATH];
+            _sntprintf(szBuffer, MAX_PATH, _T("%s") FS_PATH_SEPARATOR _T("%s"), path, pFile->d_name);
+            if (recursive && (pFile->d_type == DT_DIR))
+            {
                ScanDirectory(szBuffer, extensions, recursive);
+            }
             else
             {
-               char *extension = strrchr(pFile->d_name, '.');
-               if ((extension != NULL) && (strstr(extensions, extension) != NULL))
-                  AddFileToList(szBuffer);
+               TCHAR *extension = _tcsrchr(pFile->d_name, _T('.'));
+               if ((extension != NULL) && extensions->contains(extension + 1))
+                  s_fileList.add(szBuffer);
             }
          }
       }
-      closedir(pDir);
+      _tclosedir(pDir);
    }
 }
 
@@ -170,8 +159,6 @@ static void ScanDirectory(const char *pszPath, const char *extensions, bool recu
  */
 int main(int argc, char *argv[])
 {
-   char paths[24][MAX_PATH];
-   char extensions[64] = ".txt ";
    bool recursive = false;
    bool scanDir = false;
    SNMP_MIBObject *pRoot;
@@ -183,30 +170,33 @@ int main(int argc, char *argv[])
    _tprintf(_T("NetXMS MIB Compiler  Version ") NETXMS_VERSION_STRING _T(" (") NETXMS_BUILD_TAG _T(")\n")
             _T("Copyright (c) 2005-2017 Raden Solutions\n\n"));
 
+   StringList paths;
+   StringSet extensions;
+   extensions.add(_T("txt"));
+
    // Parse command line
    opterr = 1;
-   int index = 0;
    while((ch = getopt(argc, argv, "rd:ho:e:Psz")) != -1)
    {
       switch(ch)
       {
          case 'e':
-         {
-            char buffer[8];
-            snprintf(buffer, 8, ".%s ", optarg);
-            strcat(extensions, buffer);
-         }
+#ifdef UNICODE
+            extensions.addPreallocated(WideStringFromMBStringSysLocale(optarg));
+#else
+            extensions.add(optarg);
+#endif
             break;
          case 'h':   // Display help and exit
             Help();
             break;
          case 'd':
-         {
-            char buffer[MAX_PATH];
-            strncpy(paths[index], optarg, MAX_PATH);
+#ifdef UNICODE
+            paths.addPreallocated(_wcslwr(WideStringFromMBStringSysLocale(optarg)));
+#else
+            paths.add(strlwr(optarg));
+#endif
             scanDir = true;
-            index++;
-         }
             break;
          case 'o':
             strncpy(m_szOutFile, optarg, MAX_PATH);
@@ -233,18 +223,24 @@ int main(int argc, char *argv[])
 
    if (scanDir)
    {
-      for(int i = 0; i < index; i++)
+      for(int i = 0; i < paths.size(); i++)
       {
-         ScanDirectory(paths[i], extensions, recursive);
+         ScanDirectory(paths.get(i), &extensions, recursive);
       }
    }
 
    for(i = optind; i < argc; i++)
-      AddFileToList(argv[i]);
-   
-   if (m_iNumFiles > 0)
    {
-      ParseMIBFiles(m_iNumFiles, m_ppFileList, &pRoot);
+#ifdef UNICODE
+      s_fileList.addPreallocated(WideStringFromMBStringSysLocale(argv[i]));
+#else
+      s_fileList.add(argv[i]);
+#endif
+   }
+
+   if (s_fileList.size() > 0)
+   {
+      ParseMIBFiles(&s_fileList, &pRoot);
 
       if (pRoot != NULL)
       {
index affae49..13a3745 100644 (file)
@@ -70,7 +70,11 @@ extern FILE *mpin, *mpout;
 extern int g_nCurrLine;
 
 static MP_MODULE *m_pModule;
-static char *m_pszCurrentFilename;
+#ifdef UNICODE
+static char s_currentFilename[MAX_PATH];
+#else
+static const char *s_currentFilename;
+#endif
 
 int mperror(const char *pszMsg);
 int mplex(void);
@@ -1421,13 +1425,17 @@ Begin:
 
 %%
 
-MP_MODULE *ParseMIB(char *pszFilename)
+MP_MODULE *ParseMIB(const TCHAR *fileName)
 {
    m_pModule = NULL;
-   mpin = fopen(pszFilename, "r");
+   mpin = _tfopen(fileName, _T("r"));
    if (mpin != NULL)
    {
-          m_pszCurrentFilename = pszFilename;
+#ifdef UNICODE
+         WideCharToMultiByte(CP_ACP, WC_DEFAULTCHAR |WC_COMPOSITECHECK, fileName, -1, s_currentFilename, MAX_PATH, NULL, NULL);
+#else
+         s_currentFilename = fileName;
+#endif
       g_nCurrLine = 1;
       InitStateStack();
       /*mpdebug=1;*/
@@ -1437,7 +1445,13 @@ MP_MODULE *ParseMIB(char *pszFilename)
    }
    else
    {
-      Error(ERR_CANNOT_OPEN_FILE, pszFilename, strerror(errno));
+#ifdef UNICODE
+      char *name = MBStringFromWideString(fileName);
+      Error(ERR_CANNOT_OPEN_FILE, name, strerror(errno));
+      free(name);
+#else
+      Error(ERR_CANNOT_OPEN_FILE, fileName, strerror(errno));
+#endif
       return NULL;
    }
    return m_pModule;
@@ -1450,6 +1464,6 @@ extern "C" int mpwrap()
 
 int mperror(const char *pszMsg)
 {
-   Error(ERR_PARSER_ERROR, m_pszCurrentFilename, pszMsg, g_nCurrLine);
+   Error(ERR_PARSER_ERROR, s_currentFilename, pszMsg, g_nCurrLine);
    return 0;
 }