Annotation of researchv10no/cmd/sort/rsort.c, revision 1.1

1.1     ! root        1: /* Copyright 1990, AT&T Bell Labs */
        !             2: #include "fsort.h"
        !             3: 
        !             4: /* Radix sort by bytes.  Records are chained in a list.
        !             5:    There are up to 257 bins at each recursion level.
        !             6:    The "null bin" is for short strings that have run out;
        !             7:    the rest are for byte values 0-255 */
        !             8: 
        !             9: int aflag = 0;
        !            10: int uflag = 0;
        !            11: int rflag = 0;
        !            12: int sflag = 0;
        !            13: 
        !            14: /* Sort the list s by distributing according to
        !            15:    digit d into an array of bins, sorting the bins
        !            16:    recursively, and re-collecting them back into the list.
        !            17:    If uflag is nonzero return only 1 representative of
        !            18:    each equivalence class.  The squeeze step noted
        !            19:    below determines what bins are in use, and squeezes
        !            20:    those into a stack frame, which is contiguous to s.
        !            21:    The null bin is handled separately to cut the span
        !            22:    of the squeeze loop.
        !            23:    Precondition: length(s) > 1 */
        !            24: 
        !            25: #define tiebreak(t)                                    \
        !            26:        if(uflag) {                                     \
        !            27:                t->tail = !aflag? t->head:              \
        !            28:                          listaccum(t->head, t->tail);  \
        !            29:                t->tail->next = 0;                      \
        !            30:        } else if(keyed && !sflag && t->head->next) {   \
        !            31:                rflag = fields[0].rflag;                \
        !            32:                keyed = 0;                              \
        !            33:                sort(t, 0);                             \
        !            34:                keyed = 1;                              \
        !            35:                rflag = 0;                              \
        !            36:        } else
        !            37: 
        !            38: void
        !            39: sort(struct list *s, int d)
        !            40: {
        !            41:        extern int uflag;
        !            42:        struct list *t;
        !            43:        struct rec *r, *q;
        !            44:        struct list *frame = s + 1;     /* stack frame */
        !            45:        static struct list bins[257];
        !            46: #      define nullbin (bins+256)
        !            47:        int nbin;               /* number of filled bins */
        !            48:        struct list *low; /* lowest unsorted nonnull bin */
        !            49: loop:
        !            50:        r = s->head;
        !            51:        low = bins + 256;
        !            52:        nbin = 0;
        !            53:        while(r) {
        !            54:                if(keyed)
        !            55:                        if(r->klen > (len_t)d)
        !            56:                                t = bins + key(r)[d];
        !            57:                        else
        !            58:                                t = nullbin;
        !            59:                else
        !            60:                        if(r->dlen > (len_t)d)
        !            61:                                t = bins + data(r)[d];
        !            62:                        else
        !            63:                                t = nullbin;
        !            64:                if(t->head == 0) {
        !            65:                        if(low > t)
        !            66:                                low = t;
        !            67:                        t->head = r;
        !            68:                        nbin++;
        !            69:                } else
        !            70:                        t->tail->next = r;      /* stable sort */
        !            71:                t->tail = r;
        !            72:                r = r->next;
        !            73:        }
        !            74:        t = frame;                      /* t is stack top */
        !            75:        if(t+nbin > stackmax)
        !            76:                fatal("stack overflow", "", 0);
        !            77: #      define push(b)          /* onto stack */        \
        !            78:                *t = *b,                                \
        !            79:                t->tail->next = 0,                      \
        !            80:                t++,                                    \
        !            81:                b->head = 0,                            \
        !            82:                nbin--
        !            83:        if(nullbin->head)
        !            84:                push(nullbin);
        !            85:        for( ; nbin>0; low++)
        !            86:                if(low->head)
        !            87:                        push(low);
        !            88:        if(t == frame+1) {              /* tail recursion */
        !            89: /*             debug(frame, t, d);*/
        !            90:                r = frame->head;
        !            91:                if(r->len[keyed] <= d) {
        !            92:                        tiebreak(frame);
        !            93:                        *s = *frame;
        !            94:                        return;         /* string ran out */
        !            95:                }
        !            96:                d++;
        !            97:                goto loop;
        !            98:        }
        !            99: /*     debug(frame, t, d);*/
        !           100:        t--;
        !           101:        if(t->head->next)               /* skip 1-item list */
        !           102:                sort(t, d+1);
        !           103:        if(!rflag) {                    /* forward order */
        !           104:                r = t->tail;
        !           105:                while(t > frame) {      
        !           106:                        q = t->head;
        !           107:                        if((--t>frame || t->head->len[keyed]>d)
        !           108:                           && t->head->next)
        !           109:                                sort(t, d+1);
        !           110:                        else if(t==frame)
        !           111:                                tiebreak(t);
        !           112:                        t->tail->next = q;      /* concatenate */
        !           113:                }
        !           114:                s->head = frame->head;
        !           115:                s->tail = r;
        !           116:        } else {                        /* reverse order */
        !           117:                r = t->head;
        !           118:                while(t > frame) {      
        !           119:                        q = t->tail;
        !           120:                        if((--t>frame || t->head->len[keyed]>d)
        !           121:                           && t->head->next)
        !           122:                                sort(t, d+1);
        !           123:                        else if(t==frame)
        !           124:                                tiebreak(t);
        !           125:                        q->next = t->head;      /* concatenate */
        !           126:                }
        !           127:                s->head = r;
        !           128:                s->tail = frame->tail;
        !           129:        }
        !           130: /*     printf("return\n"); debug(s,s+1,d);*/
        !           131: }
        !           132: 
        !           133: /*
        !           134: debug(struct list *stack, struct list *top, int d)
        !           135: {
        !           136:        printf("----------------------level %d\n", d);
        !           137:        while(stack<top) {
        !           138:                printout(stack->head, stdout, "stdout");
        !           139:                printf("----------------------\n");
        !           140:                stack++;
        !           141:        }
        !           142: }
        !           143: */

unix.superglobalmegacorp.com

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