libwebsockets
Lightweight C library for HTML5 websockets
Toggle main menu visibility
Loading...
Searching...
No Matches
lws-hl.h
Go to the documentation of this file.
1
/*
2
* libwebsockets - small server side websockets and web server implementation
3
*
4
* Copyright (C) 2010 - 2026 Andy Green <andy@warmcat.com>
5
*
6
* Permission is hereby granted, free of charge, to any person obtaining a copy
7
* of this software and associated documentation files (the "Software"), to
8
* deal in the Software without restriction, including without limitation the
9
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10
* sell copies of the Software, and to permit persons to whom the Software is
11
* furnished to do so, subject to the following conditions:
12
*
13
* The above copyright notice and this permission notice shall be included in
14
* all copies or substantial portions of the Software.
15
*
16
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22
* IN THE SOFTWARE.
23
*
24
* Streaming syntax highlighting tokenizer
25
*
26
* Hostile-input-hardened, alloc-free, streaming tokenizer for producing
27
* syntax highlighting markup from arbitrary source text. Input is fed in
28
* fragments of any size (including 0 or 1 bytes); classified token pieces
29
* are passed to a caller token sink callback. A second layer provides a
30
* stock token sink that emits strict-CSP-compatible HTML markup (entity-
31
* escaped text wrapped in <span class=...>) through a caller write callback.
32
*
33
* The tokenizer never revises emitted decisions, never backtracks, and holds
34
* O(1) state regardless of input; unterminated constructs at end of input are
35
* closed out with a best-guess classification.
36
*/
37
38
#if !defined(__LWS_HL_H__)
39
#define __LWS_HL_H__
40
41
#if !defined(LHL_SCRATCH_SIZE)
42
#define LHL_SCRATCH_SIZE 40
43
#endif
44
#if !defined(LHL_PIECE_MAX)
45
#define LHL_PIECE_MAX 96
46
#endif
47
49
typedef
enum
{
50
LHL_CLS_PLAIN
,
51
LHL_CLS_IDENT
,
52
LHL_CLS_KEYWORD
,
53
LHL_CLS_TYPE
,
54
LHL_CLS_NUMBER
,
55
LHL_CLS_STRING
,
56
LHL_CLS_CHARLIT
,
57
LHL_CLS_COMMENT
,
58
LHL_CLS_PREPROC
,
59
60
/* diff presentation (lines, including their newline) */
61
62
LHL_CLS_DIFF_ADD
,
63
LHL_CLS_DIFF_REM
,
64
LHL_CLS_DIFF_HUNK
,
65
LHL_CLS_DIFF_META
,
66
67
LHL_CLS_COUNT
68
}
lws_hl_class_t
;
69
70
struct
lws_hl_ctx
;
71
typedef
struct
lws_hl_ctx
lws_hl_ctx_t
;
72
93
typedef
lws_stateful_ret_t
(*
lws_hl_token_cb
)(
void
*
user
,
lws_hl_class_t
cls,
94
const
uint8_t
*
tok
,
size_t
len);
95
96
typedef
struct
lws_hl_ops
{
97
const
char
*
name
;
99
100
int (*
construct
)(
lws_hl_ctx_t
*ctx);
103
104
lws_stateful_ret_t
(*
parse
)(
lws_hl_ctx_t
*ctx,
105
const
uint8_t
**buf,
size_t
*len);
108
109
lws_stateful_ret_t
(*
finish
)(
lws_hl_ctx_t
*ctx);
112
}
lws_hl_ops_t
;
113
121
typedef
struct
lws_hl_ctx
{
122
const
lws_hl_ops_t
*
ops
;
123
lws_hl_token_cb
cb
;
124
void
*
user
;
125
126
/* private below */
127
128
const
uint8_t
*
chunk
;
/* current input chunk base */
129
size_t
pos
;
/* scan cursor (offset in chunk) */
130
size_t
tok
;
/* current token start offset */
131
size_t
epos
;
/* emitted watermark offset */
132
uint8_t
state
;
/* driver private */
133
uint8_t
scratch_pos
;
/* driver private */
134
uint8_t
flags
;
/* driver private */
135
uint8_t
tokcls
;
/* driver private */
136
uint8_t
scratch
[
LHL_SCRATCH_SIZE
];
137
}
lws_hl_ctx_t
;
138
151
LWS_VISIBLE
LWS_EXTERN
int
152
lws_hl_construct
(
lws_hl_ctx_t
*ctx,
const
lws_hl_ops_t
*lang,
153
lws_hl_token_cb
cb,
void
*user);
154
179
LWS_VISIBLE
LWS_EXTERN
lws_stateful_ret_t
180
lws_hl_parse
(
lws_hl_ctx_t
*ctx,
const
uint8_t
**buf,
size_t
*len);
181
198
LWS_VISIBLE
LWS_EXTERN
lws_stateful_ret_t
199
lws_hl_finish
(
lws_hl_ctx_t
*ctx);
200
201
#if defined(LWS_WITH_HL_LANG_C)
209
LWS_VISIBLE
LWS_EXTERN
const
lws_hl_ops_t
*
210
lws_hl_lang_c(
void
);
211
#endif
212
213
#if defined(LWS_WITH_HL_LANG_DIFF)
223
LWS_VISIBLE
LWS_EXTERN
const
lws_hl_ops_t
*
224
lws_hl_lang_diff(
void
);
225
#endif
226
227
#if !defined(LHL_HTML_BUF)
228
#define LHL_HTML_BUF 832
229
#endif
230
231
typedef
lws_stateful_ret_t
(*
lws_hl_write_cb
)(
void
*user,
const
uint8_t
*buf,
232
size_t
len);
233
244
typedef
struct
lws_hl_html
{
245
/* private */
246
lws_hl_write_cb
wc
;
247
void
*
user
;
248
const
char
*
const
*
cls
;
249
lws_hl_class_t
last
;
250
size_t
buflen
;
251
uint8_t
open
;
252
char
buf
[
LHL_HTML_BUF
];
253
}
lws_hl_html_t
;
254
269
LWS_VISIBLE
LWS_EXTERN
int
270
lws_hl_html_construct
(
lws_hl_html_t
*h,
lws_hl_write_cb
wc,
void
*user,
271
const
char
*
const
*cls);
272
288
LWS_VISIBLE
LWS_EXTERN
lws_stateful_ret_t
289
lws_hl_html_token
(
void
*user,
lws_hl_class_t
cls,
const
uint8_t
*tok,
290
size_t
len);
291
301
LWS_VISIBLE
LWS_EXTERN
lws_stateful_ret_t
302
lws_hl_html_close
(
lws_hl_html_t
*h);
303
322
LWS_VISIBLE
LWS_EXTERN
lws_stateful_ret_t
323
lws_html_escape
(
lws_hl_write_cb
wc,
void
*user,
const
uint8_t
*src,
324
size_t
len);
325
#endif
LWS_EXTERN
#define LWS_EXTERN
Definition
libwebsockets.h:327
uint8_t
unsigned char uint8_t
Definition
libwebsockets.h:746
lws_stateful_ret_t
lws_stateful_ret_t
Definition
libwebsockets.h:802
LWS_VISIBLE
#define LWS_VISIBLE
Definition
libwebsockets.h:322
lws_hl_ctx::user
void * user
Definition
lws-hl.h:124
lws_hl_construct
LWS_VISIBLE LWS_EXTERN int lws_hl_construct(lws_hl_ctx_t *ctx, const lws_hl_ops_t *lang, lws_hl_token_cb cb, void *user)
lws_hl_html::wc
lws_hl_write_cb wc
Definition
lws-hl.h:246
lws_hl_ctx::ops
const lws_hl_ops_t * ops
Definition
lws-hl.h:122
lws_hl_html_token
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t lws_hl_html_token(void *user, lws_hl_class_t cls, const uint8_t *tok, size_t len)
lws_hl_ctx::scratch
uint8_t scratch[LHL_SCRATCH_SIZE]
Definition
lws-hl.h:136
lws_hl_ctx::chunk
const uint8_t * chunk
Definition
lws-hl.h:128
lws_hl_ctx::pos
size_t pos
Definition
lws-hl.h:129
LHL_HTML_BUF
#define LHL_HTML_BUF
Definition
lws-hl.h:228
lws_hl_parse
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t lws_hl_parse(lws_hl_ctx_t *ctx, const uint8_t **buf, size_t *len)
lws_hl_html_close
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t lws_hl_html_close(lws_hl_html_t *h)
lws_hl_finish
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t lws_hl_finish(lws_hl_ctx_t *ctx)
lws_hl_html_t
struct lws_hl_html lws_hl_html_t
LHL_SCRATCH_SIZE
#define LHL_SCRATCH_SIZE
Definition
lws-hl.h:42
lws_hl_html::cls
const char *const * cls
Definition
lws-hl.h:248
lws_hl_html::buflen
size_t buflen
Definition
lws-hl.h:250
lws_hl_ctx::state
uint8_t state
Definition
lws-hl.h:132
lws_hl_ctx::epos
size_t epos
Definition
lws-hl.h:131
lws_hl_ctx::tok
size_t tok
Definition
lws-hl.h:130
lws_hl_ctx::cb
lws_hl_token_cb cb
Definition
lws-hl.h:123
lws_hl_html_construct
LWS_VISIBLE LWS_EXTERN int lws_hl_html_construct(lws_hl_html_t *h, lws_hl_write_cb wc, void *user, const char *const *cls)
lws_hl_ctx_t
struct lws_hl_ctx lws_hl_ctx_t
Definition
lws-hl.h:71
lws_hl_html::last
lws_hl_class_t last
Definition
lws-hl.h:249
lws_hl_html::open
uint8_t open
Definition
lws-hl.h:251
lws_hl_html::user
void * user
Definition
lws-hl.h:247
lws_hl_html::buf
char buf[LHL_HTML_BUF]
Definition
lws-hl.h:252
lws_hl_ctx::flags
uint8_t flags
Definition
lws-hl.h:134
lws_hl_class_t
lws_hl_class_t
Definition
lws-hl.h:49
LHL_CLS_PREPROC
@ LHL_CLS_PREPROC
Definition
lws-hl.h:58
LHL_CLS_IDENT
@ LHL_CLS_IDENT
Definition
lws-hl.h:51
LHL_CLS_STRING
@ LHL_CLS_STRING
Definition
lws-hl.h:55
LHL_CLS_PLAIN
@ LHL_CLS_PLAIN
Definition
lws-hl.h:50
LHL_CLS_COMMENT
@ LHL_CLS_COMMENT
Definition
lws-hl.h:57
LHL_CLS_DIFF_REM
@ LHL_CLS_DIFF_REM
Definition
lws-hl.h:63
LHL_CLS_CHARLIT
@ LHL_CLS_CHARLIT
Definition
lws-hl.h:56
LHL_CLS_COUNT
@ LHL_CLS_COUNT
Definition
lws-hl.h:67
LHL_CLS_KEYWORD
@ LHL_CLS_KEYWORD
Definition
lws-hl.h:52
LHL_CLS_NUMBER
@ LHL_CLS_NUMBER
Definition
lws-hl.h:54
LHL_CLS_TYPE
@ LHL_CLS_TYPE
Definition
lws-hl.h:53
LHL_CLS_DIFF_ADD
@ LHL_CLS_DIFF_ADD
Definition
lws-hl.h:62
LHL_CLS_DIFF_META
@ LHL_CLS_DIFF_META
Definition
lws-hl.h:65
LHL_CLS_DIFF_HUNK
@ LHL_CLS_DIFF_HUNK
Definition
lws-hl.h:64
lws_hl_write_cb
lws_stateful_ret_t(* lws_hl_write_cb)(void *user, const uint8_t *buf, size_t len)
Definition
lws-hl.h:231
lws_html_escape
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t lws_html_escape(lws_hl_write_cb wc, void *user, const uint8_t *src, size_t len)
lws_hl_ops_t
struct lws_hl_ops lws_hl_ops_t
lws_hl_ctx::scratch_pos
uint8_t scratch_pos
Definition
lws-hl.h:133
lws_hl_ctx::tokcls
uint8_t tokcls
Definition
lws-hl.h:135
lws_hl_token_cb
lws_stateful_ret_t(* lws_hl_token_cb)(void *user, lws_hl_class_t cls, const uint8_t *tok, size_t len)
Definition
lws-hl.h:93
lws_hl_ctx
Definition
lws-hl.h:121
lws_hl_html
Definition
lws-hl.h:244
lws_hl_ops
Definition
lws-hl.h:96
lws_hl_ops::parse
lws_stateful_ret_t(* parse)(lws_hl_ctx_t *ctx, const uint8_t **buf, size_t *len)
Definition
lws-hl.h:104
lws_hl_ops::finish
lws_stateful_ret_t(* finish)(lws_hl_ctx_t *ctx)
Definition
lws-hl.h:109
lws_hl_ops::name
const char * name
Definition
lws-hl.h:97
lws_hl_ops::construct
int(* construct)(lws_hl_ctx_t *ctx)
Definition
lws-hl.h:100
include
libwebsockets
lws-hl.h
Generated on
for libwebsockets by
1.18.0