OSDN Git Service

implement lexer for 2ch bbs common data format.
[bbk/bchan.git] / src / psvlexer.c
1 /*
2  * psvlexer.c
3  *
4  * Copyright (c) 2011 project bchan
5  *
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.
9  *
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:
13  *
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.
18  *
19  * 2. Altered source versions must be plainly marked as such, and must not be
20  *    misrepresented as being the original software.
21  *
22  * 3. This notice may not be removed or altered from any source
23  *    distribution.
24  *
25  */
26
27 #include    "psvlexer.h"
28
29 #include        <basic.h>
30 #include        <bstdio.h>
31 #include        <bstring.h>
32
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)
36 #else
37 # define DP(arg) /**/
38 # define DP_ER(msg, err) /**/
39 #endif
40
41 /* Parenthesis-Separeted Values */
42
43 EXPORT VOID psvlexer_inputchar(psvlexer_t *lexer, UB *ch, W ch_len, psvlexer_result_t **result, W *result_len)
44 {
45         switch (lexer->state) {
46         case PSVLEXER_STATE_READ_VALUE:
47                 if ((ch[0] == '<')&&(ch_len == 1)) {
48                         lexer->state = PSVLEXER_STATE_LSTN;
49                         *result = NULL;
50                         *result_len = 0;
51                 } else if ((ch[0] == '\n')&&(ch_len == 1)) {
52                         lexer->buffer[0].type = PSVLEXER_RESULT_FIELDEND;
53                         *result = lexer->buffer;
54                         *result_len = 1;
55                 } else {
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;
60                         *result_len = 1;
61                 }
62                 break;
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;
68                         *result_len = 1;
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;
76                         *result_len = 2;
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;
82                         *result_len = 1;
83                 } else {
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;
92                         *result_len = 2;
93                 }
94                 break;
95         }
96 }
97
98 EXPORT VOID psvlexer_endinput(psvlexer_t *lexer, psvlexer_result_t **result, W *result_len)
99 {
100         switch (lexer->state) {
101         case PSVLEXER_STATE_READ_VALUE:
102                 lexer->buffer[0].type = PSVLEXER_RESULT_FIELDEND;
103                 *result = lexer->buffer;
104                 *result_len = 1;
105                 break;
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;
113                 *result_len = 2;
114                 break;
115         }
116 }
117
118 EXPORT W psvlexer_initialize(psvlexer_t *lexer)
119 {
120         lexer->state = PSVLEXER_STATE_READ_VALUE;
121         return 0;
122 }
123
124 EXPORT VOID psvlexer_finalize(psvlexer_t *lexer)
125 {
126 }