#include <stdio.h>
#include <errno.h>
#include "ttf.h"
#include "error.h"
#include "basic.h"

/*
   True Type Fonts use Motorola's byte ordering, i.e. the most significant 
   byte comes first. Thus we must provide a set of functions to access all
   values in a platform-independent way.
*/


BYTE get_BYTE(FILE *fp)
{
  int cc;
  cc = fgetc(fp);
  if (cc == EOF && errno)
    Error_throw(error_read,errno);
  return (BYTE) cc;
}

CHAR get_CHAR(FILE *fp)
{
  int cc;
  cc = fgetc(fp);
  if (cc == EOF && errno)
    Error_throw(error_read,errno);
  return (CHAR) cc;
}

USHORT get_USHORT(FILE *fp)
{
  int cc1,cc2;
  cc1 = fgetc(fp);
  cc2 = fgetc(fp);
  if (cc2 == EOF && errno)
    Error_throw(error_read,errno);
  return (USHORT) ((cc1<<8)+cc2);
}

SHORT get_SHORT(FILE *fp)
{
  int cc1,cc2;
  cc1 = fgetc(fp);
  cc2 = fgetc(fp);
  if (cc2 == EOF && errno)
    Error_throw(error_read,errno);
  return (SHORT) ((cc1<<8)+cc2);
}

ULONG get_ULONG(FILE *fp)
{
  int cc1,cc2,cc3,cc4;
  cc1 = fgetc(fp);
  cc2 = fgetc(fp);
  cc3 = fgetc(fp);
  cc4 = fgetc(fp);
  if (cc4 == EOF && errno)
    Error_throw(error_read,errno);
  return (ULONG) ((((((cc1<<8)+cc2)<<8)+cc3)<<8)+cc4);
}

LONG get_LONG(FILE *fp)
{
  int cc1,cc2,cc3,cc4;
  cc1 = fgetc(fp);
  cc2 = fgetc(fp);
  cc3 = fgetc(fp);
  cc4 = fgetc(fp);

  if (cc4 == EOF && errno)
    Error_throw(error_read,errno);
  return (LONG) ((((((cc1<<8)+cc2)<<8)+cc3)<<8)+cc4);
}

Fixed get_Fixed(FILE *fp)
{
  return (Fixed) get_ULONG(fp);
}

FUnit get_FUnit(FILE *fp)
{
  return (FUnit) get_USHORT(fp);
}

FWord get_FWord(FILE *fp)
{
  return (FWord) get_USHORT(fp);
}

uFWord get_uFWord(FILE *fp)
{
  return (uFWord) get_USHORT(fp);
}

F2Dot14 get_F2Dot14(FILE *fp)
{
  return (FWord) get_USHORT(fp);
}
