Compiling Grass 5.0 beta (final) on IRIX6.5

Ok, I finally managed to start this thing compiling
under IRIX6.5 using the native cc compiler, and I ran
into a few minor snags. Nothing terminal, just some
gcc specific extensions and a few casting abiguities.
The diff outputs are included below. I'm not 100%
certain about some of the changes, but this at least
compiled and let me get on about my business.

That is, until I got to
src.contrib/CERL/raster/r.rational.regression,
which looks like its Not Quite Ready for Ansi.
At that point, the compilation dies a horrible
flaming death. the errors are included after the
diffs, below.

General comments:

1) The __attribute__ ((__noreturn__)) feature is
gnu specific, and probably won't work on any other
compilers. A check should be added to configure,
and either "#ifdef __GNUC_MINOR__" (as below), or
do a "#define __attribute__(x)" where unsupported.

2) The configure script should see which *roff is
installed on the machine. An "NROFF = @nroff@"
can be thrown in the top level makefile, and man
page processing should be done using "$(NROFF)"

3) The compiler did generate a large number of
additional warnings, and I have the compilation
log in its entirety for anyone who may be
interested that kind of thing.

##################################################################
emitchell@orion [/opt/grass/grass5.0beta/src/include] - 3 > diff -u gisdefs.h.orig gisdefs.h
--- gisdefs.h.orig Wed Dec 29 10:10:23 1999
+++ gisdefs.h Wed Mar 8 20:25:41 2000
@@ -275,7 +275,11 @@
int G__create_alt_env(void);
int G__switch_env(void);
/* error.c */
+#ifdef __GNUC_MINOR__
int G_fatal_error(char *,...) __attribute__ ((__noreturn__));
+#else
+int G_fatal_error(char *,...);
+#endif
int G_warning(char *,...);
int G_suppress_warnings(int);
int G_sleep_on_error(int);
emitchell@orion [/opt/grass/grass5.0beta/src/display/devices/lib] - 22 > diff -u SWITCHER.c.orig
SWITCHER.c
--- SWITCHER.c.orig Wed Mar 8 20:32:29 2000
+++ SWITCHER.c Wed Mar 8 20:32:52 2000
@@ -556,7 +556,7 @@
                 xarray = (int *) xalloc (xarray, &n_xarray, x, sizeof (*xarray));
                 REC (xarray, x * sizeof (*xarray)) ;
                if (index !=0) index = 1 ;
- Raster_int(x, y, xarray, index, 1) ;
+ Raster_int(x, y, (unsigned int *) xarray, index, 1) ;
                 break ;
             case RGB_RASTER:
                 REC (&x, sizeof x) ;
@@ -896,10 +896,13 @@

static int rec(void *buf,int n)
{
+ char *cbuf = buf;
     int stat;
- while (n-- > 0)
- if ((stat=get1(((char* )buf)++)) != 0)
+ while (n-- > 0) {
+
+ if ((stat=get1(cbuf++)) != 0)
            return stat; /* EOF or COMMAND_ESC */
+ }
     return 0;
}
emitchell@orion [/opt/grass/grass5.0beta/src/display/devices/lib] - 32 > diff -u font.c.orig
font.c
--- font.c.orig Wed Mar 8 20:36:33 2000
+++ font.c Wed Mar 8 20:37:22 2000
@@ -115,8 +115,9 @@

static int X_copy (int *a,char *b, int n)
{
+ char *ca = a;
      while (n-- > 0)
- (char)*a++ = *b++;
+ *ca++ = *b++;

      return 0;
}
emitchell@orion [/opt/grass/grass5.0beta/src/display/d.rast.edit] - 39 > diff -u edit.h.orig
edit.h
--- edit.h.orig Wed Mar 8 20:44:20 2000
+++ edit.h Wed Mar 8 20:45:02 2000
@@ -62,7 +62,11 @@
/* main.c */
int do_edit(int, int, double);
int error(int, char [128]);
+#ifdef __GNUC_MINOR__
int ext(void) __attribute__ ((__noreturn__));
+#else
+int ext(void);
+#endif
/* menu.c */
int main_menu(void);
int option_menu(void);
emitchell@orion [/opt/grass/grass5.0beta/src/include] - 46 > diff -u config.h.gen config.h
--- config.h.gen Wed Mar 8 20:52:33 2000
+++ config.h Wed Mar 8 20:52:40 2000
@@ -62,7 +62,7 @@
/* #undef uid_t */

