Merge pull request #819 from brendanzagaeski/patch-1
[mono.git] / mcs / class / System.Net.Http / System.Net.Http.Headers / CollectionParser.cs
1 //
2 // CollectionParser.cs
3 //
4 // Authors:
5 //      Marek Safar  <marek.safar@gmail.com>
6 //
7 // Copyright (C) 2014 Xamarin Inc (http://www.xamarin.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 using System.Collections.Generic;
30
31 namespace System.Net.Http.Headers
32 {
33         delegate bool ElementTryParser<T> (Lexer lexer, out T parsedValue, out Token token);
34
35         static class CollectionParser
36         {
37                 public static bool TryParse<T> (string input, int minimalCount, ElementTryParser<T> parser, out List<T> result) where T : class
38                 {
39                         var lexer = new Lexer (input);
40                         result = new List<T> ();
41
42                         while (true) {
43                                 Token token;
44                                 T parsedValue;
45                                 if (!parser (lexer, out parsedValue, out token))
46                                         return false;
47
48                                 if (parsedValue != null)
49                                         result.Add (parsedValue);
50
51                                 if (token == Token.Type.SeparatorComma)
52                                         continue;
53
54                                 if (token == Token.Type.End) {
55                                         if (minimalCount > result.Count) {
56                                                 result = null;
57                                                 return false;
58                                         }
59                                                 
60                                         return true;
61                                 }
62
63                                 result = null;
64                                 return false;
65                         }
66                 }
67
68                 public static bool TryParse (string input, int minimalCount, out List<string> result)
69                 {
70                         return TryParse (input, minimalCount, TryParseStringElement, out result);
71                 }
72
73                 public static bool TryParseRepetition (string input, int minimalCount, out List<string> result)
74                 {
75                         return TryParseRepetition (input, minimalCount, TryParseStringElement, out result);
76                 }
77
78                 static bool TryParseStringElement (Lexer lexer, out string parsedValue, out Token t)
79                 {
80                         t = lexer.Scan ();
81                         if (t == Token.Type.Token) {
82                                 parsedValue = lexer.GetStringValue (t);
83                                 if (parsedValue.Length == 0)
84                                         parsedValue = null;
85
86                                 t = lexer.Scan ();
87                         } else {
88                                 parsedValue = null;
89                         }
90
91                         return true;
92                 }
93
94                 public static bool TryParseRepetition<T> (string input, int minimalCount, ElementTryParser<T> parser, out List<T> result) where T : class
95                 {
96                         var lexer = new Lexer (input);
97                         result = new List<T> ();
98
99                         while (true) {
100                                 Token token;
101                                 T parsedValue;
102                                 if (!parser (lexer, out parsedValue, out token))
103                                         return false;
104
105                                 if (parsedValue != null)
106                                         result.Add (parsedValue);
107
108                                 if (token == Token.Type.End) {
109                                         if (minimalCount > result.Count)
110                                                 return false;
111                                                 
112                                         return true;
113                                 }
114                         }
115                 }
116         }
117 }