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 <ccoll...@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
        }
 }
 

Reply via email to