;/* buildlist.c - Execute me to compile me with SAS C 5.10
LC -b1 -cfistq -v -y -j73 buildlist.c
Blink FROM LIB:c.o,buildlist.o TO buildlist LIBRARY LIB:LC.lib,LIB:Amiga.lib
quit
** The code below demonstrates the concepts and functions discussed in this
** chapter by building an application-defined Exec List.
**
** buildlist.c - example which uses an application-specific Exec list
*/
#include <exec/types.h>
#include <exec/lists.h>
#include <exec/nodes.h>
#include <exec/memory.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <string.h>
#include <stdio.h>
#ifdef LATTICE
int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */
void chkabort(void) { return; } /* really */
#endif
/* Our function prototypes */
VOID AddName(struct List *, UBYTE *);
VOID FreeNameNodes(struct List *);
VOID DisplayNameList(struct List *);
VOID DisplayName(struct List *, UBYTE *);
struct NameNode {
struct Node nn_Node; /* System Node structure */
UBYTE nn_Data[62]; /* Node-specific data */
};
#define NAMENODE_ID 100 /* The type of "NameNode" */
VOID main(VOID)
{
struct List *NameList; /* Note that a MinList would also work */
if (!( NameList = AllocMem(sizeof(struct List),MEMF_CLEAR)) )
printf("Out of memory\n");
else {
NewList(NameList); /* Important: prepare header for use */
AddName(NameList,"Name7"); AddName(NameList,"Name6");
AddName(NameList,"Name5"); AddName(NameList,"Name4");
AddName(NameList,"Name2"); AddName(NameList,"Name0");
AddName(NameList,"Name7"); AddName(NameList,"Name5");
AddName(NameList,"Name3"); AddName(NameList,"Name1");
DisplayName(NameList,"Name5");
DisplayNameList(NameList);
FreeNameNodes(NameList);
FreeMem(NameList,sizeof(struct List)); /* Free list header */
}
}
/* Allocate a NameNode structure, copy the given name into the structure,
* then add it the specified list. This example does not provide an
* error return for the out of memory condition.
*/
VOID AddName(struct List *list, UBYTE *name)
{
struct NameNode *namenode;
if (!( namenode = AllocMem(sizeof(struct NameNode),MEMF_CLEAR) ))
printf("Out of memory\n");
else {
strcpy(namenode->nn_Data,name);
namenode->nn_Node.ln_Name = namenode->nn_Data;
namenode->nn_Node.ln_Type = NAMENODE_ID;
namenode->nn_Node.ln_Pri = 0;
AddHead((struct List *)list,(struct Node *)namenode);
}
}
/*
* Free the entire list, including the header. The header is not updated
* as the list is freed. This function demonstrates how to avoid
* referencing freed memory when deallocating nodes.
*/
VOID FreeNameNodes(struct List *list)
{
struct NameNode *worknode;
struct NameNode *nextnode;
worknode = (struct NameNode *)(list->lh_Head); /* First node */
while (nextnode = (struct NameNode *)(worknode->nn_Node.ln_Succ)) {
FreeMem(worknode,sizeof(struct NameNode));
worknode = nextnode;
}
}
/*
* Print the names of each node in a list.
*/
VOID DisplayNameList(struct List *list)
{
struct Node *node;
if (list->lh_TailPred == (struct Node *)list)
printf("List is empty.\n");
else {
for (node = list->lh_Head ; node->ln_Succ ; node = node->ln_Succ)
printf("%lx -> %s\n",node,node->ln_Name);
}
}
/*
* Print the location of all nodes with a specified name.
*/
VOID DisplayName(struct List *list, UBYTE *name)
{
struct Node *node;
if (node = FindName(list,name)) {
while (node) {
printf("Found a %s at location %lx\n",node->ln_Name,node);
node = FindName((struct List *)node,name);
}
} else printf("No node with name %s found.\n",name);
}