home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / SDALLOC.C < prev    next >
C/C++ Source or Header  |  1990-10-22  |  2KB  |  85 lines

  1. /*
  2.     sdalloc.c    jdc    10/27/88
  3.  
  4.     % sed_Alloc
  5.  
  6.     C-scape 3.2
  7.     Copyright (c) 1988 by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     ---------------------
  12.      4/28/89 jdc    preened
  13.      6/21/89 jmd    made a boolean, added comments
  14.      7/06/89 jdc    varsize == 0 var now gets set to NULL (VAR_TED case)
  15.      8/14/89 jdc    added bob support
  16.  
  17.     11/16/89 jmd    fixed infinite recursion bug and size == 0 bug
  18.      3/28/90 jmd    ansi-fied
  19.     10/22/90 bkd    added alignment stuff.
  20. */
  21.  
  22. #include "sed.h"
  23. #include "sfile.h"
  24.  
  25. boolean sd_alloc(sed_type sed, boolean dobobs)
  26. /*
  27.     Allocate space for a sed's variables.
  28.     Returns FALSE if it fails.
  29.     if dobobs is TRUE, allocate space for all child seds.
  30. */
  31. {
  32.     unsigned int size;
  33.     int      i;
  34.     bob_type child;
  35.      char     *data;
  36.  
  37.     /* if we've already allocated storage, release it */
  38.     if (sed_GetMenu(sed)->varblock != NULL) {
  39.         ofree(CSA_VARBLOCK, (VOID *) sed_GetMenu(sed)->varblock);
  40.         sed_GetMenu(sed)->varblock = NULL;
  41.     }
  42.  
  43.     /* figure out how much space we need */
  44.     for (i = 0, size = 0; i < sed_GetFieldCount(sed); i++) {
  45.         size += oroundup(sed_GetVarSize(sed, i), O_ALIGNSIZE);
  46.     }
  47.  
  48.     if (size != 0) {
  49.         /* allocate the space */
  50.         if ((sed_GetMenu(sed)->varblock = (VOID *) ocalloc(CSA_VARBLOCK, 1, size)) == NULL) {
  51.             return(FALSE);
  52.         }
  53.  
  54.         /* point the field variables to the space */
  55.         for (i = 0, data = (char *)(sed_GetMenu(sed)->varblock); i < sed_GetFieldCount(sed); i++) {
  56.             if ((size = oroundup(sed_GetVarSize(sed, i), O_ALIGNSIZE)) == 0) {
  57.                 sed_SetVar(sed, i, NULL);
  58.             }
  59.             else {
  60.                 sed_SetVar(sed, i, (VOID *)data);
  61.             }
  62.             data += size;
  63.         }
  64.     }
  65.  
  66.     /* allocate space for our child seds--if we're supposed to */
  67.     if (dobobs) {
  68.         for (i = 0; i < sed_GetMenu(sed)->bobcount; i++) {
  69.  
  70.             /* pull the bob out the bob array */
  71.             child = sed_GetFieldBob(sed, ia_Get(sed_GetMenu(sed)->boba, i));
  72.  
  73.             /* check if the bob is a sed */
  74.             if (bob_IsSed(child)) {
  75.                 if (!sd_alloc(child, dobobs)) {
  76.                     return(FALSE);
  77.                 }
  78.             }
  79.         }
  80.     }
  81.  
  82.     return(TRUE);
  83. }
  84.  
  85.