/* Michael Christoph Software */
/* myListCatalog - Catalog Texte ausgeben */

/*
  g++ myListCatalog.c -o myListCatalog -l auto

  myListCatalog locale:catalog/german/sys/prefs.catalog 

  catcomp prefs.cd prefs.ct catalog prefs-neu.catalog nooptim
*/

/************************** PROGRAMM-PARAMETER ********************************/

#define PROGNAME "myListCatalog"
#define VERSIONR "1.00"
#define PROGDATE "26.11.2024"
#define COPYRIGT "Copyright © Nov.2024"
#define AUTORNAM "by Meicky-Soft"

volatile const char __attribute__((unused)) *version = "\0$VER: " PROGNAME " " VERSIONR " (" PROGDATE ") - " COPYRIGT " " AUTORNAM "\0\n";

/******************************* INCLUDES *************************************/

#include <exec/execbase.h>
#include <classes/requester.h>
#include <workbench/startup.h>

#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/utility.h>
#include <proto/locale.h>

/***************************** PROTOTYPEN *************************************/

/************************ VARIABLEN DEKLARATIONEN *****************************/

struct Catalog *gb_Catalog;

const TEXT *gb_ArgTemplate = "CATALOG,ID/K,DEBUG/K";
enum { ARG_catalog, ARG_id, ARG_debug, ARG_MAXI };
uint32 gb_Args[ARG_MAXI] = { (uint32)NULL,(uint32)NULL,(uint32)NULL };

#define CATSTR(id)        ILocale->GetCatalogStr(gb_Catalog,id,(STRPTR)STR_ ## id)
#define CATSTRSTR(id,str) ILocale->GetCatalogStr(gb_Catalog,id,(STRPTR)str)

USED CONST TEXT stacksize[] = "$STACK:80000";

/******************************************************************************/

CONST_STRPTR ReplaceNL(CONST_STRPTR str)
{
  static TEXT sout[1000];
  uint32 i, j=0;

  if(IUtility->Strlen(str) < 970)
  {
    IUtility->SetMem(sout,'\0',sizeof(sout));
    for(i=0; i<IUtility->Strlen(str); ++i)
    {
      if(str[i] == '\n') { IUtility->Strlcat(sout,"\\n",sizeof(sout)); j+=2; } 
      else if(str[i] == '\\') { IUtility->Strlcat(sout,"\\",sizeof(sout)); j+=1; } 
      else if(str[i] == '\"') { IUtility->Strlcat(sout,"\\\"",sizeof(sout)); j+=2; } 
      else sout[j++] = str[i];
    }
  }
  else return str;  // Text ist zu lange, unverändert zurück geben
  return sout;
}

/******************************************************************************/

int main(int argc, char *argv[])
{
  int res = RETURN_ERROR;
  TEXT gb_ProgName[50];  // Programmname alleine
  TEXT progname[120];    // Programmname evtl. mit Pfad
  struct RDArgs *rda = NULL;

  IDOS->GetCliProgramName(progname,sizeof(progname));
  IUtility->Strlcpy(gb_ProgName,IDOS->FilePart(progname),sizeof(gb_ProgName));  // evtl. Pfadangabe entfernen

  // ins Programmverzeichnis wechseln und Programmnamen ermitteln
  BPTR olddir = IDOS->SetCurrentDir(IDOS->GetProgramDir());

  if((rda = IDOS->ReadArgs((STRPTR)gb_ArgTemplate,(LONG*)gb_Args,NULL)))
  {
    if((gb_Catalog = ILocale->OpenCatalog(NULL,(STRPTR)gb_Args[ARG_catalog],
                                    OC_BuiltInLanguage, NULL,
                                    //OC_Version,         1,
                                    TAG_DONE)))
    {
      uint32 id, num=0;
      CONST_STRPTR s, sw;
      TEXT namecd[250], namect[250];
      BPTR cd, ct;

//s = ILocale->GetCatalogStr(gb_Catalog,10,NULL);
//IDOS->Printf("Text <%s>\n",s);
//IDOS->Printf("Zeichen %ld %ld %ld %ld\n",s[0],s[1],s[2],s[3]);

      IUtility->Strlcpy(namecd,(STRPTR)gb_Args[ARG_catalog],sizeof(namecd));
      id = IUtility->Strlen(namecd);
      namecd[id-6] = 'd'; namecd[id-5] = '\0';
      IUtility->Strlcpy(namect,namecd,sizeof(namect));
      id = IUtility->Strlen(namect);
      namect[id-1] = 't';

      if((cd = IDOS->FOpen(namecd,MODE_NEWFILE,0)))
      {
        if((ct = IDOS->FOpen(namect,MODE_NEWFILE,0)))
        {

          for(id=0; id<100000; ++id)
          {
            if((s = ILocale->GetCatalogStr(gb_Catalog,id,NULL)) != NULL)
            {
              IDOS->Printf("\r%ld",id);
              sw = ReplaceNL(s);
              IDOS->FPrintf(cd,"MSG_%ld (%ld//)\n; %s\n",id,id,sw);
              IDOS->FPrintf(ct,"MSG_%ld\n%s\n",id,sw);
              ++num;
            }
          }
          IDOS->Printf("\r%ld Texte gefunden.\n",num);

          res = RETURN_OK;

          IDOS->FClose(ct);
        }
        else IDOS->Printf("FEHLER %ld: beim öffnen der Ausgabedatei ct <%s>.\n",IDOS->IoErr(),namect);

        IDOS->FClose(cd);
      }
      else IDOS->Printf("FEHLER %ld: beim öffnen der Ausgabedatei cd <%s>.\n",IDOS->IoErr(),namecd);

      ILocale->CloseCatalog(gb_Catalog);
    }
    else IDOS->Printf("FEHLER: beim öffnen des Catalogs <%s>.\n",(STRPTR)gb_Args[ARG_catalog]);

    IDOS->FreeArgs(rda);
  }
  else { IDOS->PrintFault(IDOS->IoErr(),gb_ProgName); res = RETURN_ERROR; }


  // zurück ins Aufrufverzeichnis
  IDOS->SetCurrentDir(olddir);

  return( res );
}

/******************************************************************************/
