]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - libs/missing.h
Merge pull request #21 from merlin1991/Q3-gamepack-fix
[xonotic/netradiant.git] / libs / missing.h
index 298ef605b6bf3c99949e7e37c3734090c26c3125..2ba03d1404f8871818c733fef928bde63701722b 100644 (file)
@@ -1,32 +1,32 @@
 /*
-Copyright (c) 2001, Loki software, inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, 
-are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this list 
-of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice, this
-list of conditions and the following disclaimer in the documentation and/or
-other materials provided with the distribution.
-
-Neither the name of Loki software nor the names of its contributors may be used 
-to endorse or promote products derived from this software without specific prior 
-written permission. 
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' 
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY 
-DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
-*/
+   Copyright (c) 2001, Loki software, inc.
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without modification,
+   are permitted provided that the following conditions are met:
+
+   Redistributions of source code must retain the above copyright notice, this list
+   of conditions and the following disclaimer.
+
+   Redistributions in binary form must reproduce the above copyright notice, this
+   list of conditions and the following disclaimer in the documentation and/or
+   other materials provided with the distribution.
+
+   Neither the name of Loki software nor the names of its contributors may be used
+   to endorse or promote products derived from this software without specific prior
+   written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+   DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
 
 #ifndef _MISSING_H_
 #define _MISSING_H_
@@ -34,46 +34,36 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // NOTE TTimo
 //   this goes along with str.h and provides various utility classes
 //   and portability defines
-//   the filename is a legecy issue, it would be better to clean that up
+//   the file name (missing.h) is a legacy issue, it would be better to clean that up
 //   in a central 'portability' lib
 
 #include <glib.h>
 #include <string.h>
 
 #ifdef _WIN32
+
+#include <windows.h>
 #include <direct.h>
 #include <io.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 
-#define MyCopyFile(a,b) CopyFile(a,b,FALSE)
-
-#define S_ISDIR(mode) (mode & _S_IFDIR)
 #define R_OK 04
-#define mymkdir(a,b) _mkdir(a)
-
-#else
-
-#define MyCopyFile CopyFile
-#define mymkdir(a,b) mkdir(a,b)
-
-#endif
 
-#ifndef _WIN32
+#else // !_WIN32
 
 // LZ: very ugly hacks
-inline int GetLastError () { return 0; };
+inline int GetLastError() { return 0; };
 
 // temp stuff
-inline int GetPrivateProfileInt(char* a, char* b, int i, char* c) { return i; };
-#define VERIFY(a) a;
-int GetFullPathName(const char *lpFileName, int nBufferLength, char *lpBuffer, char **lpFilePart);
-bool CopyFile(const char *lpExistingFileName, const char *lpNewFileName);
-bool CopyTree( const char* source, const char* dest );
+inline int GetPrivateProfileInt( char* a, char* b, int i, char* c ) { return i; };
+int GetFullPathName( const char *lpFileName, int nBufferLength, char *lpBuffer, char **lpFilePart );
 
 #ifndef APIENTRY
 #define APIENTRY
 #endif
 
-int MemorySize(void *ptr);
+int MemorySize( void *ptr );
 #define _msize MemorySize
 
 #define MK_LBUTTON          0x0001
@@ -82,6 +72,9 @@ int MemorySize(void *ptr);
 #define MK_CONTROL          0x0008
 #define MK_MBUTTON          0x0010
 
+#include <dirent.h>
+#include <iostream>
+
 #endif
 
 #define CString Str
