This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
magicka/utils/magiedit/odoors/ODMulti.c
2016-12-03 15:08:50 +10:00

256 lines
8.0 KiB
C

/* OpenDoors Online Software Programming Toolkit
* (C) Copyright 1991 - 1999 by Brian Pirie.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*
* File: ODMulti.c
*
* Description: Code for multiple personality system, which allows
* a status line / function key personality to be dynamically
* selected at run-time.
*
* Revisions: Date Ver Who Change
* ---------------------------------------------------------------
* Oct 13, 1994 6.00 BP New file header format.
* Dec 09, 1994 6.00 BP Standardized coding style.
* Aug 19, 1995 6.00 BP 32-bit portability.
* Nov 11, 1995 6.00 BP Removed register keyword.
* Nov 14, 1995 6.00 BP Added include of odscrn.h.
* Nov 16, 1995 6.00 BP Removed oddoor.h, added odcore.h.
* Dec 12, 1995 6.00 BP Added entry, exit and kernel macros.
* Dec 30, 1995 6.00 BP Added ODCALL for calling convention.
* Jan 23, 1996 6.00 BP Disable MPS under Win32 version.
* Feb 19, 1996 6.00 BP Changed version number to 6.00.
* Mar 03, 1996 6.10 BP Begin version 6.10.
* Sep 01, 1996 6.10 BP Update output area on od_set_per...().
* Aug 10, 2003 6.23 SH *nix support
*/
#define BUILDING_OPENDOORS
#include <string.h>
#include <ctype.h>
#include <stddef.h>
#include <time.h>
#include <stdio.h>
#include "OpenDoor.h"
#include "ODStr.h"
#include "ODCore.h"
#include "ODGen.h"
#include "ODScrn.h"
#include "ODInEx.h"
#include "ODKrnl.h"
/* Maximum number of personalities that may be installed at once. */
#define MAX_PERSONALITIES 12
/* Information on installed personalities. */
typedef struct
{
char szName[33];
INT nStatusTopLine;
INT nStatusBottomLine;
OD_PERSONALITY_PROC *pfPersonalityFunction;
} tPersonalityInfo;
static tPersonalityInfo aPersonalityInfo[MAX_PERSONALITIES]=
{
{"STANDARD", 1, 23, pdef_opendoors},
{"REMOTEACCESS", 1, 23, pdef_ra},
{"WILDCAT", 1, 23, pdef_wildcat},
{"PCBOARD", 1, 23, pdef_pcboard}
};
/* Private variables. */
static INT nPersonalities = 5;
static INT nCurrentPersonality = 255;
/* ----------------------------------------------------------------------------
* ODMPSEnable()
*
* This function is called from within od_init() when the user enables the
* multiple personality system.
*
* Parameters: None.
*
* Return: void
*/
ODAPIDEF void ODCALL ODMPSEnable(void)
{
pfSetPersonality = od_set_personality;
}
/* ----------------------------------------------------------------------------
* od_set_personality()
*
* Sets the current personality to the one that is specified in pszName.
*
* Parameters: pszName - The name of the personality to switch to.
*
* Return: TRUE on success, or FALSE on failure.
*/
ODAPIDEF BOOL ODCALL od_set_personality(const char *pszName)
{
#ifdef OD_TEXTMODE
BYTE btNewPersonality;
char szNameToMatch[33];
tPersonalityInfo *pNewPersonalityInfo;
#endif /* OD_TEXTMODE */
/* Log function entry if running in trace mode */
TRACE(TRACE_API, "od_set_personality()");
/* Initialize OpenDoors if it hasn't already been done. */
if(!bODInitialized) od_init();
OD_API_ENTRY();
#ifdef OD_TEXTMODE
/* Check for valid parameters. */
if(strlen(pszName) == 0)
{
od_control.od_error = ERR_PARAMETER;
OD_API_EXIT();
return(FALSE);
}
/* Build personality name to match. */
strncpy(szNameToMatch, pszName, 32);
szNameToMatch[32] = '\0';
strupr(szNameToMatch);
/* Loop through installed personalities, checking for a match. */
for(btNewPersonality = 0; btNewPersonality < nPersonalities;
++btNewPersonality)
{
/* If the name of this personality matches the one we are looking for. */
if(strcmp(szNameToMatch, aPersonalityInfo[btNewPersonality].szName) == 0)
{
if(btNewPersonality != nCurrentPersonality)
{
/* Remove current status line from the screen .*/
od_set_statusline(8);
/* Initialize the new personality. */
if(nCurrentPersonality != 255)
(*(OD_PERSONALITY_CALLBACK *)pfCurrentPersonality)(22);
od_control.od_page_statusline = -1;
pNewPersonalityInfo =
&aPersonalityInfo[nCurrentPersonality=btNewPersonality];
bRAStatus = TRUE;
(*(OD_PERSONALITY_CALLBACK *)pNewPersonalityInfo
->pfPersonalityFunction)(20);
ODScrnSetBoundary(1, (BYTE)pNewPersonalityInfo->nStatusTopLine, 80,
(BYTE)pNewPersonalityInfo->nStatusBottomLine);
pfCurrentPersonality
= pNewPersonalityInfo->pfPersonalityFunction;
btCurrentStatusLine = 255;
/* Update output area. */
btOutputTop = (BYTE)pNewPersonalityInfo->nStatusTopLine;
btOutputBottom = (BYTE)pNewPersonalityInfo->nStatusBottomLine;
/* Draw the new statusline. */
od_set_statusline(0);
}
OD_API_EXIT();
return(TRUE);
}
}
OD_API_EXIT();
od_control.od_error = ERR_LIMIT;
return(FALSE);
#else /* !OD_TEXTMODE */
/* The multiple personality system is not supported under this platform. */
od_control.od_error = ERR_UNSUPPORTED;
/* Return with failure. */
OD_API_EXIT();
return(FALSE);
#endif /* !OD_TEXTMODE */
}
/* ----------------------------------------------------------------------------
* od_add_personality()
*
* Installs a new personality into the set of available personalities.
*
* Parameters: pszName - Pointer to string containing the name of
* the new personality.
*
* btOutputTop - Index of the top line of the status bar.
*
* btOutputBottom - Index of the bottom line of the status bar.
*
* pfPerFunc - Pointer to the callback function which
* implements this personality.
*
* Return: TRUE on success or FALSE on failure.
*/
ODAPIDEF BOOL ODCALL od_add_personality(const char *pszName, BYTE btOutputTop,
BYTE btOutputBottom, OD_PERSONALITY_PROC *pfPerFunc)
{
/* Log function entry if running in trace mode */
TRACE(TRACE_API, "od_add_personality()");
#ifdef OD_TEXTMODE
/* Check that we haven't exceeded the limit on the total number of */
/* installed personalities. */
if(nPersonalities == MAX_PERSONALITIES)
{
od_control.od_error = ERR_LIMIT;
return(FALSE);
}
/* Store information on this new personality. */
strncpy(aPersonalityInfo[nPersonalities].szName, pszName, 32);
aPersonalityInfo[nPersonalities].szName[32] = '\0';
strupr(aPersonalityInfo[nPersonalities].szName);
aPersonalityInfo[nPersonalities].nStatusTopLine = btOutputTop;
aPersonalityInfo[nPersonalities].nStatusBottomLine = btOutputBottom;
aPersonalityInfo[nPersonalities].pfPersonalityFunction = pfPerFunc;
/* Increment total number of personalities. */
++nPersonalities;
/* Return with success. */
return(TRUE);
#else /* !OD_TEXTMODE */
/* The multiple personality system is not supported under this platform. */
od_control.od_error = ERR_UNSUPPORTED;
/* Return with failure. */
return(FALSE);
#endif /* !OD_TEXTMODE */
}