1 #ifndef __art_struct_h_
2 #define __art_struct_h_
3 
4 #include <string>
5 #include "art_defs.h"
6 
7 using namespace std;
8 
9 // type T; if(T oper value)
10 class CExpr{
11 public:
12     string	oper,	// операция: "==", "!=", ">", ...
13     type,	// пользовательский тип: "int", "ssize_t", "gint", ...
14     // type == "" если это XXX
15     value;	// пользовательское значение: "0", "NULL", "-1", "ERR_OK", ...
16 
17 #ifdef ART_DEBUG
18     void dump(size_t ntabs);
19 #endif
20 };
21 
22 // Note: vector <CArg> args; В args[0] поле .name всегда пусто;
23 // args[0] используется для указания типа возвращаемого значения.
24 class CArg{
25 public:
26     string	type,	// пользовательский тип: "int", "void *", "LTGERR", "MyType", ...
27     name;	// пользовательское имя: "fd", "b", "ltgerr", "MyValidValue", ...
28 
29 #ifdef ART_DEBUG
30     void dump(size_t ntabs);
31 #endif
32 };
33 
34 #include <vector>
35 
36 // *Tor's class
37 class CTor{
38 public:
39     string	name;		// название Tor'a: "malloc", "fopen", ...
40 
41     vector	<CArg> args;	// args[0] = return-type, args[1] = первый аргумент, ...
42 
43     /* Аргументы считаются с нуля */
44 
45     size_t	float_arg_n1;	// номер первого аргумента, в котором значение delta
46     // или len.
47 
48     size_t	float_arg_n2;	// номер второго аргумента, в котором значение delta
49     // или len.
50     // 0 - если его нет.
51     // !float_arg_n1 --> !float_arg_n1
52     // ???Если их два, то значения перемножаются???
53 
54     vector	<string> validateDom_before;	// 1 - 1st arg's domain name.
55     // 0 - always "" (and ignorable by libgen)
56     // проверять i-й аргумент по правилам домена
57     // validateDom[i]: "stdmem", ...
58     // ДО выполнения операции.
59     // "" если проверять не надо
60 
61     bool    is_handle_arg_out; // есть возвращаемый handle или нет.
62     // если есть, то учитывается handle_arg_out.
63     // если нет, handle_arg_out игнорируется.
64     // введено в версии 2009-12-02, т.к. MAX_VALID_HANDLE_ARG
65     // более не используется.
66 
67     size_t	handle_arg_out;	// номер выходящего handl'а. Значение больше
68     // MAX_VALID_HANDLE_ARG, если его нет.
69     // По этому номеру выполняется проверка по правилам
70     // текущего Домена.
71     // Обычно используется для ALLOCATOR'а.
72     // 0 - проверять фактически retval
73     // i - проверять i-й аргумент
74     // NOTE: когда значение равно 0, то в шаблоне я пишу
75     // не проверять badRetCode посредством задания
76     // .type = ""
77 
78     CExpr	badRetCode;	// .type = "void" если возвращаемого значения нет;
79     // .type = "" если не нужно выполнять evalution,
80     // например в случае когда возвращаемое значение
81     // есть то же самое что и Handle.
82     string	cpp_alias;	// Указывает что 1) это С++ тор
83     // 2) С-Генераторы должны игнорировать этот тор на
84     // стадии генерации declaration'ов, redefinition'ов;
85     // А вот на стадии генерации ACTION'а использовать это
86     // имя вместо вызова .name'а...(этот код вызывается
87     // при работе С++-генератора)
88 
89 #ifdef ART_DEBUG
90     void dump(size_t ntabs);
91 #endif
92 };
93 
94 class CDomain{
95 public:
96     string	name;		// имя
97     bool	float_handle;	// HANDLE как id(Атомарное) или как [x..y](Плавающее)
98     string	handle;		// void*, int, FILE*, ...
99     CExpr	bad_handle;
100     bool    includesGlobal; // true -> #include <...>, else #include "..."
101     vector	<string> includes;	// art.h includes it(to have prototypes)
102     vector	<CTor>	allocators,
103     deallocators,
104     reallocators,
105     operators;
106 
107 #ifdef ART_DEBUG
108     void dump(size_t ntabs);
109 #endif
110 };
111 
112 class CTemplate{
113 public:
114     string	name;
115     string	prefix;	// префикс к перехватываемым функциям: "art_", ...
116     string	errlogmode;	// "" никуда не выводить,
117     // "console" - использовать консоль(stderr)
118     // "filename" - использовать файл
119     bool	trap_on_io_err; // true -> i/o ошибки во время работы art.lib приводят
120     // к arterrlog() + exit();
121     // false -> игнорируются
122     bool	remote_mode;	// true -> artlib будет использовать tcpip
123     bool	force_flush;	// normaly must be enabled
124     bool    fork_enabled;   // if false, then artlib tryes to detect
125     // fork() and halt the application. if true (not yet implemented), then
126     // allows handling programm with fork()
127     bool	multithreaded;	// указывает art.lib'у является ли приложение
128     // многопоточным
129     string	threading;	// указывает art.lib'у тип многопоточного приложения
130     // "posix", "win32"
131     string	compiler_type;	// указывает art.lib'у тип компилятора
132     // "gcc", "win32"
133     string	trace_target; 	// if remote_mode -> `"host", port` || `"ip", port`
134     // else `"tracefile"`
135     vector	<CDomain> domains;
136     vector	<CTor> specialTors;	// Tors with arguments from different Domains.
137     // like fread(), read(), ...
138     // vector <CComplexTor> complexTor;
139     // Смотри глобальную цель 33
140 
141 #ifdef ART_DEBUG
142     void dump(void);
143 #endif
144 };
145 
146 #endif
147