/* RectPocket - cuts a rectangular pocket */

#include <stdio.h>

double llX, llY, Xsize, Ysize, ToolDia,  FeedRate,
	      FinishWOC, FinishFeed, Offset, X, Y,
	      CurX, CurY, CurZ, ToolRadius, WidthofCut;
double DepthPerPass, Thickness;
double LineNo;
char FileName[256];
FILE *OutFile;
enum Axis {Xaxis, Yaxis} MajAxis;
int done;
int EXIT_SUCCESS=1;
int EXIT_FAILURE=0;
int true =1;
int false =0;

void outNum(RealNum, SigFrac)
double RealNum;
long SigFrac;
{
  double i;
  int j;
  char format[8];

  for (i = 1.0, j = 0; j <= 6 && i<= fabs(RealNum); i *= 10.0, j++)
    {}
    j += SigFrac-1;  /* J <= # int digits + 1 for decimal pt + #frac digits */
  if (RealNum < 0.0 )
    j += 1;          /* add a position for the minus sign */
  sprintf(format,"%%%d.%dlf",j,SigFrac);
    fprintf(OutFile, format, (RealNum));
}

void WriteLineNo()
{
  putc('N', OutFile);
  outNum(LineNo, 0L);
  LineNo += 10.0;
  putc(' ', OutFile);
}

