/*
    REFERENCES -- bibliographic software
    Copyright (C) 1995-2007  Volker Kiefel

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
    USA
*/

/*
   list_fun.c: compile list of references, standard format
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "refs.h"
#include "list_fun.h"
#include "ix01_fun.h"
#include "ix02_fun.h"
#include "fl_ut.h"
#include "str_fun.h"
#include "interf.h"
#include "initial.h"

#define REFZAHL_LEN 7
#define TEXTZEILEN_LEN 65
#define TXTBUF_SIZE 15000
#define BBTBUF_SIZE 4000

 extern char journal_pix_name[PFAD_LEN+1];
 extern char journal_name[PFAD_LEN + 1];
 extern char book_name[PFAD_LEN + 1];
 extern char autorjl_name[PFAD_LEN + 1];
 extern char autorbu_name[PFAD_LEN + 1];
 extern char quell_pix_name[PFAD_LEN + 1];
 extern char quell_name[PFAD_LEN + 1];
 static char txt_name[PFAD_LEN + 1];
 extern char log_name[PFAD_LEN + 1];
 static char bbt_name[PFAD_LEN + 1];
 static char haupt_schluessel[KENNZIFFER_LEN + 1];
 static char quell_schluessel[QUELLKUERZEL_LEN + 1];
 static char txt_buf[TXTBUF_SIZE + 1];
 static char bbt_buf[BBTBUF_SIZE + 1];

 extern char textpfad[PFAD_LEN+1];
 extern char rdbpfad[PFAD_LEN+1];

 extern FILE * ix01file;
 extern FILE * ix02file;
 extern FILE * fpjournal;
 extern FILE * fpbuch;
 extern FILE * fpautorjl;
 extern FILE * fpautorbu;
 extern FILE * fpsource;
  static FILE * fpbbt;
  static FILE * fptxt;


  static char * au_zeile;
  static char * ed_zeile;
  static char * ex_au_zeile;
  static char * ausgabe_zeile;

 extern config_set one_config_set;
 extern char wrtxtbu[WRTXTBU_LEN+1];
 
 extern journal_rec            one_journal_rec;
 extern buch_rec               one_buch_rec;
 extern quell_rec              one_quell_rec;
 extern refspix_rec            ix01rec;
 extern quellpix_rec           ix02rec;
 extern author_rec             one_aued_rec;
 static bbatchtable_rec        one_bbt_rec;

 static int getfilenames_list_fun(void);
 static int list_fun_initialize(void);
 static int list_fun_aufraeumen(void);
 static int dateien_oeffnen_list_fun(void);
 static void dateien_schliessen_list_fun(void);
 static void machlist_list_fun(void);
 static void compile_j1_list_fun(void);
 static void compile_j2_list_fun(void);
 static void compile_b1_list_fun(void);
 static void compile_b2_list_fun(void);
 static void compile_b3_list_fun(void);
 static void compile_m1_list_fun(void);
 static void compile_m2_list_fun(void);
 static void compile_aued(FILE * fpaued, char * auedstring, long zeiger);


int list_fun_main(char * code)
{
    int rueckgabewert;

    rueckgabewert = 1;
    
    if (!getfilenames_list_fun())
    {
       rueckgabewert=0;
       return rueckgabewert;
    }
    // weiter
    list_fun_initialize();
    if (dateien_oeffnen_list_fun())
    {
      machlist_list_fun();
      dateien_schliessen_list_fun();
      load_file_yn(txt_name);
    }
    list_fun_aufraeumen();
    
    return rueckgabewert;
}


static int getfilenames_list_fun(void)
{
   int rueckgabewert;
   int taste;
   char datei[PFAD_LEN+1];
   static char ein[INPUT_BU_LEN+1];

   if (!dateivornamen_holen(datei,"Please enter name for text file (default reflist)"))
   {
      strcpy(datei,"reflist");
   }
   strlimcpy(txt_name,textpfad,PFAD_LEN);
   strlimcat(txt_name,datei,PFAD_LEN);
   strlimcat(txt_name,".txt",PFAD_LEN);
   if (isfile(txt_name))
   {
     strcpy(ein,"menu");
     wrtxt("\nMenu: text file already exists, overwrite [y/n]?\n");
     taste = menu_wahl(ein,
                       "[y] yes, overwrite existing file\n"
                       "[n] no, do not overwrite existing file");
     if (taste==2)
     {
        rueckgabewert = 0;
        return rueckgabewert;
     }
   }
   /* begin new 29.11.2006 */
   wrtxt(LIST_FUN_EXPL1);
   /* end new 29.11.2006 */

   taste = datei_suchen_mit_pfad("*.bbt",rdbpfad,bbt_name);
   rueckgabewert = taste; 
   return rueckgabewert;   
}

