Follow formatting NUI
[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             {
47                 var next = _reader.Read();
48                 if (next <= 0)
49                     return next;
50                 if (unchecked((char)next) == '*')
51                     hasStar = true;
52                 else if (hasStar && unchecked((char)next) == '/')
53                     return Peek(); //recursively call self for comments following comments
54                 else
55                     hasStar = false;
56             }
57         }
58
59         //skip comments
60         //TODO unescape escaped sequences
61         public override int Read()
62         {
63             if (_cache.Count > 0)
64                 return _cache.Dequeue();
65
66             int p = _reader.Read();
67             if (p <= 0)
68                 return p;
69             var c = unchecked((char)p);
70             if (c != '/')
71                 return p;
72
73             _cache.Enqueue(c);
74             p = _reader.Read();
75             if (p <= 0)
76                 return _cache.Dequeue();
77             c = unchecked((char)p);
78             if (c != '*')
79                 return _cache.Dequeue();
80
81             _cache.Clear();
82             _reader.Read(); //consume the '*'
83
84             bool hasStar = false;
85             while (true)
86             {
87                 var next = _reader.Read();
88                 if (next <= 0)
89                     return next;
90                 if (unchecked((char)next) == '*')
91                     hasStar = true;
92                 else if (hasStar && unchecked((char)next) == '/')
93                     return Read(); //recursively call self for comments following comments
94                 else
95                     hasStar = false;
96             }
97         }
98     }
99 }