http://packetstormsecurity.org/UNIX/admin/xscreensaver-4.01.tar.gz
[xscreensaver] / hacks / strange.c
index a1bda34f70ad7ef277fc405f86b84e81d74164c4..f8f88a663c4ab5fe95e6509fd42422a15d37d1f8 100644 (file)
@@ -1,11 +1,13 @@
-/* -*- Mode: C; tab-width: 4 -*-
- * strange --- Strange attractors are not so hard to find...
- */
+/* -*- Mode: C; tab-width: 4 -*- */
+/* strange --- strange attractors */
+
 #if !defined( lint ) && !defined( SABER )
-static const char sccsid[] = "@(#)strange.c       4.02 97/04/01 xlockmore";
+static const char sccsid[] = "@(#)strange.c    5.00 2000/11/01 xlockmore";
+
 #endif
 
-/* Copyright (c) 1997 by Massimino Pascal (Pascal.Massimon@ens.fr)
+/*-
+ * Copyright (c) 1997 by Massimino Pascal <Pascal.Massimon@ens.fr>
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation for any purpose and without fee is hereby granted,
@@ -20,28 +22,41 @@ static const char sccsid[] = "@(#)strange.c    4.02 97/04/01 xlockmore";
  * other special, indirect and consequential damages.
  *
  * Revision History:
- * 30-Jul-98: sineswiper@resonatorsoft.com: added curve factor (discovered
- *         while experimenting with the Gauss_Rand function).
- * 10-May-97: jwz@jwz.org: turned into a standalone program.
- *                       Made it render into an offscreen bitmap and then copy
- *                       that onto the screen, to reduce flicker.
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: jwz@jwz.org: turned into a standalone program.
+ *              Made it render into an offscreen bitmap and then copy
+ *              that onto the screen, to reduce flicker.
+ *
+ * strange attractors are not so hard to find...
  */
 
 #ifdef STANDALONE
-# define PROGCLASS                                     "Strange"
-# define HACK_INIT                                     init_strange
-# define HACK_DRAW                                     draw_strange
-# define strange_opts                          xlockmore_opts
-# define DEFAULTS      "*delay:                2000  \n"                       \
-                                       "*ncolors:              100   \n"
-# define SMOOTH_COLORS
-# include "xlockmore.h"                                /* from the xscreensaver distribution */
-#else  /* !STANDALONE */
-# include "xlock.h"                                    /* from the xlockmore distribution */
+#define MODE_strange
+#define PROGCLASS "Strange"
+#define HACK_INIT init_strange
+#define HACK_DRAW draw_strange
+#define strange_opts xlockmore_opts
+#define DEFAULTS "*delay: 2000 \n" \
+ "*ncolors: 100 \n"
+#define SMOOTH_COLORS
+#include "xlockmore.h"         /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+#include "xlock.h"             /* from the xlockmore distribution */
 #endif /* !STANDALONE */
 
-/*****************************************************/
-/*****************************************************/
+#ifdef MODE_strange
+
+ModeSpecOpt strange_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct   strange_description =
+{"strange", "init_strange", "draw_strange", "release_strange",
+ "init_strange", "init_strange", (char *) NULL, &strange_opts,
+ 1000, 1, 1, 1, 64, 1.0, "",
+ "Shows strange attractors", 0, NULL};
+
+#endif
 
 typedef float DBL;
 typedef int PRM;
@@ -55,52 +70,33 @@ typedef int PRM;
 #define DBL_To_PRM(x)  (PRM)( (DBL)(UNIT)*(x) )
 
 
-#define DO_FOLD(a) (a)<0 ? -Fold[ (-(a))&(UNIT2-1) ] : Fold[ (a)&(UNIT2-1) ]
+#define DO_FOLD(a) (a)<0 ? -A->Fold[ (-(a))&(UNIT2-1) ] : A->Fold[ (a)&(UNIT2-1) ]
 
