[gnu.g++.bug] Fatal signal 6.

sorensen@IMAGER.MIT.EDU (Greg Sorensen) (06/18/89)

This code got this signal when I changed previously compiling code to
use multiple inheritances.

Sun4/280, running OS 4.0.  g++ 1.35.0. I'm sure that I could pare this
file down to the smallest envelope, but I don't have time, and, as the
manual says on p. 71, "simplification is not necessary."

I've included a typescript, which includes listings of the code that does 
this, after which I've appended the results of 

g++ -E testi.C > outfile

as asked to on p 70-71.

Greg Sorensen

Script started on Sat Jun 17 15:35:35 1989
imager.mit.edu:~/code/++/simp > g++ -v
g++ version 1.35.0
imager.mit.edu:~/code/++/simp > g++ testi.C
g++: Program cc1plus got fatal signal 6.
imager.mit.edu:~/code/++/simp > cat im*
/*
	image.h: C++ classes for image handling.

	$Revision: 1.11 $
	$Date: 89/06/17 13:40:51 $

	$Id: image.h,v 1.11 89/06/17 13:40:51 sorensen Exp $
	$Source: /home/sorensen/code/++/simp/RCS/image.h,v $
*/

#include "img_global.h"

class base
{
private:
	int tmp=0;
};

class img : public base {
friend class int_image;
private:
	fund_type img_type;
public:
	img() {;}
	img(img& ii);
	~img() { cout << "lowest-level base destructor\n"; }

	virtual void print() { cout << "The abstract print.\n"; }
	virtual void getnext() {;}
	virtual void putnext() {;}
	//virtual img& operator+(img&) = 0; // C++ 2.0 trick

};

class OneD : public base {
friend class int1D;
private:
	int x_dim;
public:
	virtual int& operator[](int ii) = 0;
};

img::img(img& ii)
{
	img_type = ii.img_type;
}

class TwoD : public base {
friend class int2D;
private:
	int x_dim;
	int y_dim;
public:
	virtual OneD& operator[](int ii) = 0;
};

class int_image: public img {
friend class int1D;
friend class int2D;
private:
	int * int_base;
	int * int_cur_ptr;
	int int_length;
	int int_index;
	int int_max= -MAXINT;
	int int_min=MAXINT;
	void check_int_val(int value);
public:
	int_image();
	int_update(int * start, int length);
	int_image(int * start, int length);
	int_image(int_image& ii);
	int getnext(int index);
	int putnext(int value, int index);
};

int_image::int_image()
{
  	img_type = INT;
  	int_base = 0;
  	int_cur_ptr = 0;
  	int_length = 0;
  	int_index = -1;
}

int_image::int_update(int * start, int length) 
{
  	int_base = start;
  	int_cur_ptr = int_base;
  	int_length = length;
  	int_index = 0;
  	int_max = int_max_of(start,length);
  	int_min = int_min_of(start,length);
}

int_image::int_image(int * start, int length) 
{
  	img_type = INT;
  	int_base = start;
  	int_cur_ptr = int_base;
  	int_length = length;
  	int_index = 0;
  	int_max = int_max_of(start,length);
  	int_min = int_min_of(start,length);
}

int_image::int_image(int_image& ii)
{
	if(debug) { cout << "Creating an int_image from an int_image\n"; }
	int_length = ii.int_length;
	// BSD-DEPENDANT CODE: next 2 lines?
	char * temp_int = calloc(int_length, sizeof(int));
	int_base = memcpy( temp_int, ii.int_base, int_length * sizeof(int) );
	int_cur_ptr = int_base;
	int_max = int_max_of(int_base,int_length);
	int_min = int_min_of(int_base,int_length);
}

int_image::getnext(int index = -1)
{
	if(index==0)
	{
		int_cur_ptr = int_base;
		int_index=0;
		return(*int_cur_ptr);
	}
	else if(index == -1)  
	{
		int_index++;
		return *(int_cur_ptr++);
	}
	else if(index > 0 && index < (int_length - 1) ) 
	{
		int_index = index;
		int_cur_ptr = int_base + index;
		return *int_cur_ptr;
	}
	else
	{
		cerr << "int_image boundary overrun.  Fatal error.\n";
		exit(-1); // REPLACE with less drastic code...
	}
}
	
void int_image::check_int_val(int value)
{
	if(value > int_max) int_max = value;
	else if(value < int_min) int_min = value;
}

int_image::putnext(int value, int index = -1)
{
	if(index==0)
	{
		int_cur_ptr = int_base;
		int_index = 0;
		*int_cur_ptr = value;
		return 1;
	}
	else if(index == -1) 
	{
		*int_cur_ptr = value;
		check_int_val(value);
		int_cur_ptr++;
		int_index++;
		return 1;
	}
	else if(index > 0 && index < (int_length - 1) ) 
	{
		int_index = index;
		int_cur_ptr = int_base;
		int_cur_ptr += index;
		*int_cur_ptr = value;
		check_int_val(value);
	}
	else 
	{
		cerr << "int_image boundary overrun.  Fatal error.\n";
		exit(-1); // REPLACE with less drastic code...
	}
}


