/*
"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
$Id$
*/
#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]:
- BYTE offset inside pool where the 'KRNSTR'
(kernel string) is stored
'KRNSTR's (kernel strings) are specified as an array of continuous BYTEs
------------------------------------------------------------------------
'KRNSTR':
- 'num-bytes' - [BYTE]
- total number of bytes in kernel string
- [KRNWORD] x ???
- 'KRNWORD's follow for 'num-bytes' bytes
'KRNWORD':
- [BYTE] 'key1'
- if key1 == [0,63]:
- key1 is the index of the 'sub-string' in the pool
- otherwise
- if key1 has bit 7 set
- [BYTE] 'key2'
- [BYTE] 'key3'
- the index of the 'sub-string' in the pool is:
(key1&0x7F) * 65536
+ key2 * 256
+ key3
- (index is in [16384,(2^23-1)]
- otherwise
- [BYTE] 'key2'
- the index of the 'sub-string' in the pool is:
(key1&0x3F) * 256
+ key2
- (index is in [64,16383])
- NOTE: the reason for using only extra 8-bit keys
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' and scanning through the whole
substring pool (a little slow)
(lookup table was ditched to save memory)
'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;
}
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 */