Initial revision
This commit is contained in:
139
textlist.c
Normal file
139
textlist.c
Normal file
@@ -0,0 +1,139 @@
|
||||
/* $Id: textlist.c,v 1.1 2001/11/08 05:15:43 a-ito Exp $ */
|
||||
#include "textlist.h"
|
||||
#include "indep.h"
|
||||
#include "Str.h"
|
||||
#include "gc.h"
|
||||
|
||||
/* General doubly linked list */
|
||||
|
||||
ListItem *
|
||||
newListItem(void *s, ListItem * n, ListItem * p)
|
||||
{
|
||||
ListItem *it;
|
||||
it = New(ListItem);
|
||||
it->ptr = s;
|
||||
it->next = n;
|
||||
it->prev = p;
|
||||
return it;
|
||||
}
|
||||
|
||||
GeneralList *
|
||||
newGeneralList()
|
||||
{
|
||||
GeneralList *tl = New(GeneralList);
|
||||
tl->first = tl->last = NULL;
|
||||
tl->nitem = 0;
|
||||
return tl;
|
||||
}
|
||||
|
||||
void
|
||||
pushValue(GeneralList * tl, void *s)
|
||||
{
|
||||
ListItem *it;
|
||||
if (s == NULL)
|
||||
return;
|
||||
it = newListItem(s, NULL, tl->last);
|
||||
if (tl->first == NULL) {
|
||||
tl->first = it;
|
||||
tl->last = it;
|
||||
tl->nitem = 1;
|
||||
}
|
||||
else {
|
||||
tl->last->next = it;
|
||||
tl->last = it;
|
||||
tl->nitem++;
|
||||
}
|
||||
}
|
||||
|
||||
void *
|
||||
popValue(GeneralList * tl)
|
||||
{
|
||||
ListItem *f;
|
||||
|
||||
if (tl == NULL || tl->first == NULL)
|
||||
return NULL;
|
||||
f = tl->first;
|
||||
tl->first = f->next;
|
||||
if (tl->first)
|
||||
tl->first->prev = NULL;
|
||||
else
|
||||
tl->last = NULL;
|
||||
tl->nitem--;
|
||||
return f->ptr;
|
||||
}
|
||||
|
||||
void *
|
||||
rpopValue(GeneralList * tl)
|
||||
{
|
||||
ListItem *f;
|
||||
|
||||
if (tl == NULL || tl->last == NULL)
|
||||
return NULL;
|
||||
f = tl->last;
|
||||
tl->last = f->prev;
|
||||
if (tl->last)
|
||||
tl->last->next = NULL;
|
||||
else
|
||||
tl->first = NULL;
|
||||
tl->nitem--;
|
||||
return f->ptr;
|
||||
}
|
||||
|
||||
GeneralList *
|
||||
appendGeneralList(GeneralList * tl, GeneralList * tl2)
|
||||
{
|
||||
if (tl && tl2) {
|
||||
if (tl2->first) {
|
||||
if (tl->last) {
|
||||
tl->last->next = tl2->first;
|
||||
tl2->first->prev = tl->last;
|
||||
tl->last = tl2->last;
|
||||
tl->nitem += tl2->nitem;
|
||||
}
|
||||
else {
|
||||
tl->first = tl2->first;
|
||||
tl->last = tl2->last;
|
||||
tl->nitem = tl2->nitem;
|
||||
}
|
||||
}
|
||||
tl2->first = tl2->last = NULL;
|
||||
tl2->nitem = 0;
|
||||
}
|
||||
|
||||
return tl;
|
||||
}
|
||||
|
||||
|
||||
/* Line text list */
|
||||
|
||||
TextLine *
|
||||
newTextLine(Str line, int pos)
|
||||
{
|
||||
TextLine *lbuf = New(TextLine);
|
||||
if (line)
|
||||
lbuf->line = line;
|
||||
else
|
||||
lbuf->line = Strnew();
|
||||
lbuf->pos = pos;
|
||||
return lbuf;
|
||||
}
|
||||
|
||||
void
|
||||
appendTextLine(TextLineList * tl, Str line, int pos)
|
||||
{
|
||||
TextLine *lbuf;
|
||||
|
||||
if (tl->last == NULL) {
|
||||
pushTextLine(tl, newTextLine(Strdup(line), pos));
|
||||
}
|
||||
else {
|
||||
lbuf = tl->last->ptr;
|
||||
if (lbuf->line)
|
||||
Strcat(lbuf->line, line);
|
||||
else
|
||||
lbuf->line = line;
|
||||
lbuf->pos += pos;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user