static int list_fun_initialize(void)
{
   if ((au_zeile =  (char *) malloc((AUTORZEILE_LEN+1) * sizeof(char)))==NULL)
   {
      fprintf(stderr,"\nERROR 'List' 'StandardFormat' memory allocation\n");
      exit(1);
   }
   if ((ed_zeile =  (char *) malloc((AUTORZEILE_LEN+1) * sizeof(char)))==NULL)
   {
      fprintf(stderr,"\nERROR 'List' 'StandardFormat' memory allocation\n");
      exit(1);
   }
   if ((ex_au_zeile =  (char *) malloc((AUTORZEILE_LEN+1) * sizeof(char)))==NULL)
   {
      fprintf(stderr,"\nERROR 'List' 'StandardFormat' memory allocation\n");
      exit(1);
   }
   if ((ausgabe_zeile =  (char *) malloc((AUSGABEZEILE_LEN+1) * sizeof(char)))==NULL)
   {
      fprintf(stderr,"\nERROR 'List' 'StandardFormat' memory allocation\n");
      exit(1);
   }
   return 1;
}

static int list_fun_aufraeumen(void)
{
   free(au_zeile);
   free(ed_zeile);
   free(ex_au_zeile);
   free(ausgabe_zeile);
   return 1;
}

static int dateien_oeffnen_list_fun(void)
{
  if (filesize(journal_pix_name)==0)
  {
    wrtxt("ERROR: main index file is empty\n");
    return 0;
  }
  if (!read_ix01(journal_pix_name)) return 0;
  if (!read_ix02(quell_pix_name)) return 0;
  if ((fpjournal=fopen(journal_name,"rb"))==NULL)
  {
    sprintf(wrtxtbu,"\nERROR: cannot read %s\n",journal_name);
    wrtxt(wrtxtbu);
    close_ix01();
    close_ix02();
    return 0;
  }

  if ((fpbuch=fopen(book_name,"rb"))==NULL)
  {
    sprintf(wrtxtbu,"\nERROR: cannot read %s\n",book_name);
    wrtxt(wrtxtbu);
    close_ix01();
    close_ix02();
    fclose(fpjournal);
    return 0;
  }
  if ((fpautorjl=fopen(autorjl_name,"rb"))==NULL)
  {
    sprintf(wrtxtbu,"\nERROR: cannot read %s\n",autorjl_name);
    wrtxt(wrtxtbu);
    close_ix01();
    close_ix02();
    fclose(fpjournal);
    fclose(fpbuch);
    return 0;
  }
  if ((fpautorbu=fopen(autorbu_name,"rb"))==NULL)
  {
    sprintf(wrtxtbu,"\nERROR: cannot read %s\n",autorbu_name);
    wrtxt(wrtxtbu);
    close_ix01();
    close_ix02();
    fclose(fpjournal);
    fclose(fpbuch);
    fclose(fpautorjl);
    return 0;
  }

  if ((fpbbt=fopen(bbt_name,"rb"))==NULL)
  {
    sprintf(wrtxtbu,"\nERROR: cannot read %s\n",bbt_name);
    wrtxt(wrtxtbu);
    close_ix01();
    close_ix02();
    fclose(fpjournal);
    fclose(fpbuch);
    fclose(fpautorjl);
    fclose(fpautorbu);
    return 0;
  }
  if (setvbuf(fpbbt,bbt_buf,_IOFBF,BBTBUF_SIZE)!=0)
  {
    wrtxt("\nERROR: Cannot allocate memory for fpbbt\n");
    close_ix01();
    close_ix02();
    fclose(fpjournal);
    fclose(fpbuch);
    fclose(fpautorjl);
    fclose(fpautorbu);
    fclose(fpbbt);
    return 0;
  }

  if ((fpsource=fopen(quell_name,"rb"))==NULL)
  {
    sprintf(wrtxtbu,"\nERROR: cannot read %s\n",quell_name);
    wrtxt(wrtxtbu);
    close_ix01();
    close_ix02();
    fclose(fpjournal);
    fclose(fpbuch);
    fclose(fpautorjl);
    fclose(fpautorbu);
    fclose(fpbbt);
    return 0;
  }

  if ((fptxt=fopen(txt_name,"w"))==NULL)
  {
    sprintf(wrtxtbu,"\nERROR: write read %s\n",txt_name);
    wrtxt(wrtxtbu);
    close_ix01();
    close_ix02();
    fclose(fpjournal);
    fclose(fpbuch);
    fclose(fpautorjl);
    fclose(fpautorbu);
    fclose(fpbbt);
    fclose(fpsource);
    return 0;
  }
  if (setvbuf(fptxt,txt_buf,_IOFBF,TXTBUF_SIZE)!=0)
  {
    wrtxt("\nERROR: Cannot allocate memory for fptxt\n");
    close_ix01();
    close_ix02();
    fclose(fpjournal);
    fclose(fpbuch);
    fclose(fpautorjl);
    fclose(fpautorbu);
    fclose(fpbbt);
    fclose(fpsource);
    fclose(fptxt);
    return 0;
  }
  if (logdatei_oeffnen()==0)
  {
    sprintf(wrtxtbu,"\nERROR: write read %s\n",log_name);
    wrtxt(wrtxtbu);
    close_ix01();
    close_ix02();
    fclose(fpjournal);
    fclose(fpbuch);
    fclose(fpautorjl);
    fclose(fpautorbu);
    fclose(fpbbt);
    fclose(fpsource);
    fclose(fptxt);
    return 0;
  }

  return 1;
}


