#include "gerber.h"

extern object_t *save();
extern int nr_objects;


read_file(fname,glist)
     char *fname;
     object_t **glist;
{
  FILE *f = NULL;
  int c;
  object_t **objtop;
  int number = 0;
  int inrec = 0;

  *glist = NULL;
  objtop = glist;

  f = fopen(fname,"r");
  if (!f) {
    fprintf(stderr,"Can't open gerber file %s\n",fname);
    return;
  }

  while ((c = getc(f)) != EOF) {

    switch (c) {
    case 'M':
      if (number == 2) goto exit;
    case 'D':
    case 'G':
    case 'X':
    case 'Y':
      if (inrec) {
	save_data(inrec,number);
      }
      inrec = c;
      number = 0;
      break;

    case '*':
      if (!inrec) break;
      save_data(inrec,number);
      *objtop = save();
      if (*objtop) {
	objtop = &((*objtop)->next);
      }
      number = 0;
      inrec = 0;
      break;

    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
      number *= 10;
      number += (c - '0');
      break;

    /* Whitespace */
    case '\n':
    case '\r':
    case ' ':
    case '\t':
    case 26:  /* CTRL/Z */
      break;

    default:
      fprintf(stderr,"Unknown character 0x%x in file %s\n",(int)c,fname);
    }
  }
 exit:

  if (f) fclose(f);
}

#undef max
#define max(a,b) ((a)>(b)?(a):(b))

int max_xpos = 0;
int max_ypos = 0;

static int xpos = 0;
static int ypos = 0;
static int old_xpos = 0;
static int old_ypos = 0;
static int opened = FALSE;
static tool_t *tool = NULL;
static int flash = FALSE;
extern tool_t *gettool();

save_data(type,number)
     char type;
     int number;
{
  switch (type) {
  case 'D': 
    if (number > 3) {
      tool = gettool(number);
    } else {
      switch(number) {
      case 1:
	opened = TRUE;
	flash = FALSE;
	old_xpos = xpos;
	old_ypos = ypos;
	break;
      case 2:
	opened = FALSE;
	flash = FALSE;
	break;
      case 3:
	opened = FALSE; /* ? */
	flash = TRUE;
	old_xpos = xpos;
	old_ypos = ypos;
	break;
      }
    }
    break;
  case 'G':
    break;
  case 'M': 
    break;
  case 'X':
    old_xpos = xpos;
    xpos = number;
    max_xpos = max(max_xpos,xpos);
    break;
  case 'Y':
    old_ypos = ypos;
    ypos = number;
    max_ypos = max(max_ypos,ypos);
    break;
  }
}

object_t *save()
{
  object_t *obj;

  if (!(opened || flash)) return NULL;

  obj = (object_t *)xmalloc(sizeof(object_t));

  obj->next = NULL;
  obj->tool = tool;
  obj->start_x = (flash?xpos:old_xpos);
  obj->start_y = (flash?ypos:old_ypos);
  obj->end_x = xpos;
  obj->end_y = ypos;
  nr_objects++;
  return obj;
}
