230 lines
5.3 KiB
C
230 lines
5.3 KiB
C
|
/*
|
||
|
* Various allocation routines and routines returning information about
|
||
|
* allocated objects.
|
||
|
*/
|
||
|
|
||
|
#include "stevie.h"
|
||
|
|
||
|
char *
|
||
|
alloc(size)
|
||
|
unsigned size;
|
||
|
{
|
||
|
char *p; /* pointer to new storage space */
|
||
|
|
||
|
p = malloc(size);
|
||
|
if ( p == (char *)NULL ) { /* if there is no more room... */
|
||
|
emsg("Insufficient memory");
|
||
|
}
|
||
|
return(p);
|
||
|
}
|
||
|
|
||
|
char *
|
||
|
ralloc(char *block,unsigned newsize)
|
||
|
{
|
||
|
char *p;
|
||
|
|
||
|
if((p = realloc(block,newsize)) == NULL) {
|
||
|
emsg("Insufficient memory");
|
||
|
}
|
||
|
return(p);
|
||
|
}
|
||
|
|
||
|
char *
|
||
|
strsave(string)
|
||
|
char *string;
|
||
|
{
|
||
|
return(strcpy(alloc((unsigned)(strlen(string)+1)),string));
|
||
|
}
|
||
|
|
||
|
void
|
||
|
screenalloc()
|
||
|
{
|
||
|
/*
|
||
|
* If we're changing the size of the screen, free the old arrays
|
||
|
*/
|
||
|
if (Realscreen != NULL)
|
||
|
free(Realscreen);
|
||
|
if (Nextscreen != NULL)
|
||
|
free(Nextscreen);
|
||
|
|
||
|
Realscreen = malloc((unsigned)(Rows*Columns));
|
||
|
Nextscreen = malloc((unsigned)(Rows*Columns));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Allocate and initialize a new line structure with room for
|
||
|
* 'nchars'+1 characters. We add one to nchars here to allow for
|
||
|
* null termination because all the callers would just do it otherwise.
|
||
|
*/
|
||
|
LINE *
|
||
|
newline(nchars)
|
||
|
int nchars;
|
||
|
{
|
||
|
register LINE *l;
|
||
|
|
||
|
if ((l = (LINE *) alloc(sizeof(LINE))) == NULL)
|
||
|
return (LINE *) NULL;
|
||
|
|
||
|
l->s = alloc((unsigned) (nchars+1)); /* the line is empty */
|
||
|
l->s[0] = NUL;
|
||
|
l->size = nchars + 1;
|
||
|
|
||
|
l->prev = (LINE *) NULL; /* should be initialized by caller */
|
||
|
l->next = (LINE *) NULL;
|
||
|
|
||
|
return l;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* filealloc() - construct an initial empty file buffer
|
||
|
*/
|
||
|
void
|
||
|
filealloc()
|
||
|
{
|
||
|
if ((Filemem->linep = newline(0)) == NULL) {
|
||
|
fprintf(stderr,"Unable to allocate file memory!\n");
|
||
|
exit(1);
|
||
|
}
|
||
|
if ((Filetop->linep = newline(0)) == NULL) {
|
||
|
fprintf(stderr,"Unable to allocate file memory!\n");
|
||
|
exit(1);
|
||
|
}
|
||
|
if ((Fileend->linep = newline(0)) == NULL) {
|
||
|
fprintf(stderr,"Unable to allocate file memory!\n");
|
||
|
exit(1);
|
||
|
}
|
||
|
Filemem->index = 0;
|
||
|
Filetop->index = 0;
|
||
|
Fileend->index = 0;
|
||
|
|
||
|
Filetop->linep->next = Filemem->linep; /* connect Filetop to Filemem */
|
||
|
Filemem->linep->prev = Filetop->linep;
|
||
|
|
||
|
Filemem->linep->next = Fileend->linep; /* connect Filemem to Fileend */
|
||
|
Fileend->linep->prev = Filemem->linep;
|
||
|
|
||
|
*Curschar = *Filemem;
|
||
|
*Topchar = *Filemem;
|
||
|
|
||
|
Filemem->linep->num = 0;
|
||
|
Fileend->linep->num = 0xffff;
|
||
|
|
||
|
clrall(); /* clear all marks */
|
||
|
u_clear(); /* clear the undo buffer */
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* freeall() - free the current buffer
|
||
|
*
|
||
|
* Free all lines in the current buffer.
|
||
|
*/
|
||
|
void
|
||
|
freeall()
|
||
|
{
|
||
|
register LINE *lp, *xlp;
|
||
|
|
||
|
for (lp = Filetop->linep; lp != NULL ;lp = xlp) {
|
||
|
if (lp->s != NULL)
|
||
|
free(lp->s);
|
||
|
xlp = lp->next;
|
||
|
free((char *)lp);
|
||
|
}
|
||
|
|
||
|
Curschar->linep = NULL; /* clear pointers */
|
||
|
Filetop->linep = NULL;
|
||
|
Filemem->linep = NULL;
|
||
|
Fileend->linep = NULL;
|
||
|
|
||
|
u_clear();
|
||
|
/* _heapmin(); */
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* bufempty() - return TRUE if the buffer is empty
|
||
|
*/
|
||
|
bool_t
|
||
|
bufempty()
|
||
|
{
|
||
|
return (buf1line() && Filemem->linep->s[0] == NUL);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* buf1line() - return TRUE if there is only one line
|
||
|
*/
|
||
|
bool_t
|
||
|
buf1line()
|
||
|
{
|
||
|
return (Filemem->linep->next == Fileend->linep);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* lineempty() - return TRUE if the current line is empty
|
||
|
*/
|
||
|
bool_t
|
||
|
lineempty()
|
||
|
{
|
||
|
return (Curschar->linep->s[0] == NUL);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* endofline() - return TRUE if the given position is at end of line
|
||
|
*
|
||
|
* This routine will probably never be called with a position resting
|
||
|
* on the NUL byte, but handle it correctly in case it happens.
|
||
|
*/
|
||
|
bool_t
|
||
|
endofline(p)
|
||
|
register LNPTR *p;
|
||
|
{
|
||
|
return (p->linep->s[p->index] == NUL || p->linep->s[p->index+1] == NUL);
|
||
|
}
|
||
|
/*
|
||
|
* canincrease(n) - returns TRUE if the current line can be increased 'n' bytes
|
||
|
*
|
||
|
* This routine returns immediately if the requested space is available.
|
||
|
* If not, it attempts to allocate the space and adjust the data structures
|
||
|
* accordingly. If everything fails it returns FALSE.
|
||
|
*/
|
||
|
bool_t
|
||
|
canincrease(n)
|
||
|
register int n;
|
||
|
{
|
||
|
register int nsize;
|
||
|
register char *s; /* pointer to new space */
|
||
|
|
||
|
nsize = strlen(Curschar->linep->s) + 1 + n; /* size required */
|
||
|
|
||
|
if (nsize <= Curschar->linep->size)
|
||
|
return TRUE;
|
||
|
|
||
|
/*
|
||
|
* Need to allocate more space for the string. Allow some extra
|
||
|
* space on the assumption that we may need it soon. This avoids
|
||
|
* excessive numbers of calls to malloc while entering new text.
|
||
|
*/
|
||
|
if ((s = alloc((unsigned) (nsize + SLOP))) == NULL) {
|
||
|
emsg("Can't add anything, file is too big!");
|
||
|
State = NORMAL;
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
Curschar->linep->size = nsize + SLOP;
|
||
|
strcpy(s, Curschar->linep->s);
|
||
|
free(Curschar->linep->s);
|
||
|
Curschar->linep->s = s;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
char *
|
||
|
mkstr(c)
|
||
|
char c;
|
||
|
{
|
||
|
static char s[2];
|
||
|
|
||
|
s[0] = c;
|
||
|
s[1] = NUL;
|
||
|
|
||
|
return s;
|
||
|
}
|