/*********************************************************************/
/* file: llist.c - linked-list datastructure */
/* TINTIN III */
/* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t */
/* coded by peter unold 1992 */
/*********************************************************************/
#include <string.h>
#include "tintin.h"
#if IRIX
#include <stdlib.h>
#include <unistd.h>
#endif
void insertnode_list();
/***************************************/
/* init list - return: ptr to listhead */
/***************************************/
struct listnode *init_list()
{
struct listnode *listhead;
if((listhead=(struct listnode *)(malloc(sizeof(struct listnode))))==NULL) {
fprintf(stderr, "couldn't alloc listhead\n");
exit(1);
}
listhead->next=NULL;
return(listhead);
}
/************************************************/
/* kill list - run throught list and free nodes */
/************************************************/
void kill_list(nptr)
struct listnode *nptr;
{
struct listnode *nexttodel;
nexttodel=nptr->next;
free(nptr);
for(nptr=nexttodel; nptr; nptr=nexttodel) {
nexttodel=nptr->next;
free(nptr->left);
free(nptr->right);
free(nptr);
}
}
/***********************************************/
/* make a copy of a list - return: ptr to copy */
/***********************************************/
struct listnode *copy_list(sourcelist)
struct listnode *sourcelist;
{
struct listnode *resultlist;
resultlist=init_list();
while((sourcelist=sourcelist->next))
insertnode_list(resultlist, sourcelist->left, sourcelist->right);
return(resultlist);
}
/*****************************************************************/
/* create a node containing the ltext, rtext fields and stuff it */
/* into the list - in lexicographical order */
/*****************************************************************/
void insertnode_list(listhead, ltext, rtext)
struct listnode *listhead;
char *ltext;
char *rtext;
{
struct listnode *nptr, *nptrlast, *newnode;
if((newnode=(struct listnode *)(malloc(sizeof(struct listnode))))==NULL) {
fprintf(stderr, "couldn't malloc listhead");
exit(1);
}
newnode->left=(char *)malloc(strlen(ltext)+1);
newnode->right=(char *)malloc(strlen(rtext)+1);
strcpy(newnode->left, ltext);
strcpy(newnode->right, rtext);
nptr=listhead;
while((nptrlast=nptr) && (nptr=nptr->next)) {
if(strcmp(ltext, nptr->left)<=0) {
newnode->next=nptr;
nptrlast->next=newnode;
return;
}
}
nptrlast->next=newnode;
newnode->next=NULL;
}
/*****************************/
/* delete a node from a list */
/*****************************/
void deletenode_list(listhead, nptr)
struct listnode *listhead;
struct listnode *nptr;
{
struct listnode *lastnode=listhead;
while((listhead=listhead->next)) {
if(listhead==nptr) {
lastnode->next=listhead->next;
free(listhead->left);
free(listhead->right);
free(listhead);
return;
}
lastnode=listhead;
}
return;
}
/********************************************************/
/* search for a node containing the ltext in left-field */
/* return: ptr to node on succes / NULL on failure */
/********************************************************/
struct listnode *searchnode_list(listhead, cptr)
struct listnode *listhead;
char *cptr;
{
int i;
while((listhead=listhead->next)) {
if((i=strcmp(listhead->left, cptr))==0)
return listhead;
else if(i>0)
return NULL;
}
return NULL;
}
/********************************************************/
/* search for a node that has cptr as a beginning */
/* return: ptr to node on succes / NULL on failure */
/********************************************************/
struct listnode *searchnode_list_begin(listhead, cptr)
struct listnode *listhead;
char *cptr;
{
int i;
while((listhead=listhead->next)) {
if((i=strncmp(listhead->left, cptr, strlen(cptr)))==0 && (*(listhead->left+strlen(cptr))==' ' || *(listhead->left+strlen(cptr))=='\0'))
return listhead;
else if (i>0)
return NULL;
}
return NULL;
}
/************************************/
/* show contens of a node on screen */
/************************************/
void shownode_list(nptr)
struct listnode *nptr;
{
char temp[BUFFER_SIZE];
sprintf(temp, "{%s}={%s}", nptr->left, nptr->right);
tintin_puts2(temp, (struct session *)NULL);
}
/************************************/
/* list contens of a list on screen */
/************************************/
void show_list(listhead)
struct listnode *listhead;
{
while((listhead=listhead->next))
shownode_list(listhead);
}
struct listnode *search_node_with_wild(listhead, cptr)
struct listnode *listhead;
char *cptr;
{
/* int i; */
while((listhead=listhead->next)) {
if(check_one_node(listhead->left, cptr))
return listhead;
}
return NULL;
}
int check_one_node(text, action)
char *text;
char *action;
{
char *temp, temp2[BUFFER_SIZE], *tptr;
while (*text && *action) {
if (*action=='*') {
action++;
temp=action;
tptr=temp2;
while(*temp && *temp !='*')
*tptr++=*temp++;
*tptr='\0';
if (strlen(temp2)==0)
return TRUE;
while(strncmp(temp2,text,strlen(temp2))!=0 && *text)
text++;
}
else {
temp=action;
tptr=temp2;
while (*temp && *temp !='*')
*tptr++=*temp++;
*tptr='\0';
if(strncmp(temp2,text,strlen(temp2))!=0)
return FALSE;
else {
text+=strlen(temp2);
action+=strlen(temp2);
}
}
}
if (*text)
return FALSE;
else if ((*action=='*' && !*(action+1)) || !*action)
return TRUE;
return FALSE;
}