//  File: studentitem.C
//
//  operations needed for ListNode and List Classes.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "studentitem.h"


//======================================================================
// Local Functions

static void copyitem(ListItem& x, int ss, const char *nm, const char* mj) ;


// Copy from *ptr2 to *ptr1
//
static void copyitem(ListItem& x, int ss, const char *nm, const char* mj) {

   x.ssn = ss ;

   // Copy name field

   if (nm == NULL) {
      x.name = NULL ;
   } else {
      x.name = strdup(nm) ;
      if (x.name == NULL) {
         fprintf(stderr, "could not clone student\n") ;
         exit(1) ;
      }
   }

   // Copy major field

   if (mj == NULL) {
      x.major = NULL ;
   } else {
      x.major = strdup(mj) ;
      if (x.major == NULL) {
         fprintf(stderr, "could not clone student\n") ;
         exit(1) ;
      }
   }

}


//======================================================================

// default constructor
//
ListItem::ListItem() {

   ssn = 0 ;
   name = NULL ;
   major = NULL ;
}


// alternate constructor
//
ListItem::ListItem(const ListItem& x) {

   copyitem(*this, x.ssn, x.name, x.major) ;
}


//  Type conveter.  The default values for nm and mj are NULL.
//
ListItem::ListItem(int ss, const char *nm, const char *mj) {
   copyitem(*this, ss, nm, mj) ;
}


// destructor
//
ListItem::~ListItem() {

/* Debugging:

   printf("Student Item Destructor: this=%p\n", this) ;
   printf("   ssn=%09d, ", ssn) ;
   if (name != NULL) {
      printf("name=(%p,%s), ", name, name) ;
   } else {
      printf("name=(nil), ") ;
   }
   if (major != NULL) {
      printf("major=(%p,%s)\n", major, major) ;
   } else {
      printf("major=(nil)\n") ;
   }
*/

   if (name != NULL) free(name) ;
   if (major != NULL) free(major) ;
}


// make a copy
//
ListItem *ListItem::copy() const {
   ListItem *newp ;

   newp = new ListItem ;
   copyitem(*newp, ssn, name, major) ;

   return newp ;
}


// Copy contents of host object into x
//
void ListItem::copyto(ListItem& x) const {

   copyitem(x, ssn, name, major) ;
}


// Compare data in host object with given data.
//  <0 is smaller, =0 is equal, >0 is bigger
//
int ListItem::compare(const ListItem& x) const {

   return ssn - x.ssn ;
}


// print to stdout
//
void ListItem::print() const {
   printf("%s (%09d), %s major\n", name, ssn, major) ;
}
