void eewrite_long (unsigned char ee_addr, unsigned long eedata)
When you want to save a float type, you have to rewrite it; when you want to save 100 different struct types, you have to write 100 of such nearly identical functions...
You need something more generic than what you have here.
You can write a macro that takes a pointer to the variable and uses sizeof to get its length, then you can just do ee_write(addr, varname) and it will automatically handle the type
Something like
#define writeeeprom(adr,targ) for(i=adr;i!=adr+sizeof(targ);writebyte(i++, (char*)&targ++));
(not sure if that pointer increment syntax is right, but you get the idea)
If you're writing to something like I2C ee, you'd want your bottom-level read/write code to write multiple bytes in one operation for efficiency, so it would simplify to just passing the address and size of the variable.