4 * Copyright (c) 2012 project bchan
6 * This software is provided 'as-is', without any express or implied
7 * warranty. In no event will the authors be held liable for any damages
8 * arising from the use of this software.
10 * Permission is granted to anyone to use this software for any purpose,
11 * including commercial applications, and to alter it and redistribute it
12 * freely, subject to the following restrictions:
14 * 1. The origin of this software must not be misrepresented; you must not
15 * claim that you wrote the original software. If you use this software
16 * in a product, an acknowledgment in the product documentation would be
17 * appreciated but is not required.
19 * 2. Altered source versions must be plainly marked as such, and must not be
20 * misrepresented as being the original software.
22 * 3. This notice may not be removed or altered from any source
27 #include "tadlexer_le.h"
32 #define TADLEXER_LE_FLAG_FIXED_SEGMENT 0x00000001
33 #define TADLEXER_LE_FLAG_VARIABLE_SEGMENT 0x00000002
34 #define TADLEXER_LE_FLAG_SEGMENTID_DETERMINE 0x00000004
35 #define TADLEXER_LE_FLAG_LENGTH_DETERMINE 0x00000008
36 #define TADLEXER_LE_FLAG_READING_DATA 0x00000010
38 EXPORT Bool tadlexer_le_result_is_fixedsegment(tadlexer_le_result *result)
40 return ((result->flag & TADLEXER_LE_FLAG_FIXED_SEGMENT) != 0) ? True : False;
43 EXPORT Bool tadlexer_le_result_is_variablesegment(tadlexer_le_result *result)
45 return ((result->flag & TADLEXER_LE_FLAG_VARIABLE_SEGMENT) != 0) ? True : False;
48 EXPORT Bool tadlexer_le_result_is_segmentid_determined(tadlexer_le_result *result)
50 return ((result->flag & TADLEXER_LE_FLAG_SEGMENTID_DETERMINE) != 0) ? True : False;
53 EXPORT Bool tadlexer_le_result_is_lengthdetermined(tadlexer_le_result *result)
55 return ((result->flag & TADLEXER_LE_FLAG_LENGTH_DETERMINE) != 0) ? True : False;
58 EXPORT Bool tadlexer_le_result_is_readingdata(tadlexer_le_result *result)
60 return ((result->flag & TADLEXER_LE_FLAG_READING_DATA) != 0) ? True : False;
63 EXPORT VOID tadlexer_le_inputbyte(tadlexer_le_t *lexer, UB b, tadlexer_le_result **result, W *result_len)
65 *result = &lexer->buf;
68 switch (lexer->state) {
69 case HTTP_TADLEXER_LE_STATE_START:
71 lexer->state = HTTP_TADLEXER_LE_STATE_FIRST_BYTE;
72 lexer->buf.type = TADLEXER_LE_RESULTTYPE_READING_SEGMENT;
75 case HTTP_TADLEXER_LE_STATE_FIRST_BYTE:
76 if ((b == 0xFF)&&(((lexer->segid) & 0x80) == 0x80)) {
77 lexer->state = HTTP_TADLEXER_LE_STATE_SEGLEN_FIRST;
78 lexer->buf.type = TADLEXER_LE_RESULTTYPE_READING_SEGMENT;
79 lexer->buf.flag = TADLEXER_LE_FLAG_VARIABLE_SEGMENT | TADLEXER_LE_FLAG_SEGMENTID_DETERMINE;
80 lexer->buf.val.seg.id = lexer->segid;
82 lexer->state = HTTP_TADLEXER_LE_STATE_START;
83 lexer->buf.type = TADLEXER_LE_RESULTTYPE_SEGMENT_END;
84 lexer->buf.flag = TADLEXER_LE_FLAG_FIXED_SEGMENT;
85 lexer->buf.val.ch = lexer->segid | (b << 8);
88 case HTTP_TADLEXER_LE_STATE_SEGLEN_FIRST:
90 lexer->state = HTTP_TADLEXER_LE_STATE_SEGLEN_SECOND;
91 lexer->buf.type = TADLEXER_LE_RESULTTYPE_READING_SEGMENT;
93 case HTTP_TADLEXER_LE_STATE_SEGLEN_SECOND:
95 if (lexer->len == 0) {
96 lexer->state = HTTP_TADLEXER_LE_STATE_START;
97 lexer->buf.type = TADLEXER_LE_RESULTTYPE_SEGMENT_END;
98 lexer->buf.flag |= TADLEXER_LE_FLAG_LENGTH_DETERMINE;
99 lexer->buf.val.seg.id = lexer->segid;
100 lexer->buf.val.seg.len = 0;
101 } else if (lexer->len == 0xFFFF) {
102 lexer->state = HTTP_TADLEXER_LE_STATE_LSEGLEN_FIRST;
103 lexer->buf.type = TADLEXER_LE_RESULTTYPE_READING_SEGMENT;
105 lexer->state = HTTP_TADLEXER_LE_STATE_DATA;
107 lexer->buf.type = TADLEXER_LE_RESULTTYPE_READING_SEGMENT;
108 lexer->buf.flag |= TADLEXER_LE_FLAG_LENGTH_DETERMINE;
109 lexer->buf.val.seg.id = lexer->segid;
110 lexer->buf.val.seg.len = lexer->len;
113 case HTTP_TADLEXER_LE_STATE_LSEGLEN_FIRST:
115 lexer->state = HTTP_TADLEXER_LE_STATE_LSEGLEN_SECOND;
116 lexer->buf.type = TADLEXER_LE_RESULTTYPE_READING_SEGMENT;
118 case HTTP_TADLEXER_LE_STATE_LSEGLEN_SECOND:
119 lexer->len |= b << 8;
120 lexer->state = HTTP_TADLEXER_LE_STATE_LSEGLEN_THIRD;
121 lexer->buf.type = TADLEXER_LE_RESULTTYPE_READING_SEGMENT;
123 case HTTP_TADLEXER_LE_STATE_LSEGLEN_THIRD:
124 lexer->len |= b << 16;
125 lexer->state = HTTP_TADLEXER_LE_STATE_LSEGLEN_FORTH;
126 lexer->buf.type = TADLEXER_LE_RESULTTYPE_READING_SEGMENT;
128 case HTTP_TADLEXER_LE_STATE_LSEGLEN_FORTH:
129 lexer->len |= b << 24;
130 lexer->state = HTTP_TADLEXER_LE_STATE_DATA;
132 lexer->buf.type = TADLEXER_LE_RESULTTYPE_READING_SEGMENT;
133 lexer->buf.flag |= TADLEXER_LE_FLAG_LENGTH_DETERMINE;
134 lexer->buf.val.seg.id = lexer->segid;
135 lexer->buf.val.seg.len = lexer->len;
137 case HTTP_TADLEXER_LE_STATE_DATA:
138 lexer->buf.flag |= TADLEXER_LE_FLAG_READING_DATA;
140 if (lexer->len_read == lexer->len) {
141 lexer->state = HTTP_TADLEXER_LE_STATE_START;
142 lexer->buf.type = TADLEXER_LE_RESULTTYPE_SEGMENT_END;
144 lexer->buf.type = TADLEXER_LE_RESULTTYPE_READING_SEGMENT;
150 EXPORT VOID tadlexer_le_initialize(tadlexer_le_t *lexer)
152 lexer->state = HTTP_TADLEXER_LE_STATE_START;
157 EXPORT VOID tadlexer_le_finalize(tadlexer_le_t *lexer)