class int1D: public int_image, OneD 
{
friend class int2D;
//private:
	//int x_dim;
public:
	void print();
	int1D();
	int1D_update(int * start, int xlength);
	int1D(int * start, int xlength);
	int1D(int1D& ii);
	int& operator[](int ii);
};

int1D::int1D()
{
	x_dim = 0;
}

int1D::int1D(int * start,int xlength) : (start, xlength)
{
	x_dim = xlength;
}

int1D::int1D_update(int * start,int xlength)
{
	int_image::int_update(start, xlength);
	x_dim = xlength;
}

int1D::int1D(int1D& ii) : ((int_image&) ii)
{
	x_dim = ii.x_dim;
}

void int1D::print()
{
	getnext(0);
	for(int i=0; i < x_dim; i++) cout << getnext();
}

int& int1D::operator[](int ii)
{
	return *(int_base + ii);
}
	

class int2D : public int_image, TwoD
{
private:
	//int x_dim;
	//int y_dim;
	int1D * int1D_list;
	int1D * cur_1D;
public:
	void print(){;}
	int2D(int * start, int xlength, int ylength);
	int2D(int2D& ii);
	OneD& operator[](int ii);
};

int2D::int2D(int * start, int xlength, int ylength): (start,(xlength * ylength))
{
	x_dim = xlength;
	y_dim = ylength;
	int1D int1Dstuff[y_dim]; // GCC construct...will it work?
	int1D_list = (int1D *) calloc(y_dim,sizeof(int1D));
	cur_1D = int1D_list;
	for(int i=0; i < y_dim; i++)
	{
		(int1Dstuff[i]).int1D_update(start + (i * x_dim), x_dim);
		// since int1Dstuff will be deallocated, copy this stuff to a safe place...
		cur_1D = (int1D *) memcpy(cur_1D, &int1Dstuff[i], sizeof(int1D));
		cur_1D++;
	}
}

OneD& int2D::operator[](int ii)
{
	return *(int1D_list + ii);
}

/*
  img_global.h: global include files...

  $Revision: 1.2 $
  $Date: 89/06/16 19:02:26 $

  $Id: img_global.h,v 1.2 89/06/16 19:02:26 sorensen Exp $
  $Source: /home/sorensen/code/++/simp/RCS/img_global.h,v $
*/


#include <std.h>
#include <stream.h>
#define debug 1
enum fund_type { INT, SHORT, LONG, BYTE, FLOAT, DOUBLE, BIT };

// int_max_of, int_min_of: simple max and min finders.
// Probably small enough to be inline.

int int_max_of(int * point, int length){
int * localpoint;
int maxint;
  maxint = -MAXINT;
  localpoint = point;
  for(int i=0;i<length;i++){
    if(maxint < *localpoint) maxint = *localpoint;
    localpoint++;
  }
  return maxint;
}

int int_min_of(int * point, int length){
int * localpoint;
int minint;
  minint = MAXINT;
  localpoint = point;
  for(int i=0;i<length;i++){
    if(minint < *localpoint) minint = *localpoint;
    localpoint++;
  }
  return minint;
}



imager.mit.edu:~/code/++/simp > cat testi.C
#include "image.h"

main()
{
	int array[10];

	for(int i=0;i<10;i++) array[i] = i;
	int1D biff(array,10);
	img &base = biff;
	cout << sizeof(int1D) << "\n";
	biff.print();
	int1D fred = biff;
	fred.print();

	cout << "testing: ";
	for(i=0;i<10;i++) cout << fred[i];
	cout << "\n";

	/*
	for(i=0;i<10;i++) base[i] = 2*i;
	cout << "testing2: ";
	for(i=0;i<10;i++) cout << base[i];
	cout << "\n";
	*/

}

imager.mit.edu:~/code/++/simp > exit
imager.mit.edu:~/code/++/simp > 
script done on Sat Jun 17 15:36:19 1989

---------------

# 1 "testi.C"
# 1 "image.h"
 









# 1 "img_global.h"
 










# 1 "/usr/local/lib/g++-include/std.h"
 
 























#pragma once

#pragma once

overload abs;
overload atoi;

