#include #include #include #include #include /* LINKED LIST ROUTINES =============================================*/ /* These are internal healper functions that manage the linked lists*/ /* of the line types, colors, and pattern types. */ /* U.S. Census Bureau, Geography Division, Mapping Operations Branch */ /* DATE LAST UPDATE: 3 December 1993 by F.R. Broome */ /* HISTORY: */ /* 04/24/96 - Sheeja added the following prototypes: */ /* 1. MIMgetColornode */ /* 2. MIMinsertColor */ /* 3. MIMcolorSearch */ /* 4. MIMgetPatternnode */ /* 5. MIMinsertPattern */ /* 6. MIMpatternSearch */ /* 7. MIMgetLinetypenode */ /* 8. MIMinsertLinetype */ /* 9. MIMlinetypeSearch */ /* */ /* ===== COLOR LINKED LIST STUCTURES AND VARIABLES ====================== */ struct MIMcolor { /* For linked list of colors. */ char mimColor[32]; float red, green, blue; struct MIMcolor *prevColor; }; typedef struct MIMcolor *MIMcolorPtr; MIMcolorPtr mimColorPtr = NULL, mimStartColorPtr = NULL; /* ===== PATTERN (FILL) LINKED LIST STUCTURES AND VARIABLES ============== */ struct MIMpattern { /* For linked list of patterns. */ char mimPattern[32]; /* Pattern name. */ int numBits; /* Bits per side (box assumed.)*/ struct MIMpattern *nextPattern; /* Pointer to next pattern link*/ }; typedef struct MIMpattern *MIMpatternPtr; MIMpatternPtr mimPatternPtr = NULL, mimStartPatternPtr = NULL; /* ===== LINETYPE LINKED LIST STUCTURES AND VARIABLES ==================== */ struct MIMlinetype { /* For linked list of linetypes. */ char mimLinetype[32]; int numVals; float lntypeVals[40]; /*Max of 40 changes along line*/ struct MIMlinetype *nextLinetype; }; typedef struct MIMlinetype *MIMlinetypePtr; MIMlinetypePtr mimLinetypePtr = NULL, mimStartLinetypePtr = NULL; /* PROTOTYPES */ MIMcolorPtr MIMgetColornode(void); void MIMinsertColor(char *c, float r, float g, float b); int MIMcolorSearch(char *c, float *r, float *g, float *b); MIMpatternPtr MIMgetPatternnode(void); void MIMinsertPattern(char *c,int nBits); int MIMpatternSearch(char *c, int *n); MIMlinetypePtr MIMgetLinetypenode(void); void MIMinsertLinetype(char *c, int num, float lntype[]); int MIMlinetypeSearch(char *c, int *num, float lntype[]); /* Function to allocate space for a link and return a pointer to it. */ MIMcolorPtr MIMgetColornode() { MIMcolorPtr p; p = (MIMcolorPtr) malloc(sizeof(struct MIMcolor)); return(p); } /* Function to insert a color name and MIM defining values in list. */ void MIMinsertColor(char *c, float r, float g, float b) { extern MIMcolorPtr mimStartColorPtr; MIMcolorPtr p, q, i; int cnt = 0; p = MIMgetColornode(); /* Make a link record. */ strcpy(p->mimColor, c); /* Load the color name. */ p->red = r; p->green = g; p->blue = b; p->prevColor = NULL; /* NULL the pointer to next link. */ /* Setup pointer to track back thru list from here. */ if(mimStartColorPtr == NULL) /* Return, no link to previous needed*/ { mimStartColorPtr = p; /* Set pointer to first link. */ return; } p->prevColor = mimStartColorPtr; /* Set pointer to previous. */ mimStartColorPtr = p; /* Set pointer to first link. */ } /* Given a color name, see if it is already in the linked list. If */ /* so, return the rgb values. Function also returns foundFlag value.*/ int MIMcolorSearch(char *c, float *r, float *g, float *b) { extern MIMcolorPtr mimStartColorPtr; MIMcolorPtr q; int foundFlag = 0; /* Default to NO */ int flag = 1; if(mimStartColorPtr == NULL) /* Return if no links yet. */ return(foundFlag); if(!strlen(c)) { printf("WARNING: MIMcolorSearch: No color name passed to "); printf("search function.\n"); return(foundFlag); } q = mimStartColorPtr; /* Start a end of list and work back.*/ while(flag) /* Search to end of list. */ { if(strcmp(q->mimColor, c) == 0) { foundFlag = 1; /* Set to YES */ flag = 0; /* Set escape flag. */ *r = q->red; /* Load values for this name. */ *g = q->green; *b = q->blue; break; } else q = q->prevColor; if(q == NULL) flag = 0; /* Escape, no match found. */ } return(foundFlag); } MIMpatternPtr MIMgetPatternnode() /* Allocates space for a link and */ { /* returns a pointer to it. */ MIMpatternPtr p; p = (MIMpatternPtr) malloc(sizeof(struct MIMpattern)); return(p); } void MIMinsertPattern(char *c,int nBits) { extern MIMpatternPtr mimStartPatternPtr; MIMpatternPtr p, q; int cnt = 0; p = MIMgetPatternnode(); /* Make a link record. */ strcpy(p->mimPattern, c); /* Load the pattern name. */ p->numBits = nBits; p->mimPattern[strlen(c)] = '\0'; p->nextPattern = NULL; /* NULL the pointer to next link. */ if(mimStartPatternPtr == NULL) /* Return, no list to search. */ { mimStartPatternPtr = p; /* Set pointer to first link. */ return; } q = mimStartPatternPtr; /* Start a beginning of list. */ while(q->nextPattern) /* Search to end of list. */ { q = q->nextPattern; } q->nextPattern = p; /* Make last point to new link. */ } int MIMpatternSearch(char *c, int *n) { /* See if is already in the linked list. */ extern MIMpatternPtr mimStartPatternPtr; MIMpatternPtr q; int foundFlag = 0; /* Default to NO */ int flag = 1; if(mimStartPatternPtr == NULL) /* Return if no links yet. */ return(foundFlag); q = mimStartPatternPtr; /* Start a beginning of list. */ while(flag) /* Search to end of list. */ { if(strcmp(q->mimPattern, c) == 0) { *n = q->numBits; foundFlag = 1; /* Set to YES */ break; } else q = q->nextPattern; if(q == NULL) flag = 0; } return(foundFlag); } /* Linetype linked list functions. */ MIMlinetypePtr MIMgetLinetypenode() /* Allocates space for a link */ { /* and returns a pointer to it. */ MIMlinetypePtr p; p = (MIMlinetypePtr) malloc(sizeof(struct MIMlinetype)); return(p); } void MIMinsertLinetype(char *c, int num, float lntype[]) /* Insert */ { extern MIMlinetypePtr mimStartLinetypePtr; MIMlinetypePtr p, q; int cnt; p = MIMgetLinetypenode(); /* Make a link record. */ strcpy(p->mimLinetype, c); /* Load the linetype name. */ p->numVals = num; /* Load number of values. */ for(cnt= 0; cnt < num; cnt++) p->lntypeVals[cnt] = lntype[cnt]; p->mimLinetype[strlen(c)] = '\0'; p->nextLinetype = NULL; /* NULL the pointer to next link. */ if(mimStartLinetypePtr == NULL) /* Return, no list to search. */ { mimStartLinetypePtr = p; /* Set pointer to first link. */ return; } q = mimStartLinetypePtr; /* Start a beginning of list. */ while(q->nextLinetype) /* Search to end of list. */ { q = q->nextLinetype; } q->nextLinetype = p; /* Make last point to new link. */ } int MIMlinetypeSearch(char *c, int *num, float lntype[]) /*Get, if any*/ { /* is already in the linked list. */ extern MIMlinetypePtr mimStartLinetypePtr; MIMlinetypePtr q; int foundFlag = 0; /* Default to NO */ int flag = 1, cnt, n; if(mimStartLinetypePtr == NULL) /* Return if no links yet. */ return(foundFlag); q = mimStartLinetypePtr; /* Start a beginning of list. */ while(flag) /* Search to end of list. */ { if(strcmp(q->mimLinetype, c) == 0) { foundFlag = 1; /* Set to YES */ n = q->numVals; for(cnt = 0; cnt < n; cnt++) lntype[cnt] = q->lntypeVals[cnt]; *num = q->numVals; /* Get value count. */ break; } else q = q->nextLinetype; if(q == NULL) flag = 0; } return(foundFlag); } /* END LINKED LIST ROUTINES =========================================*/