$NetBSD: patch-ac,v 1.5 2001/08/30 13:56:28 mrg Exp $

--- unwind_prot.c.orig	Wed Feb 14 23:00:55 2001
+++ unwind_prot.c	Thu Aug 30 11:24:44 2001
@@ -51,7 +51,7 @@
    points to this. */
 typedef struct {
   int *variable;
-  char *desired_setting;
+  UWP desired_setting;
   int size;
 } SAVED_VAR;

@@ -280,8 +280,9 @@
 discard_saved_var (sv)
      SAVED_VAR *sv;
 {
-  if (sv->size != sizeof (int))
-    free (sv->desired_setting);
+ if (sv->size != sizeof (int) && sv->size != sizeof (short) &&
+      sv->size != sizeof (char *))
+   free (sv->desired_setting.p);
   free (sv);
 }

@@ -293,13 +294,16 @@
 restore_variable (sv)
      SAVED_VAR *sv;
 {
-  if (sv->size != sizeof (int))
-    {
-      FASTCOPY ((char *)sv->desired_setting, (char *)sv->variable, sv->size);
-      free (sv->desired_setting);
-    }
-  else
-    *(sv->variable) = (int)sv->desired_setting;
+ if (sv->size == sizeof (int))
+   *(int *)(sv->variable) = sv->desired_setting.i;
+ else if (sv->size == sizeof (short))
+   *(short *)(sv->variable) = sv->desired_setting.s;
+ else if (sv->size == sizeof (char *))
+   *(char **)(sv->variable) = sv->desired_setting.p;
+ else {
+     FASTCOPY ((char *)sv->desired_setting.p, (char *)sv->variable, sv->size);
+     free (sv->desired_setting.p);
+ }

   free (sv);
 }
@@ -312,19 +316,22 @@
 void
 unwind_protect_var (var, value, size)
      int *var;
-     char *value;
+     UWP *value;
      int size;
 {
   SAVED_VAR *s = (SAVED_VAR *)xmalloc (sizeof (SAVED_VAR));

   s->variable = var;
-  if (size != sizeof (int))
-    {
-      s->desired_setting = (char *)xmalloc (size);
-      FASTCOPY (value, (char *)s->desired_setting, size);
-    }
-  else
-    s->desired_setting = value;
+  if (size == sizeof (int)) {
+    s->desired_setting.i = value->i;
+  } else if (size == sizeof (short)) {
+    s->desired_setting.s = value->s;
+  } else if (size == sizeof (char *)) {
+    s->desired_setting.p = value->p;
+  } else {
+       s->desired_setting.p = (char *)xmalloc (size);
+       FASTCOPY (value, (char *)s->desired_setting.p, size);
+  }
   s->size = size;
   add_unwind_protect ((Function *)restore_variable, (char *)s);
 }
