1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) Nginx, Inc.
5  */
6 
7 
8 #ifndef _NGX_STREAM_SCRIPT_H_INCLUDED_
9 #define _NGX_STREAM_SCRIPT_H_INCLUDED_
10 
11 
12 #include <ngx_config.h>
13 #include <ngx_core.h>
14 #include <ngx_stream.h>
15 
16 
17 typedef struct {
18     u_char                       *ip;
19     u_char                       *pos;
20     ngx_stream_variable_value_t  *sp;
21 
22     ngx_str_t                     buf;
23     ngx_str_t                     line;
24 
25     unsigned                      flushed:1;
26     unsigned                      skip:1;
27 
28     ngx_stream_session_t         *session;
29 } ngx_stream_script_engine_t;
30 
31 
32 typedef struct {
33     ngx_conf_t                   *cf;
34     ngx_str_t                    *source;
35 
36     ngx_array_t                 **flushes;
37     ngx_array_t                 **lengths;
38     ngx_array_t                 **values;
39 
40     ngx_uint_t                    variables;
41     ngx_uint_t                    ncaptures;
42     ngx_uint_t                    size;
43 
44     void                         *main;
45 
46     unsigned                      complete_lengths:1;
47     unsigned                      complete_values:1;
48     unsigned                      zero:1;
49     unsigned                      conf_prefix:1;
50     unsigned                      root_prefix:1;
51 } ngx_stream_script_compile_t;
52 
53 
54 typedef struct {
55     ngx_str_t                     value;
56     ngx_uint_t                   *flushes;
57     void                         *lengths;
58     void                         *values;
59 } ngx_stream_complex_value_t;
60 
61 
62 typedef struct {
63     ngx_conf_t                   *cf;
64     ngx_str_t                    *value;
65     ngx_stream_complex_value_t   *complex_value;
66 
67     unsigned                      zero:1;
68     unsigned                      conf_prefix:1;
69     unsigned                      root_prefix:1;
70 } ngx_stream_compile_complex_value_t;
71 
72 
73 typedef void (*ngx_stream_script_code_pt) (ngx_stream_script_engine_t *e);
74 typedef size_t (*ngx_stream_script_len_code_pt) (ngx_stream_script_engine_t *e);
75 
76 
77 typedef struct {
78     ngx_stream_script_code_pt     code;
79     uintptr_t                     len;
80 } ngx_stream_script_copy_code_t;
81 
82 
83 typedef struct {
84     ngx_stream_script_code_pt     code;
85     uintptr_t                     index;
86 } ngx_stream_script_var_code_t;
87 
88 
89 typedef struct {
90     ngx_stream_script_code_pt     code;
91     uintptr_t                     n;
92 } ngx_stream_script_copy_capture_code_t;
93 
94 
95 typedef struct {
96     ngx_stream_script_code_pt     code;
97     uintptr_t                     conf_prefix;
98 } ngx_stream_script_full_name_code_t;
99 
100 
101 void ngx_stream_script_flush_complex_value(ngx_stream_session_t *s,
102     ngx_stream_complex_value_t *val);
103 ngx_int_t ngx_stream_complex_value(ngx_stream_session_t *s,
104     ngx_stream_complex_value_t *val, ngx_str_t *value);
105 ngx_int_t ngx_stream_compile_complex_value(
106     ngx_stream_compile_complex_value_t *ccv);
107 char *ngx_stream_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd,
108     void *conf);
109 
110 
111 ngx_uint_t ngx_stream_script_variables_count(ngx_str_t *value);
112 ngx_int_t ngx_stream_script_compile(ngx_stream_script_compile_t *sc);
113 u_char *ngx_stream_script_run(ngx_stream_session_t *s, ngx_str_t *value,
114     void *code_lengths, size_t reserved, void *code_values);
115 void ngx_stream_script_flush_no_cacheable_variables(ngx_stream_session_t *s,
116     ngx_array_t *indices);
117 
118 void *ngx_stream_script_add_code(ngx_array_t *codes, size_t size, void *code);
119 
120 size_t ngx_stream_script_copy_len_code(ngx_stream_script_engine_t *e);
121 void ngx_stream_script_copy_code(ngx_stream_script_engine_t *e);
122 size_t ngx_stream_script_copy_var_len_code(ngx_stream_script_engine_t *e);
123 void ngx_stream_script_copy_var_code(ngx_stream_script_engine_t *e);
124 size_t ngx_stream_script_copy_capture_len_code(ngx_stream_script_engine_t *e);
125 void ngx_stream_script_copy_capture_code(ngx_stream_script_engine_t *e);
126 
127 #endif /* _NGX_STREAM_SCRIPT_H_INCLUDED_ */
128