Modified:	Thu 02/12/99 17:42

PalmPilot Category:	PocketC
//PocketIFS
//(c) T.Frogley 1999

//messages
#define APPNAME "PocketIFS"
#define VERSION " v0.3a"
#define MEMOID "PocketIFSfile"
#define REV_DATE "2/12/1999"
#define NOMATHLIBMSG "PocketIFS requires 'mathlib' to run."
#define INTERRUPTMSG "Interrupt?"
#define SAVE2MEMOMSG "Save to memo?"
#define LOADMEMOMSG (APPNAME+" memo exists, load?")
#define CONFIRMDELETEMSG (APPNAME +"memo exists, delete?")

#include "GNUGPL"

//config
#define NOISY
//#define RECURSIVE_DEPTH 5
//remove '//' from line above to use
//fixed depth plotter

#include "shape.i"
#include "trans.i"

#ifndef RECURSIVE_DEPTH
Draw(pointer shape,pointer trans,
  float a, float b, float c,float d, 
  float e, float f)
{
	pointer head;
	pointer t,s;
	pointer head,tail;
	int e;
	
	tail = head = 
	  NewTrans(a,b, c,d,e,f);
	e = s = 0;

	//eat up events
	while(event(0));

	do{	  
	  DrawShapeTrans(shape,
	    head[t_a], head[t_b],  
	    head[t_c], head[t_d], 
	    head[t_e], head[t_f],
	    1);
	  t=trans;
	  do{
    	    if (s){
	      s[t_a]=(t[t_a]*head[t_a])
	        +(t[t_c]*head[t_b]);
	      s[t_b]=(t[t_b]*head[t_a])
	        +(t[t_d]*head[t_b]);
	      s[t_c]=(t[t_a]*head[t_c])
	        +(t[t_c]*head[t_d]);
	      s[t_d]=(t[t_b]*head[t_c])
	        +(t[t_d]*head[t_d]);
	      s[t_e]=(t[t_e]*head[t_a])
	        +(t[t_f]*head[t_b])
	        +head[t_e];
	      s[t_f]=(t[t_e]*head[t_c])
	        +(t[t_f]*head[t_d])
	        +head[t_f];
	      s[t_next] = 0;
	      tail[t_next] = s;
	      s = 0;
	    }
	    else{
	      tail[t_next] = NewTrans(
	        (t[t_a]*head[t_a])
	          +(t[t_c]*head[t_b]),
	        (t[t_b]*head[t_a])
	          +(t[t_d]*head[t_b]),
	        (t[t_a]*head[t_c])
	          +(t[t_c]*head[t_d]),
	        (t[t_b]*head[t_c])
	          +(t[t_d]*head[t_d]),
	        (t[t_e]*head[t_a])
	          +(t[t_f]*head[t_b])
	          +head[t_e],
	        (t[t_e]*head[t_c])
	          +(t[t_f]*head[t_d])
	          +head[t_f]
	      );
	    }

	    if (tail[t_next]) 
	      tail = tail[t_next];

	    t = t[t_next];
	  }while(t);
	  s = head;
	  head = head[t_next];

	  if(event(0))
	    if (confirm(INTERRUPTMSG))
	      break;
	    else //eat events
	      while(event(0));

	}while(head);

	//free memory
	if (s) free(s);
 	if (head) DeleteTrans(head);
}
#else
Draw(pointer shape, pointer trans,
  float a, float b, float c,float d, 
  float e, float f, int level)
{
	float a1,b1,c1,d1,e1,f1;
	pointer head;
	DrawShapeTrans(shape,
	  a, b, c, d, e, f,
	  1);
	if (level<0) return;
	head = trans;

	do{
	a1=(trans[t_a]*a)
	  +(trans[t_c]*b);
	b1=(trans[t_b]*a)
	  +(trans[t_d]*b);
	c1=(trans[t_a]*c)
	  +(trans[t_c]*d);
	d1=(trans[t_b]*c)
	  +(trans[t_d]*d);
	e1=(trans[t_e]*a)
	  +(trans[t_f]*b)
	  +e;
	f1=(trans[t_e]*c)
	  +(trans[t_f]*d)
	  +f;
	Draw(shape, head,
	  a1, b1, c1, d1, e1, f1, 
	  level-1);
	trans = trans[t_next];
	}while(trans);
}
#endif

SaveIFS(pointer s, pointer t)
{
	if (mmfind(MEMOID)){
	if (confirm(CONFIRMDELETEMSG
	)) mmdelete();else return;}

	mmnew();
	mmputs(MEMOID + "\n");
	WriteShapeToMemo(s);
	WriteTransToMemo(t);
}

main()
{
	pointer s,t,p;
	string msg;
	int loaded;

	clear();
	msg=GNUGPLmsgEnglish(
	  APPNAME, VERSION,
	  REV_DATE, "T. Frogey");
	puts(msg);

	if (!mathlib()){
		alert(NOMATHLIBMSG);
		return;
	}

	graph_on();
	title(APPNAME+VERSION);

	alert(msg);

	loaded = 0;
	if (mmfind(MEMOID)){
	  if (confirm(LOADMEMOMSG))
	{
	    mmgetl();
	    s = ReadShapeFromMemo();
	    t = ReadTransFromMemo();
	    loaded = 1;
	  }
	}

	if (s==0){
	  s=GetShape();
	  ELOShape(s);
	  CenterShape(s);
	}
	if (t==0){
	  p=t=GetTrans(s);
	  while(confirm("Another?")){
	    p[t_next] = GetTrans(s);
	    p=p[t_next];
	  }
	}
	clearg();

	Draw(s,t,
	  cos(0),
	  -sin(0),
	  sin(0),
	  cos(0),
	  0,0
#ifdef RECURSIVE_DEPTH
	,RECURSIVE_DEPTH);
#else
	);
#endif

#ifdef NOISY
	beep(1);
#endif
	waitp();

	if (loaded == 0){
	  if (confirm(SAVE2MEMOMSG))
		SaveIFS(s,t);
#ifdef NOISY
		beep(1);
#endif
	}

	waitp();

	graph_off();

	DeletePoint(s);
	DeleteTrans(t);
}