home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games 1996 October / Amiga_Games_Extra_CD_10-96.bin / userbox / publicdomain / grabkey / source / gk_locale.c < prev    next >
C/C++ Source or Header  |  1996-07-09  |  3KB  |  227 lines

  1. /*
  2. **    GrabKEY
  3. **
  4. **        © 1996 by Timo C. Nentwig
  5. **        All Rights Reserved !
  6. **
  7. **        Tcn@techbase.in-berlin.de
  8. **
  9. */
  10.  
  11. /// #include
  12.  
  13. #include "gk_GST.h"
  14. #include "gk_Protos.h"
  15.  
  16. ///
  17. /// proto
  18.  
  19. proto VOID                     LocaleClose       (VOID);
  20. proto STRPTR __saveds __asm    LocaleHookFunc    (REG (a0) struct Hook *Hook, REG (a1) const LONG ID);
  21. proto BOOL                     LocaleOpen        (const STRPTR Name, const STRPTR BuiltIn, const LONG Version);
  22. proto STRPTR                   LocaleString      (ULONG ID);
  23.  
  24. ///
  25.  
  26. struct    Library   *LocaleBase;
  27. struct    Catalog   *Catalog;
  28. struct    Hook       LocaleHook =
  29. {
  30.  
  31.     { NULL },
  32.     (HOOKFUNC) LocaleHookFunc
  33.  
  34. };
  35.  
  36. /// LocaleClose ()
  37.  
  38.     /*
  39.      *    FUNCTION    Close localestuff opened
  40.      *                by LocaleOpen().
  41.      *
  42.      *    NOTE
  43.      *
  44.      *    EXAMPLE     LocaleClose();
  45.      *
  46.      */
  47.  
  48. VOID
  49. LocaleClose (VOID)
  50. {
  51.  
  52.     if (LocaleBase)
  53.     {
  54.  
  55.         CloseCatalog (Catalog);
  56.         Catalog = NULL;
  57.  
  58.         CloseLib (LocaleBase);
  59.         LocaleBase = NULL;
  60.  
  61.     }
  62.  
  63. }
  64.  
  65. ///
  66. /// LocaleHookFunc ()
  67.  
  68.     /*
  69.      *    FUNCTION    Hook function for LocaleString().
  70.      *
  71.      *    NOTE
  72.      *
  73.      *    EXAMPLE     struct Hook LocaleHook = { {NULL}, (HOOKFUNC) LocaleHookFunc };
  74.      *
  75.      */
  76.  
  77.  
  78. STRPTR __saveds __asm
  79. LocaleHookFunc (REG (a0) struct Hook *Hook, REG (a1) const LONG ID)
  80. {
  81.  
  82.     return (LocaleString (ID));
  83.  
  84. }
  85.  
  86. ///
  87. /// LocaleOpen ()
  88.  
  89.     /*
  90.      *    FUNCTION    Open locale specific stuff.
  91.      *
  92.      *    NOTE
  93.      *
  94.      *    EXAMPLE     LocaleOpen ("my_prg.catalog", "english", 2);
  95.      *
  96.      */
  97.  
  98. BOOL
  99. LocaleOpen (const STRPTR Name, const STRPTR BuiltIn, const LONG Version)
  100. {
  101.  
  102.     if (LocaleBase = OpenLibrary ("locale.library", 39))
  103.     {
  104.  
  105.         if (Catalog = OpenCatalog (NULL, Name, OC_BuiltInLanguage,    BuiltIn,
  106.                                                OC_BuiltInCodeSet,     0,
  107.                                                OC_Version,            2,
  108.                                                TAG_END))
  109.                                                {
  110.  
  111.                                                    return (TRUE);
  112.  
  113.                                                }
  114.                                                else
  115.                                                {
  116.  
  117.                                                    CloseCatalog (Catalog);
  118.                                                    Catalog = NULL;
  119.  
  120.                                                }
  121.  
  122.     }
  123.  
  124.     return (FALSE);
  125.  
  126. }
  127.  
  128. ///
  129. /// LocaleString ()
  130.  
  131.     /*
  132.      *    FUNCTION    Localize a string.
  133.      *
  134.      *    NOTE
  135.      *
  136.      *    EXAMPLE     STRPTR s = LocaleString (15);
  137.      *
  138.      */
  139.  
  140. STRPTR
  141. LocaleString (ULONG ID)
  142. {
  143.  
  144.     const struct    CatCompArrayType   *AppStrings    = &CatCompArray [0];
  145.     const WORD                          NumAppStrings = sizeof (CatCompArray) / sizeof (struct CatCompArrayType);
  146.     STRPTR                        Builtin;
  147.  
  148.     if (ID < NumAppStrings && AppStrings [ID] . cca_ID == ID)
  149.     {
  150.  
  151.         Builtin = AppStrings [ID] . cca_Str;
  152.  
  153.     }
  154.     else
  155.     {
  156.  
  157.         LONG    Left,
  158.                 Mid,
  159.                 Right;
  160.  
  161.             /*
  162.              *    Binary search,  note: can be applied here
  163.              *    only because the catalog entries are
  164.              *    stored in ascending ID order .  But actually,
  165.              *    this piece of code should never get called .
  166.              */
  167.  
  168.         Left  = 0;
  169.         Right = NumAppStrings - 1;
  170.  
  171.         do
  172.         {
  173.  
  174.             Mid = (Left + Right) / 2;
  175.  
  176.             if (ID < AppStrings [Mid] . cca_ID)
  177.             {
  178.  
  179.                 Right   = Mid - 1;
  180.  
  181.             }
  182.             else
  183.             {
  184.  
  185.                 Left    = Mid + 1;
  186.  
  187.             }
  188.  
  189.         }
  190.         while (ID != AppStrings [Mid] . cca_ID && Left <= Right);
  191.  
  192.         if (ID == AppStrings [Mid] . cca_ID)
  193.         {
  194.  
  195.             Builtin = AppStrings [Mid] . cca_Str;
  196.  
  197.         }
  198.         else
  199.         {
  200.  
  201.             Builtin = "";
  202.  
  203.         }
  204.  
  205.     }
  206.  
  207.     if (Catalog)
  208.     {
  209.  
  210.         STRPTR    String = GetCatalogStr (Catalog, ID, Builtin);
  211.  
  212.         if (String [0])
  213.         {
  214.  
  215.             return (String);
  216.  
  217.         }
  218.  
  219.     }
  220.  
  221.     return (Builtin);
  222.  
  223. }
  224.  
  225. ///
  226.  
  227.