4 * Copyright (c) 2011 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
33 #ifdef BCHAN_CONFIG_DEBUG
34 # define DP(arg) printf arg
35 # define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
38 # define DP_ER(msg, err) /**/
41 /* Parenthesis-Separeted Values */
43 EXPORT VOID psvlexer_inputchar(psvlexer_t *lexer, UB *ch, W ch_len, psvlexer_result_t **result, W *result_len)
45 switch (lexer->state) {
46 case PSVLEXER_STATE_READ_VALUE:
47 if ((ch[0] == '<')&&(ch_len == 1)) {
48 lexer->state = PSVLEXER_STATE_LSTN;
51 } else if ((ch[0] == '\n')&&(ch_len == 1)) {
52 lexer->buffer[0].type = PSVLEXER_RESULT_FIELDEND;
53 *result = lexer->buffer;
56 lexer->buffer[0].type = PSVLEXER_RESULT_VALUE;
57 memcpy(lexer->buffer[0].str, ch, ch_len);
58 lexer->buffer[0].len = ch_len;
59 *result = lexer->buffer;
63 case PSVLEXER_STATE_LSTN:
64 if ((ch[0] == '>')&&(ch_len == 1)) {
65 lexer->state = PSVLEXER_STATE_READ_VALUE;
66 lexer->buffer[0].type = PSVLEXER_RESULT_SEPARATION;
67 *result = lexer->buffer;
69 } else if ((ch[0] == '\n')&&(ch_len == 1)) {
70 lexer->state = PSVLEXER_STATE_READ_VALUE;
71 lexer->buffer[0].type = PSVLEXER_RESULT_VALUE;
72 lexer->buffer[0].str[0] = '<';
73 lexer->buffer[0].len = 1;
74 lexer->buffer[1].type = PSVLEXER_RESULT_FIELDEND;
75 *result = lexer->buffer;
77 } else if ((ch[0] == '<')&&(ch_len == 1)) {
78 lexer->buffer[0].type = PSVLEXER_RESULT_VALUE;
79 lexer->buffer[0].str[0] = '<';
80 lexer->buffer[0].len = 1;
81 *result = lexer->buffer;
84 lexer->state = PSVLEXER_STATE_READ_VALUE;
85 lexer->buffer[0].type = PSVLEXER_RESULT_VALUE;
86 lexer->buffer[0].str[0] = '<';
87 lexer->buffer[0].len = 1;
88 lexer->buffer[1].type = PSVLEXER_RESULT_VALUE;
89 memcpy(lexer->buffer[1].str, ch, ch_len);
90 lexer->buffer[1].len = ch_len;
91 *result = lexer->buffer;
98 EXPORT VOID psvlexer_endinput(psvlexer_t *lexer, psvlexer_result_t **result, W *result_len)
100 switch (lexer->state) {
101 case PSVLEXER_STATE_READ_VALUE:
102 lexer->buffer[0].type = PSVLEXER_RESULT_FIELDEND;
103 *result = lexer->buffer;
106 case PSVLEXER_STATE_LSTN:
107 lexer->state = PSVLEXER_STATE_READ_VALUE;
108 lexer->buffer[0].type = PSVLEXER_RESULT_VALUE;
109 lexer->buffer[0].str[0] = '<';
110 lexer->buffer[0].len = 1;
111 lexer->buffer[1].type = PSVLEXER_RESULT_FIELDEND;
112 *result = lexer->buffer;
118 EXPORT W psvlexer_initialize(psvlexer_t *lexer)
120 lexer->state = PSVLEXER_STATE_READ_VALUE;
124 EXPORT VOID psvlexer_finalize(psvlexer_t *lexer)