home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / hl10osrc.lzh / Libr2Ascii / Libr2Ascii.cc < prev    next >
C/C++ Source or Header  |  1994-04-23  |  5KB  |  216 lines

  1. /* -*- Mode: C -*- */
  2. /* Libr2Ascii.cc - Spit out a libr file as an ASCII text file.
  3.  * Created by Robert Heller on Sat Dec  7 23:09:11 1991
  4.  *
  5.  * ------------------------------------------------------------------
  6.  * Home Libarian by Deepwoods Software
  7.  * Library file to ASCII text file
  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.  
  20. #include <stream.h>
  21. #include <vBTree.h>
  22. #include <ctype.h>
  23. #ifdef MESSYDOS
  24. #include <CardRec.h>
  25. #include <ListRec.h>
  26. #else
  27. #include <CardRecord.h>
  28. #include <ListRecord.h>
  29. #endif
  30. #define VERSION "V1.0Beta"
  31. #ifdef MESSYDOS
  32. #include "Libr2Asc.h"
  33. #else
  34. #include "Libr2Ascii.h"
  35. #endif
  36.  
  37. void QuoteStringBuffer(char* buffer,char* string)
  38. {
  39.     *buffer++ = '"';
  40.     while (*string != 0) {
  41.         if (*string == '"') *buffer++ = '\\';
  42.         *buffer++ = *string++;
  43.     }
  44.     *buffer++ = '"';
  45.     *buffer = 0;
  46. }
  47.  
  48. void QuoteStringStream(ostream& out,char* string)
  49. {
  50.     out << '"';
  51.     while (*string != 0) {
  52.         if (*string == '"') out << '\\';
  53.         out << *string++;
  54.     }
  55.     out << '"';
  56. }
  57.  
  58. static char buffer[2048];
  59.  
  60. void PrintCardRecord(CoreItem* item,int level)
  61. {
  62.     int indent = 0;
  63.     int column = 0;
  64.     QuoteStringBuffer(buffer,item->key);
  65.     cout << buffer << " ";
  66.     indent += strlen(buffer) + 1;
  67.     if (item->data.size <= 0) {
  68.         cout << "#C()\n";
  69.     } else {
  70.         cout << "#C("; indent += 3;
  71.         column = indent;
  72.         CardRecord rec(&item->data);
  73.         register Card *c = &rec;
  74.         char* tn = TypeName(c->type);
  75.         cout << form(":TYPE %s ",tn); column += 7 + strlen(tn);
  76.         QuoteStringBuffer(buffer,c->author);
  77.         if ((column + 9 + strlen(buffer))> 75) {
  78.             cout << "\n";
  79.             for (int cc = 0; cc < indent; cc++) cout << " ";
  80.             column = indent;
  81.         }
  82.         cout << form(":AUTHOR %s ", buffer);
  83.         column += 9 + strlen(buffer);
  84.         QuoteStringBuffer(buffer,c->title);
  85.         if ((column + 8 + strlen(buffer))> 75) {
  86.             cout << "\n";
  87.             for (int cc = 0; cc < indent; cc++) cout << " ";
  88.             column = indent;
  89.         }
  90.         cout << form(":TITLE %s ", buffer);
  91.         column += 8 + strlen(buffer);
  92.         QuoteStringBuffer(buffer,c->publisher);
  93.         if ((column + 12 + strlen(buffer))> 75) {
  94.             cout << "\n";
  95.             for (int cc = 0; cc < indent; cc++) cout << " ";
  96.             column = indent;
  97.         }
  98.         cout << form(":PUBLISHER %s ", buffer);
  99.         column += 12 + strlen(buffer);
  100.         QuoteStringBuffer(buffer,c->city);
  101.         if ((column + 7 + strlen(buffer))> 75) {
  102.             cout << "\n";
  103.             for (int cc = 0; cc < indent; cc++) cout << " ";
  104.             column = indent;
  105.         }
  106.         cout << form(":CITY %s ", buffer);
  107.         column += 7 + strlen(buffer);
  108.         sprintf(buffer,":VOLUME %d ",c->vol);
  109.         if ((column + strlen(buffer))> 75) {
  110.             cout << "\n";
  111.             for (int cc = 0; cc < indent; cc++) cout << " ";
  112.             column = indent;
  113.         }
  114.         cout << buffer; column += strlen(buffer);
  115.         sprintf(buffer,":YEAR %d ",c->year);
  116.         if ((column + strlen(buffer))> 75) {
  117.             cout << "\n";
  118.             for (int cc = 0; cc < indent; cc++) cout << " ";
  119.             column = indent;
  120.         }
  121.         cout << buffer; column += strlen(buffer);
  122.         if ((column + 12)> 75) {
  123.             cout << "\n";
  124.             for (int cc = 0; cc < indent; cc++) cout << " ";
  125.             column = indent;
  126.         }
  127.         cout << ":DESCRIPTION\n";
  128.         QuoteStringStream(cout,c->description);
  129.         cout << ")\n";
  130.     }
  131. }
  132.  
  133. void PrintListRecord(CoreItem* item,int level)
  134. {
  135.     int indent = 0;
  136.     int column = 0;
  137.     QuoteStringBuffer(buffer,item->key);
  138.     cout << buffer << " ";
  139.     indent += strlen(buffer) + 1;
  140.     if (item->data.size <= 0) {
  141.         cout << "#()\n";
  142.     } else {
  143.         cout << "#("; indent += 2;
  144.         column = indent;
  145.         ListRecord rec(&item->data);
  146.         int numitems = rec.ElementCount();
  147.         for (int i = 0;i < numitems; i++) {
  148.             QuoteStringBuffer(buffer,rec[i]);
  149.             if ((column + 2 + strlen(buffer))> 75) {
  150.                 cout << "\n";
  151.                 for (int c = 0; c < indent;c++)
  152.                     cout << " ";
  153.                 column = indent;
  154.             }
  155.             cout << buffer; column += strlen(buffer);
  156.             if ((i+1) < numitems) {
  157.                 cout << ", "; column += 2;
  158.             }
  159.         }
  160.         cout << ")\n";
  161.     }
  162. }
  163.  
  164. static void ErrorHandler(ErrKind err,char* msg)
  165. {
  166.     if (err == sysErr) {
  167.         int error = errno;
  168.         cerr << form("Error: System:%d %s %s\n",error,strerror(error),
  169.                 msg);
  170.     } else {
  171.         cerr << form("Error: %s %s\n",
  172.             (err == termErr ? "Terminal" : "Memory"),
  173.             msg);
  174.     }
  175. }
  176.     
  177. static int ikeys;
  178. void CountRecord(CoreItem* item,int level)
  179. {
  180.     ikeys++;
  181. }
  182.  
  183. int main(int argc,char **argv)
  184. {
  185.     Libr2Ascii args(argc,argv);
  186.     vBTree vtree(args.infile,(OpenMode)(ReadOnly));
  187.     if (vtree.OpenStat() == failure) {
  188.         int error = errno;
  189.         cerr << "Could not open " << args.infile
  190.              << ": " << strerror(error) << "\n";
  191.         exit(error);
  192.     }
  193.     vtree.ErrorFun() = ErrorHandler;
  194.     
  195.     cout << vtree.CountPages() << "\n";
  196.     ikeys = 0;
  197.     vtree.TraverseId(CountRecord);
  198.     cout << ikeys << "\n";
  199.     vtree.TraverseId(PrintCardRecord);
  200.     ikeys = 0;
  201.     vtree.TraverseTitle(CountRecord);
  202.     cout << ikeys << "\n";
  203.     vtree.TraverseTitle(PrintListRecord);
  204.     ikeys = 0;
  205.     vtree.TraverseAuthor(CountRecord);
  206.     cout << ikeys << "\n";
  207.     vtree.TraverseAuthor(PrintListRecord);
  208.     ikeys = 0;
  209.     vtree.TraverseSubj(CountRecord);
  210.     cout << ikeys << "\n";
  211.     vtree.TraverseSubj(PrintListRecord);
  212. }
  213.  
  214.     
  215.  
  216.