ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Iffy/Iffy.cpp
Revision: 277
Committed: 2004-11-13T14:01:11-08:00 (20 years, 7 months ago) by Douglas Thrift
File size: 2106 byte(s)
Log Message:
This might just work.

File Contents

# User Rev Content
1 Douglas Thrift 275 // Iffy
2     //
3     // Douglas Thrift
4     //
5     // $Id$
6    
7 Douglas Thrift 276 #include "Tag.hpp"
8     #include "Matcher.hpp"
9 Douglas Thrift 275
10 Douglas Thrift 276 #include <menes-api/exename.hpp>
11     #include <menes-api/files.hpp>
12 Douglas Thrift 275 #include <menes-app/application.hpp>
13 Douglas Thrift 277 #include <menes-ext/stack.hpp>
14 Douglas Thrift 275
15     struct IffyCommand : public app::Application
16     {
17     virtual int Run(const app::ArgumentList& args)
18     {
19 Douglas Thrift 276 Iffy::program = api::GetExecutablePath().GetName();
20    
21     ext::String in("-"), out("-");
22    
23     for (size_t index(0); index < args.GetSize(); ++index)
24     {
25     Matcher matcher;
26    
27     if (args[index] == "-D")
28     {
29     if (!Iffy::debug) Iffy::debug = true;
30     }
31     else if (args[index] == matcher("^-in=(.+)$"))
32     {
33     in = matcher[1];
34     }
35     else if (args[index] == matcher("^-out=(.+)$"))
36     {
37     out = matcher[1];
38     }
39     else
40     {
41     api::Cout << "Usage: " << Iffy::program << " [-in=in] [-out=out] [-D]\n";
42    
43     return 1;
44     }
45     }
46    
47     Iffy(in, out);
48    
49 Douglas Thrift 275 return 0;
50     }
51     } iffy;
52 Douglas Thrift 276
53     Iffy::Iffy(const ext::String& in, const ext::String& out)
54     {
55     if (in == "-" && out == "-")
56     {
57     iffy(api::Cin, api::Cout);
58     }
59     else if (in == "-")
60     {
61     api::FileWriter fout(out);
62    
63     iffy(api::Cin, fout);
64     }
65     else if (out == "-")
66     {
67     api::FileReader fin(in);
68    
69     iffy(fin, api::Cout);
70     }
71     else
72     {
73     api::FileReader fin(in);
74     api::FileWriter fout(out);
75    
76     iffy(fin, fout);
77     }
78     }
79    
80     ext::String Iffy::program;
81     bool Iffy::debug(false);
82    
83     void Iffy::iffy(ios::Reader& in, ios::Writer& out)
84     {
85     ext::String segment;
86     bool text(true);
87     ios::FormatWriter fout(out);
88 Douglas Thrift 277 ext::Stack<ext::String> opens;
89 Douglas Thrift 276
90     while (read(in, segment, text)) if (text)
91     {
92     fout << segment << ios::Flush;
93    
94     text = false;
95     }
96     else
97     {
98     Tag tag(segment);
99    
100     if (tag == "br") tag = STANDALONE;
101    
102 Douglas Thrift 277 switch (tag)
103     {
104     case OPEN:
105     opens.Push(tag);
106 Douglas Thrift 276
107 Douglas Thrift 277 break;
108     case CLOSE:
109     if (tag != opens.Top()) tag = opens.Top();
110    
111     opens.Pop();
112    
113     break;
114     default:
115     break;
116     }
117    
118 Douglas Thrift 276 fout << tag << ios::Flush;
119    
120     text = true;
121     }
122     }
123    
124     bool Iffy::read(ios::Reader& in, ext::String& segment, bool text)
125     {
126     segment.Clear();
127    
128     byte_t atom;
129    
130     while (in.Get(atom))
131     {
132     if (atom == (text ? '<' : '>')) return true;
133    
134     segment.InsertLast(atom);
135     }
136    
137     return !segment.IsEmpty();
138     }

Properties

Name Value
svn:eol-style native
svn:keywords Id