home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d166 / stevie.lha / Stevie / source / alloc.c next >
C/C++ Source or Header  |  1988-11-22  |  4KB  |  164 lines

  1. /*
  2.  * STEVIE - Simply Try this Editor for VI Enthusiasts
  3.  *
  4.  * Code Contributions By : Tim Thompson           twitch!tjt
  5.  *                         Tony Andrews           onecom!wldrdg!tony 
  6.  *                         G. R. (Fred) Walter    watmath!watcgl!grwalter 
  7.  */
  8.  
  9. #include "stevie.h"
  10.  
  11. /*
  12.  * This file contains various routines dealing with allocation and
  13.  * deallocation of data structures. 
  14.  */
  15.  
  16. char           *
  17. alloc(size)
  18.     unsigned        size;
  19. {
  20.     char           *p;        /* pointer to new storage space */
  21.  
  22.     p = malloc(size);
  23.     if (p == (char *) NULL) {    /* if there is no more room... */
  24.     emsg("alloc() is unable to find memory!");
  25.     }
  26.     return (p);
  27. }
  28.  
  29. char           *
  30. strsave(string)
  31.     char           *string;
  32. {
  33.     return (strcpy(alloc((unsigned) (strlen(string) + 1)), string));
  34. }
  35.  
  36. void
  37. screenalloc()
  38. {
  39.     /*
  40.      * If we're changing the size of the screen, free the old arrays 
  41.      */
  42.     if (Realscreen != NULL)
  43.     free(Realscreen);
  44.     if (Nextscreen != NULL)
  45.     free(Nextscreen);
  46.  
  47.     Realscreen = malloc((unsigned) (Rows * Columns));
  48.     Nextscreen = malloc((unsigned) (Rows * Columns));
  49. }
  50.  
  51. /*
  52.  * Allocate and initialize a new line structure with room for 'nchars'
  53.  * characters. 
  54.  */
  55. LINE           *
  56. newline(nchars)
  57.     int             nchars;
  58. {
  59.     LINE           *l;
  60.  
  61.     l = (LINE *) alloc((unsigned) sizeof(LINE));
  62.     if (l == NULL)
  63.     return (LINE *) NULL;
  64.  
  65.     l->s = alloc((unsigned) nchars);    /* the line is empty */
  66.     l->s[0] = NUL;
  67.     l->size = nchars;
  68.  
  69.     l->prev = (LINE *) NULL;    /* should be initialized by caller */
  70.     l->next = (LINE *) NULL;
  71.  
  72.     return l;
  73. }
  74.  
  75. /*
  76.  * filealloc() - construct an initial empty file buffer 
  77.  */
  78. void
  79. filealloc()
  80. {
  81.     if ((Filemem->linep = newline(1)) == NULL) {
  82.     fprintf(stderr, "Unable to allocate file memory!\n");
  83.     getout(1);
  84.     }
  85.     if ((Fileend->linep = newline(1)) == NULL) {
  86.     fprintf(stderr, "Unable to allocate file memory!\n");
  87.     getout(1);
  88.     }
  89.     Filemem->index = 0;
  90.     Fileend->index = 0;
  91.  
  92.     Filemem->linep->next = Fileend->linep;
  93.     Fileend->linep->prev = Filemem->linep;
  94.  
  95.     *Curschar = *Filemem;
  96.     *Topchar = *Filemem;
  97.  
  98.     Filemem->linep->num = 0;
  99.     Fileend->linep->num = 0xffff;
  100.  
  101.     clrall();            /* clear all marks */
  102. }
  103.  
  104. /*
  105.  * freeall() - free the current buffer 
  106.  *
  107.  * Free all lines in the current buffer. 
  108.  */
  109. void
  110. freeall()
  111. {
  112.     LINE           *lp, *xlp;
  113.  
  114.     for (lp = Filemem->linep; lp != NULL; lp = xlp) {
  115.     if (lp->s != NULL)
  116.         free(lp->s);
  117.     xlp = lp->next;
  118.     free((char *) lp);
  119.     }
  120.  
  121.     Curschar->linep = NULL;    /* clear pointers */
  122.     Filemem->linep = NULL;
  123.     Fileend->linep = NULL;
  124. }
  125.  
  126. /*
  127.  * canincrease(n) - returns TRUE if the current line can be increased 'n'
  128.  * bytes 
  129.  *
  130.  * This routine returns immediately if the requested space is available. If not,
  131.  * it attempts to allocate the space and adjust the data structures
  132.  * accordingly. If everything fails it returns FALSE. 
  133.  */
  134. bool_t
  135. canincrease(n)
  136.     int             n;
  137. {
  138.     int             nsize;
  139.     char           *s;        /* pointer to new space */
  140.  
  141.     nsize = strlen(Curschar->linep->s) + 1 + n;    /* size required */
  142.  
  143.     if (nsize <= Curschar->linep->size)
  144.     return TRUE;
  145.  
  146.     /*
  147.      * Need to allocate more space for the string. Allow some extra space on
  148.      * the assumption that we may need it soon. This avoids excessive numbers
  149.      * of calls to malloc while entering new text. 
  150.      */
  151.     s = alloc((unsigned) (nsize + SLOP));
  152.     if (s == NULL) {
  153.     emsg("Can't add anything, file is too big!");
  154.     State = NORMAL;
  155.     return FALSE;
  156.     }
  157.     Curschar->linep->size = nsize + SLOP;
  158.     strcpy(s, Curschar->linep->s);
  159.     free(Curschar->linep->s);
  160.     Curschar->linep->s = s;
  161.  
  162.     return TRUE;
  163. }
  164.