/*ProfiPacket - packet radio terminal program
  Copyright (C) 1999  Alexander Feigl

  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

  Author:

  Alexander Feigl
  Burachstraße 51

  D-88250 Weingarten

  Mail : Alexander.Feigl@gmx.de
*/


#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "GUIProtos.h"
#include "Filetrans.h"

#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#include <unistd.h>


#define CONVERT_BUFFERSIZE 4096

int ConvertFileToAmiga(const unsigned char *filename)
 {
  unsigned char *charmem;
  FILE *convertfile;
  int err=0;
  
  charmem=malloc(CONVERT_BUFFERSIZE);
  if (charmem==NULL) return(1);
  
  convertfile=fopen(filename,"a+");
  if (convertfile==NULL) 
   {
    free(charmem);
    return(2);
   }  
  
  if (fseek(convertfile,0,SEEK_SET)==-1)
   {
    return(6);
   }
  
  while (1)
   {
    int resize;
    
    resize=fread(charmem,1,CONVERT_BUFFERSIZE,convertfile);
    if (resize==0)
     {
      if (!feof(convertfile)) err=3;
      break;     
     } 
    MAIN_ConvertToAmigaLen(charmem,resize);
    if (fseek(convertfile,-resize,SEEK_CUR)==-1)
     {
      err=4;
      break;
     }
    if (fwrite(charmem,1,resize,convertfile)!=resize)
     {
      err=5;
      break;
     }
    if (fseek(convertfile,0,SEEK_CUR)==-1)
     {
      err=6;
      break;
     }
   }
  fclose(convertfile);
  free(charmem);
  if (err)
   {
    return(err);
   }
   {
    struct FileInfo finfo;
    if (GetFileInfo(filename,&finfo)) return(7);
    finfo.fileformat=FILEFORMAT_TEXTAMIGA;
    if (SetFileInfo(filename,&finfo)) return(8);
   }  
  return(0);
 }

int ConvertFileToPC(const unsigned char *filename)
 {
  unsigned char *charmem;
  FILE *convertfile;
  int err=0;
  
  charmem=malloc(CONVERT_BUFFERSIZE);
  if (charmem==NULL) return(1);
  
  convertfile=fopen(filename,"a+");
  if (convertfile==NULL) 
   {
    free(charmem);
    return(2);
   }  
  
  if (fseek(convertfile,0,SEEK_SET)==-1)
   {
    return(6);
   }
  
  while (1)
   {
    int resize;
    
    resize=fread(charmem,1,CONVERT_BUFFERSIZE,convertfile);
    if (resize==0)
     {
      if (!feof(convertfile)) err=3;
      break;     
     } 
    MAIN_ConvertToPCLen(charmem,resize);
    if (fseek(convertfile,-resize,SEEK_CUR)==-1)
     {
      err=4;
      break;
     }
    if (fwrite(charmem,1,resize,convertfile)!=resize)
     {
      err=5;
      break;
     }
    if (fseek(convertfile,0,SEEK_CUR)==-1)
     {
      err=6;
      break;
     }
   }
  fclose(convertfile);
  free(charmem);
  if (err)
   {
    return(err);
   }
   {
    struct FileInfo finfo;
    if (GetFileInfo(filename,&finfo)) return(7);
    finfo.fileformat=FILEFORMAT_TEXT;
    if (SetFileInfo(filename,&finfo)) return(8);
   }  
  return(0);
 }

int StripCRLF(const unsigned char *filename,int strip)
 {
  unsigned char targetfile[512];
  unsigned char *sptr,*dptr;
  FILE *sfile,*dfile;
  unsigned char *buffer,*inbuffer,*outbuffer;
  int crread=0;
  int readb;

  strcpy(targetfile,filename);
  dptr=targetfile;
  while (*dptr!=0) ++dptr;
  while (1)
   {
    if ( (*dptr=='\\') || (*dptr=='/') || (*dptr==':') || (dptr==targetfile))
     {
      *(dptr+1)=0;
      break;
     }
    --dptr;
   }
  strcat(targetfile,"PPConvert.tmp");
  sfile=fopen(filename,"rb");
  if (sfile==NULL)
   {
    return(0);
   }
  dfile=fopen(targetfile,"wb");
  if (dfile==NULL)
   {
    fclose(sfile);
    return(0);
   }
  buffer=malloc(4096*3);
  if (buffer==NULL)
   {
    fclose(dfile);
    fclose(sfile);
    remove(targetfile);

   }
  inbuffer=buffer;
  outbuffer=buffer+4096;

  while (1)
   {
    readb=fread(inbuffer,1,4096,sfile);
    if (readb==-1)
     {
      fclose(dfile);
      fclose(sfile);
      remove(targetfile);
      free(buffer);
      return(0);
     }
    if (readb==0) break;
    sptr=inbuffer;
    dptr=outbuffer;
    while (readb)
     {
      if (*sptr=='\n')
       {
        if (strip)
         {
          crread=0;
         }
         else
         {
          *(dptr++)='\r';
         }
       }
      if (crread)
       {
        *(dptr++)='\r';
       }
      if ( (*sptr=='\r') && (strip) )
       {
        crread=1;
       }
       else
       {
        *(dptr++)=*(sptr);
       }

      --readb;
      ++sptr;
     }
    readb=dptr-outbuffer;
    if (readb>0)
     {
      if (fwrite(outbuffer,1,readb,dfile)!=readb)
       {
        fclose(dfile);
        fclose(sfile);
        remove(targetfile);
        free(buffer);
        return(0);
       }
     }
   }
  fclose(dfile);
  fclose(sfile);
  free(buffer);
   {
    struct FileInfo finfo;
    int flag=0;
    if (GetFileInfo(filename,&finfo)) flag=1;
    remove(filename);
    rename(targetfile,filename);
    if (flag==0) SetFileInfo(filename,&finfo);
   }
  return(1);
 }