(*------------------------------------------

  :Module.      KitCat.mod
  :Author.      Albert Weinert  [awn]
  :Address.     Krähenweg 21 , 50829 Köln
  :EMail.       Usenet_> aweinert@darkness.gun.de
  :EMail.       Z-Netz_> A.WEINERT@DARKNESS.ZER
  :Phone.       0221 / 580 29 84
  :Revision.    R.4
  :Date.        25-Jun-1993
  :Copyright.   Albert Weinert
  :Language.    Oberon-2
  :Translator.  Amiga Oberon 3.00d
  :Contents.    Konvertiert eine CatalogDescription Datei in ein Oberon Modul
  :Contents.    anstatt wie CatComp C oder Assembler Source zu erzeugen.
  :Imports.     C2OData.mod, Cd2OberonVersion.mod, Cd2OberonLocale.mod [awn]
  :Imports.     CDInput.mod, OberonOutput.mod [awn]
  :Remarks.     Braucht die v39 Interfaces.
  :Bugs.        <Bekannte Fehler>
  :Usage.       Cd2Oberon <description> <module>
  :History.     .0     [awn] 16-May-1993 : Erstellt
  :History.     .1     [awn] 17-May-1993 : Argumente werden ausgewertet, evtl.
  :History.            die Fehlermeldungen ausgeben, und sonstige Texte ausgeben.
  :History.     .3     [awn] 23-Jun-1993 : Beschreibungs und übersetzung werden nun auch
  :History.            auf "komplettheit" geprüft wenn man eine C-Datei oder Oberon-Datei
  :History.            anlegt.
  :History.     .4     [awn] 25-Jun-1993 : Von Cd2Oberon nach KitCat umbenannt

--------------------------------------------*)
MODULE KitCat;

IMPORT  ci:=CDInput,
        oo:=OberonOutput,
        cc:=CatalogOutput,
        to:=TranslationOutput,
        ti:=TranslationInput,
        cfo:=COutput,
        Dos,Exec,SYSTEM,
        cd:=C2OData,
        cv:=KitCatVersion,
        cl:=KitCatLocale,
        u:=Utility,
(*
 *        NoGuru,
 *)
        str:=Strings;


CONST Template = "DESCRIPTOR,TRANSLATION,CTFILE/K,CATALOG/K,OFILE/K,CFILE/K,L=LANGUAGE/K,V39/S,V38/S,SS=SHORTSTRINGS/S,NSS=NOSHORTSTRING/S";
      envname  = "ENV:KitCat";
VAR rd,rde,rda: Dos.RDArgsPtr;
    fh: Dos.FileHandlePtr;
    Opt : STRUCT(dum: Dos.ArgsStruct);
            descriptor  : Exec.STRPTR;
            translation : Exec.STRPTR;
            ctfile      : Exec.STRPTR;
            catalog     : Exec.STRPTR;
            ofile       : Exec.STRPTR;
            cfile       : Exec.STRPTR;
            language    : Exec.STRPTR;
            V39         : Exec.LONGBOOL;
            V38         : Exec.LONGBOOL;
            shortstring : Exec.LONGBOOL;
            nshortstring: Exec.LONGBOOL;
          END;

    descriptor,
    translation,
    ctfile,
    ofile,
    cfile,
    catalog,
    language,
    error,
    envvar : Exec.STRING;

    ok:BOOLEAN;

