home *** CD-ROM | disk | FTP | other *** search
- /*
- sarray.c
-
- % sleazy array functions
-
- OWL 1.2
- Copyright (c) 1988, by Oakland Group, Inc.
- ALL RIGHTS RESERVED.
-
- Revision History:
- -----------------
- 5/23/89 jdc added checks sa == NULL (esize == 0 case)
-
- 3/28/90 jmd ansi-fied
- */
-
- #include "oakhead.h"
-
- #include "bbcdecl.h"
- #include "sadecl.h"
-
- VOID *sa_Get(sarray_type sa, long i)
- {
- if (sa != NULL && sa_find(sa, i)) {
- return((VOID *)(sa->b->start+sa->b->off));
- }
- return(NULL);
- }
-
- VOID *sa_set(sarray_type sa, long i, VOID *sdata, byte cdata, unsigned int len, boolean ins)
- {
- long offset;
- int count;
-
- if (sa == NULL) {
- return(NULL);
- }
-
- if (!sa_find(sa, i)) {
- count = (int)(i - sa->b->row);
- for (offset = (count <= 0) ? 0L : 1L; offset < (long)count; offset++) {
- bbc_Set(sa, offset, 0, 1L, FALSE);
- }
- ins = FALSE;
- }
- else {
- offset = 0L;
- }
- if (sdata != NULL) {
- bbc_Copy(sa, offset, (char *)sdata, (long)len, ins);
- }
- else {
- bbc_Set(sa, offset, cdata, (long)len, ins);
- }
- if (!sa_find(sa, i)) {
- return(NULL);
- }
- return((VOID *)(sa->b->start+sa->b->off));
- }
-
- long sa_Del(sarray_type sa, long i, long count)
- {
- if (sa == NULL || !sa_find(sa, i)) {
- return(FALSE);
- }
-
- return(bbc_Del(sa, 0L, count));
- }
-
- boolean sa_find(sarray_type sa, long i)
- {
- bblock_type b;
- int ret = TRUE;
- long count;
-
- b = sa->b;
-
- while (b->row == -1L || b->row > i) {
- if (b->prev == NULL) {
- b->off = 0;
- b->row = 0L;
- break;
- }
- else {
- b = b->prev;
- }
- }
- if (b->row == i) {
- if (b->off == b->len) {
- return(FALSE);
- }
- }
- else {
- while (b->row < i) {
- if ((count = b->row + (long)((b->len - b->off)/sa->esize)) > i) {
- b->off += ((unsigned int)(i - b->row)) * sa->esize;
- b->row = i;
- break;
- }
- else if (b->next == NULL) {
- b->off = b->len - sa->esize;
- b->row = count - 1;
- ret = FALSE;
- break;
- }
- else {
- b = b->next;
- b->row = count;
- b->off = 0;
- }
- }
- }
- sa->b = b;
- return(ret);
- }
-
-