brender-1997/fw/fwsetup.c
2022-05-03 14:31:40 -07:00

219 lines
4.7 KiB
C

/*
* Copyright (c) 1993-1995 Argonaut Technologies Limited. All rights reserved.
*
* $Id: fwsetup.c 2.17 1996/10/29 16:15:51 STEVEW Exp $
* $Locker: $
*
*/
#include "fw.h"
#include "brassert.h"
#include "datafile.h"
#include "syscn_p.h"
BR_RCS_ID("$Id: fwsetup.c 2.17 1996/10/29 16:15:51 STEVEW Exp $")
/*
* Global renderer state
*/
br_framework_state BR_ASM_DATA fw;
/*
* Various bits of default data
*/
extern br_diaghandler * BR_ASM_DATA _BrDefaultDiagHandler;
extern br_filesystem * BR_ASM_DATA _BrDefaultFilesystem;
extern br_allocator * BR_ASM_DATA _BrDefaultAllocator;
extern br_file_primitives _BrFilePrimsNull;
/*
* System resource classes
*/
static br_resource_class resourceClasses[] = {
/*
* These two classes have to be initialised by hand
*/
{0, "REGISTRY", BR_MEMORY_REGISTRY, NULL },
{0, "ANCHOR", BR_MEMORY_ANCHOR, NULL },
{0, "RESOURCE_CLASS", BR_MEMORY_RESOURCE_CLASS, NULL },
{0, "SCRATCH,", BR_MEMORY_SCRATCH, NULL, 16 },
{0, "STRING", BR_MEMORY_STRING, NULL, 1 },
{0, "FILE", BR_MEMORY_FILE, _BrFileFree },
{0, "POOL", BR_MEMORY_POOL, NULL, 16 },
{0, "EXCEPTION_HANDLER",BR_MEMORY_EXCEPTION_HANDLER,NULL },
{0, "TOKEN", BR_MEMORY_TOKEN, NULL },
{0, "TOKEN_MAP", BR_MEMORY_TOKEN_MAP, NULL, 8 },
{0, "DATAFILE", BR_MEMORY_DATAFILE, NULL },
{0, "LEXER", BR_MEMORY_LEXER, NULL },
{0, "OBJECT_LIST", BR_MEMORY_OBJECT_LIST, NULL },
{0, "OBJECT_LIST_ENTRY",BR_MEMORY_OBJECT_LIST_ENTRY,NULL },
{0, "APPLICATION", BR_MEMORY_APPLICATION, NULL },
{0, "IMAGE", BR_MEMORY_IMAGE, _BrImageFree },
{0, "IMAGE_ARENA", BR_MEMORY_IMAGE_ARENA, NULL },
{0, "IMAGE_SECTIONS", BR_MEMORY_IMAGE_SECTIONS, NULL },
{0, "IMAGE_NAMES", BR_MEMORY_IMAGE_NAMES, NULL },
{0, "OBJECT", BR_MEMORY_OBJECT, _BrObjectFree, 16 },
{0, "OBJECT_DATA", BR_MEMORY_OBJECT_DATA, NULL, 16 },
{0, "DRIVER", BR_MEMORY_DRIVER, NULL },
{0, "FMT_RESULTS", BR_MEMORY_FMT_RESULTS, NULL },
{0, "TOKEN_VALUE", BR_MEMORY_TOKEN_VALUE, NULL },
{0, "TOKEN_TEMPLATE", BR_MEMORY_TOKEN_TEMPLATE, NULL },
};
/*
* Resident image that is used to expose resident framework
* functions to loaded devices.
*/
#include "fwimg.h"
br_error BR_PUBLIC_ENTRY BrFwBegin(void)
{
int i;
if(fw.active)
return BRE_ALLREADY_ACTIVE;
/*
* Set handlers to use defaults
*/
if(fw.diag == NULL)
fw.diag = _BrDefaultDiagHandler;
if(fw.fsys == NULL)
fw.fsys = _BrDefaultFilesystem;
if(fw.mem == NULL)
fw.mem = _BrDefaultAllocator;
/*
* Set up initial state of file writing
*/
fw.open_mode = BR_FS_MODE_BINARY;
/*
* Initialise all registries
*/
BrRegistryNew(&fw.reg_resource_classes);
/*
* Fake the resource classes that are required to
* support the registry
*/
fw.resource_class_index[BR_MEMORY_REGISTRY] =
resourceClasses+0;
fw.resource_class_index[BR_MEMORY_ANCHOR] =
resourceClasses+1;
/*
* Allocate the zero sized base resource instance for
* the framework
*/
fw.res = BrResAllocate(NULL, 0, BR_MEMORY_ANCHOR);
/*
* Register all the system resource classes
*/
for(i=0; i < BR_ASIZE(resourceClasses); i++)
BrResClassAdd(resourceClasses+i);
/*
* Setup list of loaded images
*/
BrNewList(&fw.images);
/*
* Initialise table of devices
*/
fw.dev_slots = BrResAllocate(fw.res, NDEV_SLOTS * sizeof(*fw.dev_slots), BR_MEMORY_DRIVER );
fw.ndev_slots = NDEV_SLOTS;
/*
* Mark as active
*/
fw.active = BR_TRUE;
/*
* Set up tokens
*/
BrTokenBegin();
/*
* Set up default system configuration
*/
BrSystemConfigBegin();
// Mark default drivers as still to be loaded.
fw.bAlreadyLoadedDrivers = BR_FALSE ;
/*
* Set up resident framework image
*/
BrImageAdd(&Image_BRCORE1);
return BRE_OK;
}
br_error BR_PUBLIC_ENTRY BrFwEnd(void)
{
if(!fw.active)
return BRE_NOT_ACTIVE;
BrImageRemove(&Image_BRCORE1);
/*
* Free all resources ...
*/
BrResFree(fw.res);
/*
* Clear out fw structure
*/
BrMemSet(&fw, 0, sizeof(fw));
return BRE_OK;
}
/*
* User functions for setting new errorhandler, filesystem, or allocator
*/
br_diaghandler * BR_PUBLIC_ENTRY BrDiagHandlerSet(br_diaghandler *newdh)
{
br_diaghandler *old = fw.diag;
if(newdh == NULL)
fw.diag = _BrDefaultDiagHandler;
else
fw.diag = newdh;
return old;
}
br_filesystem * BR_PUBLIC_ENTRY BrFilesystemSet(br_filesystem *newfs)
{
br_filesystem *old = fw.fsys;
if(newfs == NULL)
fw.fsys = _BrDefaultFilesystem;
else
fw.fsys = newfs;
return old;
}
br_allocator * BR_PUBLIC_ENTRY BrAllocatorSet(br_allocator *newal)
{
br_allocator *old = fw.mem;
if(newal == NULL)
fw.mem = _BrDefaultAllocator;
else
fw.mem = newal;
return old;
}