BEGIN
  ok:=TRUE;
  fh:=Dos.Open(envname,Dos.oldFile);
  IF fh # NIL THEN
    IF Dos.Read(fh,envvar,SIZE(envvar)) # -1 THEN
      rda:=Dos.AllocDosObjectTags(Dos.rdArgs,u.done);
      IF rda # NIL THEN
        str.Append(envvar,"\n");
        rda.source.buffer:=SYSTEM.ADR(envvar);
        rda.source.length:=str.Length(envvar);
        rde:=Dos.ReadArgs(Template,Opt,rda);
        IF rde = NIL THEN
          ok:=FALSE;
          cd.error:=cl.errInENVArgs;
          cd.para1:=SYSTEM.ADR(envname);
        END;
      ELSE;
        ok:=FALSE;
        cd.error:=cl.errNoMemForRDArgs;
      END;
    END;
    Dos.OldClose(fh);
  END;
  Dos.PrintF("%s © 1993 Albert Weinert\n\n",SYSTEM.ADR(cv.nameVer));
  IF ok THEN
    rd:=Dos.ReadArgs(Template,Opt,NIL);
    IF rd = NIL THEN
      ok:=FALSE;
      cd.error:=cl.errInArguments;
    END;
  END;
  (* $OddChk- *)
  IF Opt.descriptor # NIL THEN
    COPY(Opt.descriptor^,descriptor);
  END;
  IF Opt.translation # NIL THEN
    COPY(Opt.translation^,translation);
  END;

  IF Opt.ctfile # NIL THEN
    COPY(Opt.ctfile^,ctfile);
  END;

  IF Opt.ofile # NIL THEN
    COPY(Opt.ofile^,ofile);
    cd.CDList.function:="GetString";
  END;

  IF Opt.catalog # NIL THEN
    COPY(Opt.catalog^,catalog);
  END;

  IF Opt.language # NIL THEN
    COPY(Opt.language^,language);
  END;

  IF Opt.cfile # NIL THEN
    COPY(Opt.cfile^,cfile);
  END;

  (* $OddChk= *)
  cl.OpenCatalog(NIL,language);
  IF ok THEN
    IF Opt.descriptor = NIL THEN
      ok:=FALSE;
      cd.error:=cl.errNoDescriptor;
    END;
    IF ok THEN
      IF (Opt.ctfile # NIL) & (Opt.catalog # NIL) THEN
        ok:=FALSE;
        cd.error:=cl.errCTandCatalog;
      END;
    END;
  END;
  IF ok THEN
    Dos.PrintF(cl.GetString(cl.msgLoadDesc)^,SYSTEM.ADR(descriptor));
    ok:=ci.Import(descriptor);
    IF ok THEN
      Dos.PrintF(cl.GetString(cl.msgCdOK)^,SYSTEM.ADR(descriptor));

      IF ok THEN
        IF translation # "" THEN
          Dos.PrintF(cl.GetString(cl.msgLoadTrans)^,SYSTEM.ADR(translation));
          ok:=ti.Import(translation,(catalog#"") OR (ctfile=""));
          IF ok THEN
            Dos.PrintF(cl.GetString(cl.msgCtOK)^,SYSTEM.ADR(translation));
          END;
        END;
      END;

      IF ok THEN
         IF (ctfile # "") AND (translation # "") THEN
           ok:=to.CheckTranslation(TRUE,TRUE);
         ELSIF (ctfile = "") AND (translation # "") THEN
           ok:=to.CheckTranslation(FALSE,FALSE);
         ELSIF (translation = "") OR (ctfile # "") THEN
           ok:=to.CheckTranslation(TRUE,FALSE);
         END;
      END;

      IF ok THEN
        IF ctfile # "" THEN
          Dos.PrintF(cl.GetString(cl.msgCreateTranslation)^,SYSTEM.ADR(ctfile));
          ok:=to.Create(ctfile);
        END;
      END;


      IF ok THEN
        IF ofile # "" THEN
          Dos.PrintF(cl.GetString(cl.msgCreateMod)^,SYSTEM.ADR(ofile));
          ok:=oo.Create(ofile,descriptor,(Opt.V39#Exec.LFALSE) & (Opt.V38 = Exec.LFALSE),(Opt.shortstring#Exec.LFALSE) & (Opt.nshortstring = Exec.LFALSE));
        END;
      END;

      IF ok THEN
        IF cfile # "" THEN
          Dos.PrintF(cl.GetString(cl.msgCreateCFile)^,SYSTEM.ADR(cfile));
          ok:=cfo.Create(cfile,descriptor,(Opt.shortstring#Exec.LFALSE) & (Opt.nshortstring = Exec.LFALSE));
        END;
      END;

      IF ok THEN
        IF catalog # "" THEN
          IF translation # "" THEN
            Dos.PrintF(cl.GetString(cl.msgCreateCatalog)^,SYSTEM.ADR(catalog));
            ok:=cc.Create(catalog);
          ELSE
            cd.error:=cl.errMissingCT;
            ok:=FALSE;
          END;
        END;
      END;

    END;
  END;
CLOSE
  IF rd # NIL THEN Dos.FreeArgs(rd) END;
  IF rde # NIL THEN Dos.FreeArgs(rde) END;
  IF cd.error # 0 THEN
    Dos.PrintF(cl.GetString(cl.msgError)^);
    Dos.PrintF(cl.GetString(cd.error)^,cd.para1,cd.para2,cd.para3);
    Dos.PrintF("\n");
    HALT(20);
  END;
  IF ~ ok THEN
    IF Dos.Fault( Dos.IoErr(),cv.name,error, LEN(error) ) THEN
      Dos.PrintF(error);
      Dos.PrintF("\n");
    END;
  ELSE;
    Dos.PrintF("Gebe Speicher frei\n");
  END;
END KitCat.
