/*==================================================================
  ==================================================================
  ==	XMusic -- An Interactive Interface to Csound		  ==
  ==       Copyright (C) 1988 by George D. Drapeau                ==
  ==                  All Rights Reserved                         ==
  ==================================================================
  ==================================================================
*/
/* $Log:	diagramio.c,v $
 * Revision 1.4  89/08/06  18:00:12  drapeau
 *  Cleaned up the code for first X11 release.
 *  */

#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include <string.h>
#include <sys/file.h>

#define USEFILES
#include "defs.h"
#include "externs.h"




void SaveDiagram()
{
  FILE		*fp;
  Tool		*tPtr;
  FileTool	fPtr;
  int		result;
  char		tempStr[64];

  if ((fp = fopen(fileName,"w")) == NULL)
    {
      printf("Can't open file for writing.\n");
      exit(1);
    }
  printf("Writing the diagram to the file %s\n",fileName);
  for (tPtr = toolList;  tPtr;  tPtr = tPtr->next)
    {
      fPtr.toolNum = tPtr->toolNum;
      fPtr.x = tPtr->x;
      fPtr.y = tPtr->y;
      fPtr.type = tPtr->type;
      fPtr.rate = tPtr->rate;
      if (tPtr->input1)
	fPtr.in1 = tPtr->input1->toolNum;
      else
	fPtr.in1 = 0;
      if (tPtr->input2)
	fPtr.in2 = tPtr->input2->toolNum;
      else
	fPtr.in2 = 0;
      if (tPtr->input3)
	fPtr.in3 = tPtr->input3->toolNum;
      else
	fPtr.in3 = 0;
      if (tPtr->input4)
	fPtr.in4 = tPtr->input4->toolNum;
      else
	fPtr.in4 = 0;
      if (tPtr->input5)
	fPtr.in5 = tPtr->input5->toolNum;
      else
	fPtr.in5 = 0;
      if (tPtr->input6)
	fPtr.in6 = tPtr->input6->toolNum;
      else
	fPtr.in6 = 0;
      if (tPtr->input7)
	fPtr.in7 = tPtr->input7->toolNum;
      else
	fPtr.in7 = 0;
      if (tPtr->input8)
	fPtr.in8 = tPtr->input8->toolNum;
      else
	fPtr.in8 = 0;
      if (tPtr->output)
	fPtr.out = tPtr->output->toolNum;
      else
	fPtr.out = 0;
      if (tPtr->name)
	{
	  fPtr.nameLen = strlen(tPtr->name);
	  strcpy(fPtr.name,tPtr->name);
	}
      else
	fPtr.nameLen = 0;
      if (tPtr->fName)
	{
	  fPtr.fNameLen = strlen(tPtr->fName);
	  strcpy(fPtr.fName,tPtr->fName);
	}
      else
	fPtr.fNameLen = 0;
      if (tPtr->arg1)
	{
	  fPtr.arg1Len = strlen(tPtr->arg1);
	  strcpy(fPtr.arg1,tPtr->arg1);
	}
      else
	fPtr.arg1Len = 0;
      if (tPtr->arg2)
	{
	  fPtr.arg2Len = strlen(tPtr->arg2);
	  strcpy(fPtr.arg2,tPtr->arg2);
	}
      else
	fPtr.arg2Len = 0;
      if (tPtr->arg3)
	{
	  fPtr.arg3Len = strlen(tPtr->arg3);
	  strcpy(fPtr.arg3,tPtr->arg3);
	}
      else
	fPtr.arg3Len = 0;
      if (tPtr->arg4)
	{
	  fPtr.arg4Len = strlen(tPtr->arg4);
	  strcpy(fPtr.arg4,tPtr->arg4);
	}
      else
	fPtr.arg4Len = 0;
      if (tPtr->arg5)
	{
	  fPtr.arg5Len = strlen(tPtr->arg5);
	  strcpy(fPtr.arg5,tPtr->arg5);
	}
      else
	fPtr.arg5Len = 0;
      if (tPtr->arg6)
	{
	  fPtr.arg6Len = strlen(tPtr->arg6);
	  strcpy(fPtr.arg6,tPtr->arg6);
	}
      else
	fPtr.arg6Len = 0;
      if (tPtr->arg7)
	{
	  fPtr.arg7Len = strlen(tPtr->arg7);
	  strcpy(fPtr.arg7,tPtr->arg7);
	}
      else
	fPtr.arg7Len = 0;
      if (tPtr->arg8)
	{
	  fPtr.arg8Len = strlen(tPtr->arg8);
	  strcpy(fPtr.arg8,tPtr->arg8);
	}
      else
	fPtr.arg8Len = 0;
      result = fwrite((char *)&fPtr, sizeof(fPtr), 1, fp);
    }								    /* end for tPtr... */
  changesMade = 0;						    /* Update flag saying that We're starting from scratch */
  fclose(fp);							    /* Close the file */
  printf("Done writing the diagram.\n");
}								    /* end function SaveDiagram */




