/***  data.c   ***/

#include "lalgol.h"
#include "data.h"
#include "io.h"		/* fatal_error */

/*  global variables  */

int symbol_counter=1, data_counter=1; bool was_error=FALSE;
int ch=0;

/*----------------------------------------------------------------------*/
/*  storing data  */
#define DATA_max	1000
#define TEMP_max	300
#define OPTOR_max	30

int DATA[DATA_max+1]={0,0}, OPTOR[OPTOR_max]; char TEMP[TEMP_max+2];

int place_integer(p) int p;
{int i;
	i=0; while(++i<=data_counter && p!=DATA[i]);
	if(i<=data_counter) return(i);
	if(++data_counter>=DATA_max)
	    fatal_error("too many denotations");
	DATA[data_counter]=p; return(data_counter);
}

#if INT16
int place_integral(p) inta p;
/* B[Z]=DN[d]=p>>16, C[Z]=DB[d+1]=(int)p; */
{int i;
    i=0;
    while(++i<data_counter &&
                     ((int)((p)>>16)!=DATA[i] || (int)(p)!=DATA[i+1]));
    if(i<data_counter) return(i);
    if((data_counter += 2)>=DATA_max)
        fatal_error("too many denotations");
    DATA[data_counter-1]=(int)((p)>>16); DATA[data_counter]=(int)(p);
    return(data_counter-1);
}
#endif

#if INT16
typedef union { double e; struct { int i1,i2,i3,i4;} ii ;} eii;
#define ri1(x)	(*((eii*)&x)).ii.i1
#define ri2(x)	(*((eii*)&x)).ii.i2
#define ri3(x)	(*((eii*)&x)).ii.i3
#define ri4(x)  (*((eii*)&x)).ii.i4
#endif

int place_real(r) double r;
#if INT32
{union { double rl; struct { int ih,rh;} ip;} pair; int i;
	i=0; pair.rl=r;
	while(++i<data_counter &&
			 (pair.ip.ih!=DATA[i] || pair.ip.rh!=DATA[i+1]));
	if(i<data_counter) return(i);
	if((data_counter += 2)>=DATA_max)
	    fatal_error("too many denotations");
	DATA[data_counter-1]=pair.ip.ih; DATA[data_counter]=pair.ip.rh;
	return(data_counter-1);
#else   /* DN[d]=r1; DN[d+1]=r2, DN[d+2]=r3, DN[d+3]=r4 */
{int i;
    i=0;
    while(++i<=data_counter-3 &&
	(ri1(r)!=DATA[i] || ri2(r)!=DATA[i+1] ||
	 ri3(r)!=DATA[i+2] || ri4(r)!=DATA[i+3]));
    if(i<=data_counter-3) return(i);
    if((data_counter += 4)>=DATA_max)
            fatal_error("too many denotations");
    DATA[data_counter-3]=ri1(r); DATA[data_counter-2]=ri2(r);
    DATA[data_counter-1]=ri3(r); DATA[data_counter]=ri4(r);
    return(data_counter-3);
#endif
}

int place_string(length) int length;
{int result,i,j;
	i=result=data_counter+1; j=0;
	if((data_counter += length+1)>=DATA_max)
	    fatal_error("too many denotations");
	DATA[i]=length;
	while(j < length) DATA[++i]=TEMP[j++];
	return(result);
}