-/* 
-   #define DO_FOLD(a) (a)<-UNIT2 ? -Fold[(-(a))%UNIT2] : (a)<0 ? -Fold[ -(a) ] 
-
-   :  \ (a)>UNIT2 ? Fold[ (a)%UNIT2 ] : Fold[ (a) ] */
-/* #define DO_FOLD(a) DBL_To_PRM( sin( (DBL)(a)/UNIT ) ) */
-/* 
-   #define DO_FOLD(a) (a)<0 ? DBL_To_PRM( exp( 16.0*(a)/UNIT2 ) )-1.0 : \
-   DBL_To_PRM( 1.0-exp( -16.0*(a)/UNIT2 ) ) */
+#if 0
+#define DO_FOLD(a) (a)<-UNIT2 ? -A->Fold[(-(a))%UNIT2] : (a)<0 ? -A->Fold[ -(a) ] :\
+(a)>UNIT2 ? A->Fold[ (a)%UNIT2 ] : A->Fold[ (a) ]
+#define DO_FOLD(a) DBL_To_PRM( sin( (DBL)(a)/UNIT ) )
+#define DO_FOLD(a) (a)<0 ? DBL_To_PRM( exp( 16.0*(a)/UNIT2 ) )-1.0 : \
+DBL_To_PRM( 1.0-exp( -16.0*(a)/UNIT2 ) )
+#endif
 
 /******************************************************************/
 
 #define MAX_PRM 3*5
 
