/********************************************************/
/**    ASCIX©   - source code for the ASCIO            **/
/**     module of the MAGELLAN Interface Toolkit       **/
/********************************************************/
/**    Copyright 1989, Emerald Intelligence, Inc.       **/
/**    Licensed for use, providing the Interface           **/
/**    Toolkit License Agreement has been signed and returned **/
/**    to Emerald Intelligence.  Please do not freely distribute **/
/**    this or other source code sold with the Interface Toolkit  **/
/*******************************************************************/

#include "stdio.h"
#include "fcntl.h"
#define LINEFEED_AFTER_DATA 1
#define USE_SEEK_FROM_START 1
/******************************************/
void
write_to_file(file,data)
 FILE *file;
 char *data;
{
 int i = 0;
 int length = 0;

 length = strlen(data);
 for(i=0;i<length;++i)
  fwrite(&(data[i]),1,1,file);

#ifdef LINEFEED_AFTER_DATA
 /** write LINEFEED to make file editable **/
 putc(0x0A,file);
#endif

#ifdef CARRIAGE_RETURN_AFTER_DATA
 /** write CARRIAGE RETURN to make file editable **/
 putc(0x0D,file);
#endif

#ifdef NULL_AFTER_DATA
 /** write NULL to make file editable **/
 putc(0,file);
#endif

}
/******************************************/
void
shuffle(file,position,old_data,new_data)
 FILE *file;
 long position;
 char *old_data;
 char *new_data;
{
  int old_length;
  int new_length;
  long difference = 0L;
  int i;
  int status = 0;
  long start_of_data_left_to_shuffle = 0L;
  long debug_pos = 0L;
  long old_eof = 0L;
  char character = 0;
  char qin[5];

    old_length = strlen(old_data);
    new_length = strlen(new_data);

    difference = (long)(new_length - old_length);

   printf("shuffle: diff=%d, position=%d\n",difference,position);

    if(difference > 0L)  /** NEW DATA LONGER THAN OLD DATA IN FILE ***/
    {

  /** seek to end of file **/
      fseek(file,0L,2);
      old_eof = ftell(file);
 /** write a zero for every extra character in the new_data **/
      for(i=0;i<difference;++i)putc(0,file);

#ifdef OLDWAY
  /** seek to old_end_of_ file **/
      fseek(file,(long)(-difference),1);
#else
      fseek(file,(long)(old_eof),0);
#endif

   debug_pos = ftell(file);
   printf("shuffle[new longer]: diff=%d, position=%d, new_pos=%d\n",difference,position,debug_pos);

     do
     {

  /**  test if bad seek ***/
       if(status != 0)break;

       start_of_data_left_to_shuffle = ftell(file);
       fread(&character,1,1,file);

  /** write to new position **/
       fseek(file,(long)difference-1L,1);
       fwrite(&character,1,1,file);

  /** seek to preceding byte **/
       fseek(file,(long)(start_of_data_left_to_shuffle),0);
       status =  fseek(file,-1L,1);
       if(start_of_data_left_to_shuffle <= position)break;
     }while(status == 0);

     fseek(file,position,0);
     write_to_file(file,new_data);
     fseek(file,old_eof+difference,0);
     putc(EOF,file);
    }

    if(difference == 0L)  /***  NEW AND OLD DATA THE SAME LENGTH ***/
    {
     fseek(file,position,0);
     write_to_file(file,new_data);
    }

    if(difference < 0L)  /** NEW DATA SHORTER THAN OLD DATA IN FILE **/
    {
     fseek(file,position,0);
     write_to_file(file,new_data);

     fseek(file,(long)(-difference),1);

     do
     {
      fread(&character,1,1,file);
      fseek(file,(long)(difference-1L),1);
      fwrite(&character,1,1,file);
      status = fseek(file,(long)(-difference),1);  /** may be difference here! **/
     }while(status == 0);
     putc(EOF,file);
    }
 }
/******************************************/
main(argc,argv)
 int argc;
 char *argv[];
{
 char *module = argv[0];
 char *transfer_file = argv[1];
 char *direction = argv[2];
 char *write_data = argv[3];
 char *data_file = argv[4];
 char *field = argv[5];
 int read_mode = 0;
 int difference = 0;
 char buffer[255];
 int i = 0;
 int j = 0;
 FILE *transfer_fp = NULL;
 FILE *data_fp = NULL;
 int old_length,new_length;


 printf("module = '%s'\n",module);
 printf("transfer_file = '%s'\n",transfer_file);
 printf("direction = '%s'\n",direction);
if(argv[3])
 printf("write_data = '%s'\n",write_data);
if(argv[4])
 printf("data_file = '%s'\n",data_file);
if(argv[5])
 printf("field = '%s'\n",field);

 for(i=0;i<255;++i)buffer[i]=0;

if((direction[0] == 'R')|| (direction[0] == 'r'))
{
  read_mode = 1;
  transfer_fp = fopen(transfer_file,"w+");
}
 data_fp = fopen(data_file,"r+");

 printf("data_fp = %d\n",data_fp);
 printf("transfer_fp = %d\n",transfer_fp);
 printf("read_mode = %d\n",read_mode);

 if(!read_mode)
 {
  printf("data to write to file is '%s'\n",write_data);
 }


   i=0;
 do
 {
#ifdef DO_IT_HERE
  do
   {
    fread(&(buffer[i]),1,1,data_fp);
    if(buffer[i] == ',' || buffer[i] == ' ' || buffer[i] == 0x0D || buffer[i] == 0x0A)
     buffer[i] = 0;
    ++i;
   }while(buffer[i]);
#else
  fscanf(data_fp,"%s",buffer);
#endif

  printf("word in file = '%s'   sought word = '%s'\n",buffer,field);

  if(strcmp(buffer,field)==0)
  {
   j=0;
#ifdef DO_IT_HERE
   do
    {
    fread(&(buffer[j]),1,1,data_fp);
    if(buffer[j] == ',' || buffer[j] == ' ' || buffer[j] == 0x0d || buffer[j] == 0x0A)
     buffer[j] = 0;
    ++j;
    if(j > 255)
      buffer[j]=0;
    }while(buffer[j]);
#else
    fscanf(data_fp,"%s",buffer);
#endif
   if(read_mode)
   {

    fwrite(buffer,strlen(buffer),1,transfer_fp);
    putc(0,transfer_fp);
    setenv("GETIO","COMPLETED");
    fclose(transfer_fp);
    fclose(data_fp);
    break;
   }
   else
   {
    fseek(data_fp,(long)(-strlen(buffer)),1);
    shuffle(data_fp,(long)(ftell(data_fp)),buffer,write_data);

    printf("data is '%s'\n",write_data);
    setenv("GETIO","COMPLETED");
    fclose(transfer_fp);
    fclose(data_fp);
    break;
   }  
  }
 }while(!feof(data_fp));
}

 
