|
|
1.1 ! root 1: /* build_trees.c - build decode trees */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/others/quipu/photo/RCS/build_trees.c,v 7.0 89/11/23 22:01:33 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/others/quipu/photo/RCS/build_trees.c,v 7.0 89/11/23 22:01:33 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: build_trees.c,v $ ! 12: * Revision 7.0 89/11/23 22:01:33 mrose ! 13: * Release 6.0 ! 14: * ! 15: */ ! 16: ! 17: /* ! 18: * NOTICE ! 19: * ! 20: * Acquisition, use, and distribution of this module and related ! 21: * materials are subject to the restrictions of a license agreement. ! 22: * Consult the Preface in the User's Manual for the full terms of ! 23: * this agreement. ! 24: * ! 25: */ ! 26: ! 27: ! 28: ! 29: #include <stdio.h> ! 30: #include "quipu/photo.h" ! 31: ! 32: int built = 0; ! 33: char * malloc (); ! 34: ! 35: extern node * bl_tree_top; /* pointers to the decode trees */ ! 36: extern node * wt_tree_top; ! 37: extern node * two_tree_top; ! 38: ! 39: /* ROUTINE: get_node */ ! 40: /* */ ! 41: /* SYNOPSIS: creates a new node. */ ! 42: /* */ ! 43: /* DESCRIPTION: Uses malloc to allocate sufficient memory for a node to */ ! 44: /* be stored, and the sets all the pointer fields of the */ ! 45: /* node to NULL, and initialises the other fields */ ! 46: ! 47: node * ! 48: get_node () ! 49: ! 50: { ! 51: node * mem; ! 52: ! 53: mem = (node *) malloc (sizeof (node)); ! 54: mem->n_type = INTERNAL; /* The most common node type */ ! 55: mem->zero = NULL; ! 56: mem->one = NULL; ! 57: ! 58: return (mem); ! 59: } ! 60: ! 61: ! 62: char * file_path (faxdir,file) ! 63: char *faxdir, *file; ! 64: { ! 65: static char buf [200]; ! 66: char * sprintf (); ! 67: ! 68: (void) sprintf (buf,"%s/%s",faxdir,file); ! 69: return (buf); ! 70: } ! 71: ! 72: /* ROUTINE: build_trees. ! 73: /* ! 74: /* SYNOPSIS: build the decode tree. ! 75: /* ! 76: /* DESCRIPTION: For each of the three trees, read the data in from a file ! 77: /* in string form, convert this into an integer, then add this integer to the ! 78: /* tree. ! 79: /* Also contained in the node is the value associated with the string read in, ! 80: /* so we need to count each string as it is read in. ! 81: */ ! 82: ! 83: build_trees (faxdir) ! 84: char * faxdir; ! 85: { ! 86: FILE * fptr; ! 87: register i; ! 88: char buffer [15]; ! 89: char * string = buffer; ! 90: char * file; ! 91: ! 92: if (built) ! 93: return (0); ! 94: ! 95: /* create the tops of the trees */ ! 96: bl_tree_top = get_node (); ! 97: wt_tree_top = get_node (); ! 98: two_tree_top = get_node (); ! 99: ! 100: /* Add the white terminals to the white tree */ ! 101: file = file_path (faxdir,"wt_term"); ! 102: if ((fptr = fopen (file,"r")) == NULL) ! 103: { ! 104: (void) fprintf(stderr,"Can't open data file %s\n",file); ! 105: return(-1); ! 106: } ! 107: i=0; ! 108: while ( fscanf(fptr,"%s",string) != EOF ) ! 109: add_tree (string,i++,WT_TERM,wt_tree_top); ! 110: (void) fclose (fptr); ! 111: ! 112: /* Add the black terminals to the black tree */ ! 113: file = file_path (faxdir,"bl_term"); ! 114: if ((fptr = fopen (file,"r")) == NULL) ! 115: { ! 116: (void) fprintf(stderr,"Can't open data file %s\n",file); ! 117: return(-1); ! 118: } ! 119: i=0; ! 120: while ( fscanf(fptr,"%s",string) != EOF ) ! 121: add_tree (string,i++,BL_TERM,bl_tree_top); ! 122: (void) fclose (fptr); ! 123: ! 124: /* Add the white make codes to the white tree */ ! 125: file = file_path (faxdir,"wt_make"); ! 126: if ((fptr = fopen (file,"r")) == NULL) ! 127: { ! 128: (void) fprintf(stderr,"Can't open data file %s\n",file); ! 129: return(-1); ! 130: } ! 131: i = 64; ! 132: while ( fscanf(fptr,"%s",string) != EOF ) { ! 133: add_tree (string,i,MAKE,wt_tree_top); ! 134: i += 64; ! 135: } ! 136: (void) fclose (fptr); ! 137: ! 138: /* Add the black make up codes to the black tree */ ! 139: file = file_path (faxdir,"bl_make"); ! 140: if ((fptr = fopen (file,"r")) == NULL) ! 141: { ! 142: (void) fprintf(stderr,"Can't open data file %s\n",file); ! 143: return(-1); ! 144: } ! 145: i = 64; ! 146: while ( fscanf(fptr,"%s",string) != EOF ) { ! 147: add_tree (string,i,MAKE,bl_tree_top); ! 148: i += 64; ! 149: } ! 150: (void) fclose (fptr); ! 151: ! 152: /* make the two dimensional decode tree */ ! 153: file = file_path (faxdir,"two_dim"); ! 154: if ((fptr = fopen (file,"r")) == NULL) ! 155: { ! 156: (void) fprintf(stderr,"Can't open data file %s\n",file); ! 157: return(-1); ! 158: } ! 159: i = 1; ! 160: while ( fscanf(fptr,"%s",string) != EOF ) ! 161: add_tree (string,i++,MAKE,two_tree_top); ! 162: (void) fclose (fptr); ! 163: ! 164: /* put end of line markers on all three trees */ ! 165: add_tree ("00000000000",EOLN,EOLN,bl_tree_top); ! 166: add_tree ("00000000000",EOLN,EOLN,wt_tree_top); ! 167: add_tree ("00000000000",EOLN,EOLN,two_tree_top); ! 168: ! 169: built = 1; ! 170: return(0); ! 171: } ! 172: ! 173: /* ROUTINE: add_tree */ ! 174: /* */ ! 175: /* SYNOPSIS: adds a run to the tree */ ! 176: /* */ ! 177: ! 178: add_tree (string,run,mode,root) ! 179: ! 180: char * string; /* string containing the bit sequence */ ! 181: int run; /* the run length associated with the sequence */ ! 182: char mode; /* the type of data we are entering */ ! 183: node * root; /* top of the tree sting should be added to */ ! 184: { ! 185: ! 186: char * ptr; ! 187: node * treeptr; ! 188: register i; ! 189: ! 190: ptr = string; ! 191: treeptr = root; ! 192: ! 193: for ( i=0; i< strlen(string); i++,ptr++) ! 194: if (*ptr == '0') { ! 195: if (treeptr->zero == NULL) ! 196: treeptr->zero = get_node (); ! 197: treeptr = treeptr->zero; ! 198: ! 199: } else { ! 200: if (treeptr->one == NULL) ! 201: treeptr->one = get_node (); ! 202: treeptr = treeptr->one; ! 203: } ! 204: ! 205: treeptr->n_type = mode; ! 206: treeptr->value = run; ! 207: } ! 208:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.