-typedef struct {
+typedef struct _ATTRACTOR {
        DBL         Prm1[MAX_PRM], Prm2[MAX_PRM];
-       void        (*Iterate) (PRM, PRM, PRM *, PRM *);
+       PRM         Prm[MAX_PRM], *Fold;
+       void        (*Iterate) (struct _ATTRACTOR *, PRM, PRM, PRM *, PRM *);
        XPoint     *Buffer1, *Buffer2;
        int         Cur_Pt, Max_Pt;
        int         Col, Count, Speed;
        int         Width, Height;
-    Pixmap      dbuf;  /* jwz */
-    GC          dbuf_gc;
+       Pixmap      dbuf;       /* jwz */
+       GC          dbuf_gc;
 } ATTRACTOR;
 
-static ATTRACTOR *Root;
-static PRM  xmin, xmax, ymin, ymax;
-static PRM  Prm[MAX_PRM];
-static PRM *Fold = NULL;
-
-static int curve;
-
-static XrmOptionDescRec opts[] =
-{
-       {"-curve", ".strange.curve", XrmoptionSepArg, (caddr_t) "10"},
-};
-static OptionStruct desc[] =
-{
-       {"-curve", "set the curve factor of the attractors"},
-};
-
-ModeSpecOpt strange_opts = { 1, opts, 0, NULL, desc };
-
-/******************************************************************/
-/******************************************************************/
+static ATTRACTOR *Root = (ATTRACTOR *) NULL; 
 
 static DBL  Amp_Prm[MAX_PRM] =
 {
@@ -118,11 +114,10 @@ static DBL  Mid_Prm[MAX_PRM] =
 static      DBL
 Gauss_Rand(DBL c, DBL A, DBL S)
 {
-       DBL         y,z;
+       DBL         y;
 
        y = (DBL) LRAND() / MAXRAND;
-       z = curve / 10;
-       y = A * (z - exp(-y * y * S)) / (z - exp(-S));
+       y = A * (1.0 - exp(-y * y * S)) / (1.0 - exp(-S));
        if (NRAND(2))
                return (c + y);
        else
@@ -143,7 +138,7 @@ Random_Prm(DBL * Prm)
    /* 2 examples of non-linear map */
 
 static void
-Iterate_X2(PRM x, PRM y, PRM * xo, PRM * yo)
+Iterate_X2(ATTRACTOR * A, PRM x, PRM y, PRM * xo, PRM * yo)
 {
        PRM         xx, yy, xy, x2y, y2x, Tmp;
 
@@ -153,16 +148,16 @@ Iterate_X2(PRM x, PRM y, PRM * xo, PRM * yo)
        y2x = (yy * x) / UNIT;
        xy = (x * y) / UNIT;
 
-       Tmp = Prm[1] * xx + Prm[2] * xy + Prm[3] * yy + Prm[4] * x2y;
-       Tmp = Prm[0] - y + (Tmp / UNIT);
+       Tmp = A->Prm[1] * xx + A->Prm[2] * xy + A->Prm[3] * yy + A->Prm[4] * x2y;
+       Tmp = A->Prm[0] - y + (Tmp / UNIT);
        *xo = DO_FOLD(Tmp);
-       Tmp = Prm[6] * xx + Prm[7] * xy + Prm[8] * yy + Prm[9] * y2x;
-       Tmp = Prm[5] + x + (Tmp / UNIT);
+       Tmp = A->Prm[6] * xx + A->Prm[7] * xy + A->Prm[8] * yy + A->Prm[9] * y2x;
+       Tmp = A->Prm[5] + x + (Tmp / UNIT);
        *yo = DO_FOLD(Tmp);
 }
 
 static void
-Iterate_X3(PRM x, PRM y, PRM * xo, PRM * yo)
+Iterate_X3(ATTRACTOR * A, PRM x, PRM y, PRM * xo, PRM * yo)
 {
        PRM         xx, yy, xy, x2y, y2x, Tmp_x, Tmp_y, Tmp_z;
 
@@ -172,60 +167,85 @@ Iterate_X3(PRM x, PRM y, PRM * xo, PRM * yo)
        y2x = (yy * x) / UNIT;
        xy = (x * y) / UNIT;
 
-       Tmp_x = Prm[1] * xx + Prm[2] * xy + Prm[3] * yy + Prm[4] * x2y;
-       Tmp_x = Prm[0] - y + (Tmp_x / UNIT);
+       Tmp_x = A->Prm[1] * xx + A->Prm[2] * xy + A->Prm[3] * yy + A->Prm[4] * x2y;
+       Tmp_x = A->Prm[0] - y + (Tmp_x / UNIT);
        Tmp_x = DO_FOLD(Tmp_x);
 
-       Tmp_y = Prm[6] * xx + Prm[7] * xy + Prm[8] * yy + Prm[9] * y2x;
-       Tmp_y = Prm[5] + x + (Tmp_y / UNIT);
+       Tmp_y = A->Prm[6] * xx + A->Prm[7] * xy + A->Prm[8] * yy + A->Prm[9] * y2x;
+       Tmp_y = A->Prm[5] + x + (Tmp_y / UNIT);
 
        Tmp_y = DO_FOLD(Tmp_y);
 
-       Tmp_z = Prm[11] * xx + Prm[12] * xy + Prm[13] * yy + Prm[14] * y2x;
-       Tmp_z = Prm[10] + x + (Tmp_z / UNIT);
+       Tmp_z = A->Prm[11] * xx + A->Prm[12] * xy + A->Prm[13] * yy + A->Prm[14] * y2x;
+       Tmp_z = A->Prm[10] + x + (Tmp_z / UNIT);
        Tmp_z = UNIT + Tmp_z * Tmp_z / UNIT;
 
        *xo = (Tmp_x * UNIT) / Tmp_z;
        *yo = (Tmp_y * UNIT) / Tmp_z;
 }
 
-static void (*Funcs[2]) (PRM, PRM, PRM *, PRM *) = {
+static void (*Funcs[2]) (ATTRACTOR *, PRM, PRM, PRM *, PRM *) = {
        Iterate_X2, Iterate_X3
 };
 
 /***************************************************************/
 
+static void
+free_strange(Display *display, ATTRACTOR *A)
+{
+       if (A->Buffer1 != NULL) {
+               (void) free((void *) A->Buffer1);
+               A->Buffer1 = (XPoint *) NULL;
+       }
+       if (A->Buffer2 != NULL) {
+               (void) free((void *) A->Buffer2);
+               A->Buffer2 = (XPoint *) NULL;
+       }
+       if (A->dbuf) {
+               XFreePixmap(display, A->dbuf);
+               A->dbuf = None;
+       }
+       if (A->dbuf_gc) {
+               XFreeGC(display, A->dbuf_gc);
+               A->dbuf_gc = None;
+       }
+       if (A->Fold != NULL) {
+               (void) free((void *) A->Fold);
+               A->Fold = (PRM *) NULL;
+       }
+}
+
 void
 draw_strange(ModeInfo * mi)
 {
-       int         i, j, n, Max_Colors, Cur_Pt;
+       int         i, j, n, Cur_Pt;
        PRM         x, y, xo, yo;
        DBL         u;
-       ATTRACTOR  *A;
        XPoint     *Buf;
-       Display    *display;
-       GC          gc;
-       Window      window;
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
        DBL         Lx, Ly;
-       void        (*Iterate) (PRM, PRM, PRM *, PRM *);
-
-       display = MI_DISPLAY(mi);
-       window = MI_WINDOW(mi);
-       gc = MI_GC(mi);
-       Max_Colors = MI_NPIXELS(mi);
+       void        (*Iterate) (ATTRACTOR *, PRM, PRM, PRM *, PRM *);
+       PRM         xmin, xmax, ymin, ymax;
+       ATTRACTOR  *A;
 
+       if (Root == NULL)
+               return;
        A = &Root[MI_SCREEN(mi)];
+       if (A->Fold == NULL)
+               return;
 
        Cur_Pt = A->Cur_Pt;
        Iterate = A->Iterate;
 
        u = (DBL) (A->Count) / 1000.0;
        for (j = MAX_PRM - 1; j >= 0; --j)
-               Prm[j] = DBL_To_PRM((1.0 - u) * A->Prm1[j] + u * A->Prm2[j]);
+               A->Prm[j] = DBL_To_PRM((1.0 - u) * A->Prm1[j] + u * A->Prm2[j]);
 
        x = y = DBL_To_PRM(.0);
        for (n = SKIP_FIRST; n; --n) {
-               (*Iterate) (x, y, &xo, &yo);
+               (*Iterate) (A, x, y, &xo, &yo);
                x = xo + NRAND(8) - 4;
                y = yo + NRAND(8) - 4;
        }
@@ -239,9 +259,9 @@ draw_strange(ModeInfo * mi)
        Lx = (DBL) A->Width / UNIT / 2.2;
        Ly = (DBL) A->Height / UNIT / 2.2;
        for (n = A->Max_Pt; n; --n) {
-               (*Iterate) (x, y, &xo, &yo);
-               Buf->x = (short) (Lx * (x + DBL_To_PRM(1.1)));
-               Buf->y = (short) (Ly * (DBL_To_PRM(1.1) - y));
+               (*Iterate) (A, x, y, &xo, &yo);
+               Buf->x = (int) (Lx * (x + DBL_To_PRM(1.1)));
+               Buf->y = (int) (Ly * (DBL_To_PRM(1.1) - y));
                /* (void) fprintf( stderr, "X,Y: %d %d    ", Buf->x, Buf->y ); */
                Buf++;
                A->Cur_Pt++;
@@ -257,34 +277,30 @@ draw_strange(ModeInfo * mi)
                y = yo + NRAND(8) - 4;
        }
 
-       XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+       MI_IS_DRAWN(mi) = True;
 
-       if (A->dbuf)    /* jwz */
-         {
-               XSetForeground(display, A->dbuf_gc, 0);
-/*         XDrawPoints(display, A->dbuf, A->dbuf_gc, A->Buffer1,
-                                   Cur_Pt,CoordModeOrigin);*/
-               XFillRectangle(display, A->dbuf, A->dbuf_gc, 0,0, A->Width, A->Height);
-         }
-       else
-         XDrawPoints(display, window, gc, A->Buffer1, Cur_Pt, CoordModeOrigin);
+       XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
 
-       if (Max_Colors < 2)
-               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+       if (A->dbuf != None) {          /* jwz */
+               XSetForeground(display, A->dbuf_gc, 0);
+/* XDrawPoints(display, A->dbuf, A->dbuf_gc, A->Buffer1,
+   Cur_Pt,CoordModeOrigin); */
+               XFillRectangle(display, A->dbuf, A->dbuf_gc, 0, 0, A->Width, A->Height);
+       } else
+               XDrawPoints(display, window, gc, A->Buffer1, Cur_Pt, CoordModeOrigin);
+
+       if (MI_NPIXELS(mi) < 2)
+               XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
        else
-               XSetForeground(display, gc, MI_PIXEL(mi, A->Col % Max_Colors));
+               XSetForeground(display, gc, MI_PIXEL(mi, A->Col % MI_NPIXELS(mi)));
 
-       if (A->dbuf)
-         {
+       if (A->dbuf != None) {
                XSetForeground(display, A->dbuf_gc, 1);
                XDrawPoints(display, A->dbuf, A->dbuf_gc, A->Buffer2, A->Cur_Pt,
-                                       CoordModeOrigin);
-         }
-       else
-         XDrawPoints(display, window, gc, A->Buffer2, A->Cur_Pt, CoordModeOrigin);
-
-       if (A->dbuf)
-         XCopyPlane(display, A->dbuf, window, gc, 0,0,A->Width,A->Height,0,0, 1);
+                           CoordModeOrigin);
+               XCopyPlane(display, A->dbuf, window, gc, 0, 0, A->Width, A->Height, 0, 0, 1);
+       } else
+               XDrawPoints(display, window, gc, A->Buffer2, A->Cur_Pt, CoordModeOrigin);
 
        Buf = A->Buffer1;
        A->Buffer1 = A->Buffer2;
@@ -309,23 +325,26 @@ draw_strange(ModeInfo * mi)
 void
 init_strange(ModeInfo * mi)
 {
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
        ATTRACTOR  *Attractor;
 
-       curve = get_integer_resource ("curve", "Integer");
-       if (curve <= 0) curve = 10;
-
        if (Root == NULL) {
-               Root = (ATTRACTOR *) calloc(
-                                    MI_NUM_SCREENS(mi), sizeof (ATTRACTOR));
-               if (Root == NULL)
+               if ((Root = (ATTRACTOR *) calloc(MI_NUM_SCREENS(mi),
+                               sizeof (ATTRACTOR))) == NULL)
                        return;
        }
-       if (Fold == NULL) {
+       Attractor = &Root[MI_SCREEN(mi)];
+
+       if (Attractor->Fold == NULL) {
                int         i;
 
-               Fold = (PRM *) calloc(UNIT2 + 1, sizeof (PRM));
-               if (Fold == NULL)
+               if ((Attractor->Fold = (PRM *) calloc(UNIT2 + 1,
+                               sizeof (PRM))) == NULL) {
+                       free_strange(display, Attractor);
                        return;
+               }
                for (i = 0; i <= UNIT2; ++i) {
                        DBL         x;
 
@@ -336,21 +355,25 @@ init_strange(ModeInfo * mi)
                        /* x = x*(1.0-x)*4.0; */
                        x = (DBL) (i) / UNIT;
                        x = sin(x);
-                       Fold[i] = DBL_To_PRM(x);
+                       Attractor->Fold[i] = DBL_To_PRM(x);
                }
        }
-       Attractor = &Root[MI_SCREEN(mi)];
-
-       Attractor->Buffer1 = (XPoint *) calloc(MAX_POINTS, sizeof (XPoint));
        if (Attractor->Buffer1 == NULL)
-               goto Abort;
-       Attractor->Buffer2 = (XPoint *) calloc(MAX_POINTS, sizeof (XPoint));
+               if ((Attractor->Buffer1 = (XPoint *) calloc(MAX_POINTS,
+                               sizeof (XPoint))) == NULL) {
+                       free_strange(display, Attractor);
+                       return;
+               }
        if (Attractor->Buffer2 == NULL)
-               goto Abort;
+               if ((Attractor->Buffer2 = (XPoint *) calloc(MAX_POINTS,
+                               sizeof (XPoint))) == NULL) {
+                       free_strange(display, Attractor);
+                       return;
+               }
        Attractor->Max_Pt = MAX_POINTS;
 
-       Attractor->Width = MI_WIN_WIDTH(mi);
-       Attractor->Height = MI_WIN_HEIGHT(mi);
+       Attractor->Width = MI_WIDTH(mi);
+       Attractor->Height = MI_HEIGHT(mi);
        Attractor->Cur_Pt = 0;
        Attractor->Count = 0;
        Attractor->Col = NRAND(MI_NPIXELS(mi));
@@ -359,37 +382,41 @@ init_strange(ModeInfo * mi)
        Attractor->Iterate = Funcs[NRAND(2)];
        Random_Prm(Attractor->Prm1);
        Random_Prm(Attractor->Prm2);
+#ifndef NO_DBUF
+       if (Attractor->dbuf != None)
+               XFreePixmap(display, Attractor->dbuf);
+       Attractor->dbuf = XCreatePixmap(display, window,
+            Attractor->Width, Attractor->Height, 1);
+       /* Allocation checked */
+       if (Attractor->dbuf != None) {
+               XGCValues   gcv;
 
-       Attractor->dbuf = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi),
-                                                                       Attractor->Width, Attractor->Height, 1);
-       if (Attractor->dbuf)
-         {
-               XGCValues gcv;
                gcv.foreground = 0;
                gcv.background = 0;
+               gcv.graphics_exposures = False;
                gcv.function = GXcopy;
-               Attractor->dbuf_gc = XCreateGC(MI_DISPLAY(mi), Attractor->dbuf,
-                                                                          GCForeground|GCBackground|GCFunction,
-                                                                          &gcv);
-               XFillRectangle(MI_DISPLAY(mi), Attractor->dbuf,
-                                          Attractor->dbuf_gc, 0,0, Attractor->Width,
-                                          Attractor->Height);
-               XSetBackground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
-               XSetFunction(MI_DISPLAY(mi), MI_GC(mi), GXcopy);
-         }
-
-       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
-       return;
-
-      Abort:
-       if (Attractor->Buffer1 != NULL)
-               free(Attractor->Buffer1);
-       if (Attractor->Buffer2 != NULL)
-               free(Attractor->Buffer2);
-       Attractor->Buffer1 = NULL;
-       Attractor->Buffer2 = NULL;
-       Attractor->Cur_Pt = 0;
-       return;
+
+               if (Attractor->dbuf_gc != None)
+                       XFreeGC(display, Attractor->dbuf_gc);
+
+               if ((Attractor->dbuf_gc = XCreateGC(display, Attractor->dbuf,
+                               GCForeground | GCBackground | GCGraphicsExposures | GCFunction,
+                               &gcv)) == None) {
+                       XFreePixmap(display, Attractor->dbuf);
+                       Attractor->dbuf = None;
+               } else {
+                       XFillRectangle(display, Attractor->dbuf, Attractor->dbuf_gc,
+                               0, 0, Attractor->Width, Attractor->Height);
+                       XSetBackground(display, gc, MI_BLACK_PIXEL(mi));
+                       XSetFunction(display, gc, GXcopy);
+               }
+       }
+#endif
+
+       MI_CLEARWINDOW(mi);
+
+       /* Do not want any exposure events from XCopyPlane */
+       XSetGraphicsExposures(display, MI_GC(mi), False);
 }
 
 /***************************************************************/
@@ -397,24 +424,14 @@ init_strange(ModeInfo * mi)
 void
 release_strange(ModeInfo * mi)
 {
-       int         i;
+       if (Root != NULL) {
+               int         screen;
 
-       if (Root == NULL)
-               return;
-
-       for (i = 0; i < MI_NUM_SCREENS(mi); ++i) {
-               if (Root[i].Buffer1 != NULL)
-                       free(Root[i].Buffer1);
-               if (Root[i].Buffer2 != NULL)
-                       free(Root[i].Buffer2);
-               if (Root[i].dbuf)
-                   XFreePixmap(MI_DISPLAY(mi), Root[i].dbuf);
-               if (Root[i].dbuf_gc)
-                   XFreeGC(MI_DISPLAY(mi), Root[i].dbuf_gc);
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); ++screen)
+                       free_strange(MI_DISPLAY(mi), &Root[screen]);
+               (void) free((void *) Root);
+               Root = (ATTRACTOR *) NULL; 
        }
-       free(Root);
-       Root = NULL;
-       if (Fold != NULL)
-               free(Fold);
-       Fold = NULL;
 }
+
+#endif /* MODE_strange */