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 288 by douglas, 2004-12-09T22:47:17-08:00

# Line 4 | Line 4
4   //
5   // $Id$
6  
7 < #include "Iffy.hpp"
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 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines