annotate host/libcdl/func.cxx @ 3403:8c8767bb9a62 default tip

devs/nand/micron_mt29: Remove defunct references (in comments) to mt29f2g08_oob_ecc.
author Ross Younger <wry@ecoscentric.com>
date Sun, 18 Jan 2015 17:59:01 +1300
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
1 //{{{ Banner
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
2
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
3 //============================================================================
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
4 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
5 // func.cxx
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
6 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
7 // Implementation of CDL functions
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
8 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
9 //============================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
10 // ####ECOSHOSTGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
11 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
12 // This file is part of the eCos host tools.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
13 // Copyright (C) 2001 Free Software Foundation, Inc.
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
14 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
15 // This program is free software; you can redistribute it and/or modify
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
16 // it under the terms of the GNU General Public License as published by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
17 // the Free Software Foundation; either version 2 or (at your option) any
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
18 // later version.
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
19 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
20 // This program is distributed in the hope that it will be useful, but
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
21 // WITHOUT ANY WARRANTY; without even the implied warranty of
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
22 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
23 // General Public License for more details.
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
24 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
25 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
26 // along with this program; if not, write to the
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
27 // Free Software Foundation, Inc., 51 Franklin Street,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
28 // Fifth Floor, Boston, MA 02110-1301, USA.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
29 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 163
diff changeset
30 // ####ECOSHOSTGPLCOPYRIGHTEND####
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
31 //============================================================================
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
33 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
34 // Author(s): bartv
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
35 // Contact(s): bartv
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
36 // Date: 2001/04/20
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
37 // Version: 0.01
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
38 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
39 //####DESCRIPTIONEND####
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
40 //============================================================================
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
41
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
42 //}}}
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
43 //{{{ #include's
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
44
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
45 // ----------------------------------------------------------------------------
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
46 #include "cdlconfig.h"
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
47
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
48 // Get the infrastructure types, assertions, tracing and similar
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
49 // facilities.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
50 #include <cyg/infra/cyg_ass.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
51 #include <cyg/infra/cyg_trac.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
52
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
53 // <cdlcore.hxx> defines everything implemented in this module.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
54 // It implicitly supplies <string>, <vector> and <map> because
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
55 // the class definitions rely on these headers.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
56 #include <cdlcore.hxx>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
57
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
58 //}}}
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
59
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
60 //{{{ Core
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
61
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
62 // ----------------------------------------------------------------------------
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
63 int CdlFunction::next_id = 1;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
64 std::vector<CdlFunction*> CdlFunction::all_functions;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
65
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
66 // Dummy initializers, for e.g. when a particular function implementation does not
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
67 // support a certain type of inference.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
68 void (*CdlFunction::null_check)(CdlExpression, const CdlSubexpression&) =
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
69 (void (*)(CdlExpression, const CdlSubexpression&)) 0;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
70 bool (*CdlFunction::null_infer_bool)(CdlTransaction, CdlExpression, unsigned int, bool, int) =
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
71 (bool (*)(CdlTransaction, CdlExpression, unsigned int, bool, int)) 0;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
72 bool (*CdlFunction::null_infer_value)(CdlTransaction, CdlExpression, unsigned int, CdlSimpleValue&, int) =
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
73 (bool (*)(CdlTransaction, CdlExpression, unsigned int, CdlSimpleValue&, int)) 0;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
74
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
75
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
76 CdlFunction::CdlFunction(const char* name_arg, int number_args_arg,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
77 void (*check_arg)(CdlExpression, const CdlSubexpression&),
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
78 void (*eval_arg)(CdlEvalContext&, CdlExpression, const CdlSubexpression&, CdlSimpleValue&),
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
79 bool (*infer_bool_arg)(CdlTransaction, CdlExpression, unsigned int, bool, int),
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
80 bool (*infer_value_arg)(CdlTransaction, CdlExpression, unsigned int, CdlSimpleValue&, int))
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
81 : name(name_arg),
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
82 number_args(number_args_arg),
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
83 check_fn(check_arg),
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
84 eval_fn(eval_arg),
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
85 infer_bool_fn(infer_bool_arg),
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
86 infer_value_fn(infer_value_arg)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
87 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
88 id = next_id++;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
89 all_functions.push_back(this);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
90 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
91
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
92 CdlFunction::~CdlFunction()
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
93 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
94 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
95
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
96 bool
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
97 CdlFunction::is_function(std::string name, int& id)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
98 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
99 CYG_REPORT_FUNCNAMETYPE("CdlFunction::is_function", "result %d");
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
100
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
101 bool result = false;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
102 std::vector<CdlFunction*>::const_iterator i;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
103
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
104 for (i = all_functions.begin(); !result && (i != all_functions.end()); i++) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
105 if (name == (*i)->name) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
106 result = true;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
107 id = (*i)->id;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
108 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
109 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
110
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
111 CYG_REPORT_RETVAL(result);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
112 return result;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
113 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
114
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
115 std::string
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
116 CdlFunction::get_name(int id)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
117 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
118 CYG_REPORT_FUNCNAME("CdlFunction::get_name");
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
119 CYG_REPORT_FUNCARG1XV(id);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
120
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
121 std::string result = "";
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
122 std::vector<CdlFunction*>::const_iterator i;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
123
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
124 for (i = all_functions.begin(); i != all_functions.end(); i++) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
125 if (id == (*i)->id) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
126 result = (*i)->name;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
127 break;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
128 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
129 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
130
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
131 CYG_REPORT_RETURN();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
132 return result;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
133 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
134
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
135 int
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
136 CdlFunction::get_args_count(int id)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
137 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
138 CYG_REPORT_FUNCNAMETYPE("CdlFunction::get_args_count", "result %d");
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
139 CYG_REPORT_FUNCARG1XV(id);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
140
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
141 int result = 0;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
142 std::vector<CdlFunction*>::const_iterator i;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
143
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
144 for (i = all_functions.begin(); i != all_functions.end(); i++) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
145 if (id == (*i)->id) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
146 result = (*i)->number_args;;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
147 break;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
148 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
149 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
150 CYG_REPORT_RETVAL(result);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
151 return result;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
152 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
153
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
154 void
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
155 CdlFunction::check(CdlExpression expr, const CdlSubexpression& subexpr)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
156 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
157 CYG_REPORT_FUNCNAME("CdlFunction::check");
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
158 CYG_REPORT_FUNCARG2XV(expr, &subexpr);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
160 int id = subexpr.func;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
161 std::vector<CdlFunction*>::const_iterator i;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
162
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
163 for (i = all_functions.begin(); i != all_functions.end(); i++) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
164 if (id == (*i)->id) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
165 if (CdlFunction::null_check != (*i)->check_fn) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
166 (*((*i)->check_fn))(expr, subexpr);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
167 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
168 break;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
169 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
170 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
171
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
172 CYG_REPORT_RETURN();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
173 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
174
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
175 void
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
176 CdlFunction::eval(CdlEvalContext& context, CdlExpression expr, const CdlSubexpression& subexpr, CdlSimpleValue& result)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
177 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
178 CYG_REPORT_FUNCNAME("CdlFunction::eval");
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
179 CYG_REPORT_FUNCARG4XV(&context, expr, &subexpr, &result);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
180
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
181 int id = subexpr.func;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
182 std::vector<CdlFunction*>::const_iterator i;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
183
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
184 for (i = all_functions.begin(); i != all_functions.end(); i++) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
185 if (id == (*i)->id) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
186 (*((*i)->eval_fn))(context, expr, subexpr, result);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
187 break;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
188 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
189 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
190
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
191 CYG_REPORT_RETURN();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
192 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
193
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
194 bool
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
195 CdlFunction::infer_bool(CdlTransaction transaction, CdlExpression expr, unsigned int index, bool goal, int level)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
196 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
197 CYG_REPORT_FUNCNAMETYPE("CdlFunction::infer_bool", "result %d");
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
198 CYG_REPORT_FUNCARG5XV(transaction, expr, index, goal, level);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
199
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
200 bool result = false;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
201 CdlSubexpression& subexpr = expr->sub_expressions[index];
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
202 int id = subexpr.func;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
203 std::vector<CdlFunction*>::const_iterator i;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
204
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
205 for (i = all_functions.begin(); i != all_functions.end(); i++) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
206 if (id == (*i)->id) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
207 if (CdlFunction::null_infer_bool != (*i)->infer_bool_fn) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
208 result = (*((*i)->infer_bool_fn))(transaction, expr, index, goal, level);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
209 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
210 break;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
211 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
212 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
213
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
214 CYG_REPORT_RETVAL(result);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
215 return result;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
216 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
217
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
218 bool
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
219 CdlFunction::infer_value(CdlTransaction transaction, CdlExpression expr, unsigned int index, CdlSimpleValue& goal, int level)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
220 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
221 CYG_REPORT_FUNCNAMETYPE("CdlFunction::infer_value", "result %d");
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
222 CYG_REPORT_FUNCARG5XV(transaction, expr, index, &goal, level);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
223
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
224 bool result = false;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
225 CdlSubexpression& subexpr = expr->sub_expressions[index];
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
226 int id = subexpr.func;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
227 std::vector<CdlFunction*>::const_iterator i;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
228
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
229 for (i = all_functions.begin(); i != all_functions.end(); i++) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
230 if (id == (*i)->id) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
231 if (CdlFunction::null_infer_value != (*i)->infer_value_fn) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
232 result = (*((*i)->infer_value_fn))(transaction, expr, index, goal, level);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
233 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
234 break;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
235 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
236 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
237
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
238 CYG_REPORT_RETVAL(result);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
239 return result;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
240 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
241
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
242 //}}}
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
243 //{{{ is_substr()
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
244
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
245 // ----------------------------------------------------------------------------
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
246 // is_substr(A, B)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
247 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
248 // For example, is_substr(CYGBLD_GLOBAL_CFLAGS, " -fno-exceptions ")
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
249 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
250 // There is one subtlety about substring matching: what to do about the
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
251 // start and end of a string. If the specified substring begins with a
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
252 // space then this will match either a space or the start of the string,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
253 // similarly for the final character.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
254
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
255 static std::string::size_type
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
256 is_substr_find(std::string haystack, std::string needle, std::string::size_type& len_arg)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
257 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
258 CYG_REPORT_FUNCNAMETYPE("is_substr_find", "result %d");
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
259 std::string::size_type result = std::string::npos;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
260
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
261 std::string::size_type haystack_len = haystack.length();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
262 std::string::size_type needle_len = needle.length();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
263
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
264 bool leading_space = false;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
265 bool trailing_space = false;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
266
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
267 if (' ' == needle[0]) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
268 leading_space = true;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
269 needle_len--;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
270 needle = std::string(needle, 1, needle_len);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
271 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
272 if (' ' == needle[needle_len - 1]) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
273 trailing_space = true;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
274 needle_len--;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
275 needle = std::string(needle, 0, needle_len);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
276 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
277
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
278 std::string::size_type posn = haystack.find(needle);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
279 while ((std::string::npos == result) && (std::string::npos != posn)) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
280
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
281 std::string::size_type match_point = posn;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
282 bool match = true;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
283
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
284 // A possible match has been found. If there was a leading
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
285 // space, check we are either at the start of the main string
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
286 // or that a space is present.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
287 if (leading_space && (0 != posn) && (' ' != haystack[posn - 1])) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
288 match = false;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
289 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
290 if (trailing_space && (haystack_len != (posn + needle_len)) && (' ' != haystack[posn + needle_len])) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
291 match = false;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
292 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
293
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
294 // The result and len_arg returns exclude the spaces. This is deliberate.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
295 // Consider !is_substr("-g -O2 -fno-rtti -fno-exceptions", " -fnortti ").
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
296 // If during inference the spaces were removed as well, this would give
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
297 // "-g -O2-fno-exceptions", which is not desirable.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
298 if (match) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
299 result = match_point;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
300 len_arg = needle_len;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
301 } else {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
302 posn = haystack.find(needle, posn + 1);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
303 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
304 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
305
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
306 CYG_REPORT_RETVAL(result);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
307 return result;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
308 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
309
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
310 static void
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
311 is_substr_eval(CdlEvalContext& context, CdlExpression expr, const CdlSubexpression& subexpr, CdlSimpleValue& result)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
312 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
313 CYG_REPORT_FUNCNAME("is_substr_eval");
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
314 CYG_REPORT_FUNCARG4XV(&context, expr, &subexpr, &result);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
315 CYG_PRECONDITION_CLASSOC(context);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
316 CYG_PRECONDITION_CLASSC(expr);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
317
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
318 CdlSimpleValue arg0;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
319 CdlSimpleValue arg1;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
320 expr->eval_subexpression(context, subexpr.args[0], arg0);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
321 expr->eval_subexpression(context, subexpr.args[1], arg1);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
322
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
323 std::string::size_type len;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
324 result = (std::string::npos != is_substr_find(arg0.get_value(), arg1.get_value(), len));
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
325 CYG_REPORT_RETURN();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
326 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
327
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
328 // Inference is only supported if the haystack argument is a reference that can be
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
329 // updated. The needle can be an arbitrary expression.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
330 static bool
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
331 is_substr_infer_bool(CdlTransaction transaction, CdlExpression expr, unsigned int index, bool goal, int level)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
332 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
333 CYG_REPORT_FUNCNAMETYPE("is_substr_infer_bool", "result %d");
163
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
334 CYG_REPORT_FUNCARG5XV(transaction, expr, index, goal, level);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
335
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
336 bool result = false;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
337
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
338 CdlSubexpression& subexpr = expr->sub_expressions[index];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
339 CdlSubexpression& arg0 = expr->sub_expressions[subexpr.args[0]];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
340 try {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
341 if (CdlExprOp_Reference == arg0.op) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
342
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
343 CdlSimpleValue needle_value;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
344 CdlEvalContext context(transaction);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
345 expr->eval_subexpression(context, subexpr.args[1], needle_value);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
346 std::string needle = needle_value.get_value();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
347
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
348 CdlNode node = expr->references[arg0.reference_index].get_destination();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
349 CdlValuable valuable = 0;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
350 if (0 != node) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
351 valuable = dynamic_cast<CdlValuable>(node);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
352 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
353 if ((0 != valuable) && ((CdlValueFlavor_BoolData == valuable->get_flavor()) ||
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
354 (CdlValueFlavor_Data == valuable->get_flavor()))) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
355 // OK, we have a valuable which can be given a suitable value.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
356 // What is the current string?
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
357 const CdlValue& current_value = transaction->get_whole_value(valuable);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
358 std::string haystack = current_value.get_simple_value().get_value();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
359
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
360 // What is the goal? If the needle should be in the
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
361 // haystack, append it if necessary. If the needle
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
362 // should not be in the haystack, remove all current occurrences.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
363 if (goal) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
364 std::string::size_type len;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
365 if (std::string::npos == is_substr_find(haystack, needle, len)) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
366 haystack = haystack + needle;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
367 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
368 } else {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
369 std::string::size_type posn, len;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
370 for (posn = is_substr_find(haystack, needle, len);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
371 std::string::npos != posn;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
372 posn = is_substr_find(haystack, needle, len)) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
373 haystack.erase(posn, len);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
374 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
375 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
376
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
377 // OK, we have a new value for the haystack which should match the desired goal.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
378 // Try and set this value.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
379 CdlSimpleValue new_value(haystack);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
380 result = CdlInfer::set_valuable_value(transaction, valuable, new_value, level);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
381 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
382 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
383 } catch (...) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
384 result = false;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
385 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
386
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
387 CYG_REPORT_RETVAL(result);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
388 return result;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
389 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
390
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
391 static CdlFunction is_substr("is_substr", 2, CdlFunction::null_check, &is_substr_eval,
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
392 &is_substr_infer_bool, CdlFunction::null_infer_value);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
393
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
394 //}}}
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
395 //{{{ is_xsubstr()
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
396
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
397 // ----------------------------------------------------------------------------
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
398 // is_xsubstr(A, B)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
399 //
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
400 // Like is_substr() but only deals with exact matches, i.e. there is no special
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
401 // treatment for leading and trailing spaces in the needle.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
402
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
403 static void
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
404 is_xsubstr_eval(CdlEvalContext& context, CdlExpression expr, const CdlSubexpression& subexpr, CdlSimpleValue& result)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
405 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
406 CYG_REPORT_FUNCNAME("is_xsubstr_eval");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
407 CYG_REPORT_FUNCARG4XV(&context, expr, &subexpr, &result);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
408 CYG_PRECONDITION_CLASSOC(context);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
409 CYG_PRECONDITION_CLASSC(expr);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
410
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
411 CdlSimpleValue arg0;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
412 CdlSimpleValue arg1;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
413 expr->eval_subexpression(context, subexpr.args[0], arg0);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
414 expr->eval_subexpression(context, subexpr.args[1], arg1);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
415
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
416 result = (std::string::npos != arg0.get_value().find(arg1.get_value()));
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
417 CYG_REPORT_RETURN();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
418 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
419
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
420 // Inference is only supported if the haystack argument is a reference that can be
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
421 // updated. The needle can be an arbitrary expression.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
422 static bool
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
423 is_xsubstr_infer_bool(CdlTransaction transaction, CdlExpression expr, unsigned int index, bool goal, int level)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
424 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
425 CYG_REPORT_FUNCNAMETYPE("is_xsubstr_infer_bool", "result %d");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
426 CYG_REPORT_FUNCARG5XV(transaction, expr, index, goal, level);
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
427
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
428 bool result = false;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
429
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
430 CdlSubexpression& subexpr = expr->sub_expressions[index];
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
431 CdlSubexpression& arg0 = expr->sub_expressions[subexpr.args[0]];
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
432 try {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
433 if (CdlExprOp_Reference == arg0.op) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
434
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
435 CdlSimpleValue needle_value;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
436 CdlEvalContext context(transaction);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
437 expr->eval_subexpression(context, subexpr.args[1], needle_value);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
438 std::string needle = needle_value.get_value();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
439
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
440 CdlNode node = expr->references[arg0.reference_index].get_destination();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
441 CdlValuable valuable = 0;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
442 if (0 != node) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
443 valuable = dynamic_cast<CdlValuable>(node);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
444 }
163
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
445 if ((0 != valuable) && ((CdlValueFlavor_BoolData == valuable->get_flavor()) ||
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
446 (CdlValueFlavor_Data == valuable->get_flavor()))) {
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
447 // OK, we have a valuable which can be given a suitable value.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
448 // What is the current string?
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
449 const CdlValue& current_value = transaction->get_whole_value(valuable);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
450 std::string haystack = current_value.get_simple_value().get_value();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
451
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
452 // What is the goal? If the needle should be in the
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
453 // haystack, append it if necessary. If the needle
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
454 // should not be in the haystack, remove all current occurrences.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
455 if (goal) {
163
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
456 if (std::string::npos == haystack.find(needle)) {
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
457 haystack = haystack + needle;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
458 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
459 } else {
163
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
460 std::string::size_type posn;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
461 for (posn = haystack.find(needle); std::string::npos != posn; posn = haystack.find(needle)) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
462 haystack.erase(posn, needle.length());
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
463 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
464 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
465
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
466 // OK, we have a new value for the haystack which should match the desired goal.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
467 // Try and set this value.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
468 CdlSimpleValue new_value(haystack);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
469 result = CdlInfer::set_valuable_value(transaction, valuable, new_value, level);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
470 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
471 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
472 } catch (...) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
473 result = false;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
474 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
475
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
476 CYG_REPORT_RETVAL(result);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
477 return result;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
478 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
479
163
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
480 static CdlFunction is_xsubstr("is_xsubstr", 2, CdlFunction::null_check, &is_xsubstr_eval,
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
481 &is_xsubstr_infer_bool, CdlFunction::null_infer_value);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
482
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
483 //}}}
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
484 //{{{ is_loaded()
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
485
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
486 // ----------------------------------------------------------------------------
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
487 // is_loaded(x)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
488 // Check whether or not a particular configuration option is loaded.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
489 // This takes a single argument which must be a reference. No
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
490 // inference is possible, since loading and unloading packages is
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
491 // currently beyond the scope of the inference engine.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
492
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
493 static void
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
494 is_loaded_check(CdlExpression expr, const CdlSubexpression& subexpr)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
495 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
496 CYG_REPORT_FUNCNAME("is_loaded_check");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
497 CYG_REPORT_FUNCARG2XV(expr, &subexpr);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
498
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
499 CdlSubexpression& arg0 = expr->sub_expressions[subexpr.args[0]];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
500 if (CdlExprOp_Reference != arg0.op) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
501 throw CdlParseException(std::string("The argument to is_loaded() should be a reference to a configuration option.\n") +
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
502 CdlParse::get_expression_error_location());
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
503 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
504
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
505 CYG_REPORT_RETURN();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
506 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
507
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
508 static void
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
509 is_loaded_eval(CdlEvalContext& context, CdlExpression expr, const CdlSubexpression& subexpr, CdlSimpleValue& result)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
510 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
511 CYG_REPORT_FUNCNAME("is_loaded_eval");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
512 CYG_REPORT_FUNCARG4XV(&context, expr, &subexpr, &result);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
513 CYG_PRECONDITION_CLASSOC(context);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
514 CYG_PRECONDITION_CLASSC(expr);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
515
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
516 CdlSubexpression arg0 = expr->sub_expressions[subexpr.args[0]];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
517 CYG_ASSERTC(CdlExprOp_Reference == arg0.op);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
518
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
519 result = (0 != context.resolve_reference(expr, arg0.reference_index));
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
520 CYG_REPORT_RETURN();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
521 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
522
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
523 static CdlFunction is_loaded("is_loaded", 1, &is_loaded_check, &is_loaded_eval,
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
524 CdlFunction::null_infer_bool, CdlFunction::null_infer_value);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
525
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
526 //}}}
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
527 //{{{ is_active()
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
528
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
529 // ----------------------------------------------------------------------------
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
530 // is_active(x)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
531 // Check whether or not a particular configuration option is loaded
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
532 // and active. This takes a single argument which must be a reference.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
533
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
534 static void
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
535 is_active_check(CdlExpression expr, const CdlSubexpression& subexpr)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
536 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
537 CYG_REPORT_FUNCNAME("is_active_check");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
538 CYG_REPORT_FUNCARG2XV(expr, &subexpr);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
539
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
540 CdlSubexpression& arg0 = expr->sub_expressions[subexpr.args[0]];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
541 if (CdlExprOp_Reference != arg0.op) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
542 throw CdlParseException(std::string("The argument to is_active() should be a reference to a configuration option.\n") +
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
543 CdlParse::get_expression_error_location());
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
544 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
545
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
546 CYG_REPORT_RETURN();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
547 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
548
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
549 static void
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
550 is_active_eval(CdlEvalContext& context, CdlExpression expr, const CdlSubexpression& subexpr, CdlSimpleValue& result)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
551 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
552 CYG_REPORT_FUNCNAME("is_active_eval");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
553 CYG_REPORT_FUNCARG4XV(&context, expr, &subexpr, &result);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
554 CYG_PRECONDITION_CLASSOC(context);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
555 CYG_PRECONDITION_CLASSC(expr);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
556
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
557 CdlSubexpression arg0 = expr->sub_expressions[subexpr.args[0]];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
558 CYG_ASSERTC(CdlExprOp_Reference == arg0.op);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
559
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
560 CdlNode node = context.resolve_reference(expr, arg0.reference_index);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
561 if (0 != node) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
562 result = node->is_active(context.transaction);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
563 } else {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
564 result = false;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
565 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
566 CYG_REPORT_RETURN();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
567 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
568
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
569 static bool
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
570 is_active_infer_bool(CdlTransaction transaction, CdlExpression expr, unsigned int index, bool goal, int level)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
571 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
572 CYG_REPORT_FUNCNAMETYPE("is_active_infer_bool", "result %d");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
573 CYG_REPORT_FUNCARG5XV(transaction, expr, index, goal, level);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
574
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
575 bool result = false;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
576
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
577 CdlSubexpression subexpr = expr->sub_expressions[index];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
578 CdlSubexpression arg0 = expr->sub_expressions[subexpr.args[0]];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
579 CYG_ASSERTC(CdlExprOp_Reference == arg0.op);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
580
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
581 CdlNode node = expr->references[arg0.reference_index].get_destination();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
582 if (0 != node) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
583 if (goal) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
584 result = CdlInfer::make_active(transaction, node, level);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
585 } else {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
586 result = CdlInfer::make_inactive(transaction, node, level);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
587 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
588 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
589
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
590 CYG_REPORT_RETVAL(result);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
591 return result;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
592 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
593
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
594 static CdlFunction is_active("is_active", 1, &is_active_check, &is_active_eval,
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
595 &is_active_infer_bool, CdlFunction::null_infer_value);
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
596
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
597 //}}}
163
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
598 //{{{ is_enabled()
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
599
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
600 // ----------------------------------------------------------------------------
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
601 // is_enabled(x)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
602 // Check whether or not a particular configuration option is loaded
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
603 // and enabled. The active/inactive state is ignored. This function
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
604 // takes a single argument which must be a reference.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
605
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
606 static void
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
607 is_enabled_check(CdlExpression expr, const CdlSubexpression& subexpr)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
608 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
609 CYG_REPORT_FUNCNAME("is_enabled_check");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
610 CYG_REPORT_FUNCARG2XV(expr, &subexpr);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
611
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
612 CdlSubexpression& arg0 = expr->sub_expressions[subexpr.args[0]];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
613 if (CdlExprOp_Reference != arg0.op) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
614 throw CdlParseException(std::string("The argument to is_enabled() should be a reference to a configuration option.\n") +
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
615 CdlParse::get_expression_error_location());
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
616 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
617
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
618 CYG_REPORT_RETURN();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
619 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
620
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
621 static void
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
622 is_enabled_eval(CdlEvalContext& context, CdlExpression expr, const CdlSubexpression& subexpr, CdlSimpleValue& result)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
623 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
624 CYG_REPORT_FUNCNAME("is_enabled_eval");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
625 CYG_REPORT_FUNCARG4XV(&context, expr, &subexpr, &result);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
626 CYG_PRECONDITION_CLASSOC(context);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
627 CYG_PRECONDITION_CLASSC(expr);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
628
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
629 CdlSubexpression arg0 = expr->sub_expressions[subexpr.args[0]];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
630 CYG_ASSERTC(CdlExprOp_Reference == arg0.op);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
631
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
632 CdlValuable valuable = context.resolve_valuable_reference(expr, arg0.reference_index);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
633 if (0 != valuable) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
634 if (0 != context.transaction) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
635 result = valuable->is_enabled(context.transaction);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
636 } else {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
637 result = valuable->is_enabled();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
638 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
639 } else {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
640 result = false;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
641 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
642 CYG_REPORT_RETURN();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
643 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
644
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
645 static bool
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
646 is_enabled_infer_bool(CdlTransaction transaction, CdlExpression expr, unsigned int index, bool goal, int level)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
647 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
648 CYG_REPORT_FUNCNAMETYPE("is_enabled_infer_bool", "result %d");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
649 CYG_REPORT_FUNCARG5XV(transaction, expr, index, goal, level);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
650
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
651 bool result = false;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
652
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
653 CdlSubexpression subexpr = expr->sub_expressions[index];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
654 CdlSubexpression arg0 = expr->sub_expressions[subexpr.args[0]];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
655 CYG_ASSERTC(CdlExprOp_Reference == arg0.op);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
656
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
657 CdlNode node = expr->references[arg0.reference_index].get_destination();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
658 if (0 != node) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
659 CdlValuable valuable = dynamic_cast<CdlValuable>(node);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
660 if (0 != valuable) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
661 // OK, we have found a valuable. Is it already enabled?
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
662 // Does it have a boolean component? Is it modifiable? Has
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
663 // it already been modified by the user in this transaction?
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
664 if (goal == valuable->is_enabled()) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
665 result = true;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
666 } else {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
667 CdlValueFlavor flavor = valuable->get_flavor();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
668 if ((CdlValueFlavor_Bool == flavor) || (CdlValueFlavor_BoolData == flavor)) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
669 if (valuable->is_modifiable()) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
670 if (!transaction->changed_by_user(valuable)) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
671 // We have a modifiable option and want to set the enabled flag.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
672 // However we do not want to lose the current data part - unless
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
673 // some other constraint has caused that to be set.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
674 const CdlValue& old_value = transaction->get_whole_value(valuable);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
675 CdlValue new_value = old_value;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
676 if (!old_value.has_source(CdlValueSource_Inferred)) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
677 CdlSimpleValue simple_value = old_value.get_simple_value(CdlValueSource_Current);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
678 new_value.set_value(simple_value, CdlValueSource_Inferred);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
679 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
680 new_value.set_enabled(goal, CdlValueSource_Inferred);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
681 new_value.set_source(CdlValueSource_Inferred);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
682 transaction->set_whole_value(valuable, old_value, new_value);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
683 result = transaction->resolve_recursion(level);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
684 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
685 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
686 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
687 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
688 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
689 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
690
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
691 CYG_REPORT_RETVAL(result);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
692 return result;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
693 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
694
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
695 static CdlFunction is_enabled("is_enabled", 1, &is_enabled_check, &is_enabled_eval,
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
696 &is_enabled_infer_bool, CdlFunction::null_infer_value);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
697
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
698 //}}}
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
699 //{{{ get_data()
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
700
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
701 // ----------------------------------------------------------------------------
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
702 // get_data(x)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
703 // Returns "0" if the specified option is not enabled, otherwise
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
704 // the current data part fo the value. The active/inactive and the
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
705 // enabled states are ignored. This function takes a single argument
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
706 // which must be a reference.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
707
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
708 static void
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
709 get_data_check(CdlExpression expr, const CdlSubexpression& subexpr)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
710 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
711 CYG_REPORT_FUNCNAME("get_data_check");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
712 CYG_REPORT_FUNCARG2XV(expr, &subexpr);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
713
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
714 CdlSubexpression& arg0 = expr->sub_expressions[subexpr.args[0]];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
715 if (CdlExprOp_Reference != arg0.op) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
716 throw CdlParseException(std::string("The argument to get_data() should be a reference to a configuration option.\n") +
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
717 CdlParse::get_expression_error_location());
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
718 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
719
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
720 CYG_REPORT_RETURN();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
721 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
722
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
723 static void
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
724 get_data_eval(CdlEvalContext& context, CdlExpression expr, const CdlSubexpression& subexpr, CdlSimpleValue& result)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
725 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
726 CYG_REPORT_FUNCNAME("get_data_eval");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
727 CYG_REPORT_FUNCARG4XV(&context, expr, &subexpr, &result);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
728 CYG_PRECONDITION_CLASSOC(context);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
729 CYG_PRECONDITION_CLASSC(expr);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
730
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
731 CdlSubexpression arg0 = expr->sub_expressions[subexpr.args[0]];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
732 CYG_ASSERTC(CdlExprOp_Reference == arg0.op);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
733
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
734 CdlValuable valuable = context.resolve_valuable_reference(expr, arg0.reference_index);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
735 if (0 != valuable) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
736 if (0 != context.transaction) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
737 result = valuable->get_value(context.transaction);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
738 } else {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
739 result = valuable->get_value();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
740 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
741 } else {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
742 result = false;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
743 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
744 CYG_REPORT_RETURN();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
745 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
746
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
747 static bool
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
748 get_data_infer_value(CdlTransaction transaction, CdlExpression expr, unsigned int index, CdlSimpleValue& goal, int level)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
749 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
750 CYG_REPORT_FUNCNAMETYPE("get_data_infer_value", "result %d");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
751 CYG_REPORT_FUNCARG5XV(transaction, expr, index, &goal, level);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
752
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
753 bool result = false;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
754
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
755 CdlSubexpression subexpr = expr->sub_expressions[index];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
756 CdlSubexpression arg0 = expr->sub_expressions[subexpr.args[0]];
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
757 CYG_ASSERTC(CdlExprOp_Reference == arg0.op);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
758
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
759 CdlNode node = expr->references[arg0.reference_index].get_destination();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
760 if (0 != node) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
761 CdlValuable valuable = dynamic_cast<CdlValuable>(node);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
762 if (0 != valuable) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
763 // OK, we have found a valuable. Does it have a data component?
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
764 // Does it already have the right value. Is it modifiable? Has
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
765 // it already been modified by the user in this transaction?
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
766 CdlValueFlavor flavor = valuable->get_flavor();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
767 if ((CdlValueFlavor_Data == flavor) || (CdlValueFlavor_BoolData == flavor)) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
768 CdlSimpleValue current_value = valuable->get_simple_value(transaction);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
769 if (goal != current_value) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
770 if (valuable->is_modifiable()) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
771 if (!transaction->changed_by_user(valuable)) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
772 // We have a modifiable option and want to set the data part.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
773 // However we do not want to lose the enabled part - unless
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
774 // some other constraint has caused that to be set.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
775 const CdlValue& old_value = transaction->get_whole_value(valuable);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
776 CdlValue new_value = old_value;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
777 if (!old_value.has_source(CdlValueSource_Inferred)) {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
778 new_value.set_enabled(old_value.is_enabled(), CdlValueSource_Inferred);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
779 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
780 new_value.set_value(goal, CdlValueSource_Inferred);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
781 new_value.set_source(CdlValueSource_Inferred);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
782 transaction->set_whole_value(valuable, old_value, new_value);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
783 result = transaction->resolve_recursion(level);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
784 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
785 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
786 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
787 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
788 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
789 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
790
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
791 CYG_REPORT_RETVAL(result);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
792 return result;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
793 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
794
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
795 static CdlFunction get_data("get_data", 1, &get_data_check, &get_data_eval,
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
796 CdlFunction::null_infer_bool, &get_data_infer_value);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
797
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
798 //}}}
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
799 //{{{ version_cmp()
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
800
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
801 // ----------------------------------------------------------------------------
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
802 // version_cmp(a, b)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
803 // Evaluate both arguments, interpret them as version strings, and then
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
804 // return -1, 0 or 1.
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
805
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
806 static void
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
807 version_cmp_eval(CdlEvalContext& context, CdlExpression expr, const CdlSubexpression& subexpr, CdlSimpleValue& result)
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
808 {
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
809 CYG_REPORT_FUNCNAME("version_cmp_eval");
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
810 CYG_REPORT_FUNCARG4XV(&context, expr, &subexpr, &result);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
811 CYG_PRECONDITION_CLASSOC(context);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
812 CYG_PRECONDITION_CLASSC(expr);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
813
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
814 CdlSimpleValue arg0;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
815 CdlSimpleValue arg1;
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
816 expr->eval_subexpression(context, subexpr.args[0], arg0);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
817 expr->eval_subexpression(context, subexpr.args[1], arg1);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
818
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
819 result = (cdl_int) Cdl::compare_versions(arg0.get_value(), arg1.get_value());
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
820
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
821 CYG_REPORT_RETURN();
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
822 }
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
823
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
824 static CdlFunction version_cmp("version_cmp", 2, CdlFunction::null_check, &version_cmp_eval,
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
825 CdlFunction::null_infer_bool, CdlFunction::null_infer_value);
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
826
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 159
diff changeset
827 //}}}