1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
/* The vmop object.
*
* Copyright 2008 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of rsyslog.
*
* Rsyslog is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rsyslog is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
*
* A copy of the GPL can be found in the file "COPYING" in this distribution.
*/
#ifndef INCLUDED_VMOP_H
#define INCLUDED_VMOP_H
#include "ctok_token.h"
/* machine instructions types */
typedef enum { /* do NOT start at 0 to detect uninitialized types after calloc() */
opcode_INVALID = 0,
/* for simplicity of debugging and reading dumps, we use the same IDs
* that the tokenizer uses where this applicable.
*/
opcode_OR = ctok_OR,
opcode_AND = ctok_AND,
opcode_PLUS = ctok_PLUS,
opcode_MINUS = ctok_MINUS,
opcode_TIMES = ctok_TIMES, /* "*" */
opcode_DIV = ctok_DIV,
opcode_MOD = ctok_MOD,
opcode_NOT = ctok_NOT,
opcode_CMP_EQ = ctok_CMP_EQ, /* all compare operations must be in a row */
opcode_CMP_NEQ = ctok_CMP_NEQ,
opcode_CMP_LT = ctok_CMP_LT,
opcode_CMP_GT = ctok_CMP_GT,
opcode_CMP_LTEQ = ctok_CMP_LTEQ,
opcode_CMP_CONTAINS = ctok_CMP_CONTAINS,
opcode_CMP_STARTSWITH = ctok_CMP_STARTSWITH,
opcode_CMP_GTEQ = ctok_CMP_GTEQ, /* end compare operations */
/* here we start our own codes */
opcode_PUSH = 1000, /* requires var operand */
opcode_POP = 1001, /* requires var operand to receive result */
} opcode_t;
/* the vmop object */
typedef struct vmop_s {
BEGINobjInstance; /* Data to implement generic object - MUST be the first data element! */
opcode_t opcode;
union {
var_t *pVar;
/* TODO: add function pointer */
} operand;
struct vmop_s *pNext; /* next operation or NULL, if end of program (logically this belongs to vmprg) */
} vmop_t;
/* prototypes */
rsRetVal vmopConstruct(vmop_t **ppThis);
rsRetVal vmopConstructFinalize(vmop_t __attribute__((unused)) *pThis);
rsRetVal vmopDestruct(vmop_t **ppThis);
rsRetVal vmopSetOpcode(vmop_t *pThis, opcode_t opcode);
rsRetVal vmopSetVar(vmop_t *pThis, var_t *pVar);
PROTOTYPEObjClassInit(vmop);
PROTOTYPEObjDebugPrint(vmop);
#endif /* #ifndef INCLUDED_VMOP_H */
|