static void dateien_schliessen_list_fun(void)
{
   close_ix01();
   close_ix02();
   fclose(fpjournal);
   fclose(fpbuch);
   fclose(fpautorjl);
   fclose(fpautorbu);
   fclose(fpbbt);
   fclose(fpsource);
   fclose(fptxt);
   // fclose(fplog);
   logdatei_schliessen();
}

static void machlist_list_fun(void)
{
   long i, j, byte_zeiger, rec_zeiger, anzahl_records;
   static int  taste, ok;
   int schleifeok;
   /* long verzoegerung; */
   char zahl[REFZAHL_LEN+1];
   static char ein[INPUT_BU_LEN+1];

   
   fseek(fpbbt,0L,SEEK_END);
   byte_zeiger = ftell(fpbbt);
   anzahl_records = byte_zeiger/sizeof(one_bbt_rec);
   anzahl_records--;
   // wrtxt("\n");
 
   strcpy(zahl,"1");
   if (anzahl_records==-1)
   {
      wrtxt("\nCurrent BBT-file is empty\n");
      return;
   }
   strcpy(ein,"menu");
   wrtxt("\nMenu: Reference number format [1/2/3/4/5/6/q]\n");
   taste = menu_wahl(ein,
     "[1] number only: (n) ...\n"
     "[2] number and reference key: (n) <REFKEY> ...\n"
     "[3] reference key: <REFKEY> ...\n"
     "[4] no leading numbers\n"
     "[5] REFKEY*00000N: tbt-format, wrapped (65 char)\n"
     "[6] REFKEY*BBT-TEXT: tbt-format, wrapped (65 char)\n"
     "[q] quit"
     );
   
   if (taste==7)
   {
      return;
   }
   if (taste==1 || taste==2 || taste==5)
   {
    schleifeok = 0;
    do
    {
      ein_zeile(zahl,"Number assigned to the first reference (default 1)",REFZAHL_LEN);
      if (strlen(zahl)==0)
      {
        j = 1;
        ok = 1;
      } else
      {
        string_in_long(zahl,&j,&ok);
      }
      if (ok) schleifeok=1; else schleifeok=0;
     }
     while (!schleifeok);
   }
   schleifeok = 0;
   strcpy(zahl,"0");
  
   sprintf(wrtxtbu,"\n(Compiling %li references)\n",anzahl_records+1);
   wrtxt(wrtxtbu);
   rewind(fpbbt);
   for (i=0;i<=anzahl_records;i++)
   {
        /* */
        if ((i % 100)==0)
        {
           if (i==100) wrtxt("\n");
           if (i>0)
           {
             sprintf(wrtxtbu,"[%li] ",i);
             wrtxt(wrtxtbu);
           }
        }
        /*  
        if (((i % 100)==0) || (i==anzahl_records))
        {
           if (i==100) wrtxt("\n");
           if (i>0)
           {
             sprintf(wrtxtbu,"%5.1f%%",100.0*i/anzahl_records);
             wrtxt(wrtxtbu);
             wrtxt("\b\b\b\b\b\b");
           }
        }
         */ 
        fread(&one_bbt_rec, sizeof(one_bbt_rec),1,fpbbt);
        strlimcpy(haupt_schluessel,one_bbt_rec.kennziffer,KENNZIFFER_LEN);
        if (locate_ix01(haupt_schluessel,&ix01rec) > -1)
        {
           rec_zeiger = ix01rec.journal_rptr;
           byte_zeiger = rec_zeiger * sizeof(one_journal_rec);
           fseek(fpjournal,byte_zeiger,SEEK_SET);
           fread(&one_journal_rec,sizeof(one_journal_rec),1,fpjournal);

           if (taste==1) sprintf(ausgabe_zeile,"[%li] ",j);
           else if (taste==2) sprintf(ausgabe_zeile,"[%li] <%s> ",j,haupt_schluessel);
           else if (taste==3) sprintf(ausgabe_zeile,"<%s> ",haupt_schluessel);
           else if (taste==4) strcpy(ausgabe_zeile,"");
           else if (taste==5) sprintf(ausgabe_zeile,"*%s*%06li* ",haupt_schluessel,j);
           else sprintf(ausgabe_zeile,"*%s* %s * ",haupt_schluessel,one_bbt_rec.sortierfeld);

           if (!strcmp(one_journal_rec.reftyp,"j1")) compile_j1_list_fun();
           else if (!strcmp(one_journal_rec.reftyp,"j2")) compile_j2_list_fun();
           else if (!strcmp(one_journal_rec.reftyp,"b1")) compile_b1_list_fun();
           else if (!strcmp(one_journal_rec.reftyp,"b2")) compile_b2_list_fun();
           else if (!strcmp(one_journal_rec.reftyp,"b3")) compile_b3_list_fun();
           else if (!strcmp(one_journal_rec.reftyp,"m1")) compile_m1_list_fun();
           else compile_m2_list_fun();
           if (taste==5 || taste==6)
           {
               wwrap(ausgabe_zeile,TEXTZEILEN_LEN);
               if (ausgabe_zeile[strlen(ausgabe_zeile)-1]=='\n')
                  ausgabe_zeile[strlen(ausgabe_zeile)-1]='\0';
               fprintf(fptxt,"%s\n\n",ausgabe_zeile);
           }
           else
           {
               fprintf(fptxt,"%s\n\n",ausgabe_zeile);
           }

        }
        else
        {
          /* begin new for version 4.1h */
          if (taste==1) sprintf(ausgabe_zeile,"[%li] ",j);
          else if (taste==2) sprintf(ausgabe_zeile,"[%li] <%s> ",j,haupt_schluessel);
          else if (taste==3) sprintf(ausgabe_zeile,"<%s> ",haupt_schluessel);
          else if (taste==4) strcpy(ausgabe_zeile,"");
          else if (taste==5) sprintf(ausgabe_zeile,"*%s*%06li* ",haupt_schluessel,j);
          else sprintf(ausgabe_zeile,"*%s* %s * ",haupt_schluessel,one_bbt_rec.sortierfeld);

          fprintf(fptxt,"%s--%s--\n\n",ausgabe_zeile,one_bbt_rec.kennziffer);
          /* end new for version 4.1h */
          sprintf(wrtxtbu,"# %s: not found",haupt_schluessel);
          logdatei_schreiben(wrtxtbu);
        }
        j++;
   }
   if (i > 100) wrtxt("\n");
    sprintf(wrtxtbu,"\n(Textfile %s written)\n",txt_name);
    wrtxt(wrtxtbu);
}


