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 295 by douglas, 2004-12-11T01:01:55-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 +        _H<ios::Reader> rin;
56 +        _H<ios::Writer> rout;
57 +
58 +        if (in == "-") rin = &api::Cin; else rin = new api::FileReader(in);
59 +        if (out == "-") rout = &api::Cout; else rout = new api::FileWriter(out);
60 +
61 +        iffy(*rin, *rout);
62 + }
63 +
64 + ext::String Iffy::program;
65 + bool Iffy::debug(false);
66 +
67 + void Iffy::iffy(ios::Reader& in, ios::Writer& out)
68 + {
69 +        ext::Buffer segment;
70 +        bool text(false);
71 +        Cleaner cleaner;
72 +
73 +        while (read(in, segment, (text = !text))) if (text)
74 +        {
75 +                if (!segment.IsEmpty()) cleaner.insert(segment);
76 +        }
77 +        else
78 +        {
79 +                Matcher matcher;
80 +
81 +                if (segment == matcher("^!--( \\(\\d{1,2}:\\d{2}:\\d{2} [AP]M\\))--$"))
82 +                {
83 +                        cleaner.insert(matcher[1]);
84 +
85 +                        continue;
86 +                }
87 +
88 +                Tag tag(segment);
89 +
90 +                if (tag == "br") tag = STANDALONE;
91 +
92 +                cleaner.insert(tag);
93 +        }
94 +
95 +        cleaner.clean();
96 +
97 +        ios::FormatWriter fout(out);
98 +
99 +        fout << cleaner << ios::NewLine;
100 + }
101 +
102 + bool Iffy::read(ios::Reader& in, ext::Buffer& segment, bool text)
103 + {
104 +        segment.Clear();
105 +
106 +        byte_t atom;
107 +
108 +        while (in.Get(atom))
109 +        {
110 +                if (atom == (text ? '<' : '>')) return true;
111 +
112 +                segment.InsertLast(atom);
113 +        }
114 +
115 +        return !segment.IsEmpty();
116 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines