Check-in Number:
|
1910 | |
Date: |
2002-Feb-28 10:29:48 (local)
2002-Feb-28 09:29:48 (UTC) |
User: | rse |
Branch: | |
Comment: |
Try to solve the expansion problem with invalid name characters we
encountered in OSSP lmtp2nntp if we expand in two passed with different
name character sets. We want that the variable constructs which are
not valid in the first pass to be correctly kept (assuming deactivated
force_expand!) instead of an error produced.
According to Peter Simons, this might be not the correct solution,
although THL and RSE are sure it is, because we tried it in detail and
it seems to be correct. Nevertheless Peter's comment (in german) for
reference:
| Ich weiß nicht, ob das unbedingt eine gute Idee ist? Der Fehler
| "incomplete variable spec" wird immer dann ausgelöst, wenn innerhalb
| der "${...}"-Umgebung ein Zeichen auftritt, das dort nicht sein
| dürfte. Einmal kommt das natürlich vor, wenn die gültigen Zeichen für
| Variablen von Pass 1 zu Pass 2 verschieden sind ... Aber eine andere
| Ursache kann auch sein, daß beispielsweise die schließende "}"-Klammer
| fehlt.
| IMHO ist die Tatsache, daß libvar an dieser Stelle einen Fehler
| liefert kein Softwarefehler, sondern liegt in der Natur der Sache. Die
| "richtige" Lösung für das Problem wäre meiner Meinung nach, in beiden
| Pässen die Vereinigung beider Zeichenmengen zuzulassen und dann im
| jeweiligen Callback zu testen, ob der Variablenname richtig war oder
| nicht.
| Genaugenommen sollte man ohnehin überlegen, ob es nicht günstiger
| wäre, mit einem Callback das ganze in einem Pass zu parsen, und
| diesen dann einfach zwischen Callback A und B entscheiden zu lassen,
| um die tatsächliche Auflösung durchzuführen. |
Tickets: |
|
Inspections: |
|
Files: |
|
ossp-pkg/var/var.c 1.63 -> 1.64
--- var.c 2002/02/28 08:48:44 1.63
+++ var.c 2002/02/28 09:29:48 1.64
@@ -653,8 +653,21 @@
do. */
if (name.begin == name.end) {
- rc = VAR_ERR_INCOMPLETE_VARIABLE_SPEC;
- goto error_return;
+ if (force_expand) {
+ rc = VAR_ERR_INCOMPLETE_VARIABLE_SPEC;
+ goto error_return;
+ }
+ else {
+ /* If no force_expand is requested, we have to back-off.
+ We're not sure whether our approach here is 100% correct,
+ because it _could_ have side-effects according to Peter
+ Simons, but as far as we know and tried it, it is
+ correct. But be warned -- RSE */
+ result->begin = begin - 1;
+ result->end = p;
+ result->buffer_size = 0;
+ goto goahead;
+ }
}
/* If the next token is START-INDEX, read the index specification. */
@@ -725,6 +738,7 @@
}
}
+ goahead:
if (p[-1] == ':') {
/* Parse and execute commands. */
|
|
ossp-pkg/var/var_test.c 1.35 -> 1.36
--- var_test.c 2002/02/28 08:48:44 1.35
+++ var_test.c 2002/02/28 09:29:48 1.36
@@ -111,6 +111,7 @@
};
const struct test_case tests[] = {
+ { "${HOME}${!!}", "/home/regression-tests${!!}" },
{ "$HOME", "/home/regression-tests" },
{ "${FOO}", "os" },
{ "${BAR}", "type" },
|
|