/*
**	Command & Conquer Generals Zero Hour(tm)
**	Copyright 2025 Electronic Arts Inc.
**
**	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 3 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, see <http://www.gnu.org/licenses/>.
*/

/////////////////////////////////////////////////////////////////////////EA-V1
// $File: //depot/GeneralsMD/Staging/code/Libraries/Source/debug/internal.h $
// $Author: mhoffe $
// $Revision: #1 $
// $DateTime: 2003/07/03 11:55:26 $
//
// ©2003 Electronic Arts
//
// Internal header
//////////////////////////////////////////////////////////////////////////////
#ifdef _MSC_VER
#  pragma once
#endif
#ifndef INTERNAL_H // Include guard
#define INTERNAL_H

// make sure we're not omitting the frame pointer 
#pragma optimize("y",off)

// We're doing our own little internal asserts for full debug
// builds (until this library is proven & stable)
#ifdef _DEBUG
#  define __ASSERT(x) do { if (!(x)) DebugInternalAssert(__FILE__,__LINE__,#x); } while (0)
#else
#  define __ASSERT(x) do { } while(0)
#endif

/** \internal

  Internal assert function for module internal assertions.

  \param file file name
  \param line line number
  \param expr expression which failed
*/
void DebugInternalAssert(const char *file, int line, const char *expr);

/** \internal

  Allocate the given number of bytes from the Windows heap.
  This function performs a controlled crash on failure.

  \param numBytes number of bytes to allocate
  \return pointer to allocated memory
*/
void *DebugAllocMemory(unsigned numBytes);

/** \internal

  Allocates/reallocates the given memory block to the new
  given size. 
  This function performs a controlled crash on failure.

  \param oldPtr pointer to old memory block, may be NULL
  \param newSize new size of block
  \return pointer to reallocated memory
*/
void *DebugReAllocMemory(void *oldPtr, unsigned newSize);

/** \internal

  Frees the allocated memory block.
  This function never fails.

  \param ptr memory block to free
*/
void DebugFreeMemory(void *ptr);

/// \internal Command group: 'debug'
class DebugCmdInterfaceDebug: public DebugCmdInterface
{
public:
  virtual bool Execute(class Debug& dbg, const char *cmd, CommandMode cmdmode,
                       unsigned argn, const char * const * argv);

  virtual void Delete(void)
  {
    this->~DebugCmdInterfaceDebug();
    DebugFreeMemory(this);
  }
};

#endif // INTERNAL_H
