home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / OWLSCR / SARRAY.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-03-28  |  2.0 KB  |  117 lines

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