sgl

annotate src/wsys.c @ 2:e55e71da991d

converting to configure/makefile.in
author John Tsiombikas <nuclear@siggraph.org>
date Wed, 11 May 2011 05:53:26 +0300
parents
children 1b6c5dadb460
rev   line source
nuclear@1 1 #include <stdio.h>
nuclear@1 2 #include "wsys.h"
nuclear@1 3
nuclear@1 4 struct wsys_module *wslist;
nuclear@1 5 int wscount;
nuclear@1 6
nuclear@1 7 int sgl_register_module(struct wsys_module *ws)
nuclear@1 8 {
nuclear@1 9 ws->next = wslist;
nuclear@1 10 wslist = ws;
nuclear@1 11 wscount++;
nuclear@1 12 return 0;
nuclear@1 13 }
nuclear@1 14
nuclear@1 15 #define APPEND(node) \
nuclear@1 16 do { \
nuclear@1 17 if(!res) { \
nuclear@1 18 res = tail = node; \
nuclear@1 19 } else { \
nuclear@1 20 tail->next = (node); \
nuclear@1 21 tail = (node); \
nuclear@1 22 } \
nuclear@1 23 (node) = (node)->next; \
nuclear@1 24 tail->next = 0; \
nuclear@1 25 } while(0)
nuclear@1 26
nuclear@1 27 static struct wsys_module *merge(struct wsys_module *list1, struct wsys_module *list2)
nuclear@1 28 {
nuclear@1 29 struct wsys_module *res, *tail;
nuclear@1 30
nuclear@1 31 res = tail = 0;
nuclear@1 32
nuclear@1 33 while(list1 || list2) {
nuclear@1 34 if(list1 && list2) {
nuclear@1 35 if(list1->prio <= list2->prio) {
nuclear@1 36 APPEND(list1);
nuclear@1 37 } else {
nuclear@1 38 APPEND(list2);
nuclear@1 39 }
nuclear@1 40 } else if(list1) {
nuclear@1 41 APPEND(list1);
nuclear@1 42 } else {
nuclear@1 43 APPEND(list2);
nuclear@1 44 }
nuclear@1 45 }
nuclear@1 46 return res;
nuclear@1 47 }
nuclear@1 48
nuclear@1 49 static struct wsys_module *msort(struct wsys_module *list, int count)
nuclear@1 50 {
nuclear@1 51 int i, mid = count / 2;
nuclear@1 52 struct wsys_module *prev, *list2 = list;
nuclear@1 53
nuclear@1 54 if(!list->next) {
nuclear@1 55 return list;
nuclear@1 56 }
nuclear@1 57 for(i=0; i<mid; i++) {
nuclear@1 58 prev = list2;
nuclear@1 59 list2 = list2->next;
nuclear@1 60 }
nuclear@1 61 prev->next = 0;
nuclear@1 62
nuclear@1 63 list = msort(list, mid);
nuclear@1 64 list2 = msort(list2, count - mid);
nuclear@1 65 return merge(list, list2);
nuclear@1 66 }