home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 2.ddi / OWLSRC.EXE / CSCAPE / SOURCE / SARRAY.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-06  |  2.1 KB  |  128 lines

  1. /*
  2.     sarray.c
  3.  
  4.     % sleazy array functions
  5.  
  6.     OWL 1.1
  7.     Copyright (c) 1988, by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     -----------------
  12.     05/23/89 jdc    added checks sa == NULL (esize == 0 case)
  13. */
  14.  
  15. #include "oakhead.h"
  16.  
  17. #include "bbcdecl.h"
  18. #include "sadecl.h"
  19.  
  20. VOID *sa_Get(sa, i)
  21.     sarray_type sa;
  22.     long i;
  23. {
  24.     if ( sa != NULL && sa_find(sa, i) ) {
  25.         return((VOID *)(sa->b->start+sa->b->off));
  26.     }
  27.     return(NULL);
  28. }
  29.  
  30. VOID *sa_set(sa, i, sdata, cdata, len, ins)
  31.     sarray_type sa;
  32.     long i;
  33.     VOID *sdata;
  34.     byte cdata;
  35.     unsigned int len;
  36.     boolean ins;
  37. {
  38.     long offset;
  39.     int count;
  40.  
  41.     if (sa == NULL) {
  42.         return(NULL);
  43.     }
  44.  
  45.     if ( !sa_find(sa, i) ) {
  46.         count = (int)(i - sa->b->row);
  47.         for ( offset = ( count <= 0 ) ? 0L : 1L; offset < (long)count; offset++ ) {
  48.             bbc_Set(sa, offset, 0, 1L, FALSE);
  49.         }
  50.         ins = FALSE;
  51.     }
  52.     else {
  53.         offset = 0L;
  54.     }
  55.     if ( sdata != NULL ) {
  56.         bbc_Copy(sa, offset, (char *)sdata, (long)len, ins);
  57.     }
  58.     else {
  59.         bbc_Set(sa, offset, cdata, (long)len, ins);
  60.     }
  61.     if ( !sa_find(sa, i) ) {
  62.         return(NULL);
  63.     }
  64.     return((VOID *)(sa->b->start+sa->b->off));
  65. }
  66.  
  67. long sa_Del(sa, i, count)
  68.     sarray_type sa;
  69.     long i;
  70.     long count;
  71. {
  72.     if ( sa == NULL || !sa_find(sa, i) ) {
  73.         
  74.         return(FALSE);
  75.     }
  76.     return(bbc_Del(sa, 0L, count));
  77. }
  78.  
  79. boolean sa_find(sa, i)
  80.     sarray_type sa;
  81.     long i;
  82. {
  83.     bblock_type b;
  84.     int ret = TRUE;
  85.     long count;
  86.  
  87.     b = sa->b;
  88.  
  89.     while ( b->row == -1L || b->row > i ) {
  90.         if ( b->prev == NULL ) {
  91.             b->off = 0;
  92.             b->row = 0L;
  93.             break;       
  94.         }
  95.         else {
  96.             b = b->prev;
  97.         }
  98.     }
  99.     if ( b->row == i ) {
  100.         if ( b->off == b->len ) {
  101.             return(FALSE);
  102.         }
  103.     }
  104.     else {
  105.         while ( b->row < i ) {
  106.             if ( (count = b->row + (long)((b->len - b->off)/sa->esize)) > i ) {
  107.                 b->off += ((unsigned int)(i - b->row)) * sa->esize;
  108.                 b->row = i;
  109.                 break;
  110.             }
  111.             else if ( b->next == NULL ) {
  112.                 b->off = b->len - sa->esize;
  113.                 b->row = count - 1;
  114.                 ret = FALSE;
  115.                 break;
  116.             }
  117.             else {
  118.                 b = b->next;
  119.                 b->row = count;
  120.                 b->off = 0;
  121.             }
  122.         }
  123.     }
  124.     sa->b = b;
  125.     return(ret);
  126. }
  127.  
  128.