/*
   "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: kernel_string_pool.h,v 1.1.1.1 2003/01/12 00:20:19 reddawg Exp $
*/

#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 */