ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Iffy/Iffy.cpp
Revision: 279
Committed: 2004-11-13T16:14:50-08:00 (20 years, 7 months ago) by Douglas Thrift
File size: 2122 byte(s)
Log Message:
Yeah, it's really iffy, but I don't care!

File Contents

# Content
1 // Iffy
2 //
3 // Douglas Thrift
4 //
5 // $Id$
6
7 #include "Tag.hpp"
8 #include "Matcher.hpp"
9
10 #include <menes-api/exename.hpp>
11 #include <menes-api/files.hpp>
12 #include <menes-app/application.hpp>
13 #include <menes-ext/stack.hpp>
14
15 struct IffyCommand : public app::Application
16 {
17 virtual int Run(const app::ArgumentList& args)
18 {
19 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 return 0;
50 }
51 } iffy;
52
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 ios::FormatWriter fout(out);
86
87 fout << "<html>";
88
89 ext::String segment;
90 bool text(true);
91 ext::Stack<ext::String> opens;
92
93 while (read(in, segment, text)) if (text)
94 {
95 fout << segment;
96
97 text = false;
98 }
99 else
100 {
101 Tag tag(segment);
102
103 if (tag == "br") tag = STANDALONE;
104
105 switch (tag)
106 {
107 case OPEN:
108 opens.Push(tag);
109
110 break;
111 case CLOSE:
112 if (tag != opens.Top()) tag = opens.Top();
113
114 opens.Pop();
115
116 break;
117 default:
118 break;
119 }
120
121 fout << tag;
122
123 text = true;
124 }
125
126 fout << "</html>\n";
127 }
128
129 bool Iffy::read(ios::Reader& in, ext::String& segment, bool text)
130 {
131 segment.Clear();
132
133 byte_t atom;
134
135 while (in.Get(atom))
136 {
137 if (atom == (text ? '<' : '>')) return true;
138
139 segment.InsertLast(atom);
140 }
141
142 return !segment.IsEmpty();
143 }

Properties

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