ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Iffy/Iffy.cpp
(Generate patch)

Comparing Iffy/Iffy.cpp (file contents):
Revision 275 by Douglas Thrift, 2004-11-10T18:03:21-08:00 vs.
Revision 281 by Douglas Thrift, 2004-11-14T14:41:47-08:00

# Line 4 | Line 4
4   //
5   // $Id$
6  
7 < #include "Iffy.hpp"
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(false);
91 +        ext::Stack<ext::String> opens;
92 +
93 +        while (read(in, segment, (text = !text))) if (text)
94 +        {
95 +                fout << segment;
96 +        }
97 +        else
98 +        {
99 +                Matcher matcher;
100 +
101 +                if (segment == matcher("^!--( \\(\\d{1,2}:\\d{2}:\\d{2} [AP]M\\))--$"))
102 +                {
103 +                        fout << matcher[1];
104 +
105 +                        continue;
106 +                }
107 +
108 +                Tag tag(segment);
109 +
110 +                if (tag == "br") tag = STANDALONE;
111 +
112 +                switch (tag)
113 +                {
114 +                case OPEN:
115 +                        opens.Push(tag);
116 +
117 +                        break;
118 +                case CLOSE:
119 +                        if (tag != opens.Top()) tag = opens.Top();
120 +
121 +                        opens.Pop();
122 +
123 +                        break;
124 +                default:
125 +                        break;
126 +                }
127 +
128 +                fout << tag;
129 +        }
130 +
131 +        fout << "</html>\n";
132 + }
133 +
134 + bool Iffy::read(ios::Reader& in, ext::String& segment, bool text)
135 + {
136 +        segment.Clear();
137 +
138 +        byte_t atom;
139 +
140 +        while (in.Get(atom))
141 +        {
142 +                if (atom == (text ? '<' : '>')) return true;
143 +
144 +                segment.InsertLast(atom);
145 +        }
146 +
147 +        return !segment.IsEmpty();
148 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines