|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 2221 (0x8ad) Types: TextFile Notes: UNIX file Names: »logic.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦f4b8d8c84⟧ UNIX Filesystem └─⟦this⟧ »cmd/tsort/logic.c«
#include <stdio.h> #include "tsort.h" /* * Remove removes the word pointed to by "wrdp". The only effect * of this is to set its "name" to the empty string. */ #define remove(wrdp) ((wrdp)->name[0] = '\0') /* * Gone is used to determine if a word has already been * written out. The mechanism used is that when a word * has been written out, its "name" is set to the empty * string. */ #define gone(wrdp) ((wrdp)->name[0] == '\0') /* * Clean is used to remove elements of a wordlist. It takes * the wordlist pointed to by *"wrdlp" and removes any elements * for which gone returns true. */ static void clean(wrdlp) register struct wordlist **wrdlp; { register struct worlist *wrdl; for (wrdl = *wrdlp; wrdl != NULL; wrdlp = &wrdl->next, wrdl = *wrdlp) if (gone(wrdl->element)) { do { wrdl = wrdl->next; } while (wrdl != NULL && gone(wrdl->element)); *wrdlp = wrdl; if (wrdl == NULL) break; } } /* * Pass makes one pass thru the wordlist pointed to by words, * cleaning up all ancestor lists and writeing out all words * with no ancestors. When it writes out a word, it "remove"s * it. When the pass is completed, it makes another pass * to actually take all written out words out of the list * of words. */ static pass() { register struct wordlist *wrdlp; register progress = FALSE; for (wrdlp = words; wrdlp != NULL; wrdlp = wrdlp->next) { clean(&wrdlp->element->ancestors); if (wrdlp->element->ancestors == NULL) { progress = TRUE; printf("%s\n", wrdlp->element->name); remove(wrdlp->element); } } clean(&words); return (progress); } /* * Dump is used to dump out the remaining words if we find any * cycles. It simply prints out all the remaining words in * a random order. */ static void dump() { register struct wordlist *wrdlp; for (wrdlp = words; wrdlp != NULL; wrdlp = wrdlp->next) printf("%s\n", wrdlp->element->name); } /* * Order is the routine which actually controls the dumping * of all entries in the tree. It repeatedly calls pass until * the tree is empty or nothing new can be dumped (indicateing * a cycle). */ void order() { while (pass()) ; dump(); if (words != NULL) die("cycles"); }