|
|
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.