예제 #1
0
static void
humminbird_read_route(gbfile* fin) {

	humminbird_rte_t hrte;

	if (! gbfread(&hrte, 1, sizeof(hrte), fin))
		fatal(MYNAME ": Unexpected end of file!\n");

	hrte.time = be_read32(&hrte.time);
	hrte.num = be_read16(&hrte.num);

	if (hrte.count > 0) {
		int i;
		route_head *rte = NULL;

		for (i = 0; i < hrte.count; i++) {
			waypoint *wpt;
			char buff[10];
			hrte.points[i] = be_read16(&hrte.points[i]);
			
			/* locate the point over his internal Humminbird "Number" */
			snprintf(buff, sizeof(buff), "%d", hrte.points[i]);
			if (avltree_find(waypoints, buff, (void *) &wpt)) {
				if (rte == NULL) {
					rte = route_head_alloc();
					route_add_head(rte);
					rte->rte_name = xstrndup(hrte.name, sizeof(hrte.name));
					/* rte->rte_num = hrte.num + 1; only internal number */
				}
				route_add_wpt(rte, waypt_dupe(wpt));
			}
		}
	}
}
예제 #2
0
static int
mmo_write_obj_mark(const char *sobj, const char *name)
{
	char *key;
	gbuint16 nr;
	char buf[16];
	int res;
	
	if (avltree_find(mmobjects, sobj, (void *)&key)) {
		nr = (unsigned)atoi(key);
		gbfputuint16(nr, fout);
	}
	else {
		mmo_object_id++;
		snprintf(buf, sizeof(buf), "%u", mmo_object_id);

		DBG(("write", "object \"%s\" registered (id = 0x%04X)\n", mmo_object_id));

		avltree_insert(mmobjects, sobj, xstrdup(buf));
		
		gbfputuint32(mmo_filemark, fout);
		gbfputuint16(strlen(sobj), fout);
		gbfwrite(sobj, strlen(sobj), 1, fout);
	}

	mmo_object_id++;
	res = mmo_object_id;
	mmo_writestr(name);

	return res;
}
예제 #3
0
파일: osm.c 프로젝트: alexbirkett/GPSBabel
static void
osm_disp_feature(const waypoint *wpt)
{
	osm_icon_mapping_t *map;
	
	if (avltree_find(icons, wpt->icon_descr, (void *) &map))
		osm_write_tag(osm_features[map->key], map->value);
}
예제 #4
0
static mmo_data_t *
mmo_get_object(const gbuint16 objid)
{
	char key[16];
	mmo_data_t *data;
	
	snprintf(key, sizeof(key), "%d", objid | 0x8000);
	if (! avltree_find(objects, key, (void *)&data))
		fatal(MYNAME ": Unregistered object id 0x%04X!\n", objid | 0x8000);
	
	return data;
}
예제 #5
0
파일: osm.c 프로젝트: alexbirkett/GPSBabel
static char
osm_feature_ikey(const char *key)
{
	int result;
	const void *p;
	
	if (avltree_find(keys, key, &p))
		result = gb_ptr2int(p);
	else
		result = -1;

	return result;
}
예제 #6
0
static void
mmo_write_category(const char *sobj, const char *name)
{
	char *key;
	gbuint16 nr;
	
	if (avltree_find(category_names, name, (void *)&key)) {
		nr = (unsigned)atoi(key);
		gbfputuint16(nr & 0x7FFF, fout);
	}
	else {
		mmo_write_obj_mark(sobj, name);
		mmo_register_category_names(name);
	}
}
예제 #7
0
파일: osm.c 프로젝트: alexbirkett/GPSBabel
static char *
osm_feature_symbol(const int ikey, const char *value)
{
	char *result;
	char buff[128];
	osm_icon_mapping_t *data;

	buff[0] = ikey;
	strncpy(&buff[1], value, sizeof(buff) - 1);

	if (avltree_find(values, buff, (void *)&data))
		result = xstrdup(data->icon);
	else
		xasprintf(&result, "%s:%s", osm_features[ikey], value);

	return result;
}
예제 #8
0
파일: osm.c 프로젝트: alexbirkett/GPSBabel
static void
osm_rtept_disp(const waypoint *wpt_ref)
{
	char *buff;
	waypoint *wpt;
	
	if (skip_rte) return;
	
	xasprintf(&buff, "%s\01%f\01%f", (wpt_ref->shortname) ? wpt_ref->shortname : "",
		wpt_ref->latitude, wpt_ref->longitude);

	if (avltree_find(waypoints, buff, (void *) &wpt)) {
		int *id = wpt->extra_data;
		gbfprintf(fout, "    <nd ref='%d'/>\n", *id);
	}
	
	xfree(buff);
}
예제 #9
0
파일: osm.c 프로젝트: alexbirkett/GPSBabel
static void 
osm_way_nd(const char *args, const char **attrv)
{
	const char **avp = &attrv[0];

        while (*avp) {
		if (strcmp(avp[0], "ref") == 0) {
			waypoint *tmp;
			if (avltree_find(waypoints, avp[1], (void *)&tmp)) {
				tmp = waypt_dupe(tmp);
				route_add_wpt(rte, tmp);
			}
			else
				warning(MYNAME ": Way reference id \"%s\" wasn't listed under nodes!\n", avp[1]);
		}
		avp += 2;
	}
}
예제 #10
0
void avltree_insert(struct avltree *tree, struct node *n) {
	struct node **p;
	int cmp;

	//寻找插入位置
	clear(tree);
	p = avltree_find(tree,n);
	//插入结点
	n->left = NULL;
	n->right = NULL;
	n->height = 0;
	if(*p != NULL) {
		tree->set(*p,n);
		return;
	}
	*p = n;
	//调整
	avltree_adjust(tree);
}
예제 #11
0
int main() {
	struct avltree *tree;
	struct kvnode head;
	struct kvnode *tail;

	struct kvnode *p;
	char buf[200];
	int retval;
	char *str;
	struct node **ins;

	FILE *f = fopen("bible.txt","r");
	int start,end;

	tail = &head;
	tree = avltree_create(cmpf, setf);


	start = clock();
	while((retval = fscanf(f,"%s",buf)) != EOF) {
		str = malloc(strlen(buf)+1);
		strcpy(str,buf);
		p = node_create(str,1);
		ins = avltree_find(tree,p);
		if(*ins == NULL) {	//第一次
			*ins = p;
			avltree_adjust(tree);
			tail->next = p;
			tail = p;
		} else {	//直接插,不用平衡调整了
			((struct kvnode*)(*ins))->val ++;
		}
	}
	end = clock();
	printf("%d\n",end-start);
	/*
	for(p=head.next; p!=tail; p=p->next) {
		printf("%s,%d\n",p->key,p->val);
	}*/
	return 0;
}
예제 #12
0
static void
humminbird_write_waypoint_wrapper(const waypoint *wpt)
{
	char *key;
	waypoint *tmpwpt;

	xasprintf(&key, "%s\01%.9f\01%.9f", wpt->shortname, wpt->latitude, wpt->longitude);

	if (! avltree_find(waypoints, key, (void *)&tmpwpt)) {
		tmpwpt = (waypoint *)wpt;

		avltree_insert(waypoints, key, wpt);

		tmpwpt->extra_data = gb_int2ptr(waypoint_num + 1);	/* NOT NULL */
		humminbird_write_waypoint(wpt);
	}
	else {
		void *p = tmpwpt->extra_data;
		tmpwpt = (waypoint *)wpt;
		tmpwpt->extra_data = p;
	}

	xfree(key);
}
예제 #13
0
static void
mmo_read_CObjWaypoint(mmo_data_t *data)
{
#ifdef MMO_DBG
	const char *sobj = "CObjWaypoint";
#endif
	waypoint *wpt;
	time_t time;
	int rtelinks;
	mmo_data_t **rtelink = NULL;
	char *str;
	char buf[16];
	int i, ux;
	
	DBG((sobj, ":-----------------------------------------------------\n"));
	DBG((sobj, "name = \"%s\" [ visible=%s, id=0x%04X ]\n", 
		data->name, data->visible ? "yes" : "NO", data->objid));

	wpt = waypt_new();
	wpt->shortname = xstrdup(data->name);

	time = data->mtime;
	if (! time) time = data->ctime;
	if (time > 0) wpt->creation_time = time;

	wpt->latitude = gbfgetdbl(fin);
	wpt->longitude = gbfgetdbl(fin);

	DBG((sobj, "coordinates = %f / %f\n", wpt->latitude, wpt->longitude));

	rtelinks = gbfgetuint16(fin);
	if (rtelinks > 0) {

		rtelink = xcalloc(sizeof(*rtelink), rtelinks);
		DBG((sobj, "rtelinks = %d\n", rtelinks));

		for (i = 0; i < rtelinks; i++) {
			mmo_data_t *tmp;
			int objid;			

			DBG((sobj, "read rtelink number %d\n", i + 1));

			objid = gbfgetuint16(fin);
			gbfseek(fin, -2, SEEK_CUR);

			rtelink[i] = tmp = mmo_read_object(wpt);
			
			if ((objid < 0x8000) && (tmp != NULL) && (tmp->type == rtedata)) {
				route_head *rte = tmp->data;

				tmp->left--;
				route_add_wpt(rte, waypt_dupe(wpt));

				DBG((sobj, "\"%s\" Added to route \"%s\"\n", wpt->shortname, rte->rte_name));
			}
		}

	}
	
	str = mmo_readstr();	/* descr + url */
	if (strncmp(str, "_FILE_ ", 7) == 0) {
		char *cx, *cend;
		
		cx = lrtrim(str + 7);
		cend = strchr(cx, '\n');
		if (cend == NULL) cend = cx + strlen(cx);
		
		cx = lrtrim(xstrndup(cx, cend - cx));
		if (*cx) wpt->url = cx;
		else xfree(cx);

		if (*cend++) wpt->notes = xstrdup(cend);
		
		if (wpt->url) DBG((sobj, "url = \"%s\"\n", wpt->url));
	}
	else
		if (*str) wpt->notes = xstrdup(str);
	xfree(str);

	if (wpt->notes) DBG((sobj, "notes = \"%s\"\n", wpt->notes));

	mmo_fillbuf(buf, 12, 1);
	i = le_read32(&buf[8]);		/* icon */
	if (i != -1) {
		char key[16];
		char *name;
		
		snprintf(key, sizeof(key), "%d", i);
		if (avltree_find(icons, key, (void *)&name)) {
			wpt->icon_descr = xstrdup(name);
			wpt->wpt_flags.icon_descr_is_dynamic = 1;
			DBG((sobj, "icon = \"%s\"\n", wpt->icon_descr));
		}
	}

	wpt->proximity = le_read_float(&buf[4]);
	if (wpt->proximity) {
		wpt->wpt_flags.proximity = 1;
		DBG((sobj, "proximity = %f\n", wpt->proximity));
	}

	str = mmo_readstr();	/* name on gps ??? option ??? */
	if (*str) {
		wpt->description = wpt->shortname;
		wpt->shortname = str;
		DBG((sobj, "name on gps = %s\n", str));
	}
	else xfree(str);

	ux = gbfgetuint32(fin);
	DBG((sobj, "proximity type = %d\n", ux));

	if (rtelinks) {
		int i;

		for (i = 0; i < rtelinks; i++) {
			int j;
			route_head *rte = rtelink[i]->data;

			for (j = 0; j < rtelinks; j++) {
				if ((i != j) && (rtelink[i] == rtelink[j])) {
					rtelink[i]->loop = 1;
					break;
				}
			}
			rtelink[i]->done++;
			if ((rtelink[i]->left == 0) && (rtelink[i]->done == rte->rte_waypt_ct)) {
				if (mmo_version <= 0x11) mmo_end_of_route(rtelink[i]);
			}
		}
	}

	if (rtelink) {
		xfree(rtelink);
		waypt_free(wpt);
		data->data = NULL;
	}
	else waypt_add(wpt);
}