home *** CD-ROM | disk | FTP | other *** search
- /*
- sarray.c
-
- % sleazy array functions
-
- OWL 1.1
- Copyright (c) 1988, by Oakland Group, Inc.
- ALL RIGHTS RESERVED.
-
- Revision History:
- -----------------
- 05/23/89 jdc added checks sa == NULL (esize == 0 case)
- */
-
- #include "oakhead.h"
-
- #include "bbcdecl.h"
- #include "sadecl.h"
-
- VOID *sa_Get(sa, i)
- 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(sa, i, sdata, cdata, len, ins)
- 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(sa, i, count)
- 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(sa, i)
- 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);
- }
-
-