Annotation of coherent/d/bin/tsort/logic.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include "tsort.h"
        !             3: 
        !             4: 
        !             5: /*
        !             6:  *     Remove removes the word pointed to by "wrdp".  The only effect
        !             7:  *     of this is to set its "name" to the empty string.
        !             8:  */
        !             9: 
        !            10: #define        remove(wrdp)    ((wrdp)->name[0] = '\0')
        !            11: 
        !            12: 
        !            13: /*
        !            14:  *     Gone is used to determine if a word has already been
        !            15:  *     written out.  The mechanism used is that when a word
        !            16:  *     has been written out, its "name" is set to the empty
        !            17:  *     string.
        !            18:  */
        !            19: 
        !            20: #define        gone(wrdp)      ((wrdp)->name[0] == '\0')
        !            21: 
        !            22: 
        !            23: /*
        !            24:  *     Clean is used to remove elements of a wordlist.  It takes
        !            25:  *     the wordlist pointed to by *"wrdlp" and removes any elements
        !            26:  *     for which gone returns true.
        !            27:  */
        !            28: 
        !            29: static void
        !            30: clean(wrdlp)
        !            31: register struct wordlist **wrdlp;
        !            32: {
        !            33:        register struct worlist *wrdl;
        !            34: 
        !            35:        for (wrdl = *wrdlp; wrdl != NULL; wrdlp = &wrdl->next, wrdl = *wrdlp)
        !            36:                if (gone(wrdl->element)) {
        !            37:                        do {
        !            38:                                wrdl = wrdl->next;
        !            39:                        } while (wrdl != NULL && gone(wrdl->element));
        !            40:                        *wrdlp = wrdl;
        !            41:                        if (wrdl == NULL)
        !            42:                                break;
        !            43:                }
        !            44: }
        !            45: 
        !            46: 
        !            47: /*
        !            48:  *     Pass makes one pass thru the wordlist pointed to by words,
        !            49:  *     cleaning up all ancestor lists and writeing out all words
        !            50:  *     with no ancestors.  When it writes out a word, it "remove"s
        !            51:  *     it.  When the pass is completed, it makes another pass 
        !            52:  *     to actually take all written out words out of the list
        !            53:  *     of words.
        !            54:  */
        !            55: 
        !            56: static
        !            57: pass()
        !            58: {
        !            59:        register struct wordlist *wrdlp;
        !            60:        register progress = FALSE;
        !            61: 
        !            62:        for (wrdlp = words; wrdlp != NULL; wrdlp = wrdlp->next) {
        !            63:                clean(&wrdlp->element->ancestors);
        !            64:                if (wrdlp->element->ancestors == NULL) {
        !            65:                        progress = TRUE;
        !            66:                        printf("%s\n", wrdlp->element->name);
        !            67:                        remove(wrdlp->element);
        !            68:                }
        !            69:        }
        !            70:        clean(&words);
        !            71:        return (progress);
        !            72: }
        !            73: 
        !            74: 
        !            75: /*
        !            76:  *     Dump is used to dump out the remaining words if we find any
        !            77:  *     cycles.  It simply prints out all the remaining words in
        !            78:  *     a random order.
        !            79:  */
        !            80: 
        !            81: static void
        !            82: dump()
        !            83: {
        !            84:        register struct wordlist *wrdlp;
        !            85: 
        !            86:        for (wrdlp = words; wrdlp != NULL; wrdlp = wrdlp->next)
        !            87:                printf("%s\n", wrdlp->element->name);
        !            88: }
        !            89: 
        !            90: 
        !            91: /*
        !            92:  *     Order is the routine which actually controls the dumping
        !            93:  *     of all entries in the tree.  It repeatedly calls pass until
        !            94:  *     the tree is empty or nothing new can be dumped (indicateing
        !            95:  *     a cycle).
        !            96:  */
        !            97: 
        !            98: void
        !            99: order()
        !           100: {
        !           101:        while (pass())
        !           102:                ;
        !           103:        dump();
        !           104:        if (words != NULL)
        !           105:                die("cycles");
        !           106: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.