#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

struct courseInfo {
  char dept[4] ;
  short number ;
  short section ;
  short limit ;
} ;

int cmpLimit(const void *a, const void *b) {
  struct courseInfo *c1 = (struct courseInfo *)a ;
  struct courseInfo *c2 = (struct courseInfo *)b ;
  if (c1->limit < c2->limit) return -1 ;
  if (c1->limit > c2->limit) return 1 ;
  int strRet = strncmp(c1->dept, c2->dept, 4) ;
  if (strRet != 0) {
    return strRet ;
  }
  if (c1->number < c2->number) return -1 ;
  if (c1->number > c2->number) return 1 ;
  return c1->section - c2->section ;
}

int main (int argv, char **argc) {
  struct courseInfo uncaCourses[100] ;
  int numCourses ;
  char tempDept[5] ;
  FILE *inFile = fopen(argc[1], "r") ;
  if (inFile == NULL) {
    fprintf(stderr, "Unable to open %s: %s\n", argc[1], strerror(errno)) ;
    return 1 ;
  }
  FILE *outFile = fopen(argc[2], "w") ;
  if (inFile == NULL) {
    fprintf(stderr, "Unable to write %s: %s\n", argc[2], strerror(errno)) ;
    return 1 ;
  }
  numCourses = 0 ;
  while (fscanf(inFile,
	       "%4s %hd.%hd %hd",
	       tempDept,
	       &uncaCourses[numCourses].number,
	       &uncaCourses[numCourses].section,
	       &uncaCourses[numCourses].limit) == 4) {
    strncpy(uncaCourses[numCourses].dept, tempDept, 4) ;
    // printf("Read line %d\n", numCourses + 1) ;
    numCourses++ ;
  }
  puts("As input") ;
  for (int i=0; i<numCourses; ++i) {
    printf("%-4.4s %3d.%03d %5d\n",
	   uncaCourses[i].dept,
	   uncaCourses[i].number,
	   uncaCourses[i].section,
	   uncaCourses[i].limit) ;
  }
  qsort((void *)uncaCourses, numCourses, sizeof(*uncaCourses), cmpLimit) ;
  puts("After sorting") ;
  for (int i=0; i<numCourses; ++i) {
    printf("%-4.4s %3d.%03d %5d\n",
	   uncaCourses[i].dept,
	   uncaCourses[i].number,
	   uncaCourses[i].section,
	   uncaCourses[i].limit) ;
  }
  for (int i=0; i<numCourses; ++i) {
    int rc = fwrite((void *)&uncaCourses[i], sizeof(*uncaCourses), 1, outFile) ;
  }
}