ReadDiagram()
{
  FILE		*fp;
  Tool		*tPtr, *GetTool(), *AddToolToList();
  FileTool	fPtr;
  char		tempStr[64], *malloc();
  int		result, fileChg = 0;

  if ((fp = fopen(fileName,"r")) == NULL)
    {
      printf("Can't open file '%s' for reading.\n",fileName);
      return;
    }
  fseek(fp,0L,0);
  while(1)
    {
      if ((result = fread((char *)&fPtr, sizeof(fPtr),1,fp)) == 0)
	  break;
      tPtr=AddToolToList();
      tPtr->toolNum = fPtr.toolNum;
      tPtr->x = fPtr.x;
      tPtr->y = fPtr.y;
      tPtr->type = fPtr.type;
      tPtr->rate = fPtr.rate;
      if (fPtr.nameLen)
	{
	  tPtr->name = malloc(fPtr.nameLen+1);
	  strncpy(tPtr->name,fPtr.name,fPtr.nameLen);
	}							    /* end if n1... */
      if (fPtr.fNameLen)
	{
	  tPtr->fName = malloc(MAXSTRLEN);
	  strncpy(tPtr->fName,fPtr.fName,fPtr.fNameLen);
	}
      if (fPtr.arg1Len)
	{
	  tPtr->arg1 = malloc(MAXSTRLEN);
	  strncpy(tPtr->arg1,fPtr.arg1,fPtr.arg1Len);
	}
      if (fPtr.arg2Len)
	{
	  tPtr->arg2 = malloc(MAXSTRLEN);
	  strncpy(tPtr->arg2,fPtr.arg2,fPtr.arg2Len);
	}
      if (fPtr.arg3Len)
	{
	  tPtr->arg3 = malloc(MAXSTRLEN);
	  strncpy(tPtr->arg3,fPtr.arg3,fPtr.arg3Len);
	}
      if (fPtr.arg4Len)
	{
	  tPtr->arg4 = malloc(MAXSTRLEN);
	  strncpy(tPtr->arg4,fPtr.arg4,fPtr.arg4Len);
	}
      if (fPtr.arg5Len)
	{
	  tPtr->arg5 = malloc(MAXSTRLEN);
	  strncpy(tPtr->arg5,fPtr.arg5,fPtr.arg5Len);
	}
      if (fPtr.arg6Len)
	{
	  tPtr->arg6 = malloc(MAXSTRLEN);
	  strncpy(tPtr->arg6,fPtr.arg6,fPtr.arg6Len);
	}
      if (fPtr.arg7Len)
	{
	  tPtr->arg7 = malloc(MAXSTRLEN);
	  strncpy(tPtr->arg7,fPtr.arg7,fPtr.arg7Len);
	}
      if (fPtr.arg8Len)
	{
	  tPtr->arg8 = malloc(MAXSTRLEN);
	  strncpy(tPtr->arg8,fPtr.arg8,fPtr.arg8Len);
	}
    }								    /* end first while... */
  fseek(fp,0L,0);						    /* Go to beginning of file */
  while(1)
    {
      if ((result = fread((char *)&fPtr, sizeof(fPtr),1,fp)) == 0)
	{
	  break;
	}
      tPtr = GetTool(fPtr.toolNum);
      if (fPtr.in1)
	tPtr->input1 = GetTool(fPtr.in1);
      if (fPtr.in2)
	tPtr->input2 = GetTool(fPtr.in2);
      if (fPtr.in3)
	tPtr->input3 = GetTool(fPtr.in3);
      if (fPtr.in4)
	tPtr->input4 = GetTool(fPtr.in4);
      if (fPtr.in5)
	tPtr->input5 = GetTool(fPtr.in5);
      if (fPtr.in6)
	tPtr->input6 = GetTool(fPtr.in6);
      if (fPtr.in7)
	tPtr->input7 = GetTool(fPtr.in7);
      if (fPtr.in8)
	tPtr->input8 = GetTool(fPtr.in8);
      if (fPtr.out)
	tPtr->output = GetTool(fPtr.out);
    }								    /* end second while... */
  fclose(fp);							    /* Close the XMusic file just read in */
  fileChg=1;
}								    /* end function ReadDiagram */
