summaryrefslogtreecommitdiffhomepage
path: root/Parser/Reader.cpp
blob: 2863d01c17dfcedf6528be6adcfabb93aa367ae0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*  Project STARS
    John DiCamillo Software Consulting
    Copyright © 1997-2000. All Rights Reserved.

    SUBSYSTEM:    obelisk
    FILE:         reader.cpp
    AUTHOR:       John DiCamillo


    OVERVIEW
    ========
    Implementation of the Reader class
*/

#include "MemDebug.h"
#include "reader.h"
#include <stdio.h>
#include <fstream>
#include <ctype.h>


void              Print(const char* fmt, ...);

// +-------------------------------------------------------------------+

Text
ConsoleReader::more()
{
   // loop until the user types something
   do {
      printPrimaryPrompt();
      fillInputBuffer();
   } while (! *p);

   return Text(p);
}

void
ConsoleReader::printPrimaryPrompt()
{
   printf("- ");
}

void
ConsoleReader::fillInputBuffer()
{
   fgets(buffer, 980, stdin);
   p = buffer;
   while (isspace(*p)) p++;
}

// +-------------------------------------------------------------------+

FileReader::FileReader(const char* fname)
   : filename(fname), done(0)
{ }

Text
FileReader::more()
{
   if (done) return Text();

   std::fstream fin(filename, std::fstream::in);

   if (!fin) {
      Print("ERROR(Parse): Could not open file '%s'\n", filename);
      return Text();
   }

   Text result;
   char buf[1000], newline;
   
   while (fin.get(buf, 1000)) {
      result.append(buf);
      fin.get(newline);
      result.append(newline);
   }

   done = 1;
   return result;   
}

// +-------------------------------------------------------------------+

BlockReader::BlockReader(const char* block)
   : data((char*) block), done(0), length(0)
{ }

BlockReader::BlockReader(const char* block, int len)
   : data((char*) block), done(0), length(len)
{ }

Text
BlockReader::more()
{
   if (done) return Text();

   if (length) {
      Text result(data, length);
      done = 1;
      return result;   
   }
   else if (data) {
      Text result(data);
      done = 1;
      return result;   
   }

   done = 1;
   return Text();
}