@@ -90,124 +83,144 @@ int MemorySize(void *ptr);
 class CPtrArray
 {
 public:
-  CPtrArray ()
-  { m_ptrs = g_ptr_array_new (); };
-  virtual ~CPtrArray ()
-  { g_ptr_array_free (m_ptrs, TRUE); };
-  
-  void* operator[](int i) const
-  { return g_ptr_array_index (m_ptrs,i); };
-  void* GetAt(int i) const
-  { return g_ptr_array_index (m_ptrs,i); };
-  int GetSize () const
-  { return m_ptrs->len; };
-  void Add (void* ptr)
-  { g_ptr_array_add (m_ptrs, ptr); };
-  void RemoveAll ()
-  { g_ptr_array_set_size (m_ptrs, 0); };
-  void RemoveAt(int index, int count = 1)
-  {
-    if ((index < 0) || (count < 0) || (count + index > (int)m_ptrs->len))
-      return;
-    for (; count > 0; count--)
-      g_ptr_array_remove_index (m_ptrs, index);
-  }
-  void InsertAt(int nStartIndex, CPtrArray* pNewArray)
-  {
-    for (int i = 0; i < pNewArray->GetSize(); i++)
-      InsertAt(nStartIndex+i, pNewArray->GetAt(i));
-  }
-  void InsertAt(int nIndex, void* newElement, int nCount = 1)
-  {
-    if ((guint32)nIndex >= m_ptrs->len)
-    {
-      g_ptr_array_set_size (m_ptrs, nIndex + nCount);  // grow so nIndex is valid
-    }
-    else
-    {
-      // inserting in the middle of the array
-      int nOldSize = m_ptrs->len;
-      g_ptr_array_set_size (m_ptrs, m_ptrs->len + nCount);
-      // shift old data up to fill gap
-      memmove(&m_ptrs->pdata[nIndex+nCount], &m_ptrs->pdata[nIndex],
-        (nOldSize-nIndex) * sizeof(gpointer));
-      
-      memset(&m_ptrs->pdata[nIndex], 0, nCount * sizeof(gpointer));
-    }
-    
-    // insert new value in the gap
-    while (nCount--)
-      m_ptrs->pdata[nIndex++] = newElement;
-  }
-  void Copy(const CPtrArray& src)
-  {
-    g_ptr_array_set_size (m_ptrs, src.m_ptrs->len);
-    memcpy (m_ptrs->pdata, src.m_ptrs->pdata, m_ptrs->len*sizeof(gpointer));
-  }
-  
+CPtrArray ()
+{ m_ptrs = g_ptr_array_new(); };
+virtual ~CPtrArray ()
+{ g_ptr_array_free( m_ptrs, TRUE ); };
+
+void* operator[]( int i ) const
+{ return g_ptr_array_index( m_ptrs,i ); };
+void* GetAt( int i ) const
+{ return g_ptr_array_index( m_ptrs,i ); };
+int GetSize() const
+{ return m_ptrs->len; };
+void Add( void* ptr )
+{ g_ptr_array_add( m_ptrs, ptr ); };
+void RemoveAll()
+{ g_ptr_array_set_size( m_ptrs, 0 ); };
+void RemoveAt( int index, int count = 1 ){
+       if ( ( index < 0 ) || ( count < 0 ) || ( count + index > (int)m_ptrs->len ) ) {
+               return;
+       }
+       for (; count > 0; count-- )
+               g_ptr_array_remove_index( m_ptrs, index );
+}
+void InsertAt( int nStartIndex, CPtrArray* pNewArray ){
+       for ( int i = 0; i < pNewArray->GetSize(); i++ )
+               InsertAt( nStartIndex + i, pNewArray->GetAt( i ) );
+}
+void InsertAt( int nIndex, void* newElement, int nCount = 1 ){
+       if ( (guint32)nIndex >= m_ptrs->len ) {
+               g_ptr_array_set_size( m_ptrs, nIndex + nCount ); // grow so nIndex is valid
+       }
+       else
+       {
+               // inserting in the middle of the array
+               int nOldSize = m_ptrs->len;
+               g_ptr_array_set_size( m_ptrs, m_ptrs->len + nCount );
+               // shift old data up to fill gap
+               memmove( &m_ptrs->pdata[nIndex + nCount], &m_ptrs->pdata[nIndex],
+                                ( nOldSize - nIndex ) * sizeof( gpointer ) );
+
+               memset( &m_ptrs->pdata[nIndex], 0, nCount * sizeof( gpointer ) );
+       }
+
+       // insert new value in the gap
+       while ( nCount-- )
+               m_ptrs->pdata[nIndex++] = newElement;
+}
+void Copy( const CPtrArray& src ){
+       g_ptr_array_set_size( m_ptrs, src.m_ptrs->len );
+       memcpy( m_ptrs->pdata, src.m_ptrs->pdata, m_ptrs->len * sizeof( gpointer ) );
+}
+
 protected:
-  GPtrArray* m_ptrs;
+GPtrArray* m_ptrs;
 };
 
 typedef struct stringmap_s
 {
-  char* key;
-  char* value;
+       char* key;
+       char* value;
 } stringmap_t;
 
 class CMapStringToString
 {
 public:
-  CMapStringToString ()
-  { m_map = g_ptr_array_new (); };
-  ~CMapStringToString ()
-  {
-    for (guint32 i = 0; i < m_map->len; i++)
-      FreeElement ((stringmap_t*)g_ptr_array_index (m_map,i));
-    g_ptr_array_set_size (m_map, 0);
-    g_ptr_array_free (m_map, TRUE);
-  };
-  void SetAt(char* key, char* newValue)
-  {
-    for (guint32 i = 0; i < m_map->len; i++)
-    {
-      stringmap_t* entry = (stringmap_t*)g_ptr_array_index (m_map,i);
-      if (strcmp (entry->key, key) == 0)
-      {
-        g_free (entry->value);
-        entry->value = g_strdup (newValue);
-        return;
-      }
-    }
-    stringmap_t* entry = (stringmap_t*)g_malloc (sizeof (stringmap_t));
-    entry->key = g_strdup (key);
-    entry->value = g_strdup (newValue);
-    g_ptr_array_add (m_map, entry);
-  }
-  
-  bool Lookup(const char* key, CString& rValue) const
-  {
-    for (guint32 i = 0; i < m_map->len; i++)
-    {
-      stringmap_t* entry = (stringmap_t*)g_ptr_array_index (m_map,i);
-      if (strcmp (entry->key, key) == 0)
-      {
-        rValue = entry->value;
-        return true;
-      }
-    }
-    return false;
-  }
-  
+CMapStringToString ()
+{ m_map = g_ptr_array_new(); };
+~CMapStringToString (){
+       for ( guint32 i = 0; i < m_map->len; i++ )
+               FreeElement( (stringmap_t*)g_ptr_array_index( m_map,i ) );
+       g_ptr_array_set_size( m_map, 0 );
+       g_ptr_array_free( m_map, TRUE );
+};
+void SetAt( char* key, char* newValue ){
+       for ( guint32 i = 0; i < m_map->len; i++ )
+       {
+               stringmap_t* entry = (stringmap_t*)g_ptr_array_index( m_map,i );
+               if ( strcmp( entry->key, key ) == 0 ) {
+                       g_free( entry->value );
+                       entry->value = g_strdup( newValue );
+                       return;
+               }
+       }
+       stringmap_t* entry = (stringmap_t*)g_malloc( sizeof( stringmap_t ) );
+       entry->key = g_strdup( key );
+       entry->value = g_strdup( newValue );
+       g_ptr_array_add( m_map, entry );
+}
+
+bool Lookup( const char* key, CString& rValue ) const {
+       for ( guint32 i = 0; i < m_map->len; i++ )
+       {
+               stringmap_t* entry = (stringmap_t*)g_ptr_array_index( m_map,i );
+               if ( strcmp( entry->key, key ) == 0 ) {
+                       rValue = entry->value;
+                       return true;
+               }
+       }
+       return false;
+}
+
 protected:
-  GPtrArray* m_map;
-  
-  void FreeElement(stringmap_t* elem)
-  { 
-    g_free (elem->key);
-    g_free (elem->value);
-    g_free (elem);
-  };
+GPtrArray* m_map;
+
+void FreeElement( stringmap_t* elem ){
+       g_free( elem->key );
+       g_free( elem->value );
+       g_free( elem );
 };
+};
+
+class FindFiles {
+public:
+FindFiles( const char *directory );
+~FindFiles();
+
+const char* NextFile();
+private:
+#ifdef _WIN32
+Str directory;
+HANDLE findHandle;
+WIN32_FIND_DATA findFileData;
+#else
+DIR             * findHandle;
+#endif
+};
+
+bool CopyTree( const char* source, const char* dest );
+
+typedef enum {
+       PATH_FAIL,      // stat call failed (does not exist is likely)
+       PATH_DIRECTORY,
+       PATH_FILE
+} EPathCheck;
+
+// check a path for existence, return directory / file
+EPathCheck CheckFile( const char *path );
+
+bool radCreateDirectory( const char *directory );
+bool radCopyFile( const char *lpExistingFileName, const char *lpNewFileName );
 
 #endif // _MISSING_H_