summaryrefslogtreecommitdiff
path: root/i386/util/anno.c
diff options
context:
space:
mode:
Diffstat (limited to 'i386/util/anno.c')
-rw-r--r--i386/util/anno.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/i386/util/anno.c b/i386/util/anno.c
new file mode 100644
index 0000000..0137fe8
--- /dev/null
+++ b/i386/util/anno.c
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 1995 The University of Utah and
+ * the Computer Systems Laboratory at the University of Utah (CSL).
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify and distribute this software is hereby
+ * granted provided that (1) source code retains these copyright, permission,
+ * and disclaimer notices, and (2) redistributions including binaries
+ * reproduce the notices in supporting documentation, and (3) all advertising
+ * materials mentioning features or use of this software display the following
+ * acknowledgement: ``This product includes software developed by the
+ * Computer Systems Laboratory at the University of Utah.''
+ *
+ * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS
+ * IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF
+ * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * CSL requests users of this software to return to csl-dist@cs.utah.edu any
+ * improvements that they make and grant CSL redistribution rights.
+ *
+ * Author: Bryan Ford, University of Utah CSL
+ */
+
+#include "anno.h"
+#include "debug.h"
+
+#ifdef ENABLE_ANNO
+
+void anno_init()
+{
+ extern struct anno_entry __ANNO_START__[], __ANNO_END__[];
+ struct anno_entry *base;
+
+ /* Sort the tables using a slow, simple selection sort;
+ it only needs to be done once. */
+ for (base = __ANNO_START__; base < __ANNO_END__; base++)
+ {
+ struct anno_entry *cur, *low, tmp;
+
+ /* Select the lowermost remaining entry,
+ and swap it into the base slot.
+ Sort by table first, then by val1, val2, val3. */
+ low = base;
+ for (cur = base+1; cur < __ANNO_END__; cur++)
+ if ((cur->table < low->table)
+ || ((cur->table == low->table)
+ && ((cur->val1 < low->val1)
+ || ((cur->val1 == low->val1)
+ && ((cur->val2 < low->val2)
+ || ((cur->val2 == low->val2)
+ && (cur->val3 < low->val3)))))))
+ low = cur;
+ tmp = *base;
+ *base = *low;
+ *low = tmp;
+ }
+
+ /* Initialize each anno_table structure with entries in the array. */
+ for (base = __ANNO_START__; base < __ANNO_END__; )
+ {
+ struct anno_entry *end;
+
+ for (end = base;
+ (end < __ANNO_END__) && (end->table == base->table);
+ end++);
+ base->table->start = base;
+ base->table->end = end;
+
+ base = end;
+ }
+
+#if 0 /* debugging code */
+ {
+ struct anno_table *t = 0;
+
+ for (base = __ANNO_START__; base < __ANNO_END__; base++)
+ {
+ if (t != base->table)
+ {
+ t = base->table;
+ printf("table %08x: %08x-%08x (%d entries)\n",
+ t, t->start, t->end, t->end - t->start);
+ assert(t->start == base);
+ }
+ printf(" vals %08x %08x %08x\n",
+ base->table, base->val1, base->val2, base->val3);
+ }
+ }
+#endif
+}
+
+#endif ENABLE_ANNO