/*
   structrw - Platform-independent reading and writing of JAM structs
   Copyright (C) 1999 Johan Billing

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include <stdio.h>

#include <jamlib/jam.h>
#include "structrw.h"

ushort jamgetuword(uchar *buf,ulong offset)
{
    return (ushort) buf[offset]+buf[offset+1]*256;
}

void jamputuword(uchar *buf,ulong offset,ushort num)
{
    buf[offset]=num%256;
    buf[offset+1]=num/256;
}

void jamputulong(uchar *buf,ulong offset,ulong num)
{
    buf[offset]=num%256;
    buf[offset+1]=(num / 256) % 256;
    buf[offset+2]=(num / 256 / 256) % 256;
    buf[offset+3]=(num / 256 / 256 / 256) % 256;
}

ulong jamgetulong(uchar *buf,ulong offset)
{
    return (ulong) buf[offset]+
	    buf[offset+1]*256+
	    buf[offset+2]*256*256+
	    buf[offset+3]*256*256*256;
}

int freadjambaseheader(FILE *fp,s_JamBaseHeader *s_JamBaseHeader)
{
    uchar buf[SIZE_JAMBASEHEADER];

    if(fread(buf,SIZE_JAMBASEHEADER,1,fp) != 1)
	return 0;

    memcpy(s_JamBaseHeader->Signature,&buf[JAMBASEHEADER_SIGNATURE],4);

    s_JamBaseHeader->DateCreated = jamgetulong(buf,JAMBASEHEADER_DATECREATED);
    s_JamBaseHeader->ModCounter  = jamgetulong(buf,JAMBASEHEADER_MODCOUNTER);
    s_JamBaseHeader->ActiveMsgs  = jamgetulong(buf,JAMBASEHEADER_ACTIVEMSGS);
    s_JamBaseHeader->PasswordCRC = jamgetulong(buf,JAMBASEHEADER_PASSWORDCRC);
    s_JamBaseHeader->BaseMsgNum  = jamgetulong(buf,JAMBASEHEADER_BASEMSGNUM);

    memcpy(s_JamBaseHeader->RSRVD,&buf[JAMBASEHEADER_RSRVD],1000);

    return 1;
}

int fwritejambaseheader(FILE *fp,s_JamBaseHeader *s_JamBaseHeader)
{
    uchar buf[SIZE_JAMBASEHEADER];

    memcpy(&buf[JAMBASEHEADER_SIGNATURE],s_JamBaseHeader->Signature,4);

    jamputulong(buf,JAMBASEHEADER_DATECREATED, s_JamBaseHeader->DateCreated);
    jamputulong(buf,JAMBASEHEADER_MODCOUNTER,  s_JamBaseHeader->ModCounter);
    jamputulong(buf,JAMBASEHEADER_ACTIVEMSGS,  s_JamBaseHeader->ActiveMsgs);
    jamputulong(buf,JAMBASEHEADER_PASSWORDCRC, s_JamBaseHeader->PasswordCRC );
    jamputulong(buf,JAMBASEHEADER_BASEMSGNUM,  s_JamBaseHeader->BaseMsgNum);

    memcpy(&buf[JAMBASEHEADER_RSRVD],s_JamBaseHeader->RSRVD,1000);

    if(fwrite(buf,SIZE_JAMBASEHEADER,1,fp) != 1)
	return 0;

    return 1;
}

int freadjammsgheader(FILE *fp,s_JamMsgHeader *s_JamMsgHeader)
{
    uchar buf[SIZE_JAMMSGHEADER];

    if(fread(buf,SIZE_JAMMSGHEADER,1,fp) != 1)
	return 0;

    memcpy(s_JamMsgHeader->Signature,&buf[JAMMSGHEADER_SIGNATURE],4);

    s_JamMsgHeader->Revision      = jamgetuword(buf,JAMMSGHEADER_REVISION);
    s_JamMsgHeader->ReservedWord  = jamgetuword(buf,JAMMSGHEADER_RESERVEDWORD);
    s_JamMsgHeader->SubfieldLen   = jamgetulong(buf,JAMMSGHEADER_SUBFIELDLEN);
    s_JamMsgHeader->TimesRead     = jamgetulong(buf,JAMMSGHEADER_TIMESREAD);
    s_JamMsgHeader->MsgIdCRC      = jamgetulong(buf,JAMMSGHEADER_MSGIDCRC);
    s_JamMsgHeader->ReplyCRC      = jamgetulong(buf,JAMMSGHEADER_REPLYCRC);
    s_JamMsgHeader->ReplyTo       = jamgetulong(buf,JAMMSGHEADER_REPLYTO);
    s_JamMsgHeader->Reply1st      = jamgetulong(buf,JAMMSGHEADER_REPLY1ST);
    s_JamMsgHeader->ReplyNext     = jamgetulong(buf,JAMMSGHEADER_REPLYNEXT);
    s_JamMsgHeader->DateWritten   = jamgetulong(buf,JAMMSGHEADER_DATEWRITTEN);
    s_JamMsgHeader->DateReceived  = jamgetulong(buf,JAMMSGHEADER_DATERECEIVED);
    s_JamMsgHeader->DateProcessed = jamgetulong(buf,JAMMSGHEADER_DATEPROCESSED);
    s_JamMsgHeader->MsgNum        = jamgetulong(buf,JAMMSGHEADER_MSGNUM);
    s_JamMsgHeader->Attribute     = jamgetulong(buf,JAMMSGHEADER_ATTRIBUTE);
    s_JamMsgHeader->Attribute2    = jamgetulong(buf,JAMMSGHEADER_ATTRIBUTE2);
    s_JamMsgHeader->TxtOffset     = jamgetulong(buf,JAMMSGHEADER_TXTOFFSET);
    s_JamMsgHeader->TxtLen        = jamgetulong(buf,JAMMSGHEADER_TXTLEN);
    s_JamMsgHeader->PasswordCRC   = jamgetulong(buf,JAMMSGHEADER_PASSWORDCRC);
    s_JamMsgHeader->Cost          = jamgetulong(buf,JAMMSGHEADER_COST);

    return 1;
}

int fwritejammsgheader(FILE *fp,s_JamMsgHeader *s_JamMsgHeader)
{
    uchar buf[SIZE_JAMMSGHEADER];

    memcpy(&buf[JAMMSGHEADER_SIGNATURE],s_JamMsgHeader->Signature,4);

    jamputuword(buf,JAMMSGHEADER_REVISION,      s_JamMsgHeader->Revision);
    jamputuword(buf,JAMMSGHEADER_RESERVEDWORD,  s_JamMsgHeader->ReservedWord);
    jamputulong(buf,JAMMSGHEADER_SUBFIELDLEN,   s_JamMsgHeader->SubfieldLen);
    jamputulong(buf,JAMMSGHEADER_TIMESREAD,     s_JamMsgHeader->TimesRead);
    jamputulong(buf,JAMMSGHEADER_MSGIDCRC,      s_JamMsgHeader->MsgIdCRC);
    jamputulong(buf,JAMMSGHEADER_REPLYCRC,      s_JamMsgHeader->ReplyCRC  );
    jamputulong(buf,JAMMSGHEADER_REPLYTO,       s_JamMsgHeader->ReplyTo);
    jamputulong(buf,JAMMSGHEADER_REPLY1ST,      s_JamMsgHeader->Reply1st);
    jamputulong(buf,JAMMSGHEADER_REPLYNEXT,     s_JamMsgHeader->ReplyNext);
    jamputulong(buf,JAMMSGHEADER_DATEWRITTEN,   s_JamMsgHeader->DateWritten);
    jamputulong(buf,JAMMSGHEADER_DATERECEIVED,  s_JamMsgHeader->DateReceived );
    jamputulong(buf,JAMMSGHEADER_DATEPROCESSED, s_JamMsgHeader->DateProcessed);
    jamputulong(buf,JAMMSGHEADER_MSGNUM,        s_JamMsgHeader->MsgNum);
    jamputulong(buf,JAMMSGHEADER_ATTRIBUTE,     s_JamMsgHeader->Attribute);
    jamputulong(buf,JAMMSGHEADER_ATTRIBUTE2,    s_JamMsgHeader->Attribute2);
    jamputulong(buf,JAMMSGHEADER_TXTOFFSET,     s_JamMsgHeader->TxtOffset);
    jamputulong(buf,JAMMSGHEADER_TXTLEN,        s_JamMsgHeader->TxtLen);
    jamputulong(buf,JAMMSGHEADER_PASSWORDCRC,   s_JamMsgHeader->PasswordCRC);
    jamputulong(buf,JAMMSGHEADER_COST,          s_JamMsgHeader->Cost);

    if(fwrite(buf,SIZE_JAMMSGHEADER,1,fp) != 1)
	return 0;

    return 1;
}

int freadjamindex(FILE *fp,s_JamIndex *s_JamIndex)
{
    uchar buf[SIZE_JAMINDEX];

    if(fread(buf,SIZE_JAMINDEX,1,fp) != 1)
	return 0;

    s_JamIndex->UserCRC   = jamgetulong(buf,JAMINDEX_USERCRC);
    s_JamIndex->HdrOffset = jamgetulong(buf,JAMINDEX_HDROFFSET);

    return 1;
}

int fwritejamindex(FILE *fp,s_JamIndex *s_JamIndex)
{
    uchar buf[SIZE_JAMINDEX];

    jamputulong(buf,JAMINDEX_USERCRC,   s_JamIndex->UserCRC);
    jamputulong(buf,JAMINDEX_HDROFFSET, s_JamIndex->HdrOffset);

    if(fwrite(buf,SIZE_JAMINDEX,1,fp) != 1)
	return 0;

    return 1;
}

int freadjamlastread(FILE *fp,s_JamLastRead *s_JamLastRead)
{
    uchar buf[SIZE_JAMLASTREAD];

    if(fread(buf,SIZE_JAMLASTREAD,1,fp) != 1)
	return 0;

    s_JamLastRead->UserCRC     = jamgetulong(buf,JAMLASTREAD_USERCRC);
    s_JamLastRead->UserID      = jamgetulong(buf,JAMLASTREAD_USERID);
    s_JamLastRead->LastReadMsg = jamgetulong(buf,JAMLASTREAD_LASTREADMSG);
    s_JamLastRead->HighReadMsg = jamgetulong(buf,JAMLASTREAD_HIGHREADMSG);

    return 1;
}

int fwritejamlastread(FILE *fp,s_JamLastRead *s_JamLastRead)
{
    uchar buf[SIZE_JAMLASTREAD];

    jamputulong(buf,JAMLASTREAD_USERCRC,s_JamLastRead->UserCRC);
    jamputulong(buf,JAMLASTREAD_USERID,s_JamLastRead->UserID);
    jamputulong(buf,JAMLASTREAD_LASTREADMSG,s_JamLastRead->LastReadMsg);
    jamputulong(buf,JAMLASTREAD_HIGHREADMSG,s_JamLastRead->HighReadMsg);

    if(fwrite(buf,SIZE_JAMLASTREAD,1,fp) != 1)
	return 0;

    return 1;
}

int fwritejamsavesubfield(FILE *fp,s_JamSaveSubfield *s_JamSaveSubfield)
{
    uchar buf[SIZE_JAMLASTREAD];

    jamputuword(buf,JAMSAVESUBFIELD_LOID,   s_JamSaveSubfield->LoID);
    jamputuword(buf,JAMSAVESUBFIELD_HIID,   s_JamSaveSubfield->HiID);
    jamputulong(buf,JAMSAVESUBFIELD_DATLEN, s_JamSaveSubfield->DatLen);

    if(fwrite(buf,SIZE_JAMSAVESUBFIELD,1,fp) != 1)
	return 0;

    return 1;
}

void getjamsubfield(uchar *buf,s_JamSubfield *Subfield_S)
{
    Subfield_S->LoID   = jamgetuword(buf,JAMSAVESUBFIELD_LOID);
    Subfield_S->HiID   = jamgetuword(buf,JAMSAVESUBFIELD_HIID);
    Subfield_S->DatLen = jamgetulong(buf,JAMSAVESUBFIELD_DATLEN);

    Subfield_S->Buffer = (uchar *) buf + SIZE_JAMSAVESUBFIELD;
}


syntax highlighted by Code2HTML, v. 0.9.1