home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-06-29 | 5.5 KB | 243 lines | [TEXT/CWIE] |
- //LinkedList.c
-
- #include "LinkedList.proto.h"
- short reSortElement(LinkedListNode **theHead, LinkedListNode *theChangedElement)
- {
- LinkedListNode *leader, *copyOfNew;
- short index = 1;
- copyOfNew = (LinkedListNode *) myNewPtrCritical(sizeof(LinkedListNode));
- copyOfNew->name = NewString(*theChangedElement->name);
- copyOfNew->next = NULL;
- deleteItem(theHead, *theChangedElement->name);
- insertInSortedList(theHead, copyOfNew);
-
- //now its in there; return where it is
-
- leader = *theHead;
- while ((leader->next != NULL)&&
- (!(EqualString(*leader->name,*copyOfNew->name,TRUE,FALSE))))
- {
- leader = leader->next;
- index++;
- }
- return index - 1;
- }
-
- void deleteList(LinkedListNode **theHead)
- {
- LinkedListNode *current,*nextNode;
- current = *theHead;
- if (current == NULL)
- return;
- nextNode = current->next;
- while(current != NULL)
- {
- DisposeHandle((Handle)current->name);
- DisposePtr((Ptr)current);
- current = nextNode;
- nextNode = nextNode->next;
- }
- *theHead = NULL;
- }
- void insertInSortedList(LinkedListNode **head, LinkedListNode *newItem)
- {
- LinkedListNode *leader, *trailer;
- Boolean done = FALSE;
- short newOneIsBigger;
-
- if (*head == NULL)//this is first element in list
- {
- *head = newItem;
- return;
- }
- trailer = *head;
- leader = (*head)->next;
- if (leader == NULL)
- {
- (*head)->next = newItem;
- newItem->next = NULL;
- return;
- }
-
- while (!done)
- {
- newOneIsBigger = RelString(*(newItem->name),*(leader->name),TRUE,FALSE);
- if (newOneIsBigger == 1)
- {
- if (leader->next == NULL)//end of list
- {
- leader->next = newItem;
- newItem->next = NULL;
- done = TRUE;
- }
- else
- {
- trailer = leader;
- leader = leader->next;
- }
- }
- else
- {
- trailer->next = newItem;
- newItem->next = leader;
- done = TRUE;
- }
- }
- }
- //returns position
- short createNodeAndSort(LinkedListNode **head, Str255 theName)
- {
- short index=1;
- LinkedListNode *leader = *head;
- LinkedListNode *newNode = (LinkedListNode *)myNewPtrCritical(sizeof(LinkedListNode));
- newNode->name = NewString(theName);
- newNode->next = NULL;
- if (*head == NULL)
- {
- *head = newNode;
- return 1;
- }
- else
- {
- insertInSortedList(head, newNode);
-
- while ((leader->next != NULL)&&
- (!(EqualString(*leader->name,theName,TRUE,FALSE))))
- {
- leader = leader->next;
- index++;
- }
- return (index - 1);
- }
- }
-
- LinkedListNode *createSortedList(ResType ConfigResourceType,short numberofitems,Str255 placeThisFirst)
- {
- short index, resID;
- Handle ItemResource;
- Str255 ItemName;
- ResType restype;
- LinkedListNode *newNode, *theHead = NULL;
-
- if (placeThisFirst != NULL)
- {
- theHead = (LinkedListNode *) myNewPtrCritical(sizeof(LinkedListNode));
- ItemResource = Get1NamedResource(ConfigResourceType,placeThisFirst);
- theHead->name = NewString(placeThisFirst); //set the head of our list
- theHead->next = NULL;
- if (ItemResource != NULL)
- ReleaseResource(ItemResource);
- }
- for (index = 1; index <= numberofitems; index++)
- {
- ItemResource = Get1IndResource(ConfigResourceType, index);
- GetResInfo(ItemResource, &resID, &restype, (StringPtr)&ItemName);
- if (!(EqualString(placeThisFirst,ItemName,1,0)))
- {
- newNode = (LinkedListNode *) myNewPtrCritical(sizeof(LinkedListNode));
- newNode->name = NewString(ItemName);
-
- insertInSortedList(&theHead, newNode);
- ReleaseResource(ItemResource);
- }
- }
- return (theHead);
- }
-
- void deleteItem(LinkedListNode **theHead,Str255 ItemName)
- {
- LinkedListNode *leader = *theHead, *trailer = *theHead;
- while(!(EqualString(ItemName,*leader->name,TRUE,FALSE))&&(leader->next != NULL))
- {
- trailer = leader;
- leader = leader->next;
- }
- if (leader == *theHead)
- {
- *theHead = (*theHead)->next;
- DisposeHandle((Handle)leader->name);
- DisposePtr((Ptr)leader);
- }
- else
- {
- trailer->next = leader->next;
- DisposeHandle((Handle)leader->name);
- DisposePtr((Ptr)leader);
- }
- }
-
- LinkedListNode *findNode(LinkedListNode *theHead,Str255 ItemName)
- {
- LinkedListNode *leader = theHead;
- while ((leader->next != NULL)&&(!(EqualString(ItemName,*leader->name,TRUE,FALSE))))
- leader = leader->next;
-
- if (!(EqualString(ItemName,*leader->name,TRUE,FALSE)))
- return NULL;
- else
- return(leader);
- }
-
- short findClosestNodeIndex(LinkedListNode *theHead,Str255 ItemName)
- {
- short index=1;
- LinkedListNode *leader = theHead, *trailer = theHead;
- while ((leader->next != NULL) &&
- (RelString(*leader->name,ItemName,TRUE,FALSE) == -1))
- {
- trailer = leader;
- leader = leader->next;
- index++;
- }
- return index-1;
- }
-
- short findNodeIndex(LinkedListNode *theHead,Str255 ItemName)
- {
- short index = 1;
- LinkedListNode *leader = theHead;
- while ((leader->next != NULL)&&
- (!(EqualString(*leader->name,ItemName,TRUE,FALSE))))
- {
- leader = leader->next;
- index++;
- }
-
- return (index - 1);
- }
-
- void addListToMenu(MenuHandle theMenu, LinkedListNode *theHead)
- {
- LinkedListNode *traverser = theHead;
- short itemIndex = 1;
- while(traverser != NULL)
- {
- HLock((Handle)traverser->name);
- AppendMenu(theMenu,"\poops"); //these two avoid diacritcal interpertation of '<'
- SetItem(theMenu,itemIndex,*traverser->name);
- HUnlock((Handle)traverser->name);
-
- traverser = traverser->next;
- itemIndex++;
- }
- }
-
- void getAUniqueName(LinkedListNode *theHead, Str255 theName)
- {
- while(findNode(theHead,theName))
- {
- if ((theName[theName[0]] > '9')||
- (theName[theName[0]] < '0')) //add a number
- {
- theName[++theName[0]] = ' ';
- theName[++theName[0]] = '1';
- }
- else if (theName[theName[0]] == '9') //add another digit
- {
- theName[theName[0]] = '-';
- theName[++theName[0]] = '1';
- }
- else
- theName[theName[0]]++; //incremement the number
- }
- }