home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / hl10osrc.lzh / Lib / CardRecord.cc < prev    next >
Text File  |  1994-04-23  |  5KB  |  154 lines

  1. /* -*- Mode: C -*- */
  2. /* CardRecord.cc - Implementation of CardRecords
  3.  * Created by Robert Heller on Sat Dec  7 00:01:57 1991
  4.  *
  5.  * ------------------------------------------------------------------
  6.  * Home Libarian by Deepwoods Software
  7.  * Common Class library implementation code
  8.  * ------------------------------------------------------------------
  9.  * Modification History:
  10.  * ------------------------------------------------------------------
  11.  * Contents:
  12.  * ------------------------------------------------------------------
  13.  * 
  14.  * 
  15.  * Copyright (c) 1991,1992 by Robert heller (D/B/A Deepwoods Software)
  16.  *        All Rights Reserved
  17.  * 
  18.  */
  19. #ifdef MESSYDOS
  20. #include <cardrec.h>
  21. #else
  22. #include <CardRecord.h>
  23. #endif
  24. #include <stdio.h>
  25. // #include <stream.h>
  26.  
  27. extern Card defCard;    // prototypical Card
  28.  
  29. // CardRecord constructor, given an existing CardRecord
  30. CardRecord::CardRecord(CardRecord& cardrecord)
  31. {
  32.     RawData = cardrecord.RawData;
  33.     card = RecordToCard();
  34. }
  35. // CardRecord copier function
  36. CardRecord& CardRecord::operator = (CardRecord& cardrecord)
  37. {
  38.     RawData = cardrecord.RawData;
  39.     if (card != 0) delete card;
  40.     card = RecordToCard();
  41.     return *this;
  42. }
  43. // CardRecord constructor, given a CoreItem
  44. CardRecord::CardRecord(CoreItem* coreitem)
  45. {
  46.     RawData = coreitem->data;
  47.     card = RecordToCard();
  48. }
  49. // CardRecord constructor, given a Record*
  50. CardRecord::CardRecord(Record* record)
  51. {
  52.     RawData = *record;
  53.     card = RecordToCard();
  54. }
  55. // CardRecord constructor, given a Card*
  56. CardRecord::CardRecord(Card* card)
  57. {
  58.     CardRecord::card = new Card;
  59.     memcpy(CardRecord::card,card,sizeof(Card));
  60.     RawData.NewBuffer(0);
  61. }
  62. // CardRecord destructor
  63. CardRecord::~CardRecord()
  64. {
  65.     delete card;
  66.     RawData.NewBuffer(0);
  67. }
  68. // Conversion function - convert from a Record to a Card
  69. // derived from the code for RawBook::RawToBook() on page 91 of
  70. // "C++, a guide for C programmers", by Sharam Hekmatpour
  71. Card*  CardRecord::RecordToCard ()
  72. {
  73.     register char* str = RawData.buffer;    // Data string
  74.     register int   bytesleft = RawData.size; // Number of bytes
  75.     register Card *cd = new Card;        // allocate a fresh Card
  76.     *cd = defCard;                // default Card
  77.     // while bytes remain...
  78.     while (bytesleft > 0) {
  79.         // scan for field specifier
  80.         while (*str != '%' && bytesleft > 0) { str++; bytesleft--; }
  81.         // skip over specified prefix
  82.         str++; bytesleft--;
  83.         // while there still are bytes...
  84.         if (bytesleft <= 0) break;
  85.         // fan out based on field key
  86.         switch (*str++) {
  87.             case 'A': cd->author = str;  break;
  88.             case 'T': cd->title  = str;  break;
  89.             case 'P': cd->publisher = str;  break;
  90.             case 'C': cd->city = str;    break;
  91.             case 'V': cd->vol = atoi(str); break;
  92.             case 'Y': cd->year = atoi(str); break;
  93.             case 'D': cd->description = str; break;
  94.             case 't': cd->type = (enum CardType) *str;
  95.         }
  96.         // count specifier
  97.         bytesleft--;
  98.         // find strlen plus nul byte
  99.         int slen = strlen(str) + 1;
  100.         // update counter and pointer
  101.         bytesleft -= slen;
  102.         str += slen;
  103.         // EOR marker?
  104.         if (*str == '\n') break;
  105.     }
  106.     // return new Card* pointer
  107.     return cd;
  108. }
  109.  
  110. // Create a fresh record from a Card
  111. void CardRecord::UpdateRecord()
  112. {
  113.     static char vstr[20], ystr[20];        // temp strings for numerics
  114.  
  115.     // form numeric strings
  116.     sprintf(vstr,"%d",card->vol);
  117.     sprintf(ystr,"%d",card->year);
  118.     // compute buffer size
  119.     int rsize = 4 +                // "%tT\0"
  120.         strlen(card->author) + 3 +    // "%Aauthor\0"
  121.         strlen(card->title) + 3 +    // "%Ttitle\0"
  122.         strlen(card->publisher) + 3 +    // "%Ppublisher\0"
  123.         strlen(card->city) + 3 +    // "%Ccity\0"
  124.         strlen(card->description) + 3 +    // "%Ddescription\0"
  125.         strlen(vstr) + 3 +        // "%Vnnnn\0"
  126.         strlen(ystr) + 3 +        // "%Ynnnn\0"
  127.         strlen("\n") + 1;        // "\n\0"
  128.     // allocate a string
  129.     char* str = new char[rsize]; char* p = str;
  130.     // pack data into the string
  131.     *p++ = '%'; *p++ = 't'; *p++ = card->type;  *p++ = 0;
  132.     *p++ = '%'; *p++ = 'A'; strcpy(p,card->author); card->author = p;
  133.     p += strlen(p) + 1;
  134.     *p++ = '%'; *p++ = 'T'; strcpy(p,card->title); card->title = p;
  135.     p += strlen(p) + 1;
  136.     *p++ = '%'; *p++ = 'P'; strcpy(p,card->publisher); card->publisher = p;
  137.     p += strlen(p) + 1;
  138.     *p++ = '%'; *p++ = 'C'; strcpy(p,card->city); card->city = p;
  139.     p += strlen(p) + 1;
  140.     *p++ = '%'; *p++ = 'D'; strcpy(p,card->description);
  141.     card->description = p; p += strlen(p) + 1;
  142.     *p++ = '%'; *p++ = 'V'; strcpy(p,vstr); p += strlen(p) + 1;
  143.     *p++ = '%'; *p++ = 'Y'; strcpy(p,ystr); p += strlen(p) + 1;
  144. //    cerr.form("*** before *p++ = '\\n'; *p++ = 0;: p = 0x%08x\n",(long) p);
  145.     *p++ = '\n'; *p++ = 0;
  146. //    cerr.form("*** after  *p++ = '\\n'; *p++ = 0;: p = 0x%08x\n",(long) p);
  147.     // free up old buffer
  148.     RawData.NewBuffer(0);
  149.     // paste in new buffer
  150.     RawData.size = rsize;
  151.     RawData.buffer = str;
  152. }
  153.  
  154.