extern "C" {
void      _exit(int);
void      abort(void);
int       abs(int);
int       access(const char*, int);
int       acct(const char*);
unsigned  alarm(unsigned);
void*     alloca(int);
double    atof(const char*);
int       atoi(const char*);
long      atol(const char*);
int       bcmp(const void*, const void*, int);
void      bcopy(const void*, void*, int);
void*     brk(void*);
void      bzero(void*, int);
void*     calloc(unsigned, unsigned);
void      cfree(void*);
int       chdir(const char*);
int       chmod(const char*, int);
int       chown(const char*, int, int);
long      clock(void);
int       close(int);
int       creat(const char*, int);
char*     crypt(const char*, const char*);
char*     ctermid(char*);
char*     cuserid(char*);
double    drand48(void);
int       dup(int);
int       dup2(int, int);
int       dysize(int);
char*     ecvt(double, int, int*, int*);
char*     encrypt(char*, int);
double    erand(short*);
int       execl(const char*, const char *, ...);
int       execle(const char*, const char *, ...);
int       execlp(const char*, const char*, ...);
int       exect(const char*,  const char**,  char**);
int       execv(const char*,  const char**);
int       execve(const char*, const char**, char**);
int       execvp(const char*,  const char**);
void      exit(int);
int       fchmod(int, int);
int       fchown(int, int, int);
int       fcntl(int, int, int);
char*     fcvt(double, int, int*, int*);
int       ffs(int);
int       flock(int, int);
int       fork(void);
void      free(void*);
int       fsync(int);
long      ftok(const char*, int);
int       ftruncate(int, unsigned long);
char*     gcvt(double, int, char*);
char*     getcwd(char*, int);
int       getdomainname(char*, int);
int       getdtablesize(void);
int       getegid(void);
char*     getenv(const char*);
int       geteuid(void);
int       getgid(void);
int       getgroups(int, int*);
long      gethostid(void);
int       gethostname(char*, int);
char*     getlogin(void);
int       getopt(int, char**, char*);
int       getpagesize(void);
char*     getpass(const char*);
int       getpgrp(void);
int       getpid(void);
int       getppid(void);
int       getpriority(int, int);
int       getpw(int, char*);
unsigned  getuid(void);
char*     getwd(char*);
char*     index(const char*, int);
char*     initstate(unsigned, char*, int);
int       ioctl(int, int, char*);
int       isatty(int);
long      jrand48(short*);
int       kill(int, int);
int       killpg(int, int);
void      lcong48(short*);
int       link(const char*, const char*);
int       lock(int, int, long);
long      lrand48(void);
long      lseek(int, long, int);
void*     malloc(unsigned);
void*     memalign(unsigned, unsigned);
void*     memccpy(void*, const void*, int, int);
void*     memchr(const void*, int, int);
int       memcmp(const void*, const void*, int);
void*     memcpy(void*, const void*, int);
void*     memset(void*, int, int);
int       mkdir(const char*, int);
int       mknod(const char*, int, int);
int       mkstemp(char*);
char*     mktemp(char*);
long      mrand48(void);
int       nice(int);
long      nrand48(short*);
int       open(const char*, int, ...);
void      pause(void);
void      perror(const char*);
int       pipe(int*);
void      profil(char*, int, int, int);
int       psignal(unsigned, char*);
int       ptrace(int, int, int, int);
int       putenv(const char*);
int       qsort(void*, int, unsigned, auto (*ptf)(void*,void*));
int       rand(void);
long      random(void);
int       read(int, void*, unsigned);
int       readlink(const char*, char*, int);
void*     realloc(void*, unsigned);
int       rename(const char*, const char*);
char*     rindex(const char*, int);
int       rmdir(const char*);               
void*     sbrk(int);              
short*    seed48(short*);
int       send(int, char*, int, int);
int       setgid(int);
int       sethostname(char*, int);
int       setkey(const char*);
int       setpgrp(int, int);
int       setpriority(int, int, int);
int       setregid(int, int);
int       setreuid(int, int);
char*     setstate(char*);
int       setuid(int);
int       sigblock(int);
int       siginterrupt(int, int);
int       sigpause(int);
int       sigsetmask(int);
unsigned  sleep(unsigned);
int       srand(int);
void      srand48(long);
void      srandom(int);
int       stime(long*);
char*     strcat(char*, const char*);
char*     strchr(const char*, int);
int       strcmp(const char*, const char*);
char*     strcpy(char*, const char*);
int       strcspn(const char*, const char*);
char*     strdup(const char*);
int       strlen(const char*);
char*     strncat(char*, const char*, int);
int       strncmp(const char*, const char*, int);
char*     strncpy(char*, const char*, int);
char*     strpbrk(const char*, const char*);
char*     strrchr(const char*, int);
int       strspn(const char*, const char*);
double    strtod(const char*, char**);
char*     strtok(char*, const char*);
long      strtol(const char*, char**, int);
void      swab(void*, void*, int);
int       symlink(const char*, const char*);
int       syscall(int, ...);
int       system(const char*);
char*     tempnam(char*, char*);
int       tgetent(char*, char*);
int       tgetnum(char*);
int       tgetflag(char*);
char*     tgetstr(char *, char **);
char*     tgoto(char*, int, int);
long      time(long*);
 
char*     tmpnam(char*);
int       truncate(const char*, unsigned long);
char*     ttyname(int);
int       ttyslot(void);
unsigned  ualarm(unsigned, unsigned);
long      ulimit(int, long);
int       umask(int);
int       unlink(const char*);
unsigned  usleep(unsigned);
int       vadvise(int);
void*     valloc(unsigned);
int       vfork(void);
int       vhangup(void);
int       wait(int*);
int       write(int, const void*, unsigned);
}


extern char**   environ;
extern int      errno;
extern char*    sys_errlist[];
extern int      sys_nerr;                  
extern char*    optarg;
extern int      opterr;
extern int      optind;




# 12 "img_global.h"

# 1 "/usr/local/lib/g++-include/stream.h"
 
 






















#pragma once


# 1 "/usr/local/lib/g++-include/File.h"
 
 






















#pragma once


# 1 "/usr/local/lib/g++-include/builtin.h"
 

 





















 





#pragma once


overload clearbit;
overload dec;
overload gcd;
overload hex;
overload lcm;
overload lg;
overload oct;
overload setbit;
overload sign;
overload sqr;
overload testbit;
overload even;
overload odd;


# 1 "/usr/local/lib/g++-include/stddef.h"
 
 






















#pragma once





enum bool   
{           
  FALSE = 0,
  TRUE  = 1              
};





















typedef void (*one_arg_error_handler_t)(const char*);
typedef void (*two_arg_error_handler_t)(const char*, const char*);


# 49 "/usr/local/lib/g++-include/builtin.h"

# 1 "/usr/local/lib/g++-include/math.h"
 
 























#pragma once


overload acos;
overload acosh;
overload asin;
overload asinh;
overload atan2;
overload atanh;
overload ceil;
overload cos;
overload cosh;
overload exp;
overload floor;
overload gamma;
overload hypot;
overload log;
overload log10;
overload pow;
overload sin;
overload sinh;
overload sqrt;
overload tan;
overload tanh;

extern "C" {

double  acos(double);
double  acosh(double);
double  asin(double);
double  asinh(double);
double  atan(double);
double  atan2(double, double);
double  atanh(double);
double  cbrt(double);
double  ceil(double);
double  copysign(double,double);
double  cos(double);
double  cosh(double);
double  drem(double,double);
double  erf(double);
double  erfc(double);
double  exp(double);
double  expm1(double);
double  fabs(double);
double  finite(double);
double  floor(double);
double  frexp(double, int*);
double  gamma(double);
double  hypot(double,double);
double  infnan(int);
int     isinf(double);
int     isnan(double);
double  j0(double);
double  j1(double);
double  jn(int, double);
double  ldexp(double, int);
double  lgamma(double);
double  log(double);
double  log10(double);
double  log1p(double);
double  logb(double);
double  modf(double, double*);
double  pow(double, double);
double  rint(double);
double  scalb(double, int);
double  sin(double);
double  sinh(double);
double  sqrt(double);
double  tan(double);
double  tanh(double);
double  y0(double);
double  y1(double);
double  yn(int, double);

}

 

 


struct exception
{
  int type;
  char* name;
  double arg1, arg2, retval;
};








extern "C" int matherr(exception*);



# 1 "/usr/local/lib/g++-include/values.h"
 
 























#pragma once



































# 108 "/usr/local/lib/g++-include/values.h"









# 126 "/usr/local/lib/g++-include/math.h"


 





 






















































# 50 "/usr/local/lib/g++-include/builtin.h"


long         abs(long);
double       abs(double);
void         clearbit(long&, long);
void         setbit(long&, long);
int          testbit(long, long);
int          even(long);
long         gcd(long, long);
long         lg(long); 
long         lcm(long, long);
int          odd(long);
double       pow(double, long);
long         pow(long, long);
int          sign(long);
int          sign(double);
long         sqr(long);
double       sqr(double);
long         sqrt(long);

double       start_timer();
double       return_elapsed_time(double);

char*        itoa(long x, int base = 10, int width = 0);
char*        hex(long x, int width = 0);
char*        oct(long x, int width = 0);
char*        dec(long x, int width = 0);
char*        form(const char* fmt ...);
char*        chr(char ch);

unsigned int hashpjw(const char*);
unsigned int multiplicativehash(int);
unsigned int foldhash(double);

extern void default_one_arg_error_handler(const char*);
extern void default_two_arg_error_handler(const char*, const char*);

extern two_arg_error_handler_t lib_error_handler;

extern two_arg_error_handler_t 
       set_lib_error_handler(two_arg_error_handler_t f);

 

inline double abs(double _arg) 
{
  return (_arg < 0.0)? -_arg : _arg;
}

inline long abs(long _arg) 
{
  return (_arg < 0)? -_arg : _arg;
}

