[NUI] Rollback split-nui (#887)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / XamlBinding / StyleSheets / CssReader.cs
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4
5 namespace Tizen.NUI.StyleSheets
6 {
7     internal sealed class CssReader : TextReader
8     {
9         readonly TextReader _reader;
10
11         public CssReader(TextReader reader)
12         {
13             if (reader == null)
14                 throw new ArgumentNullException(nameof(reader));
15
16             _reader = reader;
17         }
18
19         readonly Queue<char> _cache = new Queue<char>();
20
21         //skip comments
22         //TODO unescape escaped sequences
23         public override int Peek()
24         {
25             if (_cache.Count > 0)
26                 return _cache.Peek();
27
28             int p = _reader.Peek();
29             if (p <= 0)
30                 return p;
31             if (unchecked((char)p) != '/')
32                 return p;
33
34             _cache.Enqueue(unchecked((char)_reader.Read()));
35             p = _reader.Peek();
36             if (p <= 0)
37                 return _cache.Peek();
38             if (unchecked((char)p) != '*')
39                 return _cache.Peek();
40
41             _cache.Clear();
42             _reader.Read(); //consume the '*'
43
44             bool hasStar = false;
45             while (true) {
46                 var next = _reader.Read();
47                 if (next <= 0)
48                     return next;
49                 if (unchecked((char)next) == '*')
50                     hasStar = true;
51                 else if (hasStar && unchecked((char)next) == '/')
52                     return Peek(); //recursively call self for comments following comments
53                 else
54                     hasStar = false;
55             }
56         }
57
58         //skip comments
59         //TODO unescape escaped sequences
60         public override int Read()
61         {
62             if (_cache.Count > 0)
63                 return _cache.Dequeue();
64
65             int p = _reader.Read();
66             if (p <= 0)
67                 return p;
68             var c = unchecked((char)p);
69             if (c != '/')
70                 return p;
71
72             _cache.Enqueue(c);
73             p = _reader.Read();
74             if (p <= 0)
75                 return _cache.Dequeue();
76             c = unchecked((char)p);
77             if (c != '*')
78                 return _cache.Dequeue();
79
80             _cache.Clear();
81             _reader.Read(); //consume the '*'
82
83             bool hasStar = false;
84             while (true) {
85                 var next = _reader.Read();
86                 if (next <= 0)
87                     return next;
88                 if (unchecked((char)next) == '*')
89                     hasStar = true;
90                 else if (hasStar && unchecked((char)next) == '/')
91                     return Read(); //recursively call self for comments following comments
92                 else
93                     hasStar = false;
94             }
95         }
96     }
97 }