Remove dynamic exceptions
[anna.git] / source / http / internal / Tokenizer.cpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #include <ctype.h>
10
11 #include <anna/config/defines.hpp>
12 #include <anna/core/DataBlock.hpp>
13
14 #include <anna/http/internal/Tokenizer.hpp>
15 #include <anna/http/internal/defines.hpp>
16 #include <anna/http/functions.hpp>
17
18 using namespace anna;
19
20 //--------------------------------------------------------------------------------------------
21 // Extrae los datos del bloque de memoria separando por espacios en blancos, tabs, etc, etc
22 //--------------------------------------------------------------------------------------------
23 void http::Tokenizer::apply(const DataBlock& data)
24 noexcept(false) {
25   const char* p = data.getData();
26   const char* maxp = p + data.getSize();
27   bool searchingInit = true;
28   const char* init = NULL;
29   int len = 0;
30   clear();
31
32   while(p < maxp) {
33     if(searchingInit == true) {
34       if(isSpace(*p) == false) {
35         init = p;
36         len = 1;
37         searchingInit = false;
38       }
39     } else {
40       if(isSpace(*p) == true) {
41         createToken(init, len);
42         searchingInit = true;
43       } else
44         len ++;
45     }
46
47     p ++;
48   }
49
50   if(searchingInit == false)
51     createToken(init, len);
52 }
53
54 void http::Tokenizer::apply(const DataBlock& data, const char* separator)
55 noexcept(false) {
56   const char* p = data.getData();
57   int size = data.getSize();
58   const char* maxp = p + size;
59   const int lenSeparator = anna_strlen(separator);
60   int pos;
61   clear();
62
63   while(p < maxp && size > 0) {
64     if((pos = find(p, size, separator)) != -1) {
65       createToken(p, pos);
66       p += (pos + lenSeparator);
67       size -= (pos + lenSeparator);
68     } else {
69       createToken(p, size);
70       p += size;
71       size = 0;
72     }
73   }
74 }
75
76 void http::Tokenizer::apply(const DataBlock& data, const char separator)
77 noexcept(false) {
78   const char* p = data.getData();
79   int size = data.getSize();
80   const char* maxp = p + size;
81   int pos;
82   clear();
83
84   while(p < maxp && size > 0) {
85     if((pos = find(p, size, separator)) != -1) {
86       createToken(p, pos);
87       p += (pos + 1);
88       size -= (pos + 1);
89     } else {
90       createToken(p, size);
91       p += size;
92       size = 0;
93     }
94   }
95 }
96
97 const http::Token* http::Tokenizer::operator [](int index) const
98 {
99   const_iterator ii = begin();
100   const_iterator maxii = end();
101
102   while(index && ii != maxii) {
103     ii ++;
104     index --;
105   }
106
107   return operator[](index);
108 }
109
110 int http::Tokenizer::find(const char* data, const int size, const char searched)
111 {
112   for(int i = 0; i < size; i ++, data ++) {
113     if(*data == searched)
114       return i;
115   }
116
117   return -1;
118 }
119
120 int http::Tokenizer::find(const char* data, const int size, const char* searched)
121 {
122   static const int EndOfLineLen = 2;
123   int result(-1);
124   const char* w(data);
125   int s(size);
126   int pos;
127   const int slen = anna_strlen(searched);
128
129   if(slen == EndOfLineLen) {
130     while((pos = find(w, s, *searched)) != -1) {
131       if((s - pos) < EndOfLineLen)
132         break;
133
134       w += pos;
135
136       if(*w == *searched && *(w + 1) == *(searched + 1)) {
137         result = (w - data);
138         break;
139       }
140
141       w ++;
142       s -= pos;
143     }
144   } else {
145     while((pos = find(w, s, *searched)) != -1) {
146       if((s - pos) < slen)
147         break;
148
149       w += pos;
150
151       if(anna_strncmp(w, searched, slen) == 0) {
152         result = (w - data);
153         break;
154       }
155
156       w ++;
157       s -= pos;
158     }
159   }
160
161   return result;
162 }
163