85
85
TSort *pData=apr_palloc(p,nItems*sizeof *pData);
88
88
qsort(pItems,nItems,sizeof *pItems,crude_order);
89
89
for(n=0 ; n < nItems ; ++n) {
90
pData[n].nPredecessors=0;
91
pData[n].ppPredecessors=apr_pcalloc(p,nItems*sizeof *pData[n].ppPredecessors);
93
pData[n].pData=&pItems[n];
90
pData[n].nPredecessors=0;
91
pData[n].ppPredecessors=apr_pcalloc(p,nItems*sizeof *pData[n].ppPredecessors);
93
pData[n].pData=&pItems[n];
96
96
for(n=0 ; n < nItems ; ++n) {
99
for(i=0 ; pItems[n].aszPredecessors && pItems[n].aszPredecessors[i] ; ++i)
100
for(k=0 ; k < nItems ; ++k)
101
if(!strcmp(pItems[k].szName,pItems[n].aszPredecessors[i])) {
104
for(l=0 ; l < pData[n].nPredecessors ; ++l)
105
if(pData[n].ppPredecessors[l] == &pData[k])
107
pData[n].ppPredecessors[pData[n].nPredecessors]=&pData[k];
108
++pData[n].nPredecessors;
112
for(i=0 ; pItems[n].aszSuccessors && pItems[n].aszSuccessors[i] ; ++i)
113
for(k=0 ; k < nItems ; ++k)
114
if(!strcmp(pItems[k].szName,pItems[n].aszSuccessors[i])) {
117
for(l=0 ; l < pData[k].nPredecessors ; ++l)
118
if(pData[k].ppPredecessors[l] == &pData[n])
120
pData[k].ppPredecessors[pData[k].nPredecessors]=&pData[n];
121
++pData[k].nPredecessors;
99
for(i=0 ; pItems[n].aszPredecessors && pItems[n].aszPredecessors[i] ; ++i)
100
for(k=0 ; k < nItems ; ++k)
101
if(!strcmp(pItems[k].szName,pItems[n].aszPredecessors[i])) {
104
for(l=0 ; l < pData[n].nPredecessors ; ++l)
105
if(pData[n].ppPredecessors[l] == &pData[k])
107
pData[n].ppPredecessors[pData[n].nPredecessors]=&pData[k];
108
++pData[n].nPredecessors;
112
for(i=0 ; pItems[n].aszSuccessors && pItems[n].aszSuccessors[i] ; ++i)
113
for(k=0 ; k < nItems ; ++k)
114
if(!strcmp(pItems[k].szName,pItems[n].aszSuccessors[i])) {
117
for(l=0 ; l < pData[k].nPredecessors ; ++l)
118
if(pData[k].ppPredecessors[l] == &pData[n])
120
pData[k].ppPredecessors[pData[k].nPredecessors]=&pData[n];
121
++pData[k].nPredecessors;
143
143
TSort *pTail=NULL;
145
145
for(nTotal=0 ; nTotal < nItems ; ++nTotal) {
150
assert(0); /* we have a loop... */
151
if(!pData[n].pNext) {
152
if(pData[n].nPredecessors) {
155
if(pData[n].ppPredecessors[k])
160
if(&pData[i] == pData[n].ppPredecessors[k]) {
170
pTail->pNext=&pData[n];
174
pTail->pNext=pTail; /* fudge it so it looks linked */
175
for(i=0 ; i < nItems ; ++i)
176
for(k=0 ; k < nItems ; ++k)
177
if(pData[i].ppPredecessors[k] == &pData[n]) {
178
--pData[i].nPredecessors;
179
pData[i].ppPredecessors[k]=NULL;
150
assert(0); /* we have a loop... */
151
if(!pData[n].pNext) {
152
if(pData[n].nPredecessors) {
155
if(pData[n].ppPredecessors[k])
160
if(&pData[i] == pData[n].ppPredecessors[k]) {
170
pTail->pNext=&pData[n];
174
pTail->pNext=pTail; /* fudge it so it looks linked */
175
for(i=0 ; i < nItems ; ++i)
176
for(k=0 ; k < nItems ; ++k)
177
if(pData[i].ppPredecessors[k] == &pData[n]) {
178
--pData[i].nPredecessors;
179
pData[i].ppPredecessors[k]=NULL;
183
183
pTail->pNext=NULL; /* unfudge the tail */
187
187
static apr_array_header_t *sort_hook(apr_array_header_t *pHooks,
197
197
pSort=tsort(pSort,pHooks->nelts);
198
198
pNew=apr_array_make(apr_hook_global_pool,pHooks->nelts,sizeof(TSortData));
199
199
if(apr_hook_debug_enabled)
200
printf("Sorting %s:",szName);
200
printf("Sorting %s:",szName);
201
201
for(n=0 ; pSort ; pSort=pSort->pNext,++n) {
203
assert(n < pHooks->nelts);
204
pHook=apr_array_push(pNew);
205
memcpy(pHook,pSort->pData,sizeof *pHook);
206
if(apr_hook_debug_enabled)
207
printf(" %s",pHook->szName);
203
assert(n < pHooks->nelts);
204
pHook=apr_array_push(pNew);
205
memcpy(pHook,pSort->pData,sizeof *pHook);
206
if(apr_hook_debug_enabled)
207
printf(" %s",pHook->szName);
209
209
if(apr_hook_debug_enabled)
212
/* destroy the pool - the sorted hooks were already copied */
246
250
if (!s_aHooksToSort) {
247
251
s_aHooksToSort = apr_array_make(apr_hook_global_pool, 1, sizeof(HookSortEntry));
250
254
for(n=0 ; n < s_aHooksToSort->nelts ; ++n) {
251
HookSortEntry *pEntry=&((HookSortEntry *)s_aHooksToSort->elts)[n];
252
*pEntry->paHooks=sort_hook(*pEntry->paHooks,pEntry->szHookName);
255
HookSortEntry *pEntry=&((HookSortEntry *)s_aHooksToSort->elts)[n];
256
*pEntry->paHooks=sort_hook(*pEntry->paHooks,pEntry->szHookName);
281
285
APU_DECLARE(void) apr_hook_debug_show(const char *szName,
282
286
const char * const *aszPre,
283
const char * const *aszSucc)
287
const char * const *aszSucc)
287
291
printf(" Hooked %s",szName);
289
fputs(" pre(",stdout);
295
fputs(*aszPre,stdout);
293
fputs(" pre(",stdout);
299
fputs(*aszPre,stdout);
301
fputs(" succ(",stdout);
307
fputs(*aszSucc,stdout);
305
fputs(" succ(",stdout);
311
fputs(*aszSucc,stdout);
312
316
fputc('\n',stdout);
324
328
apr_array_header_t **ppArray;
326
330
if(!s_phOptionalHooks)
328
332
ppArray=apr_hash_get(s_phOptionalHooks,szName,strlen(szName));
334
338
APU_DECLARE(void) apr_optional_hook_add(const char *szName,void (*pfn)(void),
335
const char * const *aszPre,
336
const char * const *aszSucc,int nOrder)
339
const char * const *aszPre,
340
const char * const *aszSucc,int nOrder)
342
346
apr_LINK__optional_t *pHook;
345
apr_array_header_t **ppArray;
349
apr_array_header_t **ppArray;
347
pArray=apr_array_make(apr_hook_global_pool,1,
348
sizeof(apr_LINK__optional_t));
349
if(!s_phOptionalHooks)
350
s_phOptionalHooks=apr_hash_make(apr_hook_global_pool);
351
ppArray=apr_palloc(apr_hook_global_pool,sizeof *ppArray);
353
apr_hash_set(s_phOptionalHooks,szName,strlen(szName),ppArray);
354
apr_hook_sort_register(szName,ppArray);
351
pArray=apr_array_make(apr_hook_global_pool,1,
352
sizeof(apr_LINK__optional_t));
353
if(!s_phOptionalHooks)
354
s_phOptionalHooks=apr_hash_make(apr_hook_global_pool);
355
ppArray=apr_palloc(apr_hook_global_pool,sizeof *ppArray);
357
apr_hash_set(s_phOptionalHooks,szName,strlen(szName),ppArray);
358
apr_hook_sort_register(szName,ppArray);
356
360
pHook=apr_array_push(pArray);
357
361
pHook->pFunc=pfn;
360
364
pHook->nOrder=nOrder;
361
365
pHook->szName=apr_hook_debug_current;
362
366
if(apr_hook_debug_enabled)
363
apr_hook_debug_show(szName,aszPre,aszSucc);
367
apr_hook_debug_show(szName,aszPre,aszSucc);
366
370
/* optional function support */
385
389
if(!s_phOptionalFunctions)
386
s_phOptionalFunctions=apr_hash_make(apr_hook_global_pool);
390
s_phOptionalFunctions=apr_hash_make(apr_hook_global_pool);
387
391
apr_hash_set(s_phOptionalFunctions,szName,strlen(szName),(void *)pfn);