main(argc, argv)
int argc;
char *argv[];
{
  OutFile = NULL;
  printf("Enter Lower Left Corner X,Y :");
  scanf("%lf%lf%*[^\n]", &llX, &llY);
  getchar();
  printf("Enter X and Y size of cutout :");
  scanf("%lf%lf%*[^\n]",&Xsize,&Ysize);
  getchar();

  printf("\nEnter Tool Diameter, Width of Cut :");
  scanf("%lf%lf%*[^\n]", &ToolDia,&WidthofCut);
  getchar();
  printf("\nEnter Feed Rate (IPM) :");
  scanf("%lf%*[^\n]", &FeedRate);
  getchar();
  printf("\nEnter Finish Feed Rate, Width of Final Cut:");
  scanf("%lf%lf%*[^\n]", &FinishFeed, &FinishWOC);
  getchar();
  printf("\nEnter depth per pass, Pocket Depth:");
  scanf("%lf%lf%*[^\n]", &DepthPerPass, &Thickness);
  getchar();
  printf("\nEnter File Name for CAM output:");
  scanf("%s",FileName);
  putchar('\n');
  OutFile = fopen(FileName,"w");
  if (OutFile != NULL)
    rewind(OutFile);
  else
    OutFile = tmpfile();
  if (OutFile == NULL)
    exit(EXIT_FAILURE);
  LineNo = 10.0;
  ToolRadius = ToolDia / 2.0;
  if (Xsize >= Ysize)
    MajAxis = Xaxis;
  else
    MajAxis = Yaxis;
  if (MajAxis == Xaxis)
    {
    CurX = llX + ToolRadius + FinishWOC;
    CurY = llY + Ysize / 2.0;
  }
  else
    {
    CurX = llX + Xsize / 2.0;
    CurY = llY + ToolRadius + FinishWOC;
    }
  WriteLineNo();
  fprintf(OutFile, "G01 F");
  outNum(40.0, 1L);   /* Lin Interp. */
  fprintf(OutFile, " X");   /* and go to initial pos */
  outNum(CurX, 4L);
  fprintf(OutFile, " Y");
  outNum(CurY, 4L);
  putc('\n', OutFile);
  WriteLineNo();         /* rapid feed to near top of work */
  putc('Z', OutFile);
  outNum(0.02, 4L);
  fprintf(OutFile, " F40");
  putc('\n',OutFile);
  for (CurZ = -DepthPerPass;
          CurZ >= -Thickness-DepthPerPass+0.001; CurZ -= DepthPerPass)
    {
      if (CurZ < -Thickness) CurZ = -Thickness;
    WriteLineNo();         /* plunge to new level */
    putc('Z', OutFile);
    outNum(CurZ, 4L);
    fprintf(OutFile, " F");
    outNum(FeedRate/5.0, 1L);
    putc('\n', OutFile);
    if (MajAxis == Xaxis)
      {
      X = llX + Xsize - ToolRadius - FinishWOC; /* plow down center */
      WriteLineNo();
      putc('X', OutFile);
      outNum(X, 4L);
      fprintf(OutFile, " F");
      outNum(FeedRate/2.0, 1L);
      putc('\n', OutFile);
      done = false;
      Offset = 0.0;
      while (!done)
	{
	Offset += WidthofCut;
	if (Offset >= Ysize/2.0 - ToolRadius - FinishWOC)
	  { 
	    Offset = Ysize/2.0 - ToolRadius - FinishWOC;
	    done = true;
	  }
	Y = llY + Ysize/2.0 + Offset;
        WriteLineNo();
        putc('Y', OutFile);
        outNum(Y, 4L);
	fprintf(OutFile, " F");
	outNum(FeedRate, 1L);
        putc('\n', OutFile);
	X = llX + ToolRadius + FinishWOC;
        WriteLineNo();
        putc('X', OutFile);
        outNum(X, 4L);
        putc('\n', OutFile);
	Y = llY + Ysize/2.0 - Offset;
        WriteLineNo();
        putc('Y', OutFile);
        outNum(Y, 4L);
        putc('\n', OutFile);
        X = llX + Xsize - ToolRadius - FinishWOC;
        WriteLineNo();
        putc('X', OutFile);
        outNum(X, 4L);
        putc('\n', OutFile);
	}     /* end while */
      Y = llY + Ysize/2.0;  /* go back to starting point */
      WriteLineNo();
      putc('Y', OutFile);
      outNum(Y, 4L);
      fprintf(OutFile, " F");
      outNum(FeedRate*4.0,1L);
      putc('\n',OutFile);
      X = llX + ToolRadius + FinishWOC;
      WriteLineNo();
      putc('X', OutFile);
      outNum(X, 4L);
      putc('\n', OutFile);
  }
  else              /* if MajAxis == Yaxis */
      {
      Y = llY + Ysize - ToolRadius - FinishWOC; /* plow down center */
      WriteLineNo();
      putc('Y', OutFile);
      outNum(Y, 4L);
      fprintf(OutFile, " F");
      outNum(FeedRate/2.0, 1L);
      putc('\n', OutFile);
      done = false;
      Offset = 0.0;
      while (!done)
	{
	Offset += WidthofCut;
	if (Offset >= Xsize/2.0 - ToolRadius - FinishWOC)
	  { 
	    Offset = Xsize/2.0 - ToolRadius - FinishWOC;
	    done = true;
	  }
	X = llX + Xsize/2.0 - Offset;
        WriteLineNo();
        putc('X', OutFile);
        outNum(X, 4L);
	fprintf(OutFile, " F");
	outNum(FeedRate, 1L);
        putc('\n', OutFile);
	Y = llY + ToolRadius + FinishWOC;
        WriteLineNo();
        putc('Y', OutFile);
        outNum(Y, 4L);
        putc('\n', OutFile);
	X = llX + Xsize/2.0 + Offset;
        WriteLineNo();
        putc('X', OutFile);
        outNum(X, 4L);
        putc('\n', OutFile);
        Y = llY + Ysize - ToolRadius - FinishWOC;
        WriteLineNo();
        putc('Y', OutFile);
        outNum(Y, 4L);
        putc('\n', OutFile);
	}   /* end while */
      X = llX + Xsize/2.0;    /* go back to starting point */
      WriteLineNo();
      putc('X', OutFile);
      outNum(X, 4L);
      fprintf(OutFile, " F");
      outNum(FeedRate*4.0, 1L);
      putc('\n', OutFile);
      Y = llY + ToolRadius + FinishWOC;
      WriteLineNo();
      putc('Y', OutFile);
      outNum(Y, 4L);
      putc('\n', OutFile);
   }
  }
  if (MajAxis == Xaxis)
    {
    WriteLineNo();         /* step out to finish dimension */
    CurX = llX + ToolRadius + 0.25 * FinishWOC;
    putc('F', OutFile);
    outNum(FinishFeed, 1L);
    fprintf(OutFile, " X");
    outNum(CurX, 4L);
    putc('\n', OutFile);
    CurX = llX + ToolRadius;
    CurY = llY + ToolRadius;
    WriteLineNo();           /* go into corner */
    putc('X', OutFile);
    outNum(CurX, 4L);
    fprintf(OutFile, " Y");
    outNum(CurY, 4L);
    putc('\n', OutFile);
    X = llX - ToolRadius + Xsize;
    WriteLineNo();
    putc('X', OutFile);
    outNum(X, 4L);
    putc('\n', OutFile);
    Y = llY - ToolRadius + Ysize;
    WriteLineNo();
    putc('Y', OutFile);
    outNum(Y, 4L);
    putc('\n', OutFile);
    WriteLineNo();
    putc('X', OutFile);
    outNum(CurX, 4L);
    putc('\n', OutFile);
    WriteLineNo();
    putc('Y', OutFile);
    outNum(CurY, 4L);
    putc('\n', OutFile);
    }
    else
      {
    WriteLineNo();         /* step out to finish dimension */
    CurY = llY + ToolRadius + 0.25 * FinishWOC;
    putc('F', OutFile);
    outNum(FinishFeed, 1L);
    fprintf(OutFile, " Y");
    outNum(CurY, 4L);
    putc('\n', OutFile);
    CurY = llY + ToolRadius;
    CurX = llX - ToolRadius + Xsize;
    WriteLineNo();           /* go into corner */
    putc('Y', OutFile);
    outNum(CurY, 4L);
    fprintf(OutFile, " X");
    outNum(CurX, 4L);
    putc('\n', OutFile);
    Y = llY - ToolRadius + Ysize;
    WriteLineNo();
    putc('Y', OutFile);
    outNum(Y, 4L);
    putc('\n', OutFile);
    X = llX + ToolRadius;
    WriteLineNo();
    putc('X', OutFile);
    outNum(X, 4L);
    putc('\n', OutFile);
    WriteLineNo();
    putc('Y', OutFile);
    outNum(CurY, 4L);
    putc('\n', OutFile);
    WriteLineNo();
    putc('X', OutFile);
    outNum(CurX, 4L);
    putc('\n', OutFile);
  }
  WriteLineNo();            /* raise tool */
  putc('Z', OutFile);
  outNum(0.1, 4L);
  putc('\n', OutFile);
  WriteLineNo();
  fprintf(OutFile, "M02\n");   /*End of Program */
  if (OutFile != NULL)
    fclose(OutFile);
  OutFile = NULL;
  if (OutFile != NULL)
    fclose(OutFile);
  exit(EXIT_SUCCESS);
}

/* End. */