inline int sign(long _arg)
{
  return (_arg == 0) ? 0 : ( (_arg > 0) ? 1 : -1 );
}

inline int sign(double _arg)
{
  return (_arg == 0.0) ? 0 : ( (_arg > 0.0) ? 1 : -1 );
}

inline long sqr(long _arg)
{
  return _arg * _arg;
}

inline double sqr(double _arg)
{
  return _arg * _arg;
}

inline int even(long _arg)
{
  return !(_arg & 1);
}

inline int odd(long _arg)
{
  return (_arg & 1);
}

inline long lcm(long _x, long _y)
{
  return _x / gcd(_x, _y) * _y;
}

inline void setbit(long& _x, long _b)
{
  _x |= (1 << _b);
}

inline void clearbit(long& _x, long _b)
{
  _x &= ~(1 << _b);
}

inline int testbit(long _x, long _b)
{
  return ((_x & (1 << _b)) != 0);
}

 


# 28 "/usr/local/lib/g++-include/File.h"

# 1 "/usr/local/lib/g++-include/stdio.h"
 
 





















 



























#pragma once


 







 


extern  struct  _iobuf {
    int      _cnt;
    char*    _ptr;
    char*    _base;

    int     _bufsiz;
    short   _flag;



    char    _file;
} _iob[];



































extern "C" {

int    _doprnt(const char*, void*,     struct _iobuf *);
int    _doscan(    struct _iobuf *, const char*, void*);
int    _filbuf(    struct _iobuf *);
int    _flsbuf(unsigned,     struct _iobuf *);
int    fclose(    struct _iobuf *);
    struct _iobuf *  fdopen(int, const char*);
int    fflush(    struct _iobuf *);
int    fgetc(    struct _iobuf *);
char*  fgets(char*, int,     struct _iobuf  *);
    struct _iobuf *  fopen(const char*, const char*);
int    fprintf(    struct _iobuf *, const char* ...);
int    fputc(int,     struct _iobuf *);
int    fputs(const char*,     struct _iobuf *);
int    fread(void*, int, int,     struct _iobuf *);
    struct _iobuf *  freopen(const char*, const char*,     struct _iobuf *);
int    fscanf(    struct _iobuf *, const char* ...);
int    fseek(    struct _iobuf *, long, int);
long   ftell(    struct _iobuf  *);
int    fwrite(const void*, int, int,     struct _iobuf *);
char*  gets(char*);
int    getw(    struct _iobuf *);
int    pclose(    struct _iobuf *);
    struct _iobuf *  popen(const char*, const char*);
int    printf(const char* ...);
void   puts(const char*);
int    putw(int,     struct _iobuf *);
int    scanf(const char* ...);
void   setbuf(    struct _iobuf *, char*);
void   setbuffer(    struct _iobuf *, char*, int);
void   setlinebuf(    struct _iobuf *);
void   setvbuf(    struct _iobuf *, char*, int, int);
int    sscanf(char*, const char* ...);
    struct _iobuf *  tmpfile();
int    ungetc(int,     struct _iobuf *);
int    vfprintf(    struct _iobuf *, const char*, void* ap);
int    vprintf(const char*, void* ap);
int    vsprintf(char*, const char*, void* ap);


int    sprintf(char*, const char* ...);




}


# 29 "/usr/local/lib/g++-include/File.h"



enum io_mode                     
{
  io_readonly   = 0,            
  io_writeonly  = 1,
  io_readwrite  = 2, 
  io_appendonly = 3,
  io_append     = 4,             
};

enum access_mode                 
{
  a_createonly  = 0,             
  a_create      = 1,             
  a_useonly     = 2,             
  a_use         = 3,             
};

enum state_value                 
{ 
  _good         = 0,             
  _eof          = 1,             
  _fail         = 2,             
  _bad          = 4              
};


class File
{
protected:
      struct _iobuf *         fp;               
  char*         nm;               
  char          rw;               
                                  
  state_value   state;            
  long          stat;             

  void          initialize();
  void          reinitialize(const char*);
  char         *readline (int chunk_number, char terminator);

public:
                File();
                File(const char* filename, io_mode m, access_mode a);
                File(const char* filename, const char* m);   
                File(int filedesc, io_mode m);
                File(    struct _iobuf * fileptr);
                File(int sz, char* buf, io_mode m);

                ~File();

 

  File&         open(const char* filename, io_mode m, access_mode a);
  File&         open(const char* filename, const char* m);
  File&         open(int  filedesc, io_mode m);
  File&         open(    struct _iobuf * fileptr);

  File&         close();
  File&         remove();

 

  int           filedesc();
  const char*   name();
  void          setname(const char* newname);
  int           iocount();

  int           rdstate();
  int           eof();
  int           fail();
  int           bad();
  int           good();

 

  int           readable();
  int           writable();
  int           is_open();

  void*         operator void*();

 

