138 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* $Id: textlist.c,v 1.4 2001/11/24 02:01:26 ukai 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;
 | |
|     }
 | |
| }
 |