00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #include <stdio.h>
00050 #include <assert.h>
00051 #include "ir_graph_util.h"
00052
00053
00054
00055
00056
00057 GRAPH* build_graph_u(VINDEX vertex_size, EINDEX edge_size, MEM_POOL* m)
00058 {
00059 GRAPH *g;
00060 int i;
00061
00062
00063 GR_ASSERT(vertex_size >= 0, "build_graph_u vertex_size < 0\n");
00064 GR_ASSERT(edge_size >= 0, "build_graph_u edge_size < 0\n");
00065
00066 g = (GRAPH*) MEM_POOL_Alloc(m, sizeof(GRAPH));
00067 GR_ASSERT (g != 0, "build_graph_u g == 0\n");
00068 bzero(g, sizeof(GRAPH));
00069
00070 if (vertex_size != 0)
00071 {
00072 GRAPH_v(g) = (VERTEX*) MEM_POOL_Alloc(m, sizeof(VERTEX)*vertex_size);
00073 GR_ASSERT (GRAPH_v(g) != 0, "build_graph_u graph_v(g) == 0\n");
00074 bzero(GRAPH_v(g), sizeof(VERTEX)*vertex_size);
00075 }
00076
00077 if (edge_size != 0)
00078 {
00079 GRAPH_e(g) = (EDGE*) MEM_POOL_Alloc(m, sizeof(EDGE)*edge_size);
00080 GR_ASSERT (GRAPH_e(g) != 0, "build_graph_u graph_e(g) == 0\n");
00081 bzero(GRAPH_e(g), sizeof(EDGE)*edge_size);
00082 }
00083
00084
00085 GRAPH_vcnt(g) = 0;
00086
00087 for (i = 0; i<vertex_size; ++i)
00088 {
00089 VERTEX_from(&GRAPH_v_i(g,i)) = i+1;
00090 VERTEX_fcnt(&GRAPH_v_i(g,i)) = -1;
00091 }
00092
00093
00094 VERTEX_from(&GRAPH_v_i(g,vertex_size-1)) = INVALID_VINDEX;
00095 GRAPH_vfree(g) = 0;
00096 GRAPH_vmax(g) = vertex_size;
00097
00098
00099
00100 GRAPH_ecnt(g) = 0;
00101 for (i = 0; i<edge_size; ++i)
00102 {
00103 EDGE_nfrom(&GRAPH_e_i(g,i)) = i+1;
00104 EDGE_from(&GRAPH_e_i(g,i)) = INVALID_VINDEX;
00105 }
00106
00107
00108 EDGE_nfrom(&GRAPH_e_i(g, edge_size-1)) = -1;
00109 GRAPH_efree(g) = 0;
00110 GRAPH_emax(g) = edge_size;
00111
00112
00113 GRAPH_root(g) = INVALID_VINDEX;
00114 GRAPH_m(g) = m;
00115 return g;
00116 }
00117
00118
00119
00120
00121
00122
00123 GRAPH* build_graph(MEM_POOL* m)
00124 {
00125 GRAPH *g;
00126
00127 g = (GRAPH*) MEM_POOL_Alloc(m, sizeof(GRAPH));
00128 bzero(g, sizeof(GRAPH));
00129 GR_ASSERT (g != 0, "build_graph g == 0\n");
00130
00131 GRAPH_vcnt(g) = 0;
00132 GRAPH_ecnt(g) = 0;
00133 GRAPH_vfree(g) = -1;
00134 GRAPH_efree(g) = -1;
00135 GRAPH_root(g) = INVALID_VINDEX;
00136 GRAPH_m(g) = m;
00137 return g;
00138 }
00139
00140
00141
00142
00143 static void grow_vertex(GRAPH *g)
00144 {
00145 VINDEX max, i;
00146
00147 MEM_POOL *m = GRAPH_m(g);
00148
00149 if (GRAPH_vmax(g) < 8)
00150 max = 16;
00151 else
00152 max = GRAPH_vmax(g)*2;
00153
00154 GR_ASSERT(max > GRAPH_vmax(g), "grow_vertex max <= GRAPH_vmax(g)\n");
00155
00156 GRAPH_v(g) = (VERTEX*) MEM_POOL_Realloc(m,GRAPH_v(g),sizeof(VERTEX)*GRAPH_vmax(g),
00157 sizeof(VERTEX)*max);
00158 for (i = GRAPH_vmax(g); i<max; ++i) {
00159 VERTEX_from(&GRAPH_v_i(g,i)) = i+1;
00160 VERTEX_fcnt(&GRAPH_v_i(g,i)) = -1;
00161 }
00162
00163
00164 VERTEX_from(&GRAPH_v_i(g,max-1)) = INVALID_VINDEX;
00165
00166 GRAPH_vfree(g) = GRAPH_vmax(g);
00167 GRAPH_vmax(g) = max;
00168
00169 }
00170
00171
00172
00173
00174 static void grow_edge(GRAPH *g)
00175 {
00176 EINDEX max, i, diff;
00177 MEM_POOL *m = GRAPH_m(g);
00178
00179 if (GRAPH_emax(g) < 8)
00180 max = 16;
00181 else
00182 max = GRAPH_emax(g)*2;
00183
00184
00185 GR_ASSERT(max > GRAPH_emax(g), "grow_edge graph_emax >= max\n");
00186 GRAPH_e(g) = (EDGE*) MEM_POOL_Realloc(m,GRAPH_e(g), sizeof(EDGE)*GRAPH_emax(g),
00187 sizeof(EDGE)*max);
00188
00189
00190
00191 for (i = GRAPH_emax(g); i<max; ++i) {
00192 EDGE_nfrom(&GRAPH_e_i(g,i)) = i+1;
00193 EDGE_from(&GRAPH_e_i(g,i)) = INVALID_EINDEX;
00194 }
00195
00196
00197 EDGE_nfrom(&GRAPH_e_i(g, max-1)) = INVALID_EINDEX;
00198
00199 GRAPH_efree(g) = GRAPH_emax(g);
00200 GRAPH_emax(g) = max;
00201 }
00202
00203
00204
00205
00206
00207 VINDEX add_vertex(GRAPH* g, void *user)
00208 {
00209 VINDEX new_vertex;
00210 MEM_POOL *m = GRAPH_m(g);
00211
00212 if (GRAPH_vfree(g) == -1)
00213 grow_vertex(g);
00214
00215 new_vertex = GRAPH_vfree(g);
00216
00217
00218 GRAPH_vfree(g) = VERTEX_from(&GRAPH_v_i(g,new_vertex));
00219
00220
00221 VERTEX_from(&GRAPH_v_i(g,new_vertex)) = INVALID_EINDEX;
00222 VERTEX_to(&GRAPH_v_i(g,new_vertex)) = INVALID_EINDEX;
00223
00224
00225 VERTEX_user(&GRAPH_v_i(g,new_vertex)) = user;
00226
00227
00228 VERTEX_fcnt(&GRAPH_v_i(g,new_vertex)) = 0;
00229 VERTEX_tcnt(&GRAPH_v_i(g,new_vertex)) = 0;
00230
00231
00232 VERTEX_level(&GRAPH_v_i(g,new_vertex)) = -1;
00233
00234
00235 GRAPH_vcnt(g)++;
00236
00237 return new_vertex;
00238 }
00239
00240
00241
00242
00243
00244
00245 EINDEX add_edge(GRAPH *g, VINDEX from, VINDEX to, void *user)
00246 {
00247 EINDEX new_edge, e2;
00248 MEM_POOL *m = GRAPH_m(g);
00249
00250 GR_ASSERT(is_vertex(g,from), "add_edge is_vertex(g, from\n");
00251 GR_ASSERT(is_vertex(g,from), "add_edge is_vertex(g, to\n");
00252
00253
00254 if(GRAPH_efree(g) == -1)
00255
00256
00257 grow_edge(g);
00258
00259
00260 new_edge = GRAPH_efree(g);
00261
00262
00263 GRAPH_efree(g)= EDGE_nfrom(&GRAPH_e_i(g,new_edge));
00264
00265
00266 EDGE_user(&GRAPH_e_i(g,new_edge)) = user;
00267
00268
00269 EDGE_from(&GRAPH_e_i(g,new_edge)) = from;
00270
00271
00272 EDGE_to(&GRAPH_e_i(g,new_edge)) = to;
00273
00274
00275 VERTEX_fcnt(&GRAPH_v_i(g,from))++;
00276
00277
00278 VERTEX_tcnt(&GRAPH_v_i(g,to))++;
00279
00280
00281 GRAPH_ecnt(g)++;
00282
00283
00284 e2 = VERTEX_from(&GRAPH_v_i(g,from));
00285 EDGE_nfrom(&GRAPH_e_i(g,new_edge)) = e2;
00286 VERTEX_from(&GRAPH_v_i(g,from)) = new_edge;
00287
00288
00289 e2 = VERTEX_to(&GRAPH_v_i(g,to));
00290 EDGE_nto(&GRAPH_e_i(g,new_edge)) = e2;
00291 VERTEX_to(&GRAPH_v_i(g,to)) = new_edge;
00292
00293
00294 EDGE_etype(&GRAPH_e_i(g,new_edge)) = 0;
00295
00296 return new_edge;
00297 }
00298
00299
00300
00301
00302
00303 BOOL is_vertex(GRAPH *g, VINDEX vertex)
00304 {
00305 return ( ( vertex < GRAPH_vmax(g) )
00306 && ( VERTEX_fcnt(&GRAPH_v_i(g,vertex)) != INVALID_VINDEX ) );
00307 }
00308
00309
00310
00311
00312 VINDEX next_vertex(GRAPH *g, VINDEX vertex)
00313 {
00314 GR_ASSERT(is_vertex(g, vertex), "next_vertex is_vertex(g,vertex)\n");
00315
00316 while (1) {
00317 if (is_vertex(g, ++vertex))
00318 return vertex;
00319 else
00320 if (vertex >= GRAPH_vmax(g))
00321 return INVALID_VINDEX;
00322 }
00323 }
00324
00325
00326
00327
00328 void delete_edge(GRAPH *g, EINDEX edge)
00329 {
00330
00331 VINDEX from_vertex, to_vertex;
00332 EINDEX next_edge, head_edge;
00333
00334 GR_ASSERT(is_edge(g, edge), "delete_edge is_edge\n");
00335
00336
00337
00338 from_vertex = EDGE_from(&GRAPH_e_i(g,edge));
00339
00340
00341 VERTEX_fcnt(&GRAPH_v_i(g,from_vertex))--;
00342
00343
00344 next_edge = EDGE_nfrom(&GRAPH_e_i(g,edge));
00345
00346
00347 head_edge = VERTEX_from(&GRAPH_v_i(g,from_vertex));
00348
00349
00350 if (head_edge == edge)
00351
00352
00353 VERTEX_from(&GRAPH_v_i(g,from_vertex)) = next_edge;
00354
00355
00356 else
00357 {
00358
00359 while (EDGE_nfrom(&GRAPH_e_i(g,head_edge)) != edge)
00360 head_edge = EDGE_nfrom(&GRAPH_e_i(g,head_edge));
00361 EDGE_nfrom(&GRAPH_e_i(g,head_edge)) = next_edge;
00362 }
00363
00364
00365
00366
00367 to_vertex = EDGE_to(&GRAPH_e_i(g,edge));
00368
00369
00370 VERTEX_tcnt(&GRAPH_v_i(g,to_vertex))--;
00371
00372
00373 next_edge = EDGE_nto(&GRAPH_e_i(g,edge));
00374
00375
00376 head_edge = VERTEX_to(&GRAPH_v_i(g,to_vertex));
00377
00378
00379 if (head_edge == edge)
00380
00381 VERTEX_to(&GRAPH_v_i(g,to_vertex)) = next_edge;
00382
00383 else
00384
00385 {
00386
00387 while (g->e[head_edge].nto != edge)
00388 head_edge = EDGE_nto(&GRAPH_e_i(g,head_edge));
00389 EDGE_nto(&GRAPH_e_i(g,head_edge)) = next_edge;
00390 }
00391
00392
00393 EDGE_nfrom(&GRAPH_e_i(g,edge)) = GRAPH_efree(g);
00394 EDGE_from(&GRAPH_e_i(g,edge)) = INVALID_VINDEX;
00395 GRAPH_efree(g) = edge;
00396 GRAPH_ecnt(g)--;
00397 }
00398
00399
00400
00401
00402 void* delete_vertex(GRAPH *g, VINDEX vertex)
00403 {
00404 void *user;
00405 EINDEX from, nfrom, to, nto;
00406
00407 GR_ASSERT(is_vertex(g, vertex), "delete vertex is_vertex\n");
00408
00409 user = VERTEX_user(&GRAPH_v_i(g,vertex));
00410
00411
00412 from = VERTEX_from(&GRAPH_v_i(g,vertex));
00413 while (from != INVALID_EINDEX)
00414 {
00415 nfrom = EDGE_nfrom(&GRAPH_e_i(g,from));
00416 delete_edge(g, from);
00417 from = nfrom;
00418 }
00419
00420
00421 to = VERTEX_to(&GRAPH_v_i(g,vertex));
00422 while (to != INVALID_EINDEX)
00423 {
00424 nto = EDGE_nto(&GRAPH_e_i(g,to));
00425 delete_edge(g, to);
00426 to = nto;
00427 }
00428
00429 VERTEX_fcnt(&GRAPH_v_i(g,vertex)) = -1;
00430 VERTEX_from(&GRAPH_v_i(g,vertex)) = GRAPH_vfree(g);
00431 GRAPH_vfree(g) = vertex;
00432 GRAPH_vcnt(g)--;
00433
00434 return user;
00435
00436 }
00437
00438
00439
00440
00441 BOOL is_edge(GRAPH *g, EINDEX edge)
00442 {
00443 return ( ( edge < GRAPH_emax(g) )
00444 && EDGE_from(&GRAPH_e_i(g,edge)) != INVALID_VINDEX );
00445 }
00446
00447
00448
00449
00450 void* get_vertex(GRAPH *g, VINDEX vertex)
00451 {
00452 GR_ASSERT(is_vertex(g,vertex), "get_vertex\n");
00453
00454 return (VERTEX_user(&GRAPH_v_i(g,vertex)));
00455 }
00456
00457
00458
00459
00460 int num_preds(GRAPH *g, VINDEX vertex)
00461 {
00462 GR_ASSERT(is_vertex(g,vertex), "num_preds is_vertex\n");
00463
00464 return (VERTEX_tcnt(&GRAPH_v_i(g,vertex)));
00465 }
00466
00467
00468
00469
00470 int num_succs(GRAPH *g, VINDEX vertex)
00471 {
00472 GR_ASSERT(is_vertex(g,vertex), "num_succs is_vertex\n");
00473
00474 return (VERTEX_fcnt(&GRAPH_v_i(g,vertex)));
00475 }
00476
00477
00478
00479
00480 void* get_edge(GRAPH *g, VINDEX from, VINDEX to)
00481 {
00482 EINDEX e;
00483
00484
00485 GR_ASSERT(is_vertex(g, from), "get_edge is_vertex from\n");
00486 GR_ASSERT(is_vertex(g, to), "get_edge is_vertex to\n");
00487
00488 e = VERTEX_from(&GRAPH_v_i(g, from));
00489
00490 while ( e != INVALID_EINDEX ) {
00491 if(EDGE_to(&GRAPH_e_i(g,e)) == to)
00492 break;
00493 e = (EDGE_nfrom(&GRAPH_e_i(g,e)));
00494 }
00495 return EDGE_user(&GRAPH_e_i(g,e));
00496 }
00497
00498
00499
00500
00501 int
00502 edge_count(GRAPH* g, VINDEX from, VINDEX to)
00503 {
00504 int count= 0;
00505 EINDEX e;
00506
00507 GR_ASSERT(is_vertex(g, from), "edge_count is_vertex from\n");
00508 GR_ASSERT(is_vertex(g, to), "edge_count is_vertex to\n");
00509
00510 e = VERTEX_from(&GRAPH_v_i(g, from));
00511
00512 while ( e != INVALID_EINDEX ) {
00513 if(EDGE_to(&GRAPH_e_i(g,e)) == to)
00514 ++count;
00515 e = (EDGE_nfrom(&GRAPH_e_i(g,e)));
00516 }
00517 return count;
00518 }
00519
00520
00521
00522
00523 void*
00524 get_edge_u(GRAPH *g, EINDEX e)
00525 {
00526 GR_ASSERT(is_edge(g, e), "get_edge_u is_edge\n");
00527
00528 return EDGE_user(&GRAPH_e_i(g,e));
00529 }
00530
00531
00532
00533 void
00534 set_edge_u (GRAPH *g, EINDEX e, void *user)
00535 {
00536 EDGE_user(&GRAPH_e_i(g,e)) = user;
00537 }
00538
00539
00540
00541
00542 V_ITER* create_vertex_iter(GRAPH *g, VINDEX vertex, MEM_POOL* m)
00543 {
00544 V_ITER *v_i;
00545 VERTEX *v_ptr;
00546 v_i = (V_ITER*) MEM_POOL_Alloc(m, sizeof(V_ITER));
00547
00548
00549 V_ITER_g(v_i) = g;
00550 V_ITER_c_v(v_i) = vertex;
00551 v_ptr = GRAPH_v(g);
00552 V_ITER_from_e(v_i) = VERTEX_from(&v_ptr[vertex]);
00553 V_ITER_to_e(v_i) = VERTEX_to(&v_ptr[vertex]);
00554 V_ITER_fcnt(v_i) = VERTEX_fcnt(&v_ptr[vertex]);
00555 V_ITER_tcnt(v_i) = VERTEX_tcnt(&v_ptr[vertex]);
00556 V_ITER_nfrom(v_i) = -1;
00557 V_ITER_nto(v_i) = -1;
00558 V_ITER_m(v_i) = m;
00559 return v_i;
00560 }
00561
00562
00563
00564
00565 VINDEX first_v_preds(V_ITER *v_i)
00566 {
00567 EINDEX e;
00568 VINDEX from;
00569
00570
00571 if ( V_ITER_to_e(v_i) == INVALID_EINDEX )
00572 {
00573
00574 MEM_POOL_FREE(V_ITER_m(v_i),v_i);
00575
00576 return INVALID_VINDEX;
00577 }
00578
00579
00580 e = V_ITER_to_e(v_i);
00581
00582 from = EDGE_from(&GRAPH_e_i(V_ITER_g(v_i),e));
00583 V_ITER_nto(v_i) = EDGE_nto(&GRAPH_e_i(V_ITER_g(v_i),e));
00584
00585
00586 V_ITER_c_e(v_i) = e;
00587 return from;
00588 }
00589
00590
00591
00592
00593 VINDEX next_v_preds(V_ITER *v_i)
00594 {
00595 EINDEX e;
00596 VINDEX from;
00597
00598
00599 if(V_ITER_nto(v_i) == -1)
00600 {
00601
00602 MEM_POOL_FREE(V_ITER_m(v_i),v_i);
00603
00604 return INVALID_VINDEX;
00605 }
00606
00607
00608 e = V_ITER_nto(v_i);
00609
00610
00611 from = EDGE_from(&GRAPH_e_i(V_ITER_g(v_i), e));
00612 V_ITER_nto(v_i) = EDGE_nto(&GRAPH_e_i(V_ITER_g(v_i),e));
00613
00614
00615 V_ITER_c_e(v_i) = e;
00616 return from;
00617 }
00618
00619
00620
00621
00622 VINDEX first_v_succs(V_ITER *v_i)
00623 {
00624 EINDEX e;
00625 VINDEX to;
00626
00627
00628 if ( V_ITER_from_e(v_i) == INVALID_EINDEX )
00629 {
00630 MEM_POOL_FREE(V_ITER_m(v_i),v_i);
00631 return INVALID_VINDEX;
00632 }
00633
00634
00635 e = V_ITER_from_e(v_i);
00636 to = EDGE_to(&GRAPH_e_i(V_ITER_g(v_i),e));
00637 V_ITER_nfrom(v_i) = EDGE_nfrom(&GRAPH_e_i(V_ITER_g(v_i),e));
00638
00639
00640 V_ITER_c_e(v_i) = e;
00641 return to;
00642 }
00643
00644
00645
00646
00647 VINDEX next_v_succs(V_ITER *v_i)
00648 {
00649 EINDEX ei;
00650 VINDEX to;
00651
00652
00653 if(V_ITER_nfrom(v_i) == -1)
00654 {
00655 MEM_POOL_FREE(V_ITER_m(v_i),v_i);
00656
00657 return INVALID_VINDEX;
00658 }
00659
00660
00661 ei = V_ITER_nfrom(v_i);
00662 to = EDGE_to(&GRAPH_e_i(V_ITER_g(v_i), ei));
00663 V_ITER_nfrom(v_i) = EDGE_nfrom(&GRAPH_e_i(V_ITER_g(v_i),ei));
00664
00665
00666 V_ITER_c_e(v_i) = ei;
00667 return to;
00668 }
00669
00670
00671
00672
00673 int
00674 get_vertex_level(GRAPH* g, VINDEX v)
00675 {
00676 return (VERTEX_level(&GRAPH_v_i(g,v)));
00677 }
00678
00679
00680
00681
00682 void
00683 set_vertex_level(GRAPH* g, VINDEX v, int level)
00684 {
00685 VERTEX_level(&GRAPH_v_i(g,v)) = level;
00686 }
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712 #define VISITED TRUE
00713 static char *Malloc_Mem_Pool;
00714 static int lvl;
00715
00716 static void
00717 Search ( GRAPH *g, VINDEX v, DFN *d, BOOL *visit, EINDEX ei )
00718 {
00719 EINDEX edge;
00720 VINDEX vtx;
00721 V_ITER *v_iter;
00722 int tmp;
00723
00724 visit[v] = VISITED;
00725 set_vertex_level(g, v, lvl);
00726
00727 lvl++;
00728
00729 v_iter = create_vertex_iter ( g, v, Malloc_Mem_Pool );
00730
00731 for ( vtx=first_v_succs(v_iter);
00732 vtx != INVALID_VINDEX ;
00733 vtx=next_v_succs(v_iter) )
00734 {
00735
00736 if ( !visit[vtx] ) {
00737 Search ( g, vtx, d, visit, V_ITER_c_e(v_iter) );
00738 }
00739 }
00740 lvl--;
00741
00742
00743 --DFN_first(d);
00744 tmp = DFN_first(d);
00745 DFN_v_list_i ( d, tmp ) = v;
00746
00747 if (ei != INVALID_VINDEX) {
00748 void *u;
00749
00750 u = get_edge_u(g, ei);
00751 DFN_user_i(d, tmp) = u;
00752 }
00753 }
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767 DFN *
00768 Depth_First_Ordering ( GRAPH *g, MEM_POOL* m )
00769 {
00770 VINDEX vertex_count = GRAPH_vcnt(g);
00771 EINDEX edge_count = GRAPH_ecnt(g);
00772 int vertex_max = GRAPH_vmax(g);
00773 DFN *d;
00774 BOOL *visit;
00775
00776
00777 GR_ASSERT ( GRAPH_root(g) != INVALID_VINDEX, "Invalid root g for graph\n");
00778 printf ("Depth_First_Ordering: vertex count = %d \n", vertex_count );
00779
00780
00781 d = (DFN*) MEM_POOL_Alloc ( m, sizeof(DFN) );
00782 GR_ASSERT(d != NULL, "Depth_First_Ordering: d" );
00783
00784 DFN_v_list(d) = (VINDEX *)
00785 MEM_POOL_Alloc ( m, sizeof(VINDEX) * vertex_count );
00786 GR_ASSERT(DFN_v_list(d) != NULL, "Depth_First_Ordering: list" );
00787
00788 DFN_user(d) = (void *)
00789 MEM_POOL_Alloc ( m, sizeof(void *) * vertex_count );
00790 GR_ASSERT(DFN_user(d) != NULL, "Depth_First_Ordering: user" );
00791
00792
00793 visit = (BOOL *) MEM_POOL_Alloc ( m, sizeof(BOOL)*vertex_max );
00794 GR_ASSERT ( visit != NULL, "Depth_First_Ordering: visit" );
00795
00796 bzero ( visit, sizeof(BOOL)*vertex_max );
00797
00798
00799
00800
00801 DFN_first(d) = DFN_end(d) = vertex_count;
00802
00803
00804 Search ( g, GRAPH_root(g), d, visit, INVALID_EINDEX );
00805
00806
00807 MEM_POOL_FREE(m, visit);
00808
00809 return(d);
00810 }
00811
00812
00813 void Print_Pred(GRAPH *g, VINDEX v, void (*prn)())
00814 {
00815 V_ITER *vi;
00816 VINDEX vtx;
00817 void * dummy = 0;
00818 int *u, total = 0;
00819
00820 vi = create_vertex_iter(g, v, dummy);
00821
00822 printf(" [");
00823 for (vtx = first_v_preds(vi);
00824 vtx != INVALID_VINDEX;
00825 vtx = next_v_preds(vi)) {
00826 (*prn)(vtx);
00827 u = (int *)get_edge_u(g, V_ITER_c_e(vi));
00828 GR_ASSERT(u, "user field in pred NULL");
00829 printf("/%d ", *u);
00830 total += *u;
00831 }
00832 printf(" - total %d]", total);
00833 }
00834
00835
00836 void Print_DFN (DFN* d, GRAPH *g, void (*prn)(), void (*prn_c)() )
00837 {
00838 VINDEX i, j;
00839 long *k;
00840
00841 printf ("Depth First Numbering: [%d..%d)\n",DFN_first(d), DFN_end(d) );
00842 for ( i = DFN_first(d); i< DFN_end(d); i++ ) {
00843 for (j = 0; j < get_vertex_level(g,DFN_v_list_i(d,i)); j++)
00844 printf("+ ");
00845 (*prn)(DFN_v_list_i(d,i));
00846 #if 0
00847 k = DFN_user_i(d,i);
00848 if (k)
00849 printf(" %d",*k);
00850 else
00851 printf(" ?");
00852 #endif
00853 Print_Pred(g, DFN_v_list_i(d,i), prn);
00854 printf("\n");
00855 }
00856 printf("\n");
00857 }
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869 void
00870 Free_DFN ( DFN* d, MEM_POOL* m )
00871 {
00872 MEM_POOL_FREE ( m, DFN_v_list(d) );
00873 MEM_POOL_FREE ( m, d );
00874 }
00875