|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1995 The University of Utah and ! 3: * the Computer Systems Laboratory at the University of Utah (CSL). ! 4: * All rights reserved. ! 5: * ! 6: * Permission to use, copy, modify and distribute this software is hereby ! 7: * granted provided that (1) source code retains these copyright, permission, ! 8: * and disclaimer notices, and (2) redistributions including binaries ! 9: * reproduce the notices in supporting documentation, and (3) all advertising ! 10: * materials mentioning features or use of this software display the following ! 11: * acknowledgement: ``This product includes software developed by the ! 12: * Computer Systems Laboratory at the University of Utah.'' ! 13: * ! 14: * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS ! 15: * IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF ! 16: * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 17: * ! 18: * CSL requests users of this software to return to [email protected] any ! 19: * improvements that they make and grant CSL redistribution rights. ! 20: * ! 21: * Author: Bryan Ford, University of Utah CSL ! 22: */ ! 23: ! 24: #include "anno.h" ! 25: #include "debug.h" ! 26: ! 27: #ifdef ENABLE_ANNO ! 28: ! 29: void anno_init() ! 30: { ! 31: extern struct anno_entry __ANNO_START__[], __ANNO_END__[]; ! 32: struct anno_entry *base; ! 33: ! 34: /* Sort the tables using a slow, simple selection sort; ! 35: it only needs to be done once. */ ! 36: for (base = __ANNO_START__; base < __ANNO_END__; base++) ! 37: { ! 38: struct anno_entry *cur, *low, tmp; ! 39: ! 40: /* Select the lowermost remaining entry, ! 41: and swap it into the base slot. ! 42: Sort by table first, then by val1, val2, val3. */ ! 43: low = base; ! 44: for (cur = base+1; cur < __ANNO_END__; cur++) ! 45: if ((cur->table < low->table) ! 46: || ((cur->table == low->table) ! 47: && ((cur->val1 < low->val1) ! 48: || ((cur->val1 == low->val1) ! 49: && ((cur->val2 < low->val2) ! 50: || ((cur->val2 == low->val2) ! 51: && (cur->val3 < low->val3))))))) ! 52: low = cur; ! 53: tmp = *base; ! 54: *base = *low; ! 55: *low = tmp; ! 56: } ! 57: ! 58: /* Initialize each anno_table structure with entries in the array. */ ! 59: for (base = __ANNO_START__; base < __ANNO_END__; ) ! 60: { ! 61: struct anno_entry *end; ! 62: ! 63: for (end = base; ! 64: (end < __ANNO_END__) && (end->table == base->table); ! 65: end++); ! 66: base->table->start = base; ! 67: base->table->end = end; ! 68: ! 69: base = end; ! 70: } ! 71: ! 72: #if 0 /* debugging code */ ! 73: { ! 74: struct anno_table *t = 0; ! 75: ! 76: for (base = __ANNO_START__; base < __ANNO_END__; base++) ! 77: { ! 78: if (t != base->table) ! 79: { ! 80: t = base->table; ! 81: printf("table %08x: %08x-%08x (%d entries)\n", ! 82: t, t->start, t->end, t->end - t->start); ! 83: assert(t->start == base); ! 84: } ! 85: printf(" vals %08x %08x %08x\n", ! 86: base->table, base->val1, base->val2, base->val3); ! 87: } ! 88: } ! 89: #endif ! 90: } ! 91: ! 92: #endif ENABLE_ANNO
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.