/* Trepan rectangular pocket, with Z ramping */

//     #include <p2c/p2c.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


static double llX, llY, Xsize, Ysize, ToolDia,  FeedRate,
	      FinishWOC, FinishFeed, Offset, X, Y,
	      CurX, CurY, CurZ, RealZ, ToolRadius;
static double DepthPerPass, Thickness;
static double LineNo;
static char FileName[256];
static FILE *OutFile;
static int   first;

static void outNum(RealNum, SigFrac)
double RealNum;
long SigFrac;
{
  double i;
  int j;
  char format[8];

  for (i = 1.0, j = 0; i <= 6 || i<= abs(RealNum); i *= 10.0, j++)
    {}
  if (SigFrac > 0) 
    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.%df",j,SigFrac);
    fprintf(OutFile, format, (RealNum));
}

static 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 (real):");
  scanf("%lg%lg%*[^\n]", &llX, &llY);
  getchar();
  printf("Enter X and Y size of cutout (real):");
  scanf("%lg%lg%*[^\n]",&Xsize,&Ysize);
  getchar();

  printf("\nEnter Tool Diameter (real):");
  scanf("%lg%*[^\n]", &ToolDia);
  getchar();
  printf("\nEnter Feed Rate (IPM) (real):");
  scanf("%lg%*[^\n]", &FeedRate);
  getchar();
  printf("\nEnter Finish Feed Rate, Width of Final Cut:");
  scanf("%lg%lg%*[^\n]", &FinishFeed, &FinishWOC);
  getchar();
  printf("\nEnter depth per pass, material Thickness:");
  scanf("%lg%lgL*[^\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;
  CurX = llX + ToolRadius + FinishWOC;
  CurY = llY + ToolRadius + FinishWOC;
  WriteLineNo();
  fprintf(OutFile, "G01 F45 X"); /* and go to initial pos */
  outNum(CurX, 4L);
  fprintf(OutFile, " Y");
  outNum(CurY, 4L);
  putc('\n', OutFile);
  first =0;
  for (CurZ = -DepthPerPass;
       CurZ >= -Thickness-DepthPerPass+0.001; CurZ -= DepthPerPass)  
    {
      RealZ = CurZ;
      if (RealZ < -Thickness) RealZ = -Thickness;
    X = llX + Xsize - ToolRadius - FinishWOC;
    if (first == 0) {
      first = 1;
      WriteLineNo();          /* rapid down to top of material */
      putc('Z', OutFile);
      outNum(0.01, 4L);
      putc('\n', OutFile);
    }
    WriteLineNo();
    putc('X', OutFile);
    outNum(X, 4L);
    fprintf(OutFile, " Z");   /* ramp down */
    outNum(RealZ, 4L);
    fprintf(OutFile, " F");   /* Feed Rate */
    outNum(FeedRate, 2L);
    putc('\n', OutFile);
    Y = llY + Ysize - ToolRadius - FinishWOC;
    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);
    }
  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);
  WriteLineNo();              /* wait for operator to remove blank */
  fprintf(OutFile, " M01 (Remove blank)\n");
  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);
  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. */