  void          error();
  void          clear(state_value f = 0);  
  File&         failif(int cond);
  void          check_state();

 

  File&         get(char& c);
  File&         put(char  c);
  File&         unget(char c);
  File&         putback(char c);  

 

  File&         put(const char* s);
  File&         get    (char* s, int n, char terminator = '\n');
  File&         getline(char* s, int n, char terminator = '\n');
  File&         gets   (char **s, char terminator = '\n');

 

  File&         read(void* x, int sz, int n);
  File&         write(void* x, int sz, int n);


 

  File&         seek(long pos, int seek_mode=0);  
  long          tell();

  File&         flush();
  File&         setbuf(int buffer_kind);  
  File&         setbuf(int size, char* buf);
  File&         raw();
};


 

extern void  verbose_File_error_handler(char*);
extern void  quiet_File_error_handler(char*);
extern void  fatal_File_error_handler(char*);
extern one_arg_error_handler_t File_error_handler;
extern one_arg_error_handler_t set_File_error_handler(one_arg_error_handler_t);

 



inline int File::filedesc()
{ 
  return   ((fp)->_file) ;
}

inline const char* File::name()
{ 
  return nm; 
}

inline int File::iocount()
{ 
  return stat; 
}

inline int File::readable()
{ 
  if (fp != 0) { if (    (((fp)->_flag&   00020 )!=0) ) state |= _eof; if (  (((fp)->_flag&   00040 )!=0) ) state |= _bad;}
  return (state == _good && (rw & 01));
}

inline int File::writable()
{ 
  if (fp != 0 &&   (((fp)->_flag&   00040 )!=0) ) state |= _bad;
  return ((state & (_fail|_bad)) == 0 && (rw & 02));
}

inline int File::is_open()
{ 
  return (fp != 0);
}

inline void File::clear(state_value flag = 0)
{ 
  state = flag;
}

inline File& File::raw()
{ 
  return this->File::setbuf(   00004 ); 
}

inline void File::check_state()  
{
  if (fp != 0)
  {
    if (    (((fp)->_flag&   00020 )!=0) )
      state |= _eof;
    else
      state &= ~_eof;
    if (  (((fp)->_flag&   00040 )!=0) )
      state |= _bad;
  }
}

inline File& File::failif(int cond)
{ 
  if (cond) state |= _fail;  return *this; 
}

inline File& File::get(char& c)
{ 
  if (readable())
  {
    int ch = (--(fp)->_cnt>=0?(int)(*(unsigned char*)(fp)->_ptr++):_filbuf(fp)) ;
    c = ch;
    failif (ch ==       (-1) );
  }
  return *this;
}

inline File& File::put(char  c) 
{ 
  return failif (!writable() ||  (--( fp)->_cnt>=0? ((int)((unsigned char)((*( fp)->_ptr++=(unsigned)(c))))):_flsbuf((unsigned)(c), fp))  ==       (-1) );
}

inline File& File::unget(char c)
{ 
  return failif(!is_open() || !(rw & 01) || ungetc(c, fp) ==       (-1) );
} 

inline File& File::putback(char c)
{ 
  return failif (!is_open() || !(rw & 01) || ungetc(c, fp) ==       (-1) );
}

inline File& File::read(void* x, int sz, int n)
{ 
  return failif (!readable() || (stat = fread(x, sz, n, fp)) != n);
} 

inline File& File::write(void* x, int sz, int n) 
{ 
  return failif (!writable() || (stat = fwrite(x, sz, n, fp)) != n);
}

inline File& File::flush()
{ 
  return failif(!is_open() || fflush(fp) ==       (-1) );
}

inline File& File::seek(long pos, int seek_mode = 0)
{ 
  return failif (!is_open() || fseek(fp, pos, seek_mode) < 0); 
}

inline long File::tell()
{ 
  failif (!is_open() || (stat = ftell(fp) < 0));
  return stat;
}

inline int File::rdstate()
{ 
  check_state();  return state;  
}                                

inline void* File::operator void*()
{ 
  check_state();  return (state & (_bad|_fail))? 0 : this ; 
}

inline int File::eof()
{ 
  check_state(); return state & _eof; 
}

inline int File::fail()
{ 
  check_state(); return state & _fail; 
}

inline int File::bad()
{ 
  check_state(); return state & _bad; 
}

inline int File::good()
{ 
  check_state(); return rdstate() == _good; 
}


 


# 28 "/usr/local/lib/g++-include/stream.h"


class whitespace                 
{                                
  char filler;                     
};

class ostream: private File
{
public:
           File::open;      File::close;
           File::remove;    File::filedesc;  File::is_open;
           File::raw;       File::put;       File::check_state;
           File::iocount;   File::error;     File::name;
           File::setname;   File::rdstate;   File::flush;
           File::eof;       File::fail;      File::bad;
           File::good;      File::clear;     File::failif;
           File::setbuf;    File::writable;  File::readable;
           

