(* ------------------------------------------------------------------------
  :Program.       BlackMagicStrings.mod
  :Contents.      Localization support module for BlackMagic
  :Author.        Cat2Mod.rexx 2.0
  :Language.      Oberon-2
  :Translator.    Amiga Oberon 3.00
  :History.       Version: 0
------------------------------------------------------------------------- *)

MODULE BlackMagicStrings;

IMPORT
  loc: Locale, u: Utility, e: Exec, y: SYSTEM;

CONST
  catalogName* = "blackmagic.catalog";
  tongue     * = "english";
  catVersion * = 0;


(* string constants generated from catalog definition: *)

  titleReadArgsRequest * = "\x00\x00" ": Argument Request";
  msgWarnArgRequired   * = "\x00\x01" "\nWarning: this argument is required.";
  fmtRequestArgPrompt  * = "\x00\x02" "Enter %s for template item \"%s%s\":";
  itemString           * = "\x00\x03" "a string";
  itemBool             * = "\x00\x04" "a boolean value";
  itemInteger          * = "\x00\x05" "an integer number";
  itemStringsCommaSep  * = "\x00\x06" "strings separated by ','";
  itemStringsBarSep    * = "\x00\x07" "strings separated by '|'";
  itemIntegersCommaSep * = "\x00\x08" "integers separated by ','";
  itemIntegersBarSep   * = "\x00\x09" "integers separated by '|'";

TYPE
  LongStrPtr * = UNTRACED POINTER TO ARRAY MAX (LONGINT)-1 OF CHAR;

VAR
  DefaultCatalog * : loc.CatalogPtr;

PROCEDURE StrIndex * (str: ARRAY OF CHAR; n: LONGINT): LongStrPtr;
(* $CopyArrays- *)
BEGIN
  RETURN y.VAL (LongStrPtr, y.VAL (LONGINT, y.ADR (str[0])) + SIZE (CHAR) *n);
END StrIndex;

PROCEDURE StrIndexA * (str: ARRAY OF CHAR; n: LONGINT): e.APTR;
(* $CopyArrays- *)
BEGIN
  RETURN StrIndex (str, n);
END StrIndexA;

PROCEDURE GetCatalogStr * (catalog: loc.CatalogPtr;
                           string : ARRAY OF CHAR  ): LongStrPtr;
VAR
  str1     : LongStrPtr;
  str2     : e.APTR;
  id       : LONGINT;
(* $CopyArrays- *)
BEGIN
  str1 := StrIndex (string, 2);
  IF loc.base = NIL THEN RETURN str1; END;
  id := ASH (ORD (string[0]), 8) + ORD (string[1]);
  str2 := loc.GetCatalogStr (catalog, id, str1^);
  IF str2 # NIL THEN str1 := str2; END;
  RETURN str1;
END GetCatalogStr;

PROCEDURE GetCatalogStrA * (catalog: loc.CatalogPtr;
                            string : ARRAY OF CHAR  ): e.APTR;
(* $CopyArrays- *)
BEGIN
  RETURN GetCatalogStr (catalog, string);
END GetCatalogStrA;

PROCEDURE GetStr * (string: ARRAY OF CHAR): LongStrPtr;
(* $CopyArrays- *)
BEGIN
  RETURN GetCatalogStr (DefaultCatalog, string);
END GetStr;

PROCEDURE GetStrA * (string: ARRAY OF CHAR): e.APTR;
(* $CopyArrays- *)
BEGIN
  RETURN GetStr (string);
END GetStrA;

PROCEDURE OpenBlackMagicCatalog * (language: ARRAY OF CHAR);
VAR
  tag : u.Tag;
  ctlg: loc.CatalogPtr;
(* $CopyArrays- *)
BEGIN
  IF loc.base # NIL THEN
    IF language = "" THEN tag := u.done; ELSE tag := loc.Language; END;
    ctlg := loc.OpenCatalog (NIL, catalogName, loc.BuiltInLanguage,
                             StrIndexA (tongue, 0), loc.Version,
                             catVersion, tag, StrIndexA (language, 0), u.done);
    IF ctlg # NIL THEN
      IF DefaultCatalog # NIL THEN loc.CloseCatalog (DefaultCatalog); END;
      DefaultCatalog := ctlg;
    END;
  END;
END OpenBlackMagicCatalog;

BEGIN
  OpenBlackMagicCatalog ("");

CLOSE
  IF loc.base # NIL THEN IF DefaultCatalog # NIL THEN
    loc.CloseCatalog (DefaultCatalog);
  END; END;
END BlackMagicStrings.

