You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2018/11/01 18:40:02 UTC
[mynewt-newt] 01/09: syscfg: Extract setting reference functionality
This is an automated email from the ASF dual-hosted git repository.
ccollins pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-newt.git
commit d7ee16d29547007ce676555f1e4c618155e27080
Author: Christopher Collins <cc...@apache.org>
AuthorDate: Mon Oct 15 18:22:52 2018 -0700
syscfg: Extract setting reference functionality
A setting can refer to another with the `MYNEWT_VAL(...)` notation.
This commit extracts the code which detects such references and puts it
into separate functions.
---
newt/syscfg/syscfg.go | 62 +++++++++++++++++++++++++++++++++------------------
1 file changed, 40 insertions(+), 22 deletions(-)
diff --git a/newt/syscfg/syscfg.go b/newt/syscfg/syscfg.go
index 6e75a84..40f68b3 100644
--- a/newt/syscfg/syscfg.go
+++ b/newt/syscfg/syscfg.go
@@ -68,6 +68,8 @@ const SYSCFG_PRIO_ANY = "any"
// Reserve last 16 priorities for the system (sanity, idle).
const SYSCFG_TASK_PRIO_MAX = 0xef
+var cfgRefRe = regexp.MustCompile("MYNEWT_VAL\\((\\w+)\\)")
+
var cfgSettingNameTypeMap = map[string]CfgSettingType{
"raw": CFG_SETTING_TYPE_RAW,
"task_priority": CFG_SETTING_TYPE_TASK_PRIO,
@@ -180,34 +182,50 @@ func (cfg *Cfg) SettingValues() map[string]string {
return values
}
-func (cfg *Cfg) ResolveValueRefs() {
- re := regexp.MustCompile("MYNEWT_VAL\\((\\w+)\\)")
- for k, entry := range cfg.Settings {
- value := strings.TrimSpace(entry.Value)
-
- m := re.FindStringSubmatch(value)
- if len(m) == 0 || len(m[0]) != len(value) {
- // either there is no reference or there's something else besides
- // reference - skip it
- // TODO we may want to emit warning in the latter case (?)
- continue
- }
+func ResolveValueRefName(val string) string {
+ // If the value has the `MYNEWT_VAL([...])` notation, then extract the
+ // parenthesized identifier.
+ m := cfgRefRe.FindStringSubmatch(val)
+ if m == nil {
+ return ""
+ } else {
+ // TODO we may try to resolve nested references...
+ return m[1]
+ }
+}
- newName := m[1]
+func (cfg *Cfg) ExpandRef(val string) (string, string, error) {
+ refName := ResolveValueRefName(val)
+ if refName == "" {
+ // Not a reference.
+ return "", val, nil
+ }
- // TODO we may try to resolve nested references...
+ entry, ok := cfg.Settings[refName]
+ if !ok {
+ return "", "", util.FmtNewtError(
+ "setting value \"%s\" references undefined setting", val)
+ }
- newEntry, exists := cfg.Settings[newName]
- entry.ValueRefName = newName
- if exists {
- entry.Value = newEntry.Value
- } else {
- // set unresolved setting value to 0, this way restrictions
- // can be evaluated and won't create spurious warnings
+ return entry.Name, entry.Value, nil
+
+}
+
+func (cfg *Cfg) ResolveValueRefs() {
+ for k, entry := range cfg.Settings {
+ refName, val, err := cfg.ExpandRef(strings.TrimSpace(entry.Value))
+ if err != nil {
+ // Referenced setting doesn't exist. Set unresolved setting value
+ // to 0, this way restrictions can be evaluated and won't create
+ // spurious warnings.
entry.Value = "0"
cfg.UnresolvedValueRefs[k] = struct{}{}
+ cfg.Settings[k] = entry
+ } else if refName != "" {
+ entry.ValueRefName = refName
+ entry.Value = val
+ cfg.Settings[k] = entry
}
- cfg.Settings[k] = entry
}
}