00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "qset.h"
00020 #include "mem.h"
00021 #include <stdio.h>
00022 #include <string.h>
00023
00024
00025
00026
00027
00028 #ifndef qhDEFlibqhull
00029 typedef struct ridgeT ridgeT;
00030 typedef struct facetT facetT;
00031 void qh_errexit(int exitcode, facetT *, ridgeT *);
00032 void qh_fprintf(FILE *fp, int msgcode, const char *fmt, ... );
00033 # ifdef _MSC_VER
00034 # pragma warning( disable : 4127)
00035 # pragma warning( disable : 4706)
00036 # endif
00037 #endif
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 void qh_setaddnth(setT **setp, int nth, void *newelem) {
00061 int oldsize, i;
00062 setelemT *sizep;
00063 setelemT *oldp, *newp;
00064
00065 if (!*setp || (sizep= SETsizeaddr_(*setp))->i==0) {
00066 qh_setlarger(setp);
00067 sizep= SETsizeaddr_(*setp);
00068 }
00069 oldsize= sizep->i - 1;
00070 if (nth < 0 || nth > oldsize) {
00071 qh_fprintf(qhmem.ferr, 6171, "qhull internal error (qh_setaddnth): nth %d is out-of-bounds for set:\n", nth);
00072 qh_setprint(qhmem.ferr, "", *setp);
00073 qh_errexit(qhmem_ERRqhull, NULL, NULL);
00074 }
00075 sizep->i++;
00076 oldp= (setelemT *)SETelemaddr_(*setp, oldsize, void);
00077 newp= oldp+1;
00078 for (i=oldsize-nth+1; i--; )
00079 (newp--)->p= (oldp--)->p;
00080 newp->p= newelem;
00081 }
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 void qh_setaddsorted(setT **setp, void *newelem) {
00100 int newindex=0;
00101 void *elem, **elemp;
00102
00103 FOREACHelem_(*setp) {
00104 if (elem < newelem)
00105 newindex++;
00106 else if (elem == newelem)
00107 return;
00108 else
00109 break;
00110 }
00111 qh_setaddnth(setp, newindex, newelem);
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 void qh_setappend(setT **setp, void *newelem) {
00131 setelemT *sizep;
00132 setelemT *endp;
00133 int count;
00134
00135 if (!newelem)
00136 return;
00137 if (!*setp || (sizep= SETsizeaddr_(*setp))->i==0) {
00138 qh_setlarger(setp);
00139 sizep= SETsizeaddr_(*setp);
00140 }
00141 count= (sizep->i)++ - 1;
00142 endp= (setelemT *)SETelemaddr_(*setp, count, void);
00143 (endp++)->p= newelem;
00144 endp->p= NULL;
00145 }
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 void qh_setappend_set(setT **setp, setT *setA) {
00163 int sizeA, size;
00164 setT *oldset;
00165 setelemT *sizep;
00166
00167 if (!setA)
00168 return;
00169 SETreturnsize_(setA, sizeA);
00170 if (!*setp)
00171 *setp= qh_setnew(sizeA);
00172 sizep= SETsizeaddr_(*setp);
00173 if (!(size= sizep->i))
00174 size= (*setp)->maxsize;
00175 else
00176 size--;
00177 if (size + sizeA > (*setp)->maxsize) {
00178 oldset= *setp;
00179 *setp= qh_setcopy(oldset, sizeA);
00180 qh_setfree(&oldset);
00181 sizep= SETsizeaddr_(*setp);
00182 }
00183 if (sizeA > 0) {
00184 sizep->i= size+sizeA+1;
00185 memcpy((char *)&((*setp)->e[size].p), (char *)&(setA->e[0].p), (size_t)(sizeA+1) * SETelemsize);
00186 }
00187 }
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206 void qh_setappend2ndlast(setT **setp, void *newelem) {
00207 setelemT *sizep;
00208 setelemT *endp, *lastp;
00209 int count;
00210
00211 if (!*setp || (sizep= SETsizeaddr_(*setp))->i==0) {
00212 qh_setlarger(setp);
00213 sizep= SETsizeaddr_(*setp);
00214 }
00215 count= (sizep->i)++ - 1;
00216 endp= (setelemT *)SETelemaddr_(*setp, count, void);
00217 lastp= endp-1;
00218 *(endp++)= *lastp;
00219 endp->p= NULL;
00220 lastp->p= newelem;
00221 }
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 void qh_setcheck(setT *set, const char *tname, unsigned id) {
00234 int maxsize, size;
00235 int waserr= 0;
00236
00237 if (!set)
00238 return;
00239 SETreturnsize_(set, size);
00240 maxsize= set->maxsize;
00241 if (size > maxsize || !maxsize) {
00242 qh_fprintf(qhmem.ferr, 6172, "qhull internal error (qh_setcheck): actual size %d of %s%d is greater than max size %d\n",
00243 size, tname, id, maxsize);
00244 waserr= 1;
00245 }else if (set->e[size].p) {
00246 qh_fprintf(qhmem.ferr, 6173, "qhull internal error (qh_setcheck): %s%d(size %d max %d) is not null terminated.\n",
00247 tname, id, size-1, maxsize);
00248 waserr= 1;
00249 }
00250 if (waserr) {
00251 qh_setprint(qhmem.ferr, "ERRONEOUS", set);
00252 qh_errexit(qhmem_ERRqhull, NULL, NULL);
00253 }
00254 }
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275 void qh_setcompact(setT *set) {
00276 int size;
00277 void **destp, **elemp, **endp, **firstp;
00278
00279 if (!set)
00280 return;
00281 SETreturnsize_(set, size);
00282 destp= elemp= firstp= SETaddr_(set, void);
00283 endp= destp + size;
00284 while (1) {
00285 if (!(*destp++ = *elemp++)) {
00286 destp--;
00287 if (elemp > endp)
00288 break;
00289 }
00290 }
00291 qh_settruncate(set, (int)(destp-firstp));
00292 }
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309 setT *qh_setcopy(setT *set, int extra) {
00310 setT *newset;
00311 int size;
00312
00313 if (extra < 0)
00314 extra= 0;
00315 SETreturnsize_(set, size);
00316 newset= qh_setnew(size+extra);
00317 SETsizeaddr_(newset)->i= size+1;
00318 memcpy((char *)&(newset->e[0].p), (char *)&(set->e[0].p), (size_t)(size+1) * SETelemsize);
00319 return(newset);
00320 }
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343 void *qh_setdel(setT *set, void *oldelem) {
00344 setelemT *sizep;
00345 setelemT *elemp;
00346 setelemT *lastp;
00347
00348 if (!set)
00349 return NULL;
00350 elemp= (setelemT *)SETaddr_(set, void);
00351 while (elemp->p != oldelem && elemp->p)
00352 elemp++;
00353 if (elemp->p) {
00354 sizep= SETsizeaddr_(set);
00355 if (!(sizep->i)--)
00356 sizep->i= set->maxsize;
00357 lastp= (setelemT *)SETelemaddr_(set, sizep->i-1, void);
00358 elemp->p= lastp->p;
00359 lastp->p= NULL;
00360 return oldelem;
00361 }
00362 return NULL;
00363 }
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383 void *qh_setdellast(setT *set) {
00384 int setsize;
00385 int maxsize;
00386 setelemT *sizep;
00387 void *returnvalue;
00388
00389 if (!set || !(set->e[0].p))
00390 return NULL;
00391 sizep= SETsizeaddr_(set);
00392 if ((setsize= sizep->i)) {
00393 returnvalue= set->e[setsize - 2].p;
00394 set->e[setsize - 2].p= NULL;
00395 sizep->i--;
00396 }else {
00397 maxsize= set->maxsize;
00398 returnvalue= set->e[maxsize - 1].p;
00399 set->e[maxsize - 1].p= NULL;
00400 sizep->i= maxsize;
00401 }
00402 return returnvalue;
00403 }
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423 void *qh_setdelnth(setT *set, int nth) {
00424 void *elem;
00425 setelemT *sizep;
00426 setelemT *elemp, *lastp;
00427
00428 elemp= (setelemT *)SETelemaddr_(set, nth, void);
00429 sizep= SETsizeaddr_(set);
00430 if ((sizep->i--)==0)
00431 sizep->i= set->maxsize;
00432 if (nth < 0 || nth >= sizep->i) {
00433 qh_fprintf(qhmem.ferr, 6174, "qhull internal error (qh_setdelnth): nth %d is out-of-bounds for set:\n", nth);
00434 qh_setprint(qhmem.ferr, "", set);
00435 qh_errexit(qhmem_ERRqhull, NULL, NULL);
00436 }
00437 lastp= (setelemT *)SETelemaddr_(set, sizep->i-1, void);
00438 elem= elemp->p;
00439 elemp->p= lastp->p;
00440 lastp->p= NULL;
00441 return elem;
00442 }
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464 void *qh_setdelnthsorted(setT *set, int nth) {
00465 void *elem;
00466 setelemT *sizep;
00467 setelemT *newp, *oldp;
00468
00469 sizep= SETsizeaddr_(set);
00470 if (nth < 0 || (sizep->i && nth >= sizep->i-1) || nth >= set->maxsize) {
00471 qh_fprintf(qhmem.ferr, 6175, "qhull internal error (qh_setdelnthsorted): nth %d is out-of-bounds for set:\n", nth);
00472 qh_setprint(qhmem.ferr, "", set);
00473 qh_errexit(qhmem_ERRqhull, NULL, NULL);
00474 }
00475 newp= (setelemT *)SETelemaddr_(set, nth, void);
00476 elem= newp->p;
00477 oldp= newp+1;
00478 while (((newp++)->p= (oldp++)->p))
00479 ;
00480 if ((sizep->i--)==0)
00481 sizep->i= set->maxsize;
00482 return elem;
00483 }
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503 void *qh_setdelsorted(setT *set, void *oldelem) {
00504 setelemT *sizep;
00505 setelemT *newp, *oldp;
00506
00507 if (!set)
00508 return NULL;
00509 newp= (setelemT *)SETaddr_(set, void);
00510 while(newp->p != oldelem && newp->p)
00511 newp++;
00512 if (newp->p) {
00513 oldp= newp+1;
00514 while (((newp++)->p= (oldp++)->p))
00515 ;
00516 sizep= SETsizeaddr_(set);
00517 if ((sizep->i--)==0)
00518 sizep->i= set->maxsize;
00519 return oldelem;
00520 }
00521 return NULL;
00522 }
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540 setT *qh_setduplicate(setT *set, int elemsize) {
00541 void *elem, **elemp, *newElem;
00542 setT *newSet;
00543 int size;
00544
00545 if (!(size= qh_setsize(set)))
00546 return NULL;
00547 newSet= qh_setnew(size);
00548 FOREACHelem_(set) {
00549 newElem= qh_memalloc(elemsize);
00550 memcpy(newElem, elem, (size_t)elemsize);
00551 qh_setappend(&newSet, newElem);
00552 }
00553 return newSet;
00554 }
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565 void **qh_setendpointer(setT *set) {
00566
00567 setelemT *sizep= SETsizeaddr_(set);
00568 int n= sizep->i;
00569 return (n ? &set->e[n-1].p : &sizep->p);
00570 }
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586 int qh_setequal(setT *setA, setT *setB) {
00587 void **elemAp, **elemBp;
00588 int sizeA= 0, sizeB= 0;
00589
00590 if (setA) {
00591 SETreturnsize_(setA, sizeA);
00592 }
00593 if (setB) {
00594 SETreturnsize_(setB, sizeB);
00595 }
00596 if (sizeA != sizeB)
00597 return 0;
00598 if (!sizeA)
00599 return 1;
00600 elemAp= SETaddr_(setA, void);
00601 elemBp= SETaddr_(setB, void);
00602 if (!memcmp((char *)elemAp, (char *)elemBp, sizeA*SETelemsize))
00603 return 1;
00604 return 0;
00605 }
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628 int qh_setequal_except(setT *setA, void *skipelemA, setT *setB, void *skipelemB) {
00629 void **elemA, **elemB;
00630 int skip=0;
00631
00632 elemA= SETaddr_(setA, void);
00633 elemB= SETaddr_(setB, void);
00634 while (1) {
00635 if (*elemA == skipelemA) {
00636 skip++;
00637 elemA++;
00638 }
00639 if (skipelemB) {
00640 if (*elemB == skipelemB) {
00641 skip++;
00642 elemB++;
00643 }
00644 }else if (*elemA != *elemB) {
00645 skip++;
00646 if (!(skipelemB= *elemB++))
00647 return 0;
00648 }
00649 if (!*elemA)
00650 break;
00651 if (*elemA++ != *elemB++)
00652 return 0;
00653 }
00654 if (skip != 2 || *elemB)
00655 return 0;
00656 return 1;
00657 }
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676 int qh_setequal_skip(setT *setA, int skipA, setT *setB, int skipB) {
00677 void **elemA, **elemB, **skipAp, **skipBp;
00678
00679 elemA= SETaddr_(setA, void);
00680 elemB= SETaddr_(setB, void);
00681 skipAp= SETelemaddr_(setA, skipA, void);
00682 skipBp= SETelemaddr_(setB, skipB, void);
00683 while (1) {
00684 if (elemA == skipAp)
00685 elemA++;
00686 if (elemB == skipBp)
00687 elemB++;
00688 if (!*elemA)
00689 break;
00690 if (*elemA++ != *elemB++)
00691 return 0;
00692 }
00693 if (*elemB)
00694 return 0;
00695 return 1;
00696 }
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715 void qh_setfree(setT **setp) {
00716 int size;
00717 void **freelistp;
00718
00719 if (*setp) {
00720 size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize;
00721 if (size <= qhmem.LASTsize) {
00722 qh_memfree_(*setp, size, freelistp);
00723 }else
00724 qh_memfree(*setp, size);
00725 *setp= NULL;
00726 }
00727 }
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743 void qh_setfree2 (setT **setp, int elemsize) {
00744 void *elem, **elemp;
00745
00746 FOREACHelem_(*setp)
00747 qh_memfree(elem, elemsize);
00748 qh_setfree(setp);
00749 }
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769 void qh_setfreelong(setT **setp) {
00770 int size;
00771
00772 if (*setp) {
00773 size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize;
00774 if (size > qhmem.LASTsize) {
00775 qh_memfree(*setp, size);
00776 *setp= NULL;
00777 }
00778 }
00779 }
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794 int qh_setin(setT *set, void *setelem) {
00795 void *elem, **elemp;
00796
00797 FOREACHelem_(set) {
00798 if (elem == setelem)
00799 return 1;
00800 }
00801 return 0;
00802 }
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820 int qh_setindex(setT *set, void *atelem) {
00821 void **elem;
00822 int size, i;
00823
00824 if (!set)
00825 return -1;
00826 SETreturnsize_(set, size);
00827 if (size > set->maxsize)
00828 return -1;
00829 elem= SETaddr_(set, void);
00830 for (i=0; i < size; i++) {
00831 if (*elem++ == atelem)
00832 return i;
00833 }
00834 return -1;
00835 }
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854 void qh_setlarger(setT **oldsetp) {
00855 int size= 1;
00856 setT *newset, *set, **setp, *oldset;
00857 setelemT *sizep;
00858 setelemT *newp, *oldp;
00859
00860 if (*oldsetp) {
00861 oldset= *oldsetp;
00862 SETreturnsize_(oldset, size);
00863 qhmem.cntlarger++;
00864 qhmem.totlarger += size+1;
00865 newset= qh_setnew(2 * size);
00866 oldp= (setelemT *)SETaddr_(oldset, void);
00867 newp= (setelemT *)SETaddr_(newset, void);
00868 memcpy((char *)newp, (char *)oldp, (size_t)(size+1) * SETelemsize);
00869 sizep= SETsizeaddr_(newset);
00870 sizep->i= size+1;
00871 FOREACHset_((setT *)qhmem.tempstack) {
00872 if (set == oldset)
00873 *(setp-1)= newset;
00874 }
00875 qh_setfree(oldsetp);
00876 }else
00877 newset= qh_setnew(3);
00878 *oldsetp= newset;
00879 }
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894 void *qh_setlast(setT *set) {
00895 int size;
00896
00897 if (set) {
00898 size= SETsizeaddr_(set)->i;
00899 if (!size)
00900 return SETelem_(set, set->maxsize - 1);
00901 else if (size > 1)
00902 return SETelem_(set, size - 2);
00903 }
00904 return NULL;
00905 }
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923 setT *qh_setnew(int setsize) {
00924 setT *set;
00925 int sizereceived;
00926 int size;
00927 void **freelistp;
00928
00929 if (!setsize)
00930 setsize++;
00931 size= sizeof(setT) + setsize * SETelemsize;
00932 if (size>0 && size <= qhmem.LASTsize) {
00933 qh_memalloc_(size, freelistp, set, setT);
00934 #ifndef qh_NOmem
00935 sizereceived= qhmem.sizetable[ qhmem.indextable[size]];
00936 if (sizereceived > size)
00937 setsize += (sizereceived - size)/SETelemsize;
00938 #endif
00939 }else
00940 set= (setT*)qh_memalloc(size);
00941 set->maxsize= setsize;
00942 set->e[setsize].i= 1;
00943 set->e[0].p= NULL;
00944 return(set);
00945 }
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966 setT *qh_setnew_delnthsorted(setT *set, int size, int nth, int prepend) {
00967 setT *newset;
00968 void **oldp, **newp;
00969 int tailsize= size - nth -1, newsize;
00970
00971 if (tailsize < 0) {
00972 qh_fprintf(qhmem.ferr, 6176, "qhull internal error (qh_setnew_delnthsorted): nth %d is out-of-bounds for set:\n", nth);
00973 qh_setprint(qhmem.ferr, "", set);
00974 qh_errexit(qhmem_ERRqhull, NULL, NULL);
00975 }
00976 newsize= size-1 + prepend;
00977 newset= qh_setnew(newsize);
00978 newset->e[newset->maxsize].i= newsize+1;
00979 oldp= SETaddr_(set, void);
00980 newp= SETaddr_(newset, void) + prepend;
00981 switch (nth) {
00982 case 0:
00983 break;
00984 case 1:
00985 *(newp++)= *oldp++;
00986 break;
00987 case 2:
00988 *(newp++)= *oldp++;
00989 *(newp++)= *oldp++;
00990 break;
00991 case 3:
00992 *(newp++)= *oldp++;
00993 *(newp++)= *oldp++;
00994 *(newp++)= *oldp++;
00995 break;
00996 case 4:
00997 *(newp++)= *oldp++;
00998 *(newp++)= *oldp++;
00999 *(newp++)= *oldp++;
01000 *(newp++)= *oldp++;
01001 break;
01002 default:
01003 memcpy((char *)newp, (char *)oldp, (size_t)nth * SETelemsize);
01004 newp += nth;
01005 oldp += nth;
01006 break;
01007 }
01008 oldp++;
01009 switch (tailsize) {
01010 case 0:
01011 break;
01012 case 1:
01013 *(newp++)= *oldp++;
01014 break;
01015 case 2:
01016 *(newp++)= *oldp++;
01017 *(newp++)= *oldp++;
01018 break;
01019 case 3:
01020 *(newp++)= *oldp++;
01021 *(newp++)= *oldp++;
01022 *(newp++)= *oldp++;
01023 break;
01024 case 4:
01025 *(newp++)= *oldp++;
01026 *(newp++)= *oldp++;
01027 *(newp++)= *oldp++;
01028 *(newp++)= *oldp++;
01029 break;
01030 default:
01031 memcpy((char *)newp, (char *)oldp, (size_t)tailsize * SETelemsize);
01032 newp += tailsize;
01033 }
01034 *newp= NULL;
01035 return(newset);
01036 }
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048 void qh_setprint(FILE *fp, const char* string, setT *set) {
01049 int size, k;
01050
01051 if (!set)
01052 qh_fprintf(fp, 9346, "%s set is null\n", string);
01053 else {
01054 SETreturnsize_(set, size);
01055 qh_fprintf(fp, 9347, "%s set=%p maxsize=%d size=%d elems=",
01056 string, set, set->maxsize, size);
01057 if (size > set->maxsize)
01058 size= set->maxsize+1;
01059 for (k=0; k < size; k++)
01060 qh_fprintf(fp, 9348, " %p", set->e[k].p);
01061 qh_fprintf(fp, 9349, "\n");
01062 }
01063 }
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079 void qh_setreplace(setT *set, void *oldelem, void *newelem) {
01080 void **elemp;
01081
01082 elemp= SETaddr_(set, void);
01083 while (*elemp != oldelem && *elemp)
01084 elemp++;
01085 if (*elemp)
01086 *elemp= newelem;
01087 else {
01088 qh_fprintf(qhmem.ferr, 6177, "qhull internal error (qh_setreplace): elem %p not found in set\n",
01089 oldelem);
01090 qh_setprint(qhmem.ferr, "", set);
01091 qh_errexit(qhmem_ERRqhull, NULL, NULL);
01092 }
01093 }
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108
01109
01110 int qh_setsize(setT *set) {
01111 int size;
01112 setelemT *sizep;
01113
01114 if (!set)
01115 return(0);
01116 sizep= SETsizeaddr_(set);
01117 if ((size= sizep->i)) {
01118 size--;
01119 if (size > set->maxsize) {
01120 qh_fprintf(qhmem.ferr, 6178, "qhull internal error (qh_setsize): current set size %d is greater than maximum size %d\n",
01121 size, set->maxsize);
01122 qh_setprint(qhmem.ferr, "set: ", set);
01123 qh_errexit(qhmem_ERRqhull, NULL, NULL);
01124 }
01125 }else
01126 size= set->maxsize;
01127 return size;
01128 }
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145 setT *qh_settemp(int setsize) {
01146 setT *newset;
01147
01148 newset= qh_setnew(setsize);
01149 qh_setappend(&qhmem.tempstack, newset);
01150 if (qhmem.IStracing >= 5)
01151 qh_fprintf(qhmem.ferr, 8123, "qh_settemp: temp set %p of %d elements, depth %d\n",
01152 newset, newset->maxsize, qh_setsize(qhmem.tempstack));
01153 return newset;
01154 }
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173 void qh_settempfree(setT **set) {
01174 setT *stackedset;
01175
01176 if (!*set)
01177 return;
01178 stackedset= qh_settemppop();
01179 if (stackedset != *set) {
01180 qh_settemppush(stackedset);
01181 qh_fprintf(qhmem.ferr, 6179, "qhull internal error (qh_settempfree): set %p(size %d) was not last temporary allocated(depth %d, set %p, size %d)\n",
01182 *set, qh_setsize(*set), qh_setsize(qhmem.tempstack)+1,
01183 stackedset, qh_setsize(stackedset));
01184 qh_errexit(qhmem_ERRqhull, NULL, NULL);
01185 }
01186 qh_setfree(set);
01187 }
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199
01200 void qh_settempfree_all(void) {
01201 setT *set, **setp;
01202
01203 FOREACHset_(qhmem.tempstack)
01204 qh_setfree(&set);
01205 qh_setfree(&qhmem.tempstack);
01206 }
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220 setT *qh_settemppop(void) {
01221 setT *stackedset;
01222
01223 stackedset= (setT*)qh_setdellast(qhmem.tempstack);
01224 if (!stackedset) {
01225 qh_fprintf(qhmem.ferr, 6180, "qhull internal error (qh_settemppop): pop from empty temporary stack\n");
01226 qh_errexit(qhmem_ERRqhull, NULL, NULL);
01227 }
01228 if (qhmem.IStracing >= 5)
01229 qh_fprintf(qhmem.ferr, 8124, "qh_settemppop: depth %d temp set %p of %d elements\n",
01230 qh_setsize(qhmem.tempstack)+1, stackedset, qh_setsize(stackedset));
01231 return stackedset;
01232 }
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244
01245
01246 void qh_settemppush(setT *set) {
01247 if (!set) {
01248 fprintf (qhmem.ferr, "qhull error (qh_settemppush): can not push a NULL temp\n");
01249 qh_errexit (qhmem_ERRqhull, NULL, NULL);
01250 }
01251 qh_setappend(&qhmem.tempstack, set);
01252 if (qhmem.IStracing >= 5)
01253 qh_fprintf(qhmem.ferr, 8125, "qh_settemppush: depth %d temp set %p of %d elements\n",
01254 qh_setsize(qhmem.tempstack), set, qh_setsize(set));
01255 }
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274 void qh_settruncate(setT *set, int size) {
01275
01276 if (size < 0 || size > set->maxsize) {
01277 qh_fprintf(qhmem.ferr, 6181, "qhull internal error (qh_settruncate): size %d out of bounds for set:\n", size);
01278 qh_setprint(qhmem.ferr, "", set);
01279 qh_errexit(qhmem_ERRqhull, NULL, NULL);
01280 }
01281 set->e[set->maxsize].i= size+1;
01282 set->e[size].p= NULL;
01283 }
01284
01285
01286
01287
01288
01289
01290
01291
01292
01293
01294
01295
01296
01297
01298 int qh_setunique(setT **set, void *elem) {
01299
01300 if (!qh_setin(*set, elem)) {
01301 qh_setappend(set, elem);
01302 return 1;
01303 }
01304 return 0;
01305 }
01306
01307
01308
01309
01310
01311
01312
01313
01314
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324
01325
01326 void qh_setzero(setT *set, int idx, int size) {
01327 int count;
01328
01329 if (idx < 0 || idx >= size || size > set->maxsize) {
01330 qh_fprintf(qhmem.ferr, 6182, "qhull internal error (qh_setzero): index %d or size %d out of bounds for set:\n", idx, size);
01331 qh_setprint(qhmem.ferr, "", set);
01332 qh_errexit(qhmem_ERRqhull, NULL, NULL);
01333 }
01334 set->e[set->maxsize].i= size+1;
01335 count= size - idx + 1;
01336 memset((char *)SETelemaddr_(set, idx, void), 0, (size_t)count * SETelemsize);
01337 }
01338
01339