diff options
| author | Suren A. Chilingaryan <csa@suren.me> | 2015-10-18 04:47:09 +0200 | 
|---|---|---|
| committer | Suren A. Chilingaryan <csa@suren.me> | 2015-10-18 04:47:09 +0200 | 
| commit | 6a4a556b15bda7e0c737f247c8282c1b3a9d1e0d (patch) | |
| tree | b7a115d7b931ec9e63bb54fc85c476cf55a90064 /pcilib | |
| parent | 1c52a32779de1569ea41267ac6fc8f51c5a8b7fd (diff) | |
| download | pcitool-6a4a556b15bda7e0c737f247c8282c1b3a9d1e0d.tar.gz pcitool-6a4a556b15bda7e0c737f247c8282c1b3a9d1e0d.tar.bz2 pcitool-6a4a556b15bda7e0c737f247c8282c1b3a9d1e0d.tar.xz pcitool-6a4a556b15bda7e0c737f247c8282c1b3a9d1e0d.zip  | |
Support properties in transform formulas
Diffstat (limited to 'pcilib')
| -rw-r--r-- | pcilib/py.c | 31 | 
1 files changed, 25 insertions, 6 deletions
diff --git a/pcilib/py.c b/pcilib/py.c index def050e..5ec122f 100644 --- a/pcilib/py.c +++ b/pcilib/py.c @@ -108,7 +108,17 @@ static char *pcilib_py_parse_string(pcilib_t *ctx, const char *codestr, pcilib_v              // find the end of the register name          reg++; -        for (i = 0; isalnum(reg[i])||(reg[i] == '_'); i++); +        if (*reg == '{') { +            reg++; +            for (i = 0; (reg[i])&&(reg[i] != '}'); i++); +            if (!reg[i]) { +                pcilib_error("Python formula (%s) contains unterminated variable reference", codestr); +                err = PCILIB_ERROR_INVALID_DATA; +                break; +            } +        } else { +            for (i = 0; isalnum(reg[i])||(reg[i] == '_'); i++); +        }          save = reg[i];          reg[i] = 0; @@ -122,14 +132,23 @@ static char *pcilib_py_parse_string(pcilib_t *ctx, const char *codestr, pcilib_v              strcpy(dst + offset, val.sval);          } else { -            err = pcilib_read_register(ctx, NULL, reg, ®val); -            if (err) break; - -            sprintf(dst + offset, "0x%x", regval); +            if (*reg == '/') { +                pcilib_value_t val = {0}; +                err = pcilib_get_property(ctx, reg, &val); +                if (err) break; +                err = pcilib_convert_value_type(ctx, &val, PCILIB_TYPE_STRING); +                if (err) break; +                sprintf(dst + offset, "%s", val.sval); +            } else { +                err = pcilib_read_register(ctx, NULL, reg, ®val); +                if (err) break; +                sprintf(dst + offset, "0x%x", regval); +            }          }          offset += strlen(dst + offset); -        reg[i] = save; +        if (save == '}') i++; +        else reg[i] = save;              // Advance to the next register if any          cur = reg + i;  | 
