LispBM
lbm_channel.h
Go to the documentation of this file.
1 /*
2  Copyright 2022 Joel Svensson svenssonjoel@yahoo.se
3 
4  This program is free software: you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation, either version 3 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
19 #ifndef LBM_CHANNEL_H_
20 #define LBM_CHANNEL_H_
21 
22 #include <stdint.h>
23 #include <stdbool.h>
24 #include <platform_mutex.h>
25 #include <lbm_types.h>
26 
27 #define TOKENIZER_BUFFER_SIZE 257
28 
29 #define CHANNEL_SUCCESS 1
30 #define CHANNEL_MORE 2
31 #define CHANNEL_END 3
32 #define CHANNEL_FULL 4
33 
34 #define CHANNEL_READER_CLOSED 1000
35 
38 typedef struct {
39  char buffer[TOKENIZER_BUFFER_SIZE];
40  unsigned int write_pos;
41  unsigned int read_pos;
42  bool more;
43  bool comment;
45  lbm_mutex_t lock;
47  // statistics
48  unsigned int row;
49  unsigned int column;
51 
55 typedef struct {
56  char *str;
57  unsigned int length;
58  unsigned int read_pos;
59  unsigned int write_pos;
60  bool more;
61  bool comment;
63  unsigned int row;
64  unsigned int column;
66 
69 typedef struct lbm_char_channel_s {
70 
72  void *state;
73  bool (*more)(struct lbm_char_channel_s *chan);
74  int (*peek)(struct lbm_char_channel_s *chan, unsigned int n, char *res);
75  bool (*read)(struct lbm_char_channel_s *chan, char *res);
76  bool (*drop)(struct lbm_char_channel_s *chan, unsigned int n);
77  bool (*comment)(struct lbm_char_channel_s *chan);
78  void (*set_comment)(struct lbm_char_channel_s *chan, bool comment);
79  void (*reader_close)(struct lbm_char_channel_s *chan);
80 
81  /* Either side */
82  bool (*channel_is_empty)(struct lbm_char_channel_s *chan);
83  bool (*channel_is_full)(struct lbm_char_channel_s *chan);
84  bool (*reader_is_closed)(struct lbm_char_channel_s *chan);
85 
86  /* Write side */
87  int (*write)(struct lbm_char_channel_s *chan, char c);
88  void (*writer_close)(struct lbm_char_channel_s *chan);
89 
90  /* Statistics */
91  unsigned int (*row)(struct lbm_char_channel_s *chan);
92  unsigned int (*column)(struct lbm_char_channel_s *chan);
93 
94  bool (*may_block)(struct lbm_char_channel_s *chan);
95 
97 
98 
99 /* Read side */
107 
117 int lbm_channel_peek(lbm_char_channel_t *chan, unsigned int n, char *res);
118 
124 bool lbm_channel_read(lbm_char_channel_t *chan, char *res);
125 
131 bool lbm_channel_drop(lbm_char_channel_t *chan, unsigned int n);
132 
138 
144 
149 
155 
156 /* Either side */
157 
163 
169 
170 /* Write side */
171 
180 int lbm_channel_write(lbm_char_channel_t *chan, char c);
181 
186 
187 /* Statistics */
188 
193 unsigned int lbm_channel_row(lbm_char_channel_t *chan);
194 
198 unsigned int lbm_channel_column(lbm_char_channel_t *chan);
199 
204 
205 /* Interface */
213  lbm_char_channel_t *chan,
214  char *str);
215 
217  lbm_char_channel_t *chan,
218  char *str,
219  unsigned int size);
220 
221 
227  lbm_char_channel_t *chan);
228 
236 
237 #endif
bool lbm_channel_comment(lbm_char_channel_t *chan)
Definition: lbm_channel.c:41
void lbm_create_string_char_channel(lbm_string_channel_state_t *st, lbm_char_channel_t *chan, char *str)
Definition: lbm_channel.c:381
void lbm_channel_reader_close(lbm_char_channel_t *chan)
Definition: lbm_channel.c:65
bool lbm_channel_reader_is_closed(lbm_char_channel_t *chan)
Definition: lbm_channel.c:69
unsigned int lbm_channel_column(lbm_char_channel_t *chan)
Definition: lbm_channel.c:77
struct lbm_char_channel_s lbm_char_channel_t
void lbm_char_channel_set_dependency(lbm_char_channel_t *chan, lbm_value dep)
Definition: lbm_channel.c:445
void lbm_create_string_char_channel_size(lbm_string_channel_state_t *st, lbm_char_channel_t *chan, char *str, unsigned int size)
Definition: lbm_channel.c:413
#define TOKENIZER_BUFFER_SIZE
Definition: lbm_channel.h:27
int lbm_channel_write(lbm_char_channel_t *chan, char c)
Definition: lbm_channel.c:57
bool lbm_channel_is_full(lbm_char_channel_t *chan)
Definition: lbm_channel.c:53
bool lbm_channel_read(lbm_char_channel_t *chan, char *res)
Definition: lbm_channel.c:33
bool lbm_channel_more(lbm_char_channel_t *chan)
Definition: lbm_channel.c:25
bool lbm_channel_is_empty(lbm_char_channel_t *chan)
Definition: lbm_channel.c:49
void lbm_channel_set_comment(lbm_char_channel_t *chan, bool comment)
Definition: lbm_channel.c:45
void lbm_create_buffered_char_channel(lbm_buffered_channel_state_t *st, lbm_char_channel_t *chan)
Definition: lbm_channel.c:222
bool lbm_channel_may_block(lbm_char_channel_t *chan)
Definition: lbm_channel.c:81
bool lbm_channel_drop(lbm_char_channel_t *chan, unsigned int n)
Definition: lbm_channel.c:37
int lbm_channel_peek(lbm_char_channel_t *chan, unsigned int n, char *res)
Definition: lbm_channel.c:29
unsigned int lbm_channel_row(lbm_char_channel_t *chan)
Definition: lbm_channel.c:73
void lbm_channel_writer_close(lbm_char_channel_t *chan)
Definition: lbm_channel.c:61
uint32_t lbm_value
Definition: lbm_types.h:44
Definition: lbm_channel.h:38
bool more
Definition: lbm_channel.h:42
unsigned int column
Definition: lbm_channel.h:49
bool mutex_initialized
Definition: lbm_channel.h:46
bool reader_closed
Definition: lbm_channel.h:44
unsigned int row
Definition: lbm_channel.h:48
bool comment
Definition: lbm_channel.h:43
lbm_mutex_t lock
Definition: lbm_channel.h:45
unsigned int write_pos
Definition: lbm_channel.h:40
unsigned int read_pos
Definition: lbm_channel.h:41
Definition: lbm_channel.h:69
void * state
Definition: lbm_channel.h:72
int(* write)(struct lbm_char_channel_s *chan, char c)
Definition: lbm_channel.h:87
lbm_value dependency
Definition: lbm_channel.h:71
bool(* channel_is_full)(struct lbm_char_channel_s *chan)
Definition: lbm_channel.h:83
bool(* more)(struct lbm_char_channel_s *chan)
Definition: lbm_channel.h:73
void(* reader_close)(struct lbm_char_channel_s *chan)
Definition: lbm_channel.h:79
unsigned int(* row)(struct lbm_char_channel_s *chan)
Definition: lbm_channel.h:91
int(* peek)(struct lbm_char_channel_s *chan, unsigned int n, char *res)
Definition: lbm_channel.h:74
bool(* may_block)(struct lbm_char_channel_s *chan)
Definition: lbm_channel.h:94
bool(* comment)(struct lbm_char_channel_s *chan)
Definition: lbm_channel.h:77
bool(* channel_is_empty)(struct lbm_char_channel_s *chan)
Definition: lbm_channel.h:82
bool(* reader_is_closed)(struct lbm_char_channel_s *chan)
Definition: lbm_channel.h:84
unsigned int(* column)(struct lbm_char_channel_s *chan)
Definition: lbm_channel.h:92
bool(* drop)(struct lbm_char_channel_s *chan, unsigned int n)
Definition: lbm_channel.h:76
void(* writer_close)(struct lbm_char_channel_s *chan)
Definition: lbm_channel.h:88
bool(* read)(struct lbm_char_channel_s *chan, char *res)
Definition: lbm_channel.h:75
void(* set_comment)(struct lbm_char_channel_s *chan, bool comment)
Definition: lbm_channel.h:78
Definition: lbm_channel.h:55
unsigned int read_pos
Definition: lbm_channel.h:58
bool reader_closed
Definition: lbm_channel.h:62
unsigned int column
Definition: lbm_channel.h:64
char * str
Definition: lbm_channel.h:56
unsigned int row
Definition: lbm_channel.h:63
unsigned int write_pos
Definition: lbm_channel.h:59
bool comment
Definition: lbm_channel.h:61
bool more
Definition: lbm_channel.h:60
unsigned int length
Definition: lbm_channel.h:57