/* dynComplex.c */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "dynComplex.h"


Complex *createComplex(double re, double im) {
  Complex *c = malloc(sizeof(Complex));
  if (!c) return NULL;

  c->re = re;
  c->im = im;
  return c;
}


Complex *cloneComplex(Complex *z) {
  return createComplex(z->re, z->im);
}


void deleteComplex(Complex *z) {
  free(z);
}


Complex *addComplex(Complex *z1, Complex *z2) {
  double re = z1->re + z2->re;
  double im = z1->im + z2->im;
  return createComplex(re, im);
}


Complex *subComplex(Complex *z1, Complex *z2) {
  double re = z1->re - z2->re;
  double im = z1->im - z2->im;
  return createComplex(re, im);
}


Complex *negComplex(Complex *z) {
  return createComplex(-z->re, -z->im);
}


Complex *multComplex(Complex *z1, Complex *z2) {
  double re = z1->re * z2->re - z1->im * z2->im;
  double im = z1->im * z2->re + z1->re * z2->im;
  return createComplex(re, im);
}


Complex *conjComplex(Complex *z) {
  return createComplex(z->re, -z->im);
}


Complex *divComplex(Complex *z1, Complex *z2) {
  double denominator = z2->re * z2->re + z2->im * z2->im;
  double re = (z1->re * z2->im + z1->im * z2->re) / denominator;
  double im = (z1->im * z2->re - z1->re * z2->im) / denominator;
  return createComplex(re, im);
}


void printComplex(char *p, Complex *z) {
  printf("%s = %.2f %c %.2f * i",
         p, z->re, z->im < 0 ? '-' : '+', fabs(z->im));
}
