/*
"kernel_string_pool.h"
created by: grayspace aka J. Leveille
for: UbixOS Project
date: May 11, 2002
purpose: to provide a mechanism for maintaining a pool of strings
for use by the kernel without unnecessary waste of memory
NOTEs:
- for now only ASCII is supported
- done quickly, pretty hacky
TODO:
- expand to support unicode
- use huffman encoding instead
*/
#ifndef _KERNEL_STRING_POOL_H
#define _KERNEL_STRING_POOL_H
/* memory FORMAT of a 'KRNSTR': (quick and dirty for now)
an 'ID' is used to indicate a string within the pool
----------------------------------------------------
'ID' - [DWORD]:
- 'num-words' - bits [0,7]
- number of 'KRNWORD's in the string is 'num-words' + 1
- bits [8,32] BYTE offset inside pool where the 'KRNSTR'
(kernel string) is stored
'KRNSTR's (kernel strings) are specified as an array of continuous BYTEs
------------------------------------------------------------------------
'KRNSTR':
- [KRNWORD] x 'num-words' (given by ID)
'KRNWORD':
- [BYTE] 'key1'
- if key1 == [0,254]:
- key1 is the index of the 'sub-string' in the pool
- otherwise key1 is an escape sequence and implies:
- [BYTE] 'key2'
- [BYTE] 'key3'
- the index of the 'sub-string' in the pool is key2*256 + key3 + 255
- NOTE: the reason for using two extra 8-bit keys instead of a 16-bit
value is in case we port to platform with data alignment exceptions
and this stuff is left dormant and never changed
- NOTE: a 'space' (0x20) is implied between each 'KRNWORD', therefore
it is not currently possible to break encode string AB into substrings
A & B if AB does not contain any spaces
- a 'sub-string' is found by using the the index of the
'sub-string' in the pool to get an offset into an array
of continuous BYTEs via lookup
'sub-string's are specified as an array of continuous BYTEs
-----------------------------------------------------------
- a 'sub-string' is as follows:
- [BYTE] 'numchars' [0,255] -> [1,256]
- [BYTE] x 'numchars' (the chars themselves)
- WARNING: empty 'sub-string's are not allowed
*/
/* WARNING: it is *assumed* any 'ID' given to a kernel
string pool function will be valid!! */
/* structure for kernel string pool */
typedef struct tagKSTR_POOL
{
/* pointer to where the kernel strings are stored */
const BYTEg * p_krnstrs;
/* pointer to where the sub strings are stored */
const BYTEg * p_substrs;
/* lookup table for substring offsets */
const unsigned int * p_substr_off;
}
KSTR_POOL;
/* the reason for this structure format is so that a tool
can be written which can generate a 'KSTR_POOL' from a configuration
file and place it into a 'C' source and header file pair as static data */
// gets the substring indicated by 'id' from the pool 'p_ksp' into 'p_dst'
// - returns pointer to 'p_dst'
char * KSTR_POOL_GetString( KSTR_POOL * p_ksp, char * p_dst, DWORDg id );
#endif /* _KERNEL_STRING_POOL_H */