/**
 * In class programming in C in lecture 20 Types in C.
 * 15-122 Spring 2014.
 */
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <assert.h>
#include "contracts.h"
#include "xalloc.h"

struct wcount {
  char *word;
  int count;
};


void increment(int *p) {
  REQUIRES(p != NULL);
  *p = *p + 1;
}

void increment_wcount(struct wcount *wc) {
  increment(&(wc->count));
}

void compare_stuff(int x, int y) {
  if (x/y == x/y)
    printf("nice!\n");
  else
    printf("strange\n");
}
  
void is_this_max_int(int x) {
  if (x < x+1) {
    printf("not max int\n");
  } else {
    printf("max int\n");
  }
}


int main() {
  unsigned char c = 0xF0;
  int i1 = (int) (unsigned int) c;
  int i2 = (int) (signed char) c;
  int i = (int)c;
  assert(i1 == 240);
  assert(i2 == -16);
  printf("sign+size change %d\n", i);
  
  is_this_max_int(500);
  is_this_max_int(0x0FFFFFFFF);
  compare_stuff(8, 2);
  //compare_stuff(5, 0);
  int *a1 = malloc(sizeof(int));
  *a1 = 55;
  increment(a1);
  printf("a1 has value %d\n", *a1);
  free(a1);

  int a2 = 7;
  increment(&a2);
  printf("a2 has value %d\n", a2);
  free(&a2);

  int a3 = 99;
  increment(&a3);
  printf("a3 has value %d\n", a3);
  free(&a3);
  

  struct wcount *wc = malloc(sizeof(struct wcount));
  wc->word = "bla";
  wc->count = 100;
  increment_wcount(wc);
  printf("wcount is %d\n", wc->count);

  int *A = xcalloc(3, sizeof(int));
  A[0] = 5;
  A[1] = 6;
  A[2] = 7;
  increment(A);
  increment(A+1);
  increment(A+2);

  increment(&A[1]);
  increment(&A[2]);

  

  return 0;
}
