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