Index: trunk/Ohana/src/opihi/dvo/.dvo
===================================================================
--- trunk/Ohana/src/opihi/dvo/.dvo	(revision 6327)
+++ 	(revision )
@@ -1,1 +1,0 @@
-avextract -phothelp
Index: trunk/Ohana/src/opihi/lib.shell/expand_vars.c
===================================================================
--- trunk/Ohana/src/opihi/lib.shell/expand_vars.c	(revision 6327)
+++ trunk/Ohana/src/opihi/lib.shell/expand_vars.c	(revision 6424)
@@ -71,7 +71,13 @@
       *N = *Val; /* place the value of the variable in the newline */
     }
+    N--; /* we overshoot on last loop */
 
-    for (N--,L++; ISVAR(*L); L++);
-    L--;
+    /* skip past the variable in the source line */
+    /* L currently points at $ */
+    L++;
+    if (*L == '?') L++;  /* skip past ? in $?name */
+
+    while (ISVAR(*L)) L++;
+    L--; /* we overshoot */
 
     if (V0 != NULL) free (V0);
Index: trunk/Ohana/src/opihi/lib.shell/string.c
===================================================================
--- trunk/Ohana/src/opihi/lib.shell/string.c	(revision 6327)
+++ trunk/Ohana/src/opihi/lib.shell/string.c	(revision 6424)
@@ -94,5 +94,5 @@
 char *thisvar (char *string) {
 
-  int i;
+  int i, start;
   char *word;
 
@@ -100,7 +100,12 @@
   if (string[0] != '$') return ((char *) NULL);
 
-  for (i = 1; ISVAR(string[i]); i++);
-  if (i == 1) return ((char *) NULL);
-
+  /* special case $?name : check that name is valid */
+  start = 1;
+  if (string[1] == '?') start = 2;
+
+  for (i = start; ISVAR(string[i]); i++);
+  if (i == start) return ((char *) NULL);
+
+  /* the ? is part of the variable */
   word = strncreate (&string[1], i - 1);
   return (word);
@@ -207,11 +212,15 @@
 char *aftervar (char *string) {
 
-  int i, j;
+  int i, j, start;
 
   if (string == (char *) NULL) return ((char *) NULL);
   if (string[0] != '$') return ((char *) NULL);
 
-  for (i = 1; ISVAR(string[i]); i++);
-  if (i == 1) return ((char *) NULL);
+  /* special case: $?name : test only name */
+  start = 1;
+  if (string[1] == '?') start = 2;
+
+  for (i = start; ISVAR(string[i]); i++);
+  if (i == start) return ((char *) NULL);
 
   for (j = i; whitespace (string[j]); j++);
Index: trunk/Ohana/src/opihi/lib.shell/variable.c
===================================================================
--- trunk/Ohana/src/opihi/lib.shell/variable.c	(revision 6327)
+++ trunk/Ohana/src/opihi/lib.shell/variable.c	(revision 6424)
@@ -103,5 +103,5 @@
   
   int i;
-  char *local, *MacroName;
+  char *local, *MacroName, *value;
 
   if (name == NULL) return (NULL);
@@ -111,5 +111,5 @@
   /* return a string which should not be freed */
   if (*name == '?') {
-    value = get_variable_ptr (name[1]);
+    value = get_variable_ptr (&name[1]);
     if (value == NULL) {
       return variable_false;
@@ -152,5 +152,5 @@
   /* return a string which can be freed */
   if (*name == '?') {
-    value = get_variable_ptr (name[1]);
+    value = get_variable_ptr (&name[1]);
     if (value == NULL) {
       value = strcreate (variable_false);
