libsrc/edit.cxx File Reference

crum rearrange and deletion routines More...

#include <string.h>
#include "udanax.h"

Include dependency graph for edit.cxx:

Include dependency graph

Go to the source code of this file.

Functions

int deletecutsectionnd (typecorecrum *ptr, typewid *offset, typeknives *knives)
 ???

void deletend (typecuc *fullcrumptr, Tumbler *origin, Tumbler *width, int index)
 ???

void makeoffsetsfor3or4cuts (typeknives *knives, Tumbler diff[])
 ???

int rearrangecutsectionnd (typecorecrum *ptr, typewid *offset, typeknives *knives)
 ???

void sortknives (typeknives *knifeptr)
 ???

void rearrangend (typecuc *fullcrumptr, typecutseq *cutseqptr, int index)
 ???

int insertcutsectionnd (typecorecrum *ptr, typewid *offset, typeknives *knives)
 ???


Detailed Description

crum rearrange and deletion routines

(to be defined)

Definition in file edit.cxx.


Function Documentation

int deletecutsectionnd typecorecrum ptr,
typewid offset,
typeknives knives
[static]
 

???

(to be defined)

Definition at line 92 of file edit.cxx.

References typeknives::blades, typeknives::dimension, typeknives::nblades, ONMYLEFTBORDER, THRUME, typecorecrum, and whereoncrum().

Referenced by deletend().

00096 {
00097     int i, cmp;
00098 
00099     for (i = knives->nblades - 1; i >= 0; --i) {        /* unique to delete */
00100         cmp = whereoncrum(ptr, offset, &knives->blades[i], knives->dimension);
00101         if (cmp == THRUME) {
00102             return (-1);
00103         } else if (cmp <= ONMYLEFTBORDER) {     /* compare last to first */
00104             return (i + 1);
00105         }
00106     }
00107     return (0);
00108 }

void deletend typecuc fullcrumptr,
Tumbler origin,
Tumbler width,
int  index
 

???

(to be defined)

Definition at line 119 of file edit.cxx.

References assert, typeknives::blades, typecorecrumhedr::cdsp, clear, deletecutsectionnd(), typeknives::dimension, disown(), typewid::dsas, findleftson(), findrightbro, makecutsnd(), movetumbler, typeknives::nblades, newfindintersectionnd(), NULL, prologuend(), recombine(), setwispupwards(), subtreefree(), tumbleradd, tumblersub(), typecorecrum, and typedsp.

Referenced by deletevspanpm().

00124 {
00125     typeknives knives;
00126     typewid offset, grasp, reach;
00127     typecuc *father, *ptr, *next;
00128     typewid foffset, fgrasp;
00129 
00130     clear(&offset, sizeof(offset));    /* fullcrum alway has zero offset */
00131     prologuend((typecorecrum *) fullcrumptr, &offset, &grasp, &reach);
00132     movetumbler(origin, &knives.blades[0]);
00133     tumbleradd(origin, width, &knives.blades[1]);
00134     knives.nblades = 2;
00135     knives.dimension = index;
00136     makecutsnd(fullcrumptr, &knives);
00137     newfindintersectionnd(fullcrumptr, &knives, &father, &foffset);
00138     prologuend((typecorecrum *) father, &foffset, &fgrasp, (typedsp *) NULL);
00139     for (ptr = (typecuc *) findleftson(father); ptr; ptr = next) {
00140         next = (typecuc *) findrightbro((typecorecrum *) ptr);
00141         switch (deletecutsectionnd((typecorecrum *) ptr, &fgrasp, &knives)) {
00142         case -1:
00143             assert(0); // deletend can't classify crum
00144         case 0:
00145             break;
00146         case 1:
00147             disown((typecorecrum *) ptr);
00148             subtreefree((typecorecrum *) ptr);
00149             break;
00150         case 2:
00151             tumblersub(&ptr->cdsp.dsas[index], width, &ptr->cdsp.dsas[index]);
00152 /* This will get set to modified in setwisp */
00153             break;
00154         default:
00155             assert(0); // unexpected cutsection
00156         }
00157     }
00158     setwispupwards(father, 1);
00159     recombine(father);
00160 }

int insertcutsectionnd typecorecrum ptr,
typewid offset,
typeknives knives
 

???

(to be defined)

Definition at line 347 of file edit.cxx.

References typeknives::blades, typecorecrumhedr::cenftype, typecorecrumhedr::cwid, typeknives::dimension, typewid::dsas, dumpwid(), typeknives::nblades, ONMYLEFTBORDER, THRUME, typecorecrum, and whereoncrum().