           ostream();
           ostream(const char* filename, io_mode m, access_mode a);
           ostream(const char* filename, const char* m);
           ostream(int filedesc, io_mode m = io_writeonly);
           ostream(    struct _iobuf * fileptr);
           ostream(int sz, char* buf);

           ~ostream();

  void*    operator void*();

  ostream& form(const char* fmt, ...);           

  ostream& operator << (char   c);
  ostream& operator << (short  n);
  ostream& operator << (unsigned short n);
  ostream& operator << (int    n);
  ostream& operator << (unsigned int n);
  ostream& operator << (long   n);
  ostream& operator << (unsigned long n);
  ostream& operator << (float  n);
  ostream& operator << (double n);
  ostream& operator << (const char* s);
};


class istream: private File
{
protected:
  ostream* tied_to;         
  void     _flush();

public:
           File::open;      File::close;     File::get;  File::gets;
           File::remove;    File::filedesc;  File::is_open;
           File::raw;       File::unget;     File::getline;
           File::iocount;   File::error;     File::name;
           File::setname;   File::rdstate;   File::putback;
           File::eof;       File::fail;      File::bad;
           File::good;      File::clear;     File::failif;
           File::setbuf;    File::writable;  File::readable;
           File::check_state;

           istream();
           istream(const char* filename, io_mode m, access_mode a);
           istream(const char* filename, const char* m);
           istream(int filedesc, io_mode m = io_readonly);
           istream(    struct _iobuf * fileptr);
           istream(int sz, char* buf);

           ~istream();

  void*    operator void*();

  ostream* tie(ostream* s);

  istream& scan(const char* fmt, ...);

  istream& operator >> (char&   c);
  istream& operator >> (short&  n);
  istream& operator >> (unsigned short& n);
  istream& operator >> (int&    n);
  istream& operator >> (unsigned int& n);
  istream& operator >> (long&   n);
  istream& operator >> (unsigned long& n);
  istream& operator >> (float&  n);
  istream& operator >> (double& n);
  istream& operator >> (char*   s);
  istream& operator >> (whitespace& w);
};

void eatwhite(istream& s);


 

extern istream  cin;              
extern ostream  cout;             
extern ostream  cerr;             

extern whitespace WS;             

 


inline void* ostream::operator void*()
{ 
  check_state(); return (state & (_bad|_fail))? 0 : this ; 
}

inline ostream& ostream::operator<<(char   c)
{ 
  put(c);  return *this;
}

inline void*    istream::operator void*()
{ 
  check_state(); return (state & (_bad|_fail))? 0 : this ; 
}

inline void istream::_flush()
{
  if (tied_to) tied_to->flush();
}


 


# 13 "img_global.h"


enum fund_type { INT, SHORT, LONG, BYTE, FLOAT, DOUBLE, BIT };

 
 

int int_max_of(int * point, int length){
int * localpoint;
int maxint;
  maxint = -     (~     (1 << (     (8  * (int)sizeof(int))   - 1)) ) ;
  localpoint = point;
  for(int i=0;i<length;i++){
    if(maxint < *localpoint) maxint = *localpoint;
    localpoint++;
  }
  return maxint;
}

int int_min_of(int * point, int length){
int * localpoint;
int minint;
  minint =      (~     (1 << (     (8  * (int)sizeof(int))   - 1)) ) ;
  localpoint = point;
  for(int i=0;i<length;i++){
    if(minint < *localpoint) minint = *localpoint;
    localpoint++;
  }
  return minint;
}



# 11 "image.h"


class base
{
private:
	int tmp=0;
};

class img : public base {
friend class int_image;
private:
	fund_type img_type;
public:
	img() {;}
	img(img& ii);
	~img() { cout << "lowest-level base destructor\n"; }

	virtual void print() { cout << "The abstract print.\n"; }
	virtual void getnext() {;}
	virtual void putnext() {;}
	 

};

class OneD : public base {
friend class int1D;
private:
	int x_dim;
public:
	virtual int& operator[](int ii) = 0;
};

img::img(img& ii)
{
	img_type = ii.img_type;
}

class TwoD : public base {
friend class int2D;
private:
	int x_dim;
	int y_dim;
public:
	virtual OneD& operator[](int ii) = 0;
};

class int_image: public img {
friend class int1D;
friend class int2D;
private:
	int * int_base;
	int * int_cur_ptr;
	int int_length;
	int int_index;
	int int_max= -     (~     (1 << (     (8  * (int)sizeof(int))   - 1)) ) ;
	int int_min=     (~     (1 << (     (8  * (int)sizeof(int))   - 1)) ) ;
	void check_int_val(int value);
public:
	int_image();
	int_update(int * start, int length);
	int_image(int * start, int length);
	int_image(int_image& ii);
	int getnext(int index);
	int putnext(int value, int index);
};