/* define curses.h WINDOW structure component */
-#define CURSES_MAXY NONE
+#define CURSES_MAXY _maxy

/* define if ftime() exists */
#define HAVE_FTIME 1
emitchell@orion [/opt/grass/grass5.0beta/src/general/g.setproj] - 53 > diff -u
local_proto.h.orig local_proto.h
--- local_proto.h.orig Wed Mar 8 20:55:15 2000
+++ local_proto.h Wed Mar 8 20:55:38 2000
@@ -25,7 +25,12 @@
int ask_fips(FILE *, int *, int *, int *);
/* main.c */
int min1(int, int);
+#ifdef __GNUC_MINOR__
int leave(int) __attribute__ ((__noreturn__));
+#else
+int leave(int);
+#endif
+
/* table.c */
int init_table(void);
int get_proj_index(char *);
emitchell@orion [/opt/grass/grass5.0beta/src/general/g.version] - 74 > diff -u main.c.orig
main.c
--- main.c.orig Wed Mar 8 21:03:40 2000
+++ main.c Wed Mar 8 21:04:18 2000
@@ -1,9 +1,11 @@
#include <stdio.h>

+#define QUOTE(x) #x
+
int main(int argc, char *argv)
{
     fprintf (stdout, "GRASS %s (%s) %s\n",
- VERSION_NUMBER, VERSION_DATE, VERSION_UPDATE_PKG );
+ QUOTE(VERSION_NUMBER), QUOTE(VERSION_DATE), QUOTE(VERSION_UPDATE_PKG) );
     fprintf (stdout, "\n");
     fprintf (stdout, "Copyright and License Statement\n");
     fprintf (stdout, "\n");
emitchell@orion [/opt/grass/grass5.0beta/src/general/g.version] - 75 > diff -u Gmakefile.orig
Gmakefile
--- Gmakefile.orig Wed Mar 8 21:00:20 2000
+++ Gmakefile Wed Mar 8 21:05:23 2000
@@ -1,5 +1,5 @@
PGM=g.version
-EXTRA_CFLAGS=-DVERSION_NUMBER="\"$(VERSION_NUMBER)\"" -DVERSION_DATE="\"$(VERSION_DATE)\""
-DVERSION_UPDATE_PKG="\"$(VERSION_UPDATE_PKG)\""
+EXTRA_CFLAGS=-DVERSION_NUMBER="$(VERSION_NUMBER)" -DVERSION_DATE="$(VERSION_DATE)"
-DVERSION_UPDATE_PKG="$(VERSION_UPDATE_PKG)"

$(BIN_MAIN_INTER)/$(PGM): main.o
        $(CC) $(LDFLAGS) $(MATHLIB) $(XDRLIB) -o $@ main.o
emitchell@orion [/opt/grass/grass5.0beta/src/imagery/i.class] - 81 > diff -u local_proto.h.orig
local_proto.h
--- local_proto.h.orig Wed Mar 8 21:09:14 2000
+++ local_proto.h Wed Mar 8 21:09:56 2000
@@ -97,7 +97,11 @@
int nstd225(void);
int nstd250(void);
/* main.c */
+#ifdef __GNUC_MINOR__
void quit(void) __attribute__ ((__noreturn__));
+#else
+void quit(void);
+#endif
int error(char *, int);
/* mouse.c */
int Mouse_pointer(int *, int *, int *);
emitchell@orion [/opt/grass/grass5.0beta/src/imagery/i.colors] - 87 > diff -u main.c.orig main.c
--- main.c.orig Wed Mar 8 21:12:45 2000
+++ main.c Wed Mar 8 21:13:06 2000
@@ -5,7 +5,11 @@
#include "globals.h"
#include "local_proto.h"

+#ifdef __GNUC_MINOR
static void quit (int) __attribute__ ((__noreturn__));
+#else
+static void quit (int);
+#endif
static int error(char *,int);

