structrw.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /*
  2. structrw - Platform-independent reading and writing of JAM structs
  3. Copyright (C) 1999 Johan Billing
  4. This library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Lesser General Public
  6. License as published by the Free Software Foundation; either
  7. version 2.1 of the License, or (at your option) any later version.
  8. This library is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public
  13. License along with this library; if not, write to the Free Software
  14. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  15. Changes made by Johan Billing 2003-10-22
  16. - Added #include <string.h>
  17. */
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include "jam.h"
  21. #include "structrw.h"
  22. uint16_t jamgetuword(unsigned char *buf,uint32_t offset)
  23. {
  24. return (uint16_t) buf[offset]+
  25. buf[offset+1]*256;
  26. }
  27. void jamputuword(unsigned char *buf,uint32_t offset,uint16_t num)
  28. {
  29. buf[offset]=num%256;
  30. buf[offset+1]=num/256;
  31. }
  32. void jamputuint32_t(unsigned char *buf,uint32_t offset,uint32_t num)
  33. {
  34. buf[offset]=num%256;
  35. buf[offset+1]=(num / 256) % 256;
  36. buf[offset+2]=(num / 256 / 256) % 256;
  37. buf[offset+3]=(num / 256 / 256 / 256) % 256;
  38. }
  39. uint32_t jamgetuint32_t(unsigned char *buf,uint32_t offset)
  40. {
  41. return (uint32_t) buf[offset]+
  42. buf[offset+1]*256+
  43. buf[offset+2]*256*256+
  44. buf[offset+3]*256*256*256;
  45. }
  46. int freadjambaseheader(FILE *fp,s_JamBaseHeader *s_JamBaseHeader)
  47. {
  48. unsigned char buf[SIZE_JAMBASEHEADER];
  49. if(fread(buf,SIZE_JAMBASEHEADER,1,fp) != 1)
  50. return 0;
  51. memcpy(s_JamBaseHeader->Signature,&buf[JAMBASEHEADER_SIGNATURE],4);
  52. s_JamBaseHeader->DateCreated = jamgetuint32_t(buf,JAMBASEHEADER_DATECREATED);
  53. s_JamBaseHeader->ModCounter = jamgetuint32_t(buf,JAMBASEHEADER_MODCOUNTER);
  54. s_JamBaseHeader->ActiveMsgs = jamgetuint32_t(buf,JAMBASEHEADER_ACTIVEMSGS);
  55. s_JamBaseHeader->PasswordCRC = jamgetuint32_t(buf,JAMBASEHEADER_PASSWORDCRC);
  56. s_JamBaseHeader->BaseMsgNum = jamgetuint32_t(buf,JAMBASEHEADER_BASEMSGNUM);
  57. memcpy(s_JamBaseHeader->RSRVD,&buf[JAMBASEHEADER_RSRVD],1000);
  58. return 1;
  59. }
  60. int fwritejambaseheader(FILE *fp,s_JamBaseHeader *s_JamBaseHeader)
  61. {
  62. unsigned char buf[SIZE_JAMBASEHEADER];
  63. memcpy(&buf[JAMBASEHEADER_SIGNATURE],s_JamBaseHeader->Signature,4);
  64. jamputuint32_t(buf,JAMBASEHEADER_DATECREATED, s_JamBaseHeader->DateCreated);
  65. jamputuint32_t(buf,JAMBASEHEADER_MODCOUNTER, s_JamBaseHeader->ModCounter);
  66. jamputuint32_t(buf,JAMBASEHEADER_ACTIVEMSGS, s_JamBaseHeader->ActiveMsgs);
  67. jamputuint32_t(buf,JAMBASEHEADER_PASSWORDCRC, s_JamBaseHeader->PasswordCRC );
  68. jamputuint32_t(buf,JAMBASEHEADER_BASEMSGNUM, s_JamBaseHeader->BaseMsgNum);
  69. memcpy(&buf[JAMBASEHEADER_RSRVD],s_JamBaseHeader->RSRVD,1000);
  70. if(fwrite(buf,SIZE_JAMBASEHEADER,1,fp) != 1)
  71. return 0;
  72. return 1;
  73. }
  74. int freadjammsgheader(FILE *fp,s_JamMsgHeader *s_JamMsgHeader)
  75. {
  76. unsigned char buf[SIZE_JAMMSGHEADER];
  77. if(fread(buf,SIZE_JAMMSGHEADER,1,fp) != 1)
  78. return 0;
  79. memcpy(s_JamMsgHeader->Signature,&buf[JAMMSGHEADER_SIGNATURE],4);
  80. s_JamMsgHeader->Revision = jamgetuword(buf,JAMMSGHEADER_REVISION);
  81. s_JamMsgHeader->ReservedWord = jamgetuword(buf,JAMMSGHEADER_RESERVEDWORD);
  82. s_JamMsgHeader->SubfieldLen = jamgetuint32_t(buf,JAMMSGHEADER_SUBFIELDLEN);
  83. s_JamMsgHeader->TimesRead = jamgetuint32_t(buf,JAMMSGHEADER_TIMESREAD);
  84. s_JamMsgHeader->MsgIdCRC = jamgetuint32_t(buf,JAMMSGHEADER_MSGIDCRC);
  85. s_JamMsgHeader->ReplyCRC = jamgetuint32_t(buf,JAMMSGHEADER_REPLYCRC);
  86. s_JamMsgHeader->ReplyTo = jamgetuint32_t(buf,JAMMSGHEADER_REPLYTO);
  87. s_JamMsgHeader->Reply1st = jamgetuint32_t(buf,JAMMSGHEADER_REPLY1ST);
  88. s_JamMsgHeader->ReplyNext = jamgetuint32_t(buf,JAMMSGHEADER_REPLYNEXT);
  89. s_JamMsgHeader->DateWritten = jamgetuint32_t(buf,JAMMSGHEADER_DATEWRITTEN);
  90. s_JamMsgHeader->DateReceived = jamgetuint32_t(buf,JAMMSGHEADER_DATERECEIVED);
  91. s_JamMsgHeader->DateProcessed = jamgetuint32_t(buf,JAMMSGHEADER_DATEPROCESSED);
  92. s_JamMsgHeader->MsgNum = jamgetuint32_t(buf,JAMMSGHEADER_MSGNUM);
  93. s_JamMsgHeader->Attribute = jamgetuint32_t(buf,JAMMSGHEADER_ATTRIBUTE);
  94. s_JamMsgHeader->Attribute2 = jamgetuint32_t(buf,JAMMSGHEADER_ATTRIBUTE2);
  95. s_JamMsgHeader->TxtOffset = jamgetuint32_t(buf,JAMMSGHEADER_TXTOFFSET);
  96. s_JamMsgHeader->TxtLen = jamgetuint32_t(buf,JAMMSGHEADER_TXTLEN);
  97. s_JamMsgHeader->PasswordCRC = jamgetuint32_t(buf,JAMMSGHEADER_PASSWORDCRC);
  98. s_JamMsgHeader->Cost = jamgetuint32_t(buf,JAMMSGHEADER_COST);
  99. return 1;
  100. }
  101. int fwritejammsgheader(FILE *fp,s_JamMsgHeader *s_JamMsgHeader)
  102. {
  103. unsigned char buf[SIZE_JAMMSGHEADER];
  104. memcpy(&buf[JAMMSGHEADER_SIGNATURE],s_JamMsgHeader->Signature,4);
  105. jamputuword(buf,JAMMSGHEADER_REVISION, s_JamMsgHeader->Revision);
  106. jamputuword(buf,JAMMSGHEADER_RESERVEDWORD, s_JamMsgHeader->ReservedWord);
  107. jamputuint32_t(buf,JAMMSGHEADER_SUBFIELDLEN, s_JamMsgHeader->SubfieldLen);
  108. jamputuint32_t(buf,JAMMSGHEADER_TIMESREAD, s_JamMsgHeader->TimesRead);
  109. jamputuint32_t(buf,JAMMSGHEADER_MSGIDCRC, s_JamMsgHeader->MsgIdCRC);
  110. jamputuint32_t(buf,JAMMSGHEADER_REPLYCRC, s_JamMsgHeader->ReplyCRC );
  111. jamputuint32_t(buf,JAMMSGHEADER_REPLYTO, s_JamMsgHeader->ReplyTo);
  112. jamputuint32_t(buf,JAMMSGHEADER_REPLY1ST, s_JamMsgHeader->Reply1st);
  113. jamputuint32_t(buf,JAMMSGHEADER_REPLYNEXT, s_JamMsgHeader->ReplyNext);
  114. jamputuint32_t(buf,JAMMSGHEADER_DATEWRITTEN, s_JamMsgHeader->DateWritten);
  115. jamputuint32_t(buf,JAMMSGHEADER_DATERECEIVED, s_JamMsgHeader->DateReceived );
  116. jamputuint32_t(buf,JAMMSGHEADER_DATEPROCESSED, s_JamMsgHeader->DateProcessed);
  117. jamputuint32_t(buf,JAMMSGHEADER_MSGNUM, s_JamMsgHeader->MsgNum);
  118. jamputuint32_t(buf,JAMMSGHEADER_ATTRIBUTE, s_JamMsgHeader->Attribute);
  119. jamputuint32_t(buf,JAMMSGHEADER_ATTRIBUTE2, s_JamMsgHeader->Attribute2);
  120. jamputuint32_t(buf,JAMMSGHEADER_TXTOFFSET, s_JamMsgHeader->TxtOffset);
  121. jamputuint32_t(buf,JAMMSGHEADER_TXTLEN, s_JamMsgHeader->TxtLen);
  122. jamputuint32_t(buf,JAMMSGHEADER_PASSWORDCRC, s_JamMsgHeader->PasswordCRC);
  123. jamputuint32_t(buf,JAMMSGHEADER_COST, s_JamMsgHeader->Cost);
  124. if(fwrite(buf,SIZE_JAMMSGHEADER,1,fp) != 1)
  125. return 0;
  126. return 1;
  127. }
  128. int freadjamindex(FILE *fp,s_JamIndex *s_JamIndex)
  129. {
  130. unsigned char buf[SIZE_JAMINDEX];
  131. if(fread(buf,SIZE_JAMINDEX,1,fp) != 1)
  132. return 0;
  133. s_JamIndex->UserCRC = jamgetuint32_t(buf,JAMINDEX_USERCRC);
  134. s_JamIndex->HdrOffset = jamgetuint32_t(buf,JAMINDEX_HDROFFSET);
  135. return 1;
  136. }
  137. int fwritejamindex(FILE *fp,s_JamIndex *s_JamIndex)
  138. {
  139. unsigned char buf[SIZE_JAMINDEX];
  140. jamputuint32_t(buf,JAMINDEX_USERCRC, s_JamIndex->UserCRC);
  141. jamputuint32_t(buf,JAMINDEX_HDROFFSET, s_JamIndex->HdrOffset);
  142. if(fwrite(buf,SIZE_JAMINDEX,1,fp) != 1)
  143. return 0;
  144. return 1;
  145. }
  146. int freadjamlastread(FILE *fp,s_JamLastRead *s_JamLastRead)
  147. {
  148. unsigned char buf[SIZE_JAMLASTREAD];
  149. if(fread(buf,SIZE_JAMLASTREAD,1,fp) != 1)
  150. return 0;
  151. s_JamLastRead->UserCRC = jamgetuint32_t(buf,JAMLASTREAD_USERCRC);
  152. s_JamLastRead->UserID = jamgetuint32_t(buf,JAMLASTREAD_USERID);
  153. s_JamLastRead->LastReadMsg = jamgetuint32_t(buf,JAMLASTREAD_LASTREADMSG);
  154. s_JamLastRead->HighReadMsg = jamgetuint32_t(buf,JAMLASTREAD_HIGHREADMSG);
  155. return 1;
  156. }
  157. int fwritejamlastread(FILE *fp,s_JamLastRead *s_JamLastRead)
  158. {
  159. unsigned char buf[SIZE_JAMLASTREAD];
  160. jamputuint32_t(buf,JAMLASTREAD_USERCRC,s_JamLastRead->UserCRC);
  161. jamputuint32_t(buf,JAMLASTREAD_USERID,s_JamLastRead->UserID);
  162. jamputuint32_t(buf,JAMLASTREAD_LASTREADMSG,s_JamLastRead->LastReadMsg);
  163. jamputuint32_t(buf,JAMLASTREAD_HIGHREADMSG,s_JamLastRead->HighReadMsg);
  164. if(fwrite(buf,SIZE_JAMLASTREAD,1,fp) != 1)
  165. return 0;
  166. return 1;
  167. }
  168. int fwritejamsavesubfield(FILE *fp,s_JamSaveSubfield *s_JamSaveSubfield)
  169. {
  170. unsigned char buf[SIZE_JAMLASTREAD];
  171. jamputuword(buf,JAMSAVESUBFIELD_LOID, s_JamSaveSubfield->LoID);
  172. jamputuword(buf,JAMSAVESUBFIELD_HIID, s_JamSaveSubfield->HiID);
  173. jamputuint32_t(buf,JAMSAVESUBFIELD_DATLEN, s_JamSaveSubfield->DatLen);
  174. if(fwrite(buf,SIZE_JAMSAVESUBFIELD,1,fp) != 1)
  175. return 0;
  176. return 1;
  177. }
  178. void getjamsubfield(unsigned char *buf,s_JamSubfield *Subfield_S)
  179. {
  180. Subfield_S->LoID = jamgetuword(buf,JAMSAVESUBFIELD_LOID);
  181. Subfield_S->HiID = jamgetuword(buf,JAMSAVESUBFIELD_HIID);
  182. Subfield_S->DatLen = jamgetuint32_t(buf,JAMSAVESUBFIELD_DATLEN);
  183. Subfield_S->Buffer = (char *) buf + SIZE_JAMSAVESUBFIELD;
  184. }