Referenced by makegappm().

00351 {
00352     int i, cmp; /* hacked from delete */
00353 
00354 /* for (i = knives->nblades-1; i >= 0; --i){ */
00355     if (knives->nblades == 2) {
00356         i = 1;
00357         cmp = whereoncrum(ptr, offset, &knives->blades[i], knives->dimension);
00358         if ( /* false&& */ cmp == THRUME) {
00359             dumpwid((typewid *) &ptr->cwid.dsas[i], ptr->cenftype);
00360             return -1;
00361         } else if (cmp <= ONMYLEFTBORDER) {     /* compare last to first */
00362             return 2;
00363         }
00364     }
00365 
00366     i = 0;
00367 
00368     cmp = whereoncrum(ptr, offset, &knives->blades[i], knives->dimension);
00369     if (cmp == THRUME) {
00370         dumpwid((typewid *) &ptr->cwid.dsas[i], ptr->cenftype);
00371         return -1;
00372     } else if (cmp <= ONMYLEFTBORDER) { /* compare last to first */
00373         return 1;
00374     }
00375 
00376 /* } */
00377     return 0;
00378 }

void makeoffsetsfor3or4cuts typeknives knives,
Tumbler  diff[]
[static]
 

???

(to be defined)

Definition at line 172 of file edit.cxx.

References assert, typeknives::blades, movetumbler, typeknives::nblades, Tumbler::sign, tumblerclear, and tumblersub().

Referenced by rearrangend().

00175 {
00176     Tumbler a, b;
00177 
00178 /* diff[0] is simply ignored */
00179     if (knives->nblades == 4) {
00180         tumblersub(&knives->blades[2], &knives->blades[0], &(diff[1]));
00181         tumblersub(&knives->blades[1], &knives->blades[0], &a);
00182         tumblersub(&knives->blades[3], &knives->blades[2], &b);
00183         tumblersub(&b, &a, &(diff[2]));
00184 /* tumblersub (&knives->blades[0], &knives->blades[2], &(diff[3])); *//* should be <0 */
00185         movetumbler(&diff[1], &diff[3]);
00186         diff[3].sign = !diff[1].sign;
00187     } else if (knives->nblades == 3) {
00188         tumblersub(&knives->blades[2], &knives->blades[1], &diff[1]);
00189         tumblersub(&knives->blades[1], &knives->blades[0], &diff[2]);   /* should be negative */
00190         diff[2].sign = !diff[2].sign;
00191         tumblerclear(&(diff[3]));
00192     } else
00193         assert(0); // Wrong number of cuts
00194 }

int rearrangecutsectionnd typecorecrum ptr,
typewid offset,
typeknives knives
[static]
 

???

(to be defined)

Definition at line 206 of file edit.cxx.

References typeknives::blades, typeknives::dimension, typeknives::nblades, ONMYLEFTBORDER, THRUME, typecorecrum, and whereoncrum().

Referenced by rearrangend().

00210 {
00211     int i, cmp;
00212 
00213     for (i = knives->nblades - 1; i >= 0; --i) {
00214         cmp = whereoncrum(ptr, offset, &knives->blades[i], knives->dimension);
00215         if (cmp == THRUME) {
00216             return -1;
00217         } else if (cmp <= ONMYLEFTBORDER) {
00218             return i + 1;
00219         }
00220     }
00221     return 0;
00222 }

void rearrangend typecuc fullcrumptr,
typecutseq cutseqptr,
int  index
 

???

(to be defined)

Definition at line 256 of file edit.cxx.

References assert, typeknives::blades, typecorecrumhedr::cdsp, typecuc::cenftype, typecutseq::cutsarray, typeknives::dimension, typewid::dsas, dumppoomwisps(), findleftson(), findrightbro, fixincoresubtreewids(), ivemodified(), L, makecutsnd(), makeoffsetsfor3or4cuts(), movetumbler, typeknives::nblades, newfindintersectionnd(), NULL, typecutseq::numberofcuts, POOM, prologuend(), rearrangecutsectionnd(), recombine(), setwispupwards(), showspanf(), sortknives(), SPAN, splitcrumupwards(), tumbleradd, typecorecrum, and typedsp.

Referenced by rearrangepm().