static void compile_j1_list_fun(void)
{
   compile_aued(fpautorjl, au_zeile,ix01rec.autorjl_rptr);
   strlimcat(ausgabe_zeile,au_zeile,AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,one_journal_rec.titel,AUSGABEZEILE_LEN);
   if (!satzzeichen(ausgabe_zeile))
      strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   else
      strlimcat(ausgabe_zeile," ",AUSGABEZEILE_LEN);

   strncpy(quell_schluessel,one_journal_rec.kuerzel,KUERZEL_LEN);
   if (locate_ix02(quell_schluessel,&ix02rec) > -1)
   {
       long byte_zeiger;
       byte_zeiger = ix02rec.quell_rptr * sizeof(one_quell_rec);
       fseek(fpsource,byte_zeiger,SEEK_SET);
       fread(&one_quell_rec,sizeof(one_quell_rec),1,fpsource);
       strlimcat(ausgabe_zeile,one_quell_rec.quell_zeitschrift,AUSGABEZEILE_LEN);
       strlimcat(ausgabe_zeile," ",AUSGABEZEILE_LEN);
   }
   else
   {
      strlimcat(ausgabe_zeile,"[",AUSGABEZEILE_LEN);
      strlimcat(ausgabe_zeile,quell_schluessel,AUSGABEZEILE_LEN);
      strlimcat(ausgabe_zeile,"] ",AUSGABEZEILE_LEN);
      // fprintf(fplog,"# %s: JOURNAL name corresponding to [%s] not found\n",haupt_schluessel,quell_schluessel);
      sprintf(wrtxtbu,"# %s: JOURNAL name corresponding to [%s] not found",haupt_schluessel,quell_schluessel);
      logdatei_schreiben(wrtxtbu);
   }

   strlimcat(ausgabe_zeile,one_journal_rec.jahrgang,AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,"; ",AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,one_journal_rec.band,AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,": ",AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,one_journal_rec.seite_von,AUSGABEZEILE_LEN);
   if (strcmp(one_journal_rec.seite_von,one_journal_rec.seite_bis)!=0 &&
       strlen(one_journal_rec.seite_bis)>0)
   {
       strlimcat(ausgabe_zeile,"-",AUSGABEZEILE_LEN);
       strlimcat(ausgabe_zeile,one_journal_rec.seite_bis,AUSGABEZEILE_LEN);
   }
   strlimcat(ausgabe_zeile,".",AUSGABEZEILE_LEN);
}

