
#include <std.h>
#include <math.h>
#include <sys/file.h>

extern "C" {
#include <sys/mman.h>

int munmap(char *, long);
}

#include "rtree.h"

const int	MAX_POLY= 500;

main(int argc, char **argv)
{
  char			*data;
  long			datasize;
  register int		x, y;
  int			npoint;
  int			i;
  point			points[100000];
  object_type		obj;
  r_entry		temp;
  geometr		geom;
  char			mapdata[1000];
  int			fdata;
  int			fl;
  int			closed;

  if (argc != 4) {
      fprintf(stderr, "Usage: %s [-c|-o] tablename mapname\n", argv[0]);
      exit(1);
  }
  closed= argv[1][1] == 'c';

  strcpy(mapdata, argv[3]);
  strcat(mapdata, ".bin");
  if (mapdata[0] != '/') {
    fprintf(stderr, "Sorry, mapname must start with '/'\n");
    exit(1);
  }
  if ((fdata = open(mapdata, O_RDONLY)) == -1) {
      fprintf(stderr, "Map data file can't be opened.\n");
      exit(1);
  }
  datasize=lseek(fdata,0L,L_XTND);
  if ((data =(char *)mmap(0,datasize, PROT_READ, MAP_SHARED, fdata, 0))
           == (char *)-1) {
      fprintf(stderr, "Map data file can't be mapped.\n");
      exit(1);
  }


  obj.pts= points;
  obj.type= area;

  char			*end= data+datasize;
  short			*p= (short*) data;

  char q[20*MAX_POLY];
  char s[1000];

  fl= *p != -9999;

  // printf("create %s(name=char16, closed=bool, offset= int4, geo_bbox=box, mapfile=map) \\g\n", argv[2]);
  printf("create %s() inherits (offset_map) \\g\n", argv[2]);
  printf("define index %sindex on %s using rtree (geo_bbox box_ops) \\g\n",
	argv[2], argv[2]);

  for (; ((char*)p) <end;) {
	sprintf(q, "append %s(name=\"?\", closed=\"%s\"::bool, mapfile=\"%s\"",
	  argv[2], closed ? "true": "false", mapdata);
	temp.id= (long) ((char*)p-data);
	if (fl) {
	    p++; p++; npoint= *(long*)p; p++; p++;
	} else {
	    p++; npoint= *(short*)p; p++;
	}
fprintf(stderr,"npoint: %d\n", npoint);

	obj.nrofpoints= npoint;
	sprintf(s, ", offset= %d,", temp.id);
	strcat(q, s);
	for (i= 0; i < npoint; i++) {
	  if (fl) {
	    obj.pts[i][1]= *(float*)p; p++; p++;
	    obj.pts[i][0]= *(float*)p; p++; p++;
	  } else {
	    obj.pts[i][1]= *p / 100.0; p++;
	    obj.pts[i][0]= *p / 100.0; p++;
	  }
	}
	geom.to_rectangle( obj.pts, obj.nrofpoints, temp.mbr);
	sprintf(s, " geo_bbox=\"(%f,%f,%f,%f)\"::box) \\g",
		temp.mbr[0][0],
		temp.mbr[0][1],
		temp.mbr[1][0],
		temp.mbr[1][1]);
	strcat(q, s);
	printf("%s\n", q);
	if (strlen(q) > 8000) {
		fprintf(stderr, "String too long!\n");
		exit(1);
	}
  }
}
