mirror of https://github.com/lianthony/NT4.0
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
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.
|
|
//
|
|
|