OSSP CVS Repository

ossp - Check-in [1910]
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [Patchset]  [Tagging/Branching

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     16 inserted, 2 deleted
ossp-pkg/var/var_test.c      1.35 -> 1.36     1 inserted, 0 deleted

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"                                           },

CVSTrac 2.0.1