int load_rects(const char *fname, int4 **rects) {
	FILE *fp = fopen(fname, "rb");
	if (!fp) {
		fprintf(stderr, "could not open %s\n", fname);
		return -1;
	}

	int numrects = -1;
	if (fscanf(fp, "%d", &numrects) != 1 || numrects < 0) {
		fprintf(stderr, "failed to read number of rects from %s\n", fname);
		fclose(fp);
		return -1;
	}

	int4 *ptr = (int4 *)calloc(numrects, sizeof(int4));
	if (ptr == NULL) {
		fprintf(stderr, "unable to allocate memory for %d rects\n", numrects);
		fclose(fp);
		return -1;
	}

	for (int i = 0; i < numrects; ++i) {
		int *elx = &(ptr[i].x);
		int *ely = &(ptr[i].y);
		int *elz = &(ptr[i].z);
		int *elw = &(ptr[i].w);
		if (ferror(fp) || feof(fp) || fscanf(fp, "%d %d %d %d", elx, ely, elz, elw) != 4) {
			fprintf(stderr, "failed to read coordinates for rect %d\n", i);
			fclose(fp);
			free(ptr);
			return -1;
		}
	}
	*rects = ptr;
	return numrects;
}
