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 279 by Douglas Thrift, 2004-11-13T16:14:50-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(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 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines