pack_utils.c
References to this file elsewhere.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #ifndef CRAY
6 # ifdef NOUNDERSCORE
7 # define INT_PACK_DATA int_pack_data
8 # define INT_GET_TI_HEADER_C int_get_ti_header_c
9 # define INT_GEN_TI_HEADER_C int_gen_ti_header_c
10 # define ADD_TO_BUFSIZE_FOR_FIELD_C add_to_bufsize_for_field_c
11 # define STORE_PIECE_OF_FIELD_C store_piece_of_field_c
12 # define RETRIEVE_PIECES_OF_FIELD_C retrieve_pieces_of_field_c
13 # define INIT_STORE_PIECE_OF_FIELD init_store_piece_of_field
14 # define INIT_RETRIEVE_PIECES_OF_FIELD init_retrieve_pieces_of_field
15 # define PERTURB_REAL perturb_real
16 # else
17 # ifdef F2CSTYLE
18 # define INT_PACK_DATA int_pack_data__
19 # define INT_GET_TI_HEADER_C int_get_ti_header_c__
20 # define INT_GEN_TI_HEADER_C int_gen_ti_header_c__
21 # define ADD_TO_BUFSIZE_FOR_FIELD_C add_to_bufsize_for_field_c__
22 # define STORE_PIECE_OF_FIELD_C store_piece_of_field_c__
23 # define RETRIEVE_PIECES_OF_FIELD_C retrieve_pieces_of_field_c__
24 # define INIT_STORE_PIECE_OF_FIELD init_store_piece_of_field__
25 # define INIT_RETRIEVE_PIECES_OF_FIELD init_retrieve_pieces_of_field__
26 # define PERTURB_REAL perturb_real__
27 # else
28 # define INT_PACK_DATA int_pack_data_
29 # define INT_GET_TI_HEADER_C int_get_ti_header_c_
30 # define INT_GEN_TI_HEADER_C int_gen_ti_header_c_
31 # define ADD_TO_BUFSIZE_FOR_FIELD_C add_to_bufsize_for_field_c_
32 # define STORE_PIECE_OF_FIELD_C store_piece_of_field_c_
33 # define RETRIEVE_PIECES_OF_FIELD_C retrieve_pieces_of_field_c_
34 # define INIT_STORE_PIECE_OF_FIELD init_store_piece_of_field_
35 # define INIT_RETRIEVE_PIECES_OF_FIELD init_retrieve_pieces_of_field_
36 # define PERTURB_REAL perturb_real_
37 # endif
38 # endif
39 #endif
40
41 /* CALL int_pack_data ( hdrbuf , hdrbufsiz * inttypesize , int_local_output_buffer, int_local_output_cursor ) */
42
43 INT_PACK_DATA ( unsigned char *buf , int *ninbytes , unsigned char *obuf, int *cursor )
44 {
45 int i, lcurs ;
46 lcurs = *cursor - 1 ;
47 for ( i = 0 ; i < *ninbytes ; i++ )
48 {
49 obuf[lcurs++] = buf[i] ;
50 }
51 *cursor = lcurs+1 ;
52 }
53
54 int
55 INT_GEN_TI_HEADER_C ( char * hdrbuf, int * hdrbufsize, /* hdrbufsize is in bytes */
56 int * itypesize, int * typesize,
57 int * DataHandle, char * Data,
58 int * Count, int * code )
59 {
60 int i ;
61 char * p ;
62 p = hdrbuf ;
63 p += sizeof(int) ;
64 bcopy( code, p, sizeof(int) ) ; p += sizeof(int) ; /* 2 */
65 bcopy( DataHandle, p, sizeof(int) ) ; p += sizeof(int) ; /* 3 */
66 bcopy( typesize, p, sizeof(int) ) ; p += sizeof(int) ; /* 4 */
67 bcopy( Count, p, sizeof(int) ) ; p += sizeof(int) ; /* 5 */
68 bcopy( Data, p, *Count * *typesize ) ; p += *Count * *typesize ; /* 6++ */
69 *hdrbufsize = (int) (p - hdrbuf) ;
70 bcopy( hdrbufsize, hdrbuf, sizeof(int) ) ;
71 return(0) ;
72 }
73
74 int
75 INT_GET_TI_HEADER_C ( char * hdrbuf, int * hdrbufsize, int * n, /* hdrbufsize and n are in bytes */
76 int * itypesize, int * typesize,
77 int * DataHandle, char * Data,
78 int * Count, int * code )
79 {
80 int i ;
81 char * p ;
82 p = hdrbuf ;
83 bcopy( p, hdrbufsize, sizeof(int) ) ; p += sizeof(int) ; /* 1 */
84 bcopy( p, code, sizeof(int) ) ; p += sizeof(int) ; /* 2 */
85 bcopy( p, DataHandle, sizeof(int) ) ; p += sizeof(int) ; /* 3 */
86 bcopy( p, typesize, sizeof(int) ) ; p += sizeof(int) ; /* 4 */
87 bcopy( p, Count, sizeof(int) ) ; p += sizeof(int) ; /* 5 */
88 if ( *Count * *typesize > 0 ) {
89 bcopy( p, Data, *Count * *typesize ) ; p += *Count * *typesize ; /* 6++ */
90 }
91 *n = (int)( p - hdrbuf ) ;
92 return(0) ;
93 }
94
95 #define MAX_FLDS 2000
96 static char fld_name[MAX_FLDS][256] ;
97 static char *fld_cache[MAX_FLDS] ;
98 static int fld_curs[MAX_FLDS] ;
99 static int fld_bufsize[MAX_FLDS] ;
100 static int fld = 0 ;
101 static int numflds = 0 ;
102 static int frst = 1 ;
103
104 int INIT_STORE_PIECE_OF_FIELD ()
105 {
106 int i ;
107 if ( frst ) {
108 for ( i = 0 ; i < MAX_FLDS ; i++ ) {
109 fld_cache[i] = NULL ;
110 }
111 frst = 0 ;
112 }
113 numflds = 0 ;
114 for ( i = 0 ; i < MAX_FLDS ; i++ ) {
115 strcpy( fld_name[i], "" ) ;
116 if ( fld_cache[i] != NULL ) free( fld_cache[i] ) ;
117 fld_cache[i] = NULL ;
118 fld_curs[i] = 0 ;
119 fld_bufsize[i] = 0 ;
120 }
121 return(0) ;
122 }
123
124 int INIT_RETRIEVE_PIECES_OF_FIELD ()
125 {
126 fld = 0 ;
127 return(0) ;
128 }
129
130 int
131 ADD_TO_BUFSIZE_FOR_FIELD_C ( int varname[], int * chunksize )
132 {
133 int i, n ;
134 int found ;
135 char vname[256] ;
136
137 n = varname[0] ;
138 for ( i = 1; i <= n ; i++ ) { vname[i-1] = varname[i] ; }
139 vname[n] = '\0' ;
140
141 found = -1 ;
142 for ( i = 0 ; i < numflds ; i++ ) { if ( !strcmp( fld_name[i], vname ) ) { found = i ; break ; } }
143 if ( found == -1 ) {
144 found = numflds++ ;
145 strcpy( fld_name[found], vname ) ;
146 fld_bufsize[found] = *chunksize ;
147 }
148 else
149 {
150 fld_bufsize[found] += *chunksize ;
151 }
152 if ( fld_cache[found] != NULL ) { free( fld_cache[found] ) ; }
153 fld_cache[found] = NULL ;
154 return(0) ;
155 }
156
157 int
158 STORE_PIECE_OF_FIELD_C ( char * buf , int varname[], int * chunksize, int *retval )
159 {
160 int i, n ;
161 int found ;
162 char vname[256] ;
163
164 n = varname[0] ;
165 for ( i = 1; i <= n ; i++ ) { vname[i-1] = varname[i] ; }
166 vname[n] = '\0' ;
167
168 found = -1 ;
169 for ( i = 0 ; i < numflds ; i++ ) { if ( !strcmp( fld_name[i], vname ) ) { found = i ; break ; } }
170 if ( found == -1 ) {
171 fprintf(stderr,"frame/pack_utils.c: field (%s) not found; was not set up with add_to_bufsize_for_field\n",vname ) ;
172 *retval = 1 ;
173 return(0) ;
174 }
175
176 if ( fld_cache[found] == NULL ) {
177 fld_cache[found] = (char *) malloc( fld_bufsize[found] ) ;
178 fld_curs[found] = 0 ;
179 }
180
181 if ( fld_curs[found] + *chunksize > fld_bufsize[found] ) {
182 fprintf(stderr,
183 "frame/pack_utils.c: %s would overwrite %d + %d > %d [%d]\n",vname, fld_curs[found], *chunksize, fld_bufsize[found], found ) ;
184 *retval = 1 ;
185 return(0) ;
186 }
187
188 bcopy( buf, fld_cache[found]+fld_curs[found], *chunksize ) ;
189 fld_curs[found] += *chunksize ;
190 *retval = 0 ;
191 return(0) ;
192 }
193
194 int
195 RETRIEVE_PIECES_OF_FIELD_C ( char * buf , int varname[], int * insize, int * outsize, int *retval )
196 {
197 int i, n ;
198 int found ;
199 char vname[256] ;
200
201 if ( fld < numflds ) {
202 if ( fld_curs[fld] > *insize ) {
203 fprintf(stderr,"retrieve: fld_curs[%d] (%d) > *insize (%d)\n",fld,fld_curs[fld], *insize ) ;
204 }
205 *outsize = ( fld_curs[fld] <= *insize ) ? fld_curs[fld] : *insize ;
206 varname[0] = (int) strlen( fld_name[fld] ) ;
207 for ( i = 1 ; i <= varname[0] ; i++ ) varname[i] = fld_name[fld][i-1] ;
208 for ( i = 0 ; i < *outsize ; i++ ) buf[i] = fld_cache[fld][i] ;
209 if ( fld_cache[fld] != NULL ) free ( fld_cache[fld] ) ;
210 fld_cache[fld] = NULL ;
211 fld_bufsize[fld] = 0 ;
212 fld++ ;
213 *retval = 0 ;
214 }
215 else {
216 numflds = 0 ;
217 *retval = -1 ;
218 }
219 return(0) ;
220 }
221
222 #define INDEX_2(A,B,NB) ( (B) + (A)*(NB) )
223 #define INDEX_3(A,B,C) INDEX_2( (A), INDEX_2( (B), (C), (me[1]-ms[1]+1) ), (me[1]-ms[1]+1)*(me[0]-ms[0]+1) )
224 /* flip low order bit of fp number */
225 int
226 PERTURB_REAL ( float * field, int ds[], int de[], int ms[], int me[], int ps[], int pe[] )
227 {
228 int i,j,k ;
229 int le ; /* index of little end */
230 float x = 2.0 ;
231 unsigned int y ;
232 unsigned char a[4], *p ;
233 if ( sizeof(float) != 4 ) return(-1) ;
234 /* check endianness of machine */
235 bcopy ( &x, a, 4 ) ;
236 le = 0 ;
237 if ( a[0] == 0x40 ) le = 3 ;
238 for ( k = ps[2]-1 ; k <= pe[2]-1 ; k++ )
239 for ( j = ps[1]-1 ; j <= pe[1]-1 ; j++ )
240 for ( i = ps[0]-1 ; i <= pe[0]-1 ; i++ )
241 {
242 /* do not change zeros */
243 if ( field[ INDEX_3(k,j,i) ] != 0.0 ) {
244 p = (unsigned char *)&(field[ INDEX_3(k,j,i) ] ) ;
245 if ( *(p+le) & 1 ) { *(p+le) &= 0x7e ; }
246 else { *(p+le) |= 1 ; }
247 }
248 }
249 return(0) ;
250 }