ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Iffy/Iffy.cpp
Revision: 288
Committed: 2004-12-09T22:47:17-08:00 (20 years, 6 months ago) by douglas
File size: 2072 byte(s)
Log Message:
Hrm, not getting anywhere yet, but sort of figuring out what's wrong.

File Contents

# Content
1 // Iffy
2 //
3 // Douglas Thrift
4 //
5 // $Id$
6
7 #include "Cleaner.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 ext::String segment;
86 bool text(false);
87 Cleaner cleaner;
88
89 while (read(in, segment, (text = !text))) if (text)
90 {
91 cleaner.insert(segment);
92 }
93 else
94 {
95 Matcher matcher;
96
97 if (segment == matcher("^!--( \\(\\d{1,2}:\\d{2}:\\d{2} [AP]M\\))--$"))
98 {
99 cleaner.insert(matcher[1]);
100
101 continue;
102 }
103
104 Tag tag(segment);
105
106 if (tag == "br") tag = STANDALONE;
107
108 cleaner.insert(tag);
109 }
110
111 cleaner.clean();
112
113 ios::FormatWriter fout(out);
114
115 fout << cleaner;
116 }
117
118 bool Iffy::read(ios::Reader& in, ext::String& segment, bool text)
119 {
120 segment.Clear();
121
122 utf8_t atom;
123
124 while (in.Get(atom))
125 {
126 if (atom == (text ? '<' : '>')) return true;
127
128 segment.InsertLast(atom);
129 }
130
131 return !segment.IsEmpty();
132 }

Properties

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