Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

268 lines
4.9 KiB

/**********************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1995 **/
/**********************************************************************/
/*
history.c
This file contains routines for managing the history list.
*/
#include "gopherp.h"
#pragma hdrstop
//
// Private constants.
//
//
// Private types.
//
typedef struct _HISTORY_REC
{
LIST_ENTRY list;
CHAR * pszLocator;
INT iCaret;
} HISTORY_REC, FAR * LPHISTORY_REC;
//
// Private globals.
//
LIST_ENTRY _HistoryStack;
LPHISTORY_REC _pnext;
//
// Private prototypes.
//
//
// Public functions.
//
/*******************************************************************
NAME: HistInitialize
SYNOPSIS: Initializes the history package.
RETURNS: BOOL - TRUE if successful, FALSE if not.
********************************************************************/
BOOL
HistInitialize(
VOID
)
{
InitializeListHead( &_HistoryStack );
_pnext = NULL;
return TRUE;
} // HistInitialize
/*******************************************************************
NAME: HistTerminate
SYNOPSIS: Terminates the history package.
********************************************************************/
VOID
HistTerminate(
VOID
)
{
HistFlushStack();
} // HistTerminate
/*******************************************************************
NAME: HistFlushStack
SYNOPSIS: Flushes all stack entries from the history list.
********************************************************************/
VOID
HistFlushStack(
VOID
)
{
PLIST_ENTRY plist;
LPHISTORY_REC prec;
//
// Zap the history list.
//
while( !IsListEmpty( &_HistoryStack ) )
{
plist = RemoveTailList( &_HistoryStack );
prec = CONTAINING_RECORD( plist, HISTORY_REC, list );
M_FREE( prec );
}
//
// Nuke the next item to be pushed.
//
if( _pnext )
{
M_FREE( _pnext );
_pnext = NULL;
}
} // HistFlushStack
/*******************************************************************
NAME: HistAvailable
SYNOPSIS: Determines if there are history entries available.
RETURNS: BOOL - TRUE if history entries are available,
FALSE otherwise.
********************************************************************/
BOOL
HistAvailable(
VOID
)
{
return !IsListEmpty( &_HistoryStack );
} // HistAvailable
/*******************************************************************
NAME: HistPush
SYNOPSIS: Pushes a new entry onto the history stack. In reality,
pushes are deferred by one push. This keeps the history
package from always returning you to the current page.
ENTRY: pszLocator - The locator to push.
iCaret - Current listbox caret location.
********************************************************************/
VOID
HistPush(
CHAR * pszLocator,
INT iCaret
)
{
LPHISTORY_REC prec;
//
// Create a new record.
//
prec = M_ALLOC( sizeof(HISTORY_REC) +
STRLEN( pszLocator ) + 1 );
if( prec == NULL )
{
return;
}
//
// Setup the record.
//
prec->pszLocator = (CHAR *)( prec + 1 );
STRCPY( prec->pszLocator, pszLocator );
prec->iCaret = 0;
//
// If we've got a record "on deck", push it onto the list
// and enable the "backup" button.
//
if( _pnext )
{
InsertTailList( &_HistoryStack, &_pnext->list );
_pnext->iCaret = iCaret;
}
//
// The newly allocated record will be the next one to be pushed.
//
_pnext = prec;
} // HistPush
/*******************************************************************
NAME: HistPop
SYNOPSIS: Pops the next entry from the history list and calls
Listbox_NewServer to update the display.
********************************************************************/
VOID
HistPop(
VOID
)
{
PLIST_ENTRY plist;
LPHISTORY_REC prec;
//
// If the history list is empty, there's nothing else to do.
//
if( IsListEmpty( &_HistoryStack ) )
{
return;
}
//
// If we've got a record "on deck", nuke it.
//
if( _pnext )
{
M_FREE( _pnext );
_pnext = NULL;
}
//
// Retrieve the most recently pushed record.
//
plist = RemoveTailList( &_HistoryStack );
prec = CONTAINING_RECORD( plist, HISTORY_REC, list );
//
// Let the listbox do the dirty work.
//
Listbox_RetrieveDir( prec->pszLocator, NULL, prec->iCaret );
//
// Nuke the popped item.
//
M_FREE( prec );
} // HistPop
//
// Private functions.
//