static void compile_j2_list_fun(void)
{
   if (strlen(one_journal_rec.instau) > 0)
   {
      strlimcat(ausgabe_zeile,one_journal_rec.instau,AUSGABEZEILE_LEN);
      strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   }
   strlimcat(ausgabe_zeile,one_journal_rec.titel,AUSGABEZEILE_LEN);
   if (!satzzeichen(ausgabe_zeile))
      strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   else
      strlimcat(ausgabe_zeile," ",AUSGABEZEILE_LEN);

   strncpy(quell_schluessel,one_journal_rec.kuerzel,KUERZEL_LEN);
   if (locate_ix02(quell_schluessel,&ix02rec) > -1)
   {
       long byte_zeiger;
       byte_zeiger = ix02rec.quell_rptr * sizeof(one_quell_rec);
       fseek(fpsource,byte_zeiger,SEEK_SET);
       fread(&one_quell_rec,sizeof(one_quell_rec),1,fpsource);
       strlimcat(ausgabe_zeile,one_quell_rec.quell_zeitschrift,AUSGABEZEILE_LEN);
       strlimcat(ausgabe_zeile," ",AUSGABEZEILE_LEN);
   }
   else
   {
      strlimcat(ausgabe_zeile,"[",AUSGABEZEILE_LEN);
      strlimcat(ausgabe_zeile,quell_schluessel,AUSGABEZEILE_LEN);
      strlimcat(ausgabe_zeile,"] ",AUSGABEZEILE_LEN);
      sprintf(wrtxtbu,"# %s: JOURNAL name corresponding to [%s] not found",haupt_schluessel,quell_schluessel);
      logdatei_schreiben(wrtxtbu);
   }

   strlimcat(ausgabe_zeile,one_journal_rec.jahrgang,AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,"; ",AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,one_journal_rec.band,AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,": ",AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,one_journal_rec.seite_von,AUSGABEZEILE_LEN);
   if (strcmp(one_journal_rec.seite_von,one_journal_rec.seite_bis)!=0 &&
       strlen(one_journal_rec.seite_bis)>0)
   {
       strlimcat(ausgabe_zeile,"-",AUSGABEZEILE_LEN);
       strlimcat(ausgabe_zeile,one_journal_rec.seite_bis,AUSGABEZEILE_LEN);
   }
   strlimcat(ausgabe_zeile,".",AUSGABEZEILE_LEN);
}


