Main Page   Data Structures   File List   Data Fields   Globals  

insertring.c

Go to the documentation of this file.
00001 #include <stdlib.h>
00002 #include "sadie.h"
00003 #include "chain.h"
00004 
00005 
00006 void SYNTHESIZE_INSERT_RING (
00007 CHAIN *chainmap,               /* Pointer to chain structure */
00008 int   ring,                    /* Ring_id of ring on left */
00009 int   fracWidth,               /* Percentage of width */
00010 int ringnum                    /* Ring_id of added ring */                           
00011 ) {
00012     int left_x, left_y, right_x, right_y;
00013     int prevx, prevy, currx, curry;
00014     int AddAfterLast = 0;
00015     unsigned char code;
00016     LIST_NODE  *leftLnode;
00017     LIST_NODE  *rightLnode;
00018     LIST_NODE  *tempLnode;
00019     CHAIN_NODE *leftCnode;
00020     CHAIN_NODE *rightCnode;
00021     CHAIN_NODE *tempCnode;
00022     CHAIN_NODE ** prevCnode;
00023     char msg[SLEN];
00024     
00025     leftLnode = chainmap->list;
00026     while(leftLnode != NULL && leftLnode->ring_id != ring) 
00027         leftLnode = leftLnode->next;
00028 
00029     if( leftLnode == NULL ) {
00030         sprintf(msg, "SynthesizeInsertRing >> Ring %d not found", ring);
00031         MESSAGE('E', msg);
00032         goto the_end;
00033     }
00034     
00035     if( leftLnode->next == NULL ) {
00036         AddAfterLast = 1;
00037     } else if( fracWidth <= 0 || fracWidth >= 100 ) {
00038         sprintf(msg, "Sadie_TREES_SynthesizeDisplayRing >> Percentage of width should be between 1 and 99");
00039         MESSAGE('E', msg);
00040         goto the_end;
00041     }
00042 
00043     /* Allocate memory for LIST_NODE of the  added ring */
00044     if ((tempLnode = (LIST_NODE *)malloc(sizeof(LIST_NODE))) == NULL) {
00045         MESSAGE('E', " Memory request failed.");
00046         goto the_end;
00047     }
00048 
00049     tempLnode->ring_id = ringnum;
00050     tempLnode->ring_type = ADDED;
00051     tempLnode->next = NULL;
00052 
00053     if (AddAfterLast)
00054         rightLnode = leftLnode;
00055     else
00056         rightLnode = leftLnode->next;
00057 
00058     left_x = leftLnode->startk;
00059     left_y = leftLnode->startj;
00060     right_x = rightLnode->startk;
00061     right_y = rightLnode->startj;
00062     
00063     leftCnode = leftLnode->chain;
00064     rightCnode = rightLnode->chain;
00065     
00066     if (left_y < right_y) 
00067         while(leftCnode != NULL && left_y != right_y) {
00068             CHAIN_COMPUTE_COORDINATES(left_x, left_y, leftCnode->code, &left_x, &left_y);
00069             leftCnode = (CHAIN_NODE *)leftCnode->next;
00070         }
00071     else if (right_y < left_y) 
00072         while(rightCnode != NULL && right_y != left_y) {
00073             CHAIN_COMPUTE_COORDINATES(right_x, right_y, rightCnode->code, &right_x, &right_y);
00074             rightCnode = (CHAIN_NODE *)rightCnode->next;
00075         }
00076 
00077     prevx = (int)(left_x + (right_x - left_x) * (float)fracWidth/100.0 + (float)(AddAfterLast*fracWidth));
00078     prevy = left_y;
00079     tempLnode->startk = prevx;
00080     tempLnode->startj = prevy;
00081 
00082     prevCnode = (CHAIN_NODE **)&(tempLnode->chain);
00083     while(leftCnode != NULL && rightCnode != NULL) {
00084         
00085         CHAIN_COMPUTE_COORDINATES(left_x, left_y, leftCnode->code, &left_x, &left_y);
00086         CHAIN_COMPUTE_COORDINATES(right_x, right_y, rightCnode->code, &right_x, &right_y);
00087         currx = (int)(left_x + (right_x - left_x) * (float)fracWidth/100.0 + (float)(AddAfterLast*fracWidth));
00088         curry = left_y;
00089 
00090         CHAIN_COMPUTE_CODE(prevy, prevx, curry, currx, &code);
00091 
00092         /* Allocate memory for CHAIN_NODE of the  added ring */
00093         if ((tempCnode = (CHAIN_NODE *)malloc(sizeof(CHAIN_NODE))) == NULL) {
00094             MESSAGE('E', " Memory request failed.");
00095             goto the_end;
00096         }
00097 
00098         tempCnode->code = code;
00099         tempCnode->valid = 0;
00100         tempCnode->next = NULL;
00101         (*prevCnode) = tempCnode;
00102         prevCnode = (CHAIN_NODE **)&(tempCnode->next);
00103         
00104         prevx = currx;
00105         prevy = curry;
00106         leftCnode = (CHAIN_NODE *)leftCnode->next;
00107         rightCnode = (CHAIN_NODE *)rightCnode->next;
00108                 
00109     }
00110 
00111     tempLnode->next = leftLnode->next;
00112     leftLnode->next = tempLnode;
00113 
00114  the_end:
00115 }

Generated on Wed Apr 9 08:56:07 2003 for TREES by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002