windows-nt/Source/XPSP1/NT/base/efiutil/efilib/efisrc/newdel.cxx
2020-09-26 16:20:57 +08:00

175 lines
2.6 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1990-1999 Microsoft Corporation
Module Name:
newdel.cxx
Abstract:
This module implements the C++ new and delete operators for
the Setup-Loader environment. In other environments, the utilities
use the standard C++ new and delete.
Environment:
ULIB, User Mode
--*/
#include <pch.cxx>
#define _ULIB_MEMBER_
#include "ulib.hxx"
#ifdef _EFICHECK_
extern "C" {
#include <efi.h>
#include <efilib.h>
}
#endif
extern "C"
int _cdecl
_purecall( );
int _cdecl
_purecall( )
{
DebugAbort( "Pure virtual function called.\n" );
return 0;
}
// When the utilities are running the Setup Loader
// or Autocheck environments, they can't use the C-Run-
// Time new and delete; instead, these functions are
// provided.
//
PVOID _cdecl
operator new (
IN size_t bytes
)
/*++
Routine Description:
This routine allocates 'bytes' bytes of memory.
Arguments:
bytes - Supplies the number of bytes requested.
Return Value:
A pointer to 'bytes' bytes or NULL.
--*/
{
void * ptr;
ptr = AllocatePool(bytes);
return ptr;
}
VOID _cdecl
operator delete (
IN PVOID pointer
)
/*++
Routine Description:
This routine frees the memory pointed to by 'pointer'.
Arguments:
pointer - Supplies a pointer to the memoery to be freed.
Return Value:
None.
--*/
{
if (pointer) {
FreePool(pointer);
}
}
typedef void (*PF)(PVOID);
typedef void (*PFI)(PVOID, int);
PVOID
__vec_new(
IN OUT PVOID op,
IN int number,
IN int size,
IN PVOID f)
/*
allocate a vector of "number" elements of size "size"
and initialize each by a call of "f"
*/
{
if (op == 0) {
op = AllocatePool( number * size );
}
if (op && f) {
register char* p = (char*) op;
register char* lim = p + number*size;
register PF fp = PF(f);
while (p < lim) {
(*fp) (PVOID(p));
p += size;
}
}
return op;
}
void
__vec_delete(
PVOID op,
int n,
int sz,
PVOID f,
int del,
int x)
/*
destroy a vector of "n" elements of size "sz"
*/
{
// unreferenced parameters
// I wonder what it does
(void)(x);
if (op) {
if (f) {
register char* cp = (char*) op;
register char* p = cp;
register PFI fp = PFI(f);
p += n*sz;
while (p > cp) {
p -= sz;
(*fp)(PVOID(p), 2); // destroy VBC, don't delete
}
}
if (del) {
FreePool(op);
}
}
}