/*
 * shapes.c
 * This program reads an input file called shapes.txt, analyzes it and 
 * computes the area of each shape it specifies.
 */

#include <stdio.h>

#define MAX_LINE 80
#define PI       3.14159265

/* Definition of a point: */
struct _Point
{
  float x;
  float y;
};

typedef struct _Point Point;

int main ()
{
  Point  p, q, r;
  float  radius;
  char   line[MAX_LINE];
  FILE   *p_file;
  float  area;

  /* Open the input file. */
  p_file = fopen ("shapes.txt", "r");

  /* Check that the file has been successfully opened. */
  if (p_file == NULL)
  {
    printf ("The input file shapes.txt was not found.\n");
    return (1);
  }

  /* Read the file. */
  while (! feof (p_file))
  {
    /* Get the next line. */
    if (fgets (line, MAX_LINE, p_file) == NULL)
      break;

    /* The last character in the line is EOL - get rid of it. */
    line[strlen(line) - 1] = '\0';

    /* Ignore empty lines. */
    if (strlen(line) == 0)
      continue;

    /* The input file should contain descriptions of shapes, using the 
       following format:
       | RECTANGLE
       | x1 y1  x2 y2
       or:
       | CIRCLE
       | x y  r
       or:
       | TRIANGLE
       | x1 y1  x2 y2  x3 y3
     */
    if (strncmp (line, "TRI", 3) == 0)
    {
      /* Read the three vertices of the triangle. */
      fscanf (p_file, "%f %f %f %f %f %f", 
              &(p.x), &(p.y), &(q.x), &(q.y), &(r.x), &(r.y));

      printf ("Read a triangle, ");
      area = (p.x*(q.y - r.y) - p.y*(q.x - r.x) + (q.x*r.y - q.y*r.x)) / 2;

    }
    else if (strncmp (line, "RECT", 4) == 0)
    {
      /* Read the to corners of the rectangle. */
      fscanf (p_file, "%f %f %f %f",
              &(p.x), &(p.y), &(q.x), &(q.y));

      printf ("Read a rectangle, ");
      area = (p.x - q.x) * (p.y - q.y);
    }
    else if (strncmp (line, "CIRC", 4) == 0)
    {
      /* Read the center and radius of the circle. */
      fscanf (p_file, "%f %f %f",
              &(p.x), &(p.y), &radius);

      printf ("Read a circle, ");
      area = PI * radius * radius;
    }
    else
    {
      printf ("Unknown shape (%s) - skipping.\n", line);
      continue;
    }

    /* Read until the end of the current line. */
    fgets (line, MAX_LINE, p_file);
    
    /* Print the area. */
    area = (area < 0) ? -area : area;
    printf ("its area is %g\n", area);
  }

  /* Close the file. */
  fclose (p_file);

  return (0);
}