00260 {
00261     typecuc *father, *ptr;
00262     typewid foffset, fgrasp;
00263     typeknives knives;
00264     Tumbler diff[4];
00265     int i;
00266 
00267 #ifdef UNdeFined
00268     L("entering rearrangend\n");
00269       fixincoresubtreewids(fullcrumptr);    /* 1999 // a temp kluge zzz till we find where setwisp * isnt called// 
00270  *//* this is a brute  force kluge, if this fixes anything it means that the wids aren't being set properly somplace else probably near here */
00271     L("in rearrangend \n");
00272     switch (fullcrumptr->cenftype) {
00273     case POOM:
00274         L("in rearrangend  dumppoomwisps\n");
00275         dumppoomwisps(fullcrumptr);
00276         break;
00277     case SPAN:
00278         L("in rearrangend  showspanf\n");
00279         showspanf(fullcrumptr);
00280         break;
00281     }
00282 #endif
00283 /* displaycutspm(cutseqptr); */
00284     knives.dimension = index;
00285     knives.nblades = cutseqptr->numberofcuts;
00286     for (i = 0; i < knives.nblades; i++) {
00287         movetumbler(&cutseqptr->cutsarray[i], &knives.blades[i]);
00288     }
00289     sortknives(&knives);
00290     makeoffsetsfor3or4cuts(&knives, diff);
00291 /* for(i=1;i<=knives.nblades;i++){L("\noffset for cut %d = ",i);dumptumbler(&diff[i]);} */
00292     makecutsnd(fullcrumptr, &knives);
00293     newfindintersectionnd(fullcrumptr, &knives, &father, &foffset);
00294     prologuend((typecorecrum *) father, &foffset, &fgrasp, (typedsp *) NULL);
00295     for (ptr = (typecuc *) findleftson(father); ptr; ptr = (typecuc *) findrightbro((typecorecrum *) ptr)) {
00296         i = rearrangecutsectionnd((typecorecrum *) ptr, &fgrasp, &knives);
00297         switch (i) {
00298         case -1:
00299             assert(0); // rearrangend can't classify crum
00300         case 0:
00301         case 4:                       /* these never move */
00302             break;
00303         case 1:
00304         case 2:
00305         case 3:                       /* 3 only moves in 4 cuts */
00306             tumbleradd(&ptr->cdsp.dsas[index], &diff[i], &ptr->cdsp.dsas[index]);
00307 /* L("\nptr = %x i = %d ",ptr,i); dump(ptr); */
00308             ivemodified((typecorecrum *) ptr);
00309             break;
00310         default:
00311             assert(0); // unexpected cutsection
00312         }
00313     }
00314     setwispupwards(father, 1);         /* should do nothing, */
00315 /* but, just on general principles.. */
00316     recombine(fullcrumptr);
00317 
00318     (void)splitcrumupwards(fullcrumptr);        /* can we move this before recombine ? */
00319 #ifdef UnDEfINed
00320     L("leaving rearrangend\n");
00321 
00322       fixincoresubtreewids(fullcrumptr);    /* 1999 // a temp kluge zzz till we find where setwisp * isnt called// 
00323  *//* this is a brute  force kluge, if this fixes anything it means that the wids aren't being set properly somplace else probably near here */
00324     L("in rearrangend \n");
00325     switch (fullcrumptr->cenftype) {
00326     case POOM:
00327         L("in rearrangend  dumppoomwisps\n");
00328         dumppoomwisps(fullcrumptr);
00329         break;
00330     case SPAN:
00331         L("in rearrangend  showspanf\n");
00332         showspanf(fullcrumptr);
00333         break;
00334     }
00335 #endif
00336 
00337 }

void sortknives typeknives knifeptr  )  [static]
 

???

(to be defined)

Definition at line 232 of file edit.cxx.

References typeknives::blades, GREATER, movetumbler, typeknives::nblades, and tumblercmp().

Referenced by rearrangend().

00234 {
00235     Tumbler temp;
00236     int i;
00237 
00238     for (i = 0; i < knifeptr->nblades - 1; ++i) {
00239         if (tumblercmp(&knifeptr->blades[i], &knifeptr->blades[i + 1]) == GREATER) {
00240             movetumbler(&knifeptr->blades[i + 1], &temp);
00241             movetumbler(&knifeptr->blades[i], &knifeptr->blades[i + 1]);
00242             movetumbler(&temp, &knifeptr->blades[i]);
00243             --i;
00244         }
00245     }
00246 }


Generated on Sun Aug 21 04:18:29 2005 for Udanax-Green by doxygen1.3.4