static void compile_b1_list_fun(void)
{
   long byte_zeiger;
   compile_aued(fpautorbu, ed_zeile,ix01rec.autorbu_rptr);
   strlimcat(ausgabe_zeile,ed_zeile,AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   byte_zeiger = ix01rec.buch_rptr * sizeof(one_buch_rec);
   fseek(fpbuch,byte_zeiger,SEEK_SET);
   fread(&one_buch_rec,sizeof(one_buch_rec),1,fpbuch);


   strlimcat(ausgabe_zeile,one_buch_rec.titel_bu,AUSGABEZEILE_LEN);
   if (!satzzeichen(ausgabe_zeile))
      strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   else
     strlimcat(ausgabe_zeile," ",AUSGABEZEILE_LEN);
   if (strlen(one_journal_rec.band) >0)
   {
      strlimcat(ausgabe_zeile,one_journal_rec.band,AUSGABEZEILE_LEN);
      strlimcat(ausgabe_zeile,". ed. ",AUSGABEZEILE_LEN);
   }
    strlimcat(ausgabe_zeile,one_buch_rec.publ_ort,AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,": ",AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,one_buch_rec.verlag,AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,", ",AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,one_journal_rec.jahrgang,AUSGABEZEILE_LEN);

    if (strlen(one_journal_rec.seite_von)>0)
    {
       strlimcat(ausgabe_zeile,": ",AUSGABEZEILE_LEN);
       strlimcat(ausgabe_zeile,one_journal_rec.seite_von,AUSGABEZEILE_LEN);
       if (strcmp(one_journal_rec.seite_von,one_journal_rec.seite_bis)!=0 &&
           strlen(one_journal_rec.seite_bis)>0)
       {
           strlimcat(ausgabe_zeile,"-",AUSGABEZEILE_LEN);
           strlimcat(ausgabe_zeile,one_journal_rec.seite_bis,AUSGABEZEILE_LEN);
       }
       strlimcat(ausgabe_zeile,".",AUSGABEZEILE_LEN);
    }
    else strlimcat(ausgabe_zeile,".",AUSGABEZEILE_LEN);
}



static void compile_b2_list_fun(void)
{
   long byte_zeiger;
   compile_aued(fpautorbu, ed_zeile,ix01rec.autorbu_rptr);
   compile_aued(fpautorjl, au_zeile,ix01rec.autorjl_rptr);

   strlimcat(ausgabe_zeile,au_zeile,AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,one_journal_rec.titel,AUSGABEZEILE_LEN);
   if (!satzzeichen(ausgabe_zeile))
     strlimcat(ausgabe_zeile,". In: ",AUSGABEZEILE_LEN);
   else
     strlimcat(ausgabe_zeile," In: ",AUSGABEZEILE_LEN);

   strlimcat(ausgabe_zeile,ed_zeile,AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,", ",AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,"editors. ",AUSGABEZEILE_LEN);

   byte_zeiger = ix01rec.buch_rptr * sizeof(one_buch_rec);
   fseek(fpbuch,byte_zeiger,SEEK_SET);
   fread(&one_buch_rec,sizeof(one_buch_rec),1,fpbuch);
   strlimcat(ausgabe_zeile,one_buch_rec.titel_bu,AUSGABEZEILE_LEN);
   if (!satzzeichen(ausgabe_zeile))
      strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   else
      strlimcat(ausgabe_zeile," ",AUSGABEZEILE_LEN);

   if (strlen(one_journal_rec.band) >0)
   {
      strlimcat(ausgabe_zeile,one_journal_rec.band,AUSGABEZEILE_LEN);
      strlimcat(ausgabe_zeile,". ed. ",AUSGABEZEILE_LEN);
   }
    strlimcat(ausgabe_zeile,one_buch_rec.publ_ort,AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,": ",AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,one_buch_rec.verlag,AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,", ",AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,one_journal_rec.jahrgang,AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,": ",AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,one_journal_rec.seite_von,AUSGABEZEILE_LEN);
    if (strcmp(one_journal_rec.seite_von,one_journal_rec.seite_bis)!=0 &&
        strlen(one_journal_rec.seite_bis)>0)
    {
        strlimcat(ausgabe_zeile,"-",AUSGABEZEILE_LEN);
        strlimcat(ausgabe_zeile,one_journal_rec.seite_bis,AUSGABEZEILE_LEN);
    }
    strlimcat(ausgabe_zeile,".",AUSGABEZEILE_LEN);
}

static void compile_b3_list_fun(void)
{
   long byte_zeiger;
   // compile_aued(fpautorbu, ed_zeile,ix01rec.autorbu_rptr);
   // strlimcat(ausgabe_zeile,ed_zeile,AUSGABEZEILE_LEN);
   // strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   byte_zeiger = ix01rec.buch_rptr * sizeof(one_buch_rec);
   fseek(fpbuch,byte_zeiger,SEEK_SET);
   fread(&one_buch_rec,sizeof(one_buch_rec),1,fpbuch);
   
   if (strlen(one_buch_rec.insted) > 0)
   {
      strlimcat(ausgabe_zeile,one_buch_rec.insted,AUSGABEZEILE_LEN);
      strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   }
   

   strlimcat(ausgabe_zeile,one_buch_rec.titel_bu,AUSGABEZEILE_LEN);
   if (!satzzeichen(ausgabe_zeile))
      strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   else
     strlimcat(ausgabe_zeile," ",AUSGABEZEILE_LEN);
   if (strlen(one_journal_rec.band) >0)
   {
      strlimcat(ausgabe_zeile,one_journal_rec.band,AUSGABEZEILE_LEN);
      strlimcat(ausgabe_zeile,". ed. ",AUSGABEZEILE_LEN);
   }
    strlimcat(ausgabe_zeile,one_buch_rec.publ_ort,AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,": ",AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,one_buch_rec.verlag,AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,", ",AUSGABEZEILE_LEN);
    strlimcat(ausgabe_zeile,one_journal_rec.jahrgang,AUSGABEZEILE_LEN);

    if (strlen(one_journal_rec.seite_von)>0)
    {
       strlimcat(ausgabe_zeile,": ",AUSGABEZEILE_LEN);
       strlimcat(ausgabe_zeile,one_journal_rec.seite_von,AUSGABEZEILE_LEN);
       if (strcmp(one_journal_rec.seite_von,one_journal_rec.seite_bis)!=0 &&
           strlen(one_journal_rec.seite_bis)>0)
       {
           strlimcat(ausgabe_zeile,"-",AUSGABEZEILE_LEN);
           strlimcat(ausgabe_zeile,one_journal_rec.seite_bis,AUSGABEZEILE_LEN);
       }
       strlimcat(ausgabe_zeile,".",AUSGABEZEILE_LEN);
    }
    else strlimcat(ausgabe_zeile,".",AUSGABEZEILE_LEN);
}

static void compile_m1_list_fun(void)
{
   compile_aued(fpautorjl, au_zeile,ix01rec.autorjl_rptr);
   strlimcat(ausgabe_zeile,au_zeile,AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,one_journal_rec.titel,AUSGABEZEILE_LEN);
   if (!satzzeichen(ausgabe_zeile))
      strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   else
      strlimcat(ausgabe_zeile," ",AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,one_journal_rec.howpublished,AUSGABEZEILE_LEN);
   if (!satzzeichen(ausgabe_zeile))
      strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   else
      strlimcat(ausgabe_zeile," ",AUSGABEZEILE_LEN);

   // strncpy(quell_schluessel,one_journal_rec.kuerzel,KUERZEL_LEN);
   // if (locate_ix02(quell_schluessel,&ix02rec) > -1)
   // {
   //     long byte_zeiger;
   //     byte_zeiger = ix02rec.quell_rptr * sizeof(one_quell_rec);
   //     fseek(fpsource,byte_zeiger,SEEK_SET);
   //     fread(&one_quell_rec,sizeof(one_quell_rec),1,fpsource);
   //     strlimcat(ausgabe_zeile,one_quell_rec.quell_zeitschrift,AUSGABEZEILE_LEN);
   //     strlimcat(ausgabe_zeile," ",AUSGABEZEILE_LEN);
   // }
   // else
   // {
   //    strlimcat(ausgabe_zeile,"[",AUSGABEZEILE_LEN);
   //    strlimcat(ausgabe_zeile,quell_schluessel,AUSGABEZEILE_LEN);
   //    strlimcat(ausgabe_zeile,"] ",AUSGABEZEILE_LEN);
   //    // fprintf(fplog,"# %s: JOURNAL name corresponding to [%s] not found\n",haupt_schluessel,quell_schluessel);
   //    sprintf(wrtxtbu,"# %s: JOURNAL name corresponding to [%s] not found",haupt_schluessel,quell_schluessel);
   //    logdatei_schreiben(wrtxtbu);
   // }

   strlimcat(ausgabe_zeile,one_journal_rec.jahrgang,AUSGABEZEILE_LEN);
   if (strlen(one_journal_rec.seite_von) > 0)
   {
     strlimcat(ausgabe_zeile,"; ",AUSGABEZEILE_LEN);
   } else
   {
      if (!satzzeichen(ausgabe_zeile))
      {
         strlimcat(ausgabe_zeile,".",AUSGABEZEILE_LEN);
      }
   }
   // strlimcat(ausgabe_zeile,one_journal_rec.band,AUSGABEZEILE_LEN);
   // strlimcat(ausgabe_zeile,": ",AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,one_journal_rec.seite_von,AUSGABEZEILE_LEN);
   if (strcmp(one_journal_rec.seite_von,one_journal_rec.seite_bis)!=0 &&
       strlen(one_journal_rec.seite_bis)>0)
   {
       strlimcat(ausgabe_zeile,"-",AUSGABEZEILE_LEN);
       strlimcat(ausgabe_zeile,one_journal_rec.seite_bis,AUSGABEZEILE_LEN);
   }
   if (!satzzeichen(ausgabe_zeile))
   {
      strlimcat(ausgabe_zeile,".",AUSGABEZEILE_LEN);
   }
}

static void compile_m2_list_fun(void)
{
   if (strlen(one_journal_rec.instau) > 0)
   {
      strlimcat(ausgabe_zeile,one_journal_rec.instau,AUSGABEZEILE_LEN);
      strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   }
   strlimcat(ausgabe_zeile,one_journal_rec.titel,AUSGABEZEILE_LEN);
   if (!satzzeichen(ausgabe_zeile))
      strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   else
      strlimcat(ausgabe_zeile," ",AUSGABEZEILE_LEN);

   strlimcat(ausgabe_zeile,one_journal_rec.howpublished,AUSGABEZEILE_LEN);
   if (!satzzeichen(ausgabe_zeile))
      strlimcat(ausgabe_zeile,". ",AUSGABEZEILE_LEN);
   else
      strlimcat(ausgabe_zeile," ",AUSGABEZEILE_LEN);

   // strncpy(quell_schluessel,one_journal_rec.kuerzel,KUERZEL_LEN);
   // if (locate_ix02(quell_schluessel,&ix02rec) > -1)
   // {
   //     long byte_zeiger;
   //     byte_zeiger = ix02rec.quell_rptr * sizeof(one_quell_rec);
   //     fseek(fpsource,byte_zeiger,SEEK_SET);
   //     fread(&one_quell_rec,sizeof(one_quell_rec),1,fpsource);
   //     strlimcat(ausgabe_zeile,one_quell_rec.quell_zeitschrift,AUSGABEZEILE_LEN);
   //     strlimcat(ausgabe_zeile," ",AUSGABEZEILE_LEN);
   // }
   // else
   // {
   //    strlimcat(ausgabe_zeile,"[",AUSGABEZEILE_LEN);
   //    strlimcat(ausgabe_zeile,quell_schluessel,AUSGABEZEILE_LEN);
   //    strlimcat(ausgabe_zeile,"] ",AUSGABEZEILE_LEN);
   //    sprintf(wrtxtbu,"# %s: JOURNAL name corresponding to [%s] not found",haupt_schluessel,quell_schluessel);
   //    logdatei_schreiben(wrtxtbu);
   // }

   strlimcat(ausgabe_zeile,one_journal_rec.jahrgang,AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,"; ",AUSGABEZEILE_LEN);
   // strlimcat(ausgabe_zeile,one_journal_rec.band,AUSGABEZEILE_LEN);
   // strlimcat(ausgabe_zeile,": ",AUSGABEZEILE_LEN);
   strlimcat(ausgabe_zeile,one_journal_rec.seite_von,AUSGABEZEILE_LEN);
   if (strcmp(one_journal_rec.seite_von,one_journal_rec.seite_bis)!=0 &&
       strlen(one_journal_rec.seite_bis)>0)
   {
       strlimcat(ausgabe_zeile,"-",AUSGABEZEILE_LEN);
       strlimcat(ausgabe_zeile,one_journal_rec.seite_bis,AUSGABEZEILE_LEN);
   }
   strlimcat(ausgabe_zeile,".",AUSGABEZEILE_LEN);
}



static void compile_aued(FILE * fpaued, char * auedstring, long zeiger)
{
   int anzahl_n, i;
   long byte_zeiger;
   strcpy(auedstring,"");
   byte_zeiger = zeiger * sizeof(one_aued_rec);
   fseek(fpaued,byte_zeiger,SEEK_SET);
   fread(&one_aued_rec,sizeof(one_aued_rec),1,fpaued);
   fseek(fpaued,byte_zeiger,SEEK_SET);
   anzahl_n = one_aued_rec.au_n;
   for (i=1;i<=anzahl_n;i++)
   {
        fread(&one_aued_rec,sizeof(one_aued_rec),1,fpaued);
        strlimcat(auedstring,one_aued_rec.au_nachname,AUTORZEILE_LEN);
        strlimcat(auedstring," ",AUTORZEILE_LEN);
        strlimcat(auedstring,one_aued_rec.au_vornamen,AUTORZEILE_LEN);
        if  (i<anzahl_n) strlimcat(auedstring,", ",AUTORZEILE_LEN);
   }
}