int main (int argc, char *argv)
emitchell@orion [/opt/grass/grass5.0beta/src/imagery/i.in.erdas] - 92 > diff -u main.c.orig
main.c
--- main.c.orig Wed Mar 8 21:15:33 2000
+++ main.c Wed Mar 8 21:16:03 2000
@@ -545,7 +545,7 @@
         if (!(swapflag->answer || autoswapflag->answer))
         {
                ActuallySwap = 0;
- if ((erdashd.pack == 256 ) || (erdashd.pack == 512 )) // 1 or 2 byte-swapped
+ if ((erdashd.pack == 256 ) || (erdashd.pack == 512 )) /* 1 or 2 byte-swapped */
                        ActuallySwap = 1 ;
                if (erdashd.pack == 0)
                {
emitchell@orion [/opt/grass/grass5.0beta/src/imagery/i.ortho.photo/photo.2image] - 97 > diff -u
globals.h.orig globals.h
--- globals.h.orig Wed Mar 8 21:18:21 2000
+++ globals.h Wed Mar 8 21:19:17 2000
@@ -144,7 +144,11 @@
int Menu_msg(char *);
int Start_mouse_in_menu(void);
/* main.c */
+#ifdef __GNUC_MINOR__
int quit(int) __attribute__ ((__noreturn__));
+#else
+int quit(int);
+#endif
int error(char *, int);
/* mark.c */
int mark(int, int, int);
emitchell@orion [/opt/grass/grass5.0beta/src/imagery/i.ortho.photo/photo.2target] - 103 > diff
-u local_proto.h.orig local_proto.h
--- local_proto.h.orig Wed Mar 8 21:20:52 2000
+++ local_proto.h Wed Mar 8 21:21:56 2000
@@ -69,7 +69,11 @@
int Menu_msg(char *);
int Start_mouse_in_menu(void);
/* main.c */
+#ifdef __GNUC_MINOR__
int quit(int) __attribute__ ((__noreturn__));
+#else
+int quit(int);
+#endif
int error(char *, int);
/* mark.c */
int mark(int, int, int);
emitchell@orion [/opt/grass/grass5.0beta/src/imagery/i.points] - 109 > diff -u main.c.orig
main.c
--- main.c.orig Wed Mar 8 21:24:44 2000
+++ main.c Wed Mar 8 21:25:07 2000
@@ -6,7 +6,11 @@
#include "local_proto.h"
#include "raster.h"

+#ifdef __GNUC_MINOR__
int quit (int) __attribute__ ((__noreturn__));
+#else
+int quit (int);
+#endif
int error (char *, int);

int main (int argc, char *argv)
emitchell@orion [/opt/grass/grass5.0beta/src/imagery/i.vpoints] - 114 > diff -u globals.h.orig
globals.h
--- globals.h.orig Wed Mar 8 21:28:17 2000
+++ globals.h Wed Mar 8 21:28:31 2000
@@ -155,7 +155,11 @@
int Start_mouse_in_menu(void);
/* main.c */
int main(int, char *);
+#ifdef __GNUC_MINOR__
int quit(int) __attribute__ ((__noreturn__));
+#else
+int quit(int);
+#endif
int error(char *, int);
/* mark.c */
int mark(int, int, int);
emitchell@orion [/opt/grass/grass5.0beta/src/libes/geom/basic] - 119 > diff -u malloc.c.orig
malloc.c
--- malloc.c.orig Wed Mar 8 21:33:39 2000
+++ malloc.c Wed Mar 8 21:34:20 2000
@@ -8,6 +8,10 @@
#include <sys/types.h>
#endif

+#ifdef sgi
+#include <malloc.h> /* we need the M_DEBUG macro below */
+#endif
+
/*---------------------------------------------------------------------------*/

#define REPORT_THRESHOLD 1000000
emitchell@orion [/opt/grass/grass5.0beta/src/mapdev/v.geom/cmd] - 124 > diff -u Gmakefile.orig
Gmakefile
--- Gmakefile.orig Wed Mar 8 21:43:17 2000
+++ Gmakefile Wed Mar 8 21:43:51 2000
@@ -5,6 +5,10 @@

LIBES = $(VECTLIB) $(DIG_ATTLIB) $(GISLIB) $(TRIANGLIB)

+ifeq ($(shell uname),IRIX64)
+LIBES += -lmalloc
+endif
+
SOURCES = \
        main.c

emitchell@orion [/opt/grass/grass5.0beta/src/paint/Interface/driverlib] - 129 > diff -u
interface.c.orig interface.c
--- interface.c.orig Wed Mar 8 21:48:06 2000
+++ interface.c Wed Mar 8 21:48:59 2000
@@ -363,16 +363,17 @@
static int rec (void *buf,int n)
{
     int i;
+ char *cbuf = buf;

     while (n > 0)
     {
- i = read (0, buf, n);
+ i = read (0, cbuf, n);

        if (i == 0)
            paint_error ("unexpected EOF");
        if (i < 0)
            paint_error ("read error");
- (char *)buf += i;
+ cbuf += i;
        n -= i;
     }
emitchell@orion [/opt/grass/grass5.0beta/src/paint/Programs/p.map.new/cmd] - 134 > diff -u
scale.c.orig scale.c
--- scale.c.orig Wed Mar 8 21:51:53 2000
+++ scale.c Wed Mar 8 21:52:22 2000
@@ -24,7 +24,11 @@
#define MILES_TO_INCHES ((double)5280*12)

static double do_scale (struct Cell_head *, int, int, char *);
+#ifdef __GNUC_MINOR__
static int OOPS (void) __attribute__ ((__noreturn__));
+#else
+static int OOPS (void);
+#endif

int scale (struct Cell_head *window, int panel, int margin, char *text)
{
emitchell@orion [/opt/grass/grass5.0beta/src/ps.map/ps.map/cmd] - 139 > diff -u scale.c.orig
scale.c
--- scale.c.orig Wed Mar 8 21:53:48 2000
+++ scale.c Wed Mar 8 21:54:28 2000
@@ -13,7 +13,11 @@
#define MILES_TO_INCHES ((double)5280*12)
#define PWIDTH (PS.page_width-PS.left_marg-PS.right_marg)
static double do_scale(char *);
+#ifdef __GNUC_MINOR__
static int OOPS() __attribute__ ((__noreturn__));
+#else
+static int OOPS();
+#endif

double scale(char *text)
emitchell@orion [/opt/grass/grass5.0beta/src/raster/r.mapcalc/mapcalc] - 144 > diff -u
maps.c.orig maps.c
--- maps.c.orig Wed Mar 8 21:58:30 2000
+++ maps.c Wed Mar 8 22:00:44 2000
@@ -332,8 +332,9 @@
                    SETNULL_D(values);
                values++;
            }
+ values = vbuf;
            btree_update (btree, (char *)&key, sizeof(key),
- (char *)values = vbuf, sizeof(vbuf));
+ values, sizeof(vbuf));
        }

/* and finally lookup the translated value */
emitchell@orion [/opt/grass/grass5.0beta/src/raster/r.statistics/man] - 153 > diff -u
Gmakefile.orig Gmakefile
--- Gmakefile.orig Wed Mar 8 22:05:22 2000
+++ Gmakefile Wed Mar 8 22:05:58 2000
@@ -2,8 +2,14 @@
MDIR=$(SRC)/../man/man$(MSEC)
MUTL=$(SRC)/../man/utilities

+ifeq ($(shell uname),IRIX64)
+NROFF = groff
+else
+NROFF=nroff
+endif
+
man:
        -cp r.statistics.man $(MDIR)/r.statistics
- nroff $(MUTL)/man.version $(MDIR)/.class-header \
+ $(NROFF) $(MUTL)/man.version $(MDIR)/.class-header \
        $(MUTL)/man.header r.statistics.man $(MDIR)/.class-notice \
        > $(GISBASE)/man/$(MSEC)/r.statistics
emitchell@orion [/opt/grass/grass5.0beta/src/scripts/contrib/s.in.grid] - 158 > diff -u
Gmakefile.orig Gmakefile
--- Gmakefile.orig Wed Mar 8 22:09:42 2000
+++ Gmakefile Wed Mar 8 22:09:54 2000
@@ -16,6 +16,11 @@
MDIR=$(SRC)/../man/man$(MSEC)
MUTL=$(SRC)/../man/utilities

+ifeq ($(shell uname),IRIX64)
+NROFF = groff
+else
+NROFF=nroff
+endif

all : $(PROG) man

@@ -26,7 +31,7 @@

man:
        -cp $(PGM).man $(MDIR)/$(PGM)
- nroff $(MUTL)/man.version $(MDIR)/.class-header \
+ $(NROFF) $(MUTL)/man.version $(MDIR)/.class-header \
         $(MUTL)/man.header $(PGM).man $(MDIR)/.class-notice \
         > $(GISBASE)/man/$(MSEC)/$(PGM)

emitchell@orion [/opt/grass/grass5.0beta/src/sites/s.kcv] - 165 > diff -u Gmakefile.orig
Gmakefile
--- Gmakefile.orig Wed Mar 8 22:16:35 2000
+++ Gmakefile Wed Mar 8 22:16:51 2000
@@ -11,6 +11,12 @@
        histo.o \
        utils.o

+ifeq ($(shell uname),IRIX64)
+NROFF = groff
+else
+NROFF=nroff
+endif
+
all: s.kcv man

s.kcv: $(BIN_CONTRIB_CMD)/s.kcv
@@ -20,7 +26,7 @@

man:
        -cp s.kcv.man $(MDIR)/s.kcv
- nroff $(MUTL)/man.version $(MDIR)/.class-header \
+ $(NROFF) $(MUTL)/man.version $(MDIR)/.class-header \
           $(MUTL)/man.header s.kcv.man $(MDIR)/.class-notice \
           > $(GISBASE)/man/$(MSEC)/s.kcv
lint:
emitchell@orion [/opt/grass/grass5.0beta/src.contrib/CERL/raster/r.out.mpeg] - 170 > diff -u
local_proto.h.orig local_proto.h
--- local_proto.h.orig Wed Mar 8 22:21:37 2000
+++ local_proto.h Wed Mar 8 22:22:00 2000
@@ -2,7 +2,6 @@
int load_files(void);
int use_r_out(void);
char **gee_wildfiles(char *, char *, int *);
-int parse_command(int, char *, char *, int *, int *, int *, int *);
/* write.c */
int write_ycc(char *, char *, char *, int, int, int *, int *, char *);
int write_ppm(char *, char *, char *, int, int, int *, int *, char *);
emitchell@orion [/opt/grass/grass5.0beta/src.contrib/CERL/raster/r.out.mpeg] - 172 > diff -u
main.c.orig main.c
--- main.c.orig Wed Mar 8 22:22:22 2000
+++ main.c Wed Mar 8 22:23:10 2000
@@ -38,6 +38,9 @@

#define USE_PPM

+int parse_command(int, char *, char *[MAXVIEWS][MAXIMAGES],
+ int *, int *, int *, int *);
+
int nrows, ncols, numviews, quality, quiet=0;
char *vfiles[MAXVIEWS][MAXIMAGES];
char outfile[BUFSIZ];
##################################################################
/opt/grass/grass5.0beta/src.contrib/CERL/raster/r.rational.regression
  make -f OBJ.mips-sgi-irix6.5/make.rules

make[1]: Entering directory `/opt/grass/grass5.0beta/src.contrib/CERL/raster/r.rational.regression'
rm -f OBJ.mips-sgi-irix6.5/xformation.o
cc -g -I/opt/grass/grass5.0beta/src/include -c xformation.c
"xformation.c", line 49: warning(1116): non-void function "normalization_x1"
          (declared at line 6) should return a value
  }
  ^
"xformation.c", line 101: warning(1116): non-void function "normalization_x2"
          (declared at line 53) should return a value
  }
  ^
"xformation.c", line 153: warning(1116): non-void function "ndvi" (declared at
          line 104) should return a value
  }
  ^
"xformation.c", line 209: warning(1116): non-void function "ndvi_intensity"
          (declared at line 156) should return a value
  }
  ^
"xformation.c", line 264: warning(1116): non-void function "ndvi_reflectance"
          (declared at line 211) should return a value
  }
  ^
"xformation.c", line 323: warning(1116): non-void function "rvi" (declared at
          line 268) should return a value
  }
  ^
"xformation.c", line 578: warning(1116): non-void function
          "nonlinear_linearization" (declared at line 327) should return a
          value
  }
  ^
"xformation.c", line 817: warning(1116): non-void function
          "nonlinear_linearization_NDVI" (declared at line 581) should return
          a value
  }
  ^
"xformation.c", line 969: warning(1551): variable "standard_residual_old" is
          used before its value is set
                  standard_residual, standard_residual_old);
                                     ^
"xformation.c", line 972: warning(1116): non-void function "relaxation"
          (declared at line 820) should return a value
  }
  ^
"xformation.c", line 984: error(1153): declaration is incompatible with
          previous "vector" (declared at line 12)
        y2=vector(ndata);
           ^
"xformation.c", line 984: error(1515): a value of type "int" cannot be
          assigned to an entity of type "double *"
        y2=vector(ndata);
          ^
"xformation.c", line 985: error(1515): a value of type "int" cannot be
          assigned to an entity of type "double *"
        epsilon=vector(ndata);
               ^
"xformation.c", line 1054: warning(1116): non-void function "prediction_linear"
          (declared at line 975) should return a value
  }
  ^
"xformation.c", line 1264: warning(1116): non-void function
          "prediction_linear_other" (declared at line 1058) should return a
          value
  }
  ^
"xformation.c", line 1280: error(1515): a value of type "int" cannot be
          assigned to an entity of type "double *"
        y2=vector(ndata);
          ^
"xformation.c", line 1281: error(1515): a value of type "int" cannot be
          assigned to an entity of type "double *"
        epsilon=vector(ndata);
               ^
"xformation.c", line 1351: warning(1116): non-void function
          "prediction_nonlinear" (declared at line 1270) should return a value
  }
  ^
"xformation.c", line 1527: warning(1116): non-void function
          "prediction_nonlinear_other" (declared at line 1358) should return a
          value
  }
  ^
5 errors detected in the compilation of "xformation.c".
make[1]: *** [OBJ.mips-sgi-irix6.5/xformation.o] Error 2
make[1]: Target `/opt/grass/etc/bin/contrib/cmd/r.rational.regression' not remade because of errors.
make[1]: Leaving directory `/opt/grass/grass5.0beta/src.contrib/CERL/raster/r.rational.regression'
GISGEN failure at STEP: src.contrib/CERL/raster/r.rational.regression
make: *** [do-install] Error 1
make: Target `install' not remade because of errors.

-- ebm
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=+
| Eric B. Mitchell mailto:emitchell@altaira.com |
| tel: (301) 809 - 3534 Altair Aerospace Corporation |
| tel: (800) 7 - ALTAIR 4201 Northview Dr. Suite 410 |
| fax: (301) 805 - 8122 Bowie, MD 20716 |
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=+
              ,___
          /"\ / o=\ /"""---===/
         / \_/ \__/ ---===/
         | //\ || /""TT""/ //\ || ||""\
         | // \ || || // \ || ||__/
         | //--==\ |L--/ || //--==\ || || "=,
          \ ---===/
           \____---===/

Hi Eric,

many thanks for your large set of patches!
I have applied all except one, they compile on
Linux. So I uploaded them to CVS.

General wish from my side:
If sending patches, please put them into a
separate file including the original CRs.
Here I had to adjust many linebreaks manually
within the diffs. Then patching would more easy :slight_smile:

Concerning the patches itself, I ran into troubles here:
src/raster/r.mapcalc/mapcalc/maps.c

gcc -g -O2 -I/home/neteler/ggg/src/include -c maps.c
maps.c: In function 'translate_from_cats':
maps.c:337: warning: passing arg 4 of 'btree_update' from incompatible
pointer type
-> this patch I did not apply (yet). Perhaps you can re-check it.

Modified patches:

src/raster/r.statistics/man/Gmakefile
-> here I modified ../Gmakefile not to compiler man/
as it is not required (the man section is already updated)

src/scripts/contrib/s.in.grid/Gmakefile
src/sites/s.kcv/Gmakefile
-> same thing, man is deactivated

Concerning ifeq ($(shell uname),IRIX64) statements:
If compiling on Solaris the ifeq statements cause troubles.
Therefore I hesitate to include them.
Solaris users: please send your comments on this.

Many thanks, Eric, you should find all patches except above
in CVS now. This will be good news for other IRIX users.

Kind regards

  Markus Neteler

-----------------------------------------------------------------
Geographisches Institut | Schneiderberg 50
  + Physische Geographie 30167 Hannover, Germany
  & Landschaftsoekologie + Tel: ++49-(0)511-762-4494
Universitaet Hannover Fax: ++49-(0)511-762-3984
                neteler@geog.uni-hannover.de
-----------------------------------------------------------------