Esempio n. 1
0
File: sdrlist.c Progetto: b/ION
Object	Sdr_list_insert_last(char *file, int line, Sdr sdrv, Object list,
		Address data)
{
	SdrList		listBuffer;
	Object		elt;
	SdrListElt	eltBuffer;

	if (!(sdr_in_xn(sdrv)))
	{
		oK(_iEnd(file, line, _notInXnMsg()));
		return 0;
	}

	joinTrace(sdrv, file, line);
	if (list == 0)
	{
		oK(_xniEnd(file, line, "list", sdrv));
		return 0;
	}

	/* create new element */
	elt = _sdrzalloc(sdrv, sizeof(SdrListElt));
	if (elt == 0)
	{
		oK(_iEnd(file, line, "elt"));
		return 0;
	}

	sdr_list__elt_clear(&eltBuffer);
	eltBuffer.list = list;
	eltBuffer.data = data;

	/* insert new element at the end of the list */
	sdrFetch(listBuffer, (Address) list);
	eltBuffer.prev = listBuffer.last;
	eltBuffer.next = 0;
	sdrPut((Address) elt, eltBuffer);
	if (listBuffer.last != 0)
	{
		sdrFetch(eltBuffer, (Address) listBuffer.last);
		eltBuffer.next = elt;
		sdrPut((Address) listBuffer.last, eltBuffer);
	}
	else
	{
		listBuffer.first = elt;
	}

	listBuffer.last = elt;
	listBuffer.length += 1;
	sdrPut((Address) list, listBuffer);
	return elt;
}
Esempio n. 2
0
File: sdrlist.c Progetto: b/ION
Object	Sdr_list_create(char *file, int line, Sdr sdrv)
{
	Object	list;
	SdrList	listBuffer;

	if (!(sdr_in_xn(sdrv)))
	{
		oK(_iEnd(file, line, _notInXnMsg()));
		return 0;
	}

	joinTrace(sdrv, file, line);
	list = _sdrzalloc(sdrv, sizeof(SdrList));
	if (list == 0)
	{
		oK(_iEnd(file, line, "list"));
		return 0;
	}

	sdr_list__clear(&listBuffer);
	sdrPut((Address) list, listBuffer);
	return list;
}
Esempio n. 3
0
File: sdrlist.c Progetto: b/ION
Object	Sdr_list_insert(char *file, int line, Sdr sdrv, Object list,
		Address data, SdrListCompareFn compare, void *argData)
{
	SdrList		listBuffer;
	SdrListElt	eltBuffer;
	Object		elt;

	if (!(sdr_in_xn(sdrv)))
	{
		oK(_iEnd(file, line, _notInXnMsg()));
		return 0;
	}

	if (list == 0)
	{
		oK(_xniEnd(file, line, "list", sdrv));
		return 0;
	}

	/*	If not sorted list, just append to the end of the list.	*/

	if (compare == (SdrListCompareFn) NULL)
	{
		return Sdr_list_insert_last(file, line, sdrv, list, data);
	}

	/*	Application claims that this list is sorted.  Find
	 *	position to insert new data into list.  Start from end
	 *	of list to keep sort stable; sort sequence is implicitly
	 *	FIFO within key, i.e., we insert element AFTER the last
	 *	element in the table with the same key value.		*/

	sdrFetch(listBuffer, (Address) list);
	for (elt = listBuffer.last; elt != 0; elt = eltBuffer.prev)
	{
		sdrFetch(eltBuffer, (Address) elt);
		if (compare(sdrv, eltBuffer.data, argData) <= 0) break;
	}

	/*	Insert into list at this point.				*/

	if (elt == 0)
	{
		return Sdr_list_insert_first(file, line, sdrv, list, data);
	}

	return Sdr_list_insert_after(file, line, sdrv, elt, data);
}
Esempio n. 4
0
File: sdrlist.c Progetto: b/ION
void	Sdr_list_destroy(char *file, int line, Sdr sdrv, Object list,
		SdrListDeleteFn deleteFn, void *arg)
{
	SdrList		listBuffer;
	Object		elt;
	Object		next;
	SdrListElt	eltBuffer;

	if (!(sdr_in_xn(sdrv)))
	{
		oK(_iEnd(file, line, _notInXnMsg()));
		return;
	}

	joinTrace(sdrv, file, line);
	if (list == 0)
	{
		oK(_xniEnd(file, line, "list", sdrv));
		return;
	}

	sdrFetch(listBuffer, (Address) list);
	for (elt = listBuffer.first; elt != 0; elt = next)
	{
		sdrFetch(eltBuffer, (Address) elt);
		next = eltBuffer.next;
		if (deleteFn)
		{
			deleteFn(sdrv, eltBuffer.data, arg);
		}

		/* just in case user mistakenly accesses later... */
		sdr_list__elt_clear(&eltBuffer);
		sdrPut((Address) elt, eltBuffer);
		sdrFree(elt);
	}

	/* just in case user mistakenly accesses later... */
	sdr_list__clear(&listBuffer);
	sdrPut((Address) list, listBuffer);
	sdrFree(list);
}
Esempio n. 5
0
int	Psm_add_catlg(char *file, int line, PsmPartition partition)
{
	PartitionMap	*map;
	PsmAddress	catlg;

	if (!partition)
	{
		oK(_iEnd(file, line, "partition"));
		return -1;
	}

	map = (PartitionMap *) (partition->space);
	lockPartition(map);
	if (map->directory != 0)
	{
		unlockPartition(map);
		_putErrmsg(file, line, "Partition already has root value; \
erase it first.", NULL);
		return -1;
	}
Esempio n. 6
0
File: sdrlist.c Progetto: b/ION
void	Sdr_list_user_data_set(char *file, int line, Sdr sdrv, Object list,
		Address data)
{
	SdrList	listBuffer;

	if (!(sdr_in_xn(sdrv)))
	{
		oK(_iEnd(file, line, _notInXnMsg()));
		return;
	}

	joinTrace(sdrv, file, line);
	if (list == 0)
	{
		oK(_xniEnd(file, line, "list", sdrv));
		return;
	}

	sdrFetch(listBuffer, list);
	listBuffer.userData = data;
	sdrPut((Address) list, listBuffer);
}
Esempio n. 7
0
File: sdrlist.c Progetto: b/ION
void	Sdr_list_delete(char *file, int line, Sdr sdrv, Object elt,
		SdrListDeleteFn deleteFn, void *arg)
{
	SdrListElt	eltBuffer;
	Object		list;
	SdrList		listBuffer;
	Object		next;
	Object		prev;

	if (!(sdr_in_xn(sdrv)))
	{
		oK(_iEnd(file, line, _notInXnMsg()));
		return;
	}

	joinTrace(sdrv, file, line);
	if (elt == 0)
	{
		oK(_xniEnd(file, line, "elt", sdrv));
		return;
	}

	sdrFetch(eltBuffer, (Address) elt);
	if ((list = eltBuffer.list) == 0)
	{
		oK(_xniEnd(file, line, "list", sdrv));
		return;
	}

	sdrFetch(listBuffer, (Address) list);
	if (listBuffer.length < 1)
	{
		oK(_xniEnd(file, line, "list non-empty", sdrv));
		return;
	}

	next = eltBuffer.next;
	prev = eltBuffer.prev;
	if (deleteFn)
	{
		deleteFn(sdrv, eltBuffer.data, arg);
	}

	/* just in case user accesses later... */
	sdr_list__elt_clear(&eltBuffer);
	sdrPut((Address) elt, eltBuffer);
	sdrFree(elt);
	if (prev)
	{
		sdrFetch(eltBuffer, (Address) prev);
		eltBuffer.next = next;
		sdrPut((Address) prev, eltBuffer);
	}
	else
	{
		listBuffer.first = next;
	}

	if (next)
	{
		sdrFetch(eltBuffer, (Address) next);
		eltBuffer.prev = prev;
		sdrPut((Address) next, eltBuffer);
	}
	else
	{
		listBuffer.last = prev;
	}

	listBuffer.length -= 1;
	sdrPut((Address) list, listBuffer);
}
Esempio n. 8
0
File: sdrlist.c Progetto: b/ION
Object	Sdr_list_insert_before(char *file, int line, Sdr sdrv, Object oldElt,
		Address data)
{
	SdrListElt	oldEltBuffer;
	Object		list;
	SdrList		listBuffer;
	Object		elt;
	SdrListElt	eltBuffer;

	if (!(sdr_in_xn(sdrv)))
	{
		oK(_iEnd(file, line, _notInXnMsg()));
		return 0;
	}

	joinTrace(sdrv, file, line);
	if (oldElt == 0)
	{
		oK(_xniEnd(file, line, "oldElt", sdrv));
		return 0;
	}

	sdrFetch(oldEltBuffer, (Address) oldElt);
	if ((list = oldEltBuffer.list) == 0)
	{
		oK(_xniEnd(file, line, "list", sdrv));
		return 0;
	}

	/* create new element */
	elt = _sdrzalloc(sdrv, sizeof(SdrListElt));
	if (elt == 0)
	{
		oK(_iEnd(file, line, "elt"));
		return 0;
	}

	sdr_list__elt_clear(&eltBuffer);
	eltBuffer.list = list;
	eltBuffer.data = data;

	/* insert new element before the specified element */
	sdrFetch(listBuffer, (Address) list);
	eltBuffer.prev = oldEltBuffer.prev;
	eltBuffer.next = oldElt;
	sdrPut((Address) elt, eltBuffer);
	if (oldEltBuffer.prev != 0)
	{
		sdrFetch(eltBuffer, (Address) oldEltBuffer.prev);
		eltBuffer.next = elt;
		sdrPut((Address) oldEltBuffer.prev, eltBuffer);
	}
	else
	{
		listBuffer.first = elt;
	}

	oldEltBuffer.prev = elt;
	sdrPut((Address) oldElt, oldEltBuffer);
	listBuffer.length += 1;
	sdrPut((Address) list, listBuffer);
	return elt;
}