int_image::int_image()
{
  	img_type = INT;
  	int_base = 0;
  	int_cur_ptr = 0;
  	int_length = 0;
  	int_index = -1;
}

int_image::int_update(int * start, int length) 
{
  	int_base = start;
  	int_cur_ptr = int_base;
  	int_length = length;
  	int_index = 0;
  	int_max = int_max_of(start,length);
  	int_min = int_min_of(start,length);
}

int_image::int_image(int * start, int length) 
{
  	img_type = INT;
  	int_base = start;
  	int_cur_ptr = int_base;
  	int_length = length;
  	int_index = 0;
  	int_max = int_max_of(start,length);
  	int_min = int_min_of(start,length);
}

int_image::int_image(int_image& ii)
{
	if(1 ) { cout << "Creating an int_image from an int_image\n"; }
	int_length = ii.int_length;
	 
	char * temp_int = calloc(int_length, sizeof(int));
	int_base = memcpy( temp_int, ii.int_base, int_length * sizeof(int) );
	int_cur_ptr = int_base;
	int_max = int_max_of(int_base,int_length);
	int_min = int_min_of(int_base,int_length);
}

int_image::getnext(int index = -1)
{
	if(index==0)
	{
		int_cur_ptr = int_base;
		int_index=0;
		return(*int_cur_ptr);
	}
	else if(index == -1)  
	{
		int_index++;
		return *(int_cur_ptr++);
	}
	else if(index > 0 && index < (int_length - 1) ) 
	{
		int_index = index;
		int_cur_ptr = int_base + index;
		return *int_cur_ptr;
	}
	else
	{
		cerr << "int_image boundary overrun.  Fatal error.\n";
		exit(-1);  
	}
}
	
void int_image::check_int_val(int value)
{
	if(value > int_max) int_max = value;
	else if(value < int_min) int_min = value;
}

int_image::putnext(int value, int index = -1)
{
	if(index==0)
	{
		int_cur_ptr = int_base;
		int_index = 0;
		*int_cur_ptr = value;
		return 1;
	}
	else if(index == -1) 
	{
		*int_cur_ptr = value;
		check_int_val(value);
		int_cur_ptr++;
		int_index++;
		return 1;
	}
	else if(index > 0 && index < (int_length - 1) ) 
	{
		int_index = index;
		int_cur_ptr = int_base;
		int_cur_ptr += index;
		*int_cur_ptr = value;
		check_int_val(value);
	}
	else 
	{
		cerr << "int_image boundary overrun.  Fatal error.\n";
		exit(-1);  
	}
}


class int1D: public int_image, OneD 
{
friend class int2D;
 
	 
public:
	void print();
	int1D();
	int1D_update(int * start, int xlength);
	int1D(int * start, int xlength);
	int1D(int1D& ii);
	int& operator[](int ii);
};

int1D::int1D()
{
	x_dim = 0;
}

int1D::int1D(int * start,int xlength) : (start, xlength)
{
	x_dim = xlength;
}

int1D::int1D_update(int * start,int xlength)
{
	int_image::int_update(start, xlength);
	x_dim = xlength;
}

int1D::int1D(int1D& ii) : ((int_image&) ii)
{
	x_dim = ii.x_dim;
}

void int1D::print()
{
	getnext(0);
	for(int i=0; i < x_dim; i++) cout << getnext();
}

int& int1D::operator[](int ii)
{
	return *(int_base + ii);
}
	

class int2D : public int_image, TwoD
{
private:
	 
	 
	int1D * int1D_list;
	int1D * cur_1D;
public:
	void print(){;}
	int2D(int * start, int xlength, int ylength);
	int2D(int2D& ii);
	OneD& operator[](int ii);
};

int2D::int2D(int * start, int xlength, int ylength): (start,(xlength * ylength))
{
	x_dim = xlength;
	y_dim = ylength;
	int1D int1Dstuff[y_dim];  
	int1D_list = (int1D *) calloc(y_dim,sizeof(int1D));
	cur_1D = int1D_list;
	for(int i=0; i < y_dim; i++)
	{
		(int1Dstuff[i]).int1D_update(start + (i * x_dim), x_dim);
		 
		cur_1D = (int1D *) memcpy(cur_1D, &int1Dstuff[i], sizeof(int1D));
		cur_1D++;
	}
}

OneD& int2D::operator[](int ii)
{
	return *(int1D_list + ii);
}

# 1 "testi.C"


main()
{
	int array[10];

	for(int i=0;i<10;i++) array[i] = i;
	int1D biff(array,10);
	img &base = biff;
	cout << sizeof(int1D) << "\n";
	biff.print();
	int1D fred = biff;
	fred.print();

	cout << "testing: ";
	for(i=0;i<10;i++) cout << fred[i];
	cout << "\n";

	 






}