annotate conversion/scxtominc/scx_file.c @ 618:9de05be4c965

Pre-release
author neelin <neelin>
date Wed, 28 Sep 1994 10:32:02 +0000
parents 4023ad64bae5
children 96821ec9dfac
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
72
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
1 /* ----------------------------- MNI Header -----------------------------------
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
2 @NAME : scx_file.c
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
3 @DESCRIPTION: File containing routines to read scanditronix image files
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
4 @GLOBALS :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
5 @CREATED : January 8, 1993 (Peter Neelin)
314
34fcd78b1b85 Added RCS logging in source.
neelin <neelin>
parents: 259
diff changeset
6 @MODIFIED : $Log: scx_file.c,v $
618
9de05be4c965 Pre-release
neelin <neelin>
parents: 433
diff changeset
7 @MODIFIED : Revision 1.9 1994-09-28 10:33:28 neelin
9de05be4c965 Pre-release
neelin <neelin>
parents: 433
diff changeset
8 @MODIFIED : Pre-release
314
34fcd78b1b85 Added RCS logging in source.
neelin <neelin>
parents: 259
diff changeset
9 @MODIFIED :
618
9de05be4c965 Pre-release
neelin <neelin>
parents: 433
diff changeset
10 * Revision 1.8 93/11/03 17:16:19 neelin
9de05be4c965 Pre-release
neelin <neelin>
parents: 433
diff changeset
11 * Removed check for DPR==1 when getting images (this applies only to data).
9de05be4c965 Pre-release
neelin <neelin>
parents: 433
diff changeset
12 *
433
4023ad64bae5 Removed check for DPR==1 when getting images (this applies only to data).
neelin <neelin>
parents: 374
diff changeset
13 * Revision 1.7 93/10/06 10:15:46 neelin
4023ad64bae5 Removed check for DPR==1 when getting images (this applies only to data).
neelin <neelin>
parents: 374
diff changeset
14 * Added include of memory.h for compilation on SUNs
4023ad64bae5 Removed check for DPR==1 when getting images (this applies only to data).
neelin <neelin>
parents: 374
diff changeset
15 *
374
3816e24a7935 Added include of memory.h for compilation on SUNs
neelin <neelin>
parents: 367
diff changeset
16 * Revision 1.6 93/09/22 14:50:32 neelin
3816e24a7935 Added include of memory.h for compilation on SUNs
neelin <neelin>
parents: 367
diff changeset
17 * Added DTYP = 2 for short values in scx_get_image (this isn't documented,
3816e24a7935 Added include of memory.h for compilation on SUNs
neelin <neelin>
parents: 367
diff changeset
18 * but seems to occur for version 6 files sometimes).
3816e24a7935 Added include of memory.h for compilation on SUNs
neelin <neelin>
parents: 367
diff changeset
19 *
367
96a886088b4d Added DTYP = 2 for short values in scx_get_image (this isn't documented,
neelin <neelin>
parents: 334
diff changeset
20 * Revision 1.5 93/08/31 12:08:28 neelin
96a886088b4d Added DTYP = 2 for short values in scx_get_image (this isn't documented,
neelin <neelin>
parents: 334
diff changeset
21 * Added conditional definition of SEEK_SET.
96a886088b4d Added DTYP = 2 for short values in scx_get_image (this isn't documented,
neelin <neelin>
parents: 334
diff changeset
22 *
334
02c4afafc38d Added conditional definition of SEEK_SET.
neelin <neelin>
parents: 314
diff changeset
23 * Revision 1.4 93/08/11 15:27:42 neelin
02c4afafc38d Added conditional definition of SEEK_SET.
neelin <neelin>
parents: 314
diff changeset
24 * Added RCS logging in source.
02c4afafc38d Added conditional definition of SEEK_SET.
neelin <neelin>
parents: 314
diff changeset
25 *
259
ebee92189246 Added copyright notice.
neelin <neelin>
parents: 237
diff changeset
26 @COPYRIGHT :
ebee92189246 Added copyright notice.
neelin <neelin>
parents: 237
diff changeset
27 Copyright 1993 Peter Neelin, McConnell Brain Imaging Centre,
ebee92189246 Added copyright notice.
neelin <neelin>
parents: 237
diff changeset
28 Montreal Neurological Institute, McGill University.
ebee92189246 Added copyright notice.
neelin <neelin>
parents: 237
diff changeset
29 Permission to use, copy, modify, and distribute this
ebee92189246 Added copyright notice.
neelin <neelin>
parents: 237
diff changeset
30 software and its documentation for any purpose and without
ebee92189246 Added copyright notice.
neelin <neelin>
parents: 237
diff changeset
31 fee is hereby granted, provided that the above copyright
ebee92189246 Added copyright notice.
neelin <neelin>
parents: 237
diff changeset
32 notice appear in all copies. The author and McGill University
ebee92189246 Added copyright notice.
neelin <neelin>
parents: 237
diff changeset
33 make no representations about the suitability of this
ebee92189246 Added copyright notice.
neelin <neelin>
parents: 237
diff changeset
34 software for any purpose. It is provided "as is" without
ebee92189246 Added copyright notice.
neelin <neelin>
parents: 237
diff changeset
35 express or implied warranty.
72
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
36 ---------------------------------------------------------------------------- */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
37
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
38 #ifndef lint
618
9de05be4c965 Pre-release
neelin <neelin>
parents: 433
diff changeset
39 static char rcsid[]="$Header: /private-cvsroot/minc/conversion/scxtominc/scx_file.c,v 1.9 1994-09-28 10:33:28 neelin Exp $";
72
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
40 #endif
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
41
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
42 #include <stdlib.h>
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
43 #include <stdio.h>
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
44 #include <string.h>
374
3816e24a7935 Added include of memory.h for compilation on SUNs
neelin <neelin>
parents: 367
diff changeset
45 #include <memory.h>
72
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
46 #include <scx_header_def.h>
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
47 #include <scx_file.h>
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
48 #include <vax_conversions.h>
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
49
334
02c4afafc38d Added conditional definition of SEEK_SET.
neelin <neelin>
parents: 314
diff changeset
50 #ifndef SEEK_SET
02c4afafc38d Added conditional definition of SEEK_SET.
neelin <neelin>
parents: 314
diff changeset
51 # define SEEK_SET 0
02c4afafc38d Added conditional definition of SEEK_SET.
neelin <neelin>
parents: 314
diff changeset
52 #endif
02c4afafc38d Added conditional definition of SEEK_SET.
neelin <neelin>
parents: 314
diff changeset
53
72
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
54 /* Private functions */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
55 private void scx_get_value(unsigned char *header, long position,
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
56 scx_mnem_types type, int length,
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
57 long *lvalue, float *fvalue, char *svalue);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
58
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
59 /* Constants */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
60 #define TRUE 1
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
61 #define FALSE 0
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
62 #define HEADER_SIZE 2048
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
63 #define FILE_TYPE_POSITION 0
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
64 #define FILE_TYPE_TYPE scx_word
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
65 #define SCX_NCS "NCS"
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
66 #define SCX_SPOS "SPOS"
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
67 #define SCX_DPR "DPR"
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
68 #define SCX_FHS "FHS"
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
69 #define SCX_REC "REC"
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
70 #define SCX_DTYP "DTYP"
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
71 #define SCX_IMFM "IMFM"
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
72 #define SCX_SPOS "SPOS"
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
73 #define MAX_PIX_SIZE 2
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
74
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
75
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
76 /* ----------------------------- MNI Header -----------------------------------
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
77 @NAME : scx_open
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
78 @INPUT : filename - name of file to open
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
79 @OUTPUT : (none)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
80 @RETURNS : Pointer to scanditronix file descriptor or NULL if an error
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
81 occurs.
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
82 @DESCRIPTION: Routine to open a scanditronix file (for reading only), given
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
83 its pathname.
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
84 @METHOD :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
85 @GLOBALS :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
86 @CALLS :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
87 @CREATED : January 8, 1993 (Peter Neelin)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
88 @MODIFIED :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
89 ---------------------------------------------------------------------------- */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
90 public scx_file *scx_open(char *filename)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
91 {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
92 scx_file *file;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
93 long file_type, nslice, spos;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
94 int i;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
95
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
96 /* Allocate space for a scx file structure */
237
bff58e671d2e Changed includes, malloc, free and return from main.
neelin <neelin>
parents: 72
diff changeset
97 file = (void *) malloc(sizeof(scx_file));
72
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
98
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
99 /* Open the file */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
100 if ((file->file_pointer=fopen(filename, "rb")) == NULL) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
101 free(file);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
102 return NULL;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
103 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
104
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
105 /* Read in the header */
237
bff58e671d2e Changed includes, malloc, free and return from main.
neelin <neelin>
parents: 72
diff changeset
106 file->header = (void *) malloc(HEADER_SIZE);
72
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
107 if (fread(file->header, sizeof(char), (size_t) HEADER_SIZE,
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
108 file->file_pointer) != HEADER_SIZE) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
109 free(file->header);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
110 free(file);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
111 return NULL;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
112 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
113
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
114 /* Get the file type from the header */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
115 scx_get_value(file->header, FILE_TYPE_POSITION, FILE_TYPE_TYPE, 1,
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
116 &file_type, NULL, NULL);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
117
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
118 /* Search for the file type */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
119 for (i=0; (scx_file_types[i].file_type!=0) &&
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
120 (file_type!=scx_file_types[i].file_type); i++) {}
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
121 if (scx_file_types[i].file_type==0) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
122 free(file->header);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
123 free(file);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
124 return NULL;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
125 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
126 file->blocks = scx_file_types[i].block_list;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
127 file->mnemonics = scx_file_types[i].mnemonic_list;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
128
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
129 /* Get the number of mnemonics in the header */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
130 for (i=0; file->mnemonics[i].name!=NULL; i++) {}
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
131 file->num_mnemonics = i;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
132
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
133 /* Check for a consistent header by looking at the slice positions */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
134 if (scx_get_mnem(file, SCX_NCS, 0, &nslice, NULL, NULL) || (nslice<=0)) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
135 free(file->header);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
136 free(file);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
137 return NULL;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
138 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
139 for (i=0; i<nslice; i++) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
140 if (scx_get_mnem(file, SCX_SPOS, i, &spos, NULL, NULL) ||
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
141 (spos<0) || (spos>nslice)) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
142 free(file->header);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
143 free(file);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
144 return NULL;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
145 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
146 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
147
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
148 return file;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
149 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
150
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
151 /* ----------------------------- MNI Header -----------------------------------
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
152 @NAME : scx_close
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
153 @INPUT : file - scanditronix file descriptor to close
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
154 @OUTPUT : (none)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
155 @RETURNS : (nothing)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
156 @DESCRIPTION: Routine to close a scanditronix file.
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
157 @METHOD :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
158 @GLOBALS :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
159 @CALLS :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
160 @CREATED : January 8, 1993 (Peter Neelin)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
161 @MODIFIED :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
162 ---------------------------------------------------------------------------- */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
163 public void scx_close(scx_file *file)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
164 {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
165 if (file==NULL) return;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
166 (void) fclose(file->file_pointer);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
167 free(file->header);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
168 free(file);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
169
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
170 return;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
171 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
172
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
173 /* ----------------------------- MNI Header -----------------------------------
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
174 @NAME : scx_get_mnem
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
175 @INPUT : file - scanditronix file descriptor
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
176 mnem - mnemonic to find
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
177 multiplicity - index of value to get
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
178 @OUTPUT : lvalue - long integer value to return
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
179 fvalue - floating point value to return
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
180 svalue - string value to return
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
181 @RETURNS : TRUE if an error occurs, FALSE otherwise
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
182 @DESCRIPTION: Routine to get a mnemonic's value from a scanditronix file
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
183 header.
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
184 @METHOD :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
185 @GLOBALS :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
186 @CALLS :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
187 @CREATED : January 8, 1993 (Peter Neelin)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
188 @MODIFIED :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
189 ---------------------------------------------------------------------------- */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
190 public int scx_get_mnem(scx_file *file, char *mnem, int multiplicity,
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
191 long *lvalue, float *fvalue, char *svalue)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
192 {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
193 scx_block_type *block_ptr;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
194 scx_mnemonic_type *mnem_ptr;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
195 long position;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
196
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
197 /* Check file pointer */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
198 if (file==NULL) return TRUE;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
199
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
200 /* Check for negative multiplicity */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
201 if (multiplicity < 0) return TRUE;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
202
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
203 /* Search for the mnemonic */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
204 for (mnem_ptr=file->mnemonics;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
205 (mnem_ptr->name!=NULL) && (strcmp(mnem_ptr->name, mnem)!=0);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
206 mnem_ptr++) {}
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
207 if (mnem_ptr->name==NULL) return TRUE;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
208
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
209 /* Check for a mnemonic not in the file (a constant). We only handle
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
210 integer constants */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
211 if (!mnem_ptr->in_file) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
212 switch (mnem_ptr->type) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
213 case scx_byte:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
214 case scx_word:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
215 case scx_long:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
216 if (lvalue!=NULL) *lvalue = mnem_ptr->mdefault;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
217 if (fvalue!=NULL) *fvalue = mnem_ptr->mdefault;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
218 if (svalue!=NULL)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
219 (void) sprintf(svalue, "%d", (int) mnem_ptr->mdefault);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
220 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
221 default:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
222 return TRUE;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
223 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
224 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
225
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
226 /* Mnemonic is in file header */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
227 else {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
228
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
229 /* Calculate the position of the mnemonic by looping through
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
230 the list of parent blocks */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
231 position = mnem_ptr->start;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
232 for (block_ptr = mnem_ptr->block;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
233 (multiplicity>0) && (block_ptr!=NULL);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
234 block_ptr = block_ptr->parent) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
235 position += block_ptr->length *
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
236 (multiplicity % block_ptr->multiplicity);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
237 multiplicity /= block_ptr->multiplicity;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
238 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
239 if (multiplicity > 0) return TRUE;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
240
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
241 /* Get the value */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
242 scx_get_value(file->header, position, mnem_ptr->type, mnem_ptr->length,
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
243 lvalue, fvalue, svalue);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
244
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
245 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
246
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
247 return FALSE;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
248 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
249
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
250 /* ----------------------------- MNI Header -----------------------------------
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
251 @NAME : scx_get_value
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
252 @INPUT : header - pointer to header data
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
253 position - postion of value to read
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
254 type - type of value to get
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
255 length - number of values to get
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
256 @OUTPUT : lvalue - long integer value to return
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
257 fvalue - floating point value to return
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
258 svalue - string value to return
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
259 @RETURNS : (nothing)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
260 @DESCRIPTION: Routine to get a mnemonic's value from a scanditronix file
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
261 header, given the position and type.
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
262 @METHOD :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
263 @GLOBALS :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
264 @CALLS :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
265 @CREATED : January 8, 1993 (Peter Neelin)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
266 @MODIFIED :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
267 ---------------------------------------------------------------------------- */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
268 private void scx_get_value(unsigned char *header, long position,
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
269 scx_mnem_types type, int length,
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
270 long *lvalue, float *fvalue, char *svalue)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
271 {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
272 void *data;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
273 unsigned char *bdata;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
274 short *idata;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
275 long *ldata;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
276 float *fdata;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
277
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
278 /* Check length */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
279 if (length<=0) return;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
280
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
281 /* Get the values */
237
bff58e671d2e Changed includes, malloc, free and return from main.
neelin <neelin>
parents: 72
diff changeset
282 data = (void *) malloc(length * scx_mnem_type_size[type]);
72
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
283 bdata = data; idata = data; ldata = data; fdata = data;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
284 switch (type) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
285 case scx_byte:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
286 case scx_string:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
287 case scx_time:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
288 case scx_date:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
289 (void) memcpy(bdata, &header[position], length);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
290 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
291 case scx_word:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
292 case scx_short_float:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
293 get_vax_short(length, &header[position], idata);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
294 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
295 case scx_long:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
296 get_vax_long(length, &header[position], ldata);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
297 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
298 case scx_float:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
299 get_vax_float(length, &header[position], fdata);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
300 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
301
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
302 /* Convert the values */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
303 switch (type) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
304 case scx_byte:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
305 if (lvalue!=NULL) *lvalue = bdata[0];
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
306 if (fvalue!=NULL) *fvalue = bdata[0];
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
307 if (svalue!=NULL) (void) sprintf(svalue, "%d", (int) bdata[0]);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
308 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
309 case scx_string:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
310 if (lvalue!=NULL) *lvalue = 0;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
311 if (fvalue!=NULL) *fvalue = 0;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
312 if (svalue!=NULL) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
313 (void) memcpy(svalue, bdata, length);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
314 svalue[length]='\0';
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
315 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
316 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
317 case scx_time:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
318 if (lvalue!=NULL) *lvalue = 0;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
319 if (fvalue!=NULL) *fvalue = 0;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
320 if (svalue!=NULL) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
321 if (length==3)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
322 (void) sprintf(svalue, "%02d:%02d:%02d",
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
323 (int) bdata[0], (int) bdata[1], (int) bdata[2]);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
324 else if (length==4)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
325 (void) sprintf(svalue, "%02d:%02d:%02d.%02d",
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
326 (int) bdata[0], (int) bdata[1],
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
327 (int) bdata[2], (int) bdata[3]);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
328 else
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
329 svalue[0]='\0';
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
330 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
331 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
332 case scx_date:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
333 if (lvalue!=NULL) *lvalue = 0;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
334 if (fvalue!=NULL) *fvalue = 0;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
335 if (svalue!=NULL) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
336 if (length==3)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
337 (void) sprintf(svalue, "%02d-%02d-%02d",
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
338 (int) bdata[0], (int) bdata[1], (int) bdata[2]);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
339 else
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
340 svalue[0]='\0';
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
341 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
342 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
343 case scx_word:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
344 if (lvalue!=NULL) *lvalue = idata[0];
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
345 if (fvalue!=NULL) *fvalue = idata[0];
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
346 if (svalue!=NULL) (void) sprintf(svalue, "%d", (int) idata[0]);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
347 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
348 case scx_short_float:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
349 if (lvalue!=NULL) *lvalue = idata[0]/100.0;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
350 if (fvalue!=NULL) *fvalue = idata[0]/100.0;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
351 if (svalue!=NULL) (void) sprintf(svalue, "%8g", (double) idata[0]/100.0);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
352 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
353 case scx_long:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
354 if (lvalue!=NULL) *lvalue = ldata[0];
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
355 if (fvalue!=NULL) *fvalue = ldata[0];
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
356 if (svalue!=NULL) (void) sprintf(svalue, "%d", (int) ldata[0]);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
357 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
358 case scx_float:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
359 if (lvalue!=NULL) *lvalue = fdata[0];
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
360 if (fvalue!=NULL) *fvalue = fdata[0];
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
361 if (svalue!=NULL) (void) sprintf(svalue, "%8g", (double) fdata[0]);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
362 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
363 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
364
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
365 free(data);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
366
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
367 return;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
368
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
369 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
370
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
371 /* ----------------------------- MNI Header -----------------------------------
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
372 @NAME : scx_get_image
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
373 @INPUT : file - scanditronix file pointer
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
374 image_num - image to get (first image is zero)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
375 @OUTPUT : image - pointer to array into which image should be written.
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
376 @RETURNS : TRUE if an error occurs, false otherwise.
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
377 @DESCRIPTION: Routine to get an image from a scanditronix image file.
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
378 @METHOD :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
379 @GLOBALS :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
380 @CALLS :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
381 @CREATED : January 11, 1993 (Peter Neelin)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
382 @MODIFIED :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
383 ---------------------------------------------------------------------------- */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
384 public int scx_get_image(scx_file *file, int image_num, short *image)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
385 {
433
4023ad64bae5 Removed check for DPR==1 when getting images (this applies only to data).
neelin <neelin>
parents: 374
diff changeset
386 long header_size, record_size, data_type;
72
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
387 long image_width, image_pos, image_npix, image_size;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
388 long file_offset, array_offset, ipix;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
389 int pix_size;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
390 unsigned char *bimage;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
391
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
392 /* Check file pointer */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
393 if (file==NULL) return TRUE;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
394
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
395 /* Parameters for calculating image position */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
396 if (scx_get_mnem(file, SCX_FHS, 0, &header_size, NULL, NULL) ||
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
397 scx_get_mnem(file, SCX_REC, 0, &record_size, NULL, NULL) ||
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
398 scx_get_mnem(file, SCX_DTYP, 0, &data_type, NULL, NULL) ||
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
399 scx_get_mnem(file, SCX_IMFM, 0, &image_width, NULL, NULL) ||
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
400 scx_get_mnem(file, SCX_SPOS, image_num, &image_pos, NULL, NULL) ||
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
401 (header_size<0) || (record_size<0) || (image_width<0) ||
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
402 (image_pos<0)) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
403 return TRUE;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
404 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
405
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
406 /* Check that image is in file */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
407 if (image_pos<1) return TRUE;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
408
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
409 /* Check data type */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
410 switch (data_type) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
411 case 0: pix_size=2; break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
412 case 1: pix_size=1; break;
367
96a886088b4d Added DTYP = 2 for short values in scx_get_image (this isn't documented,
neelin <neelin>
parents: 334
diff changeset
413 case 2: pix_size=2; break;
72
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
414 default: return TRUE;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
415 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
416
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
417 /* Calculate image size and offsets */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
418 image_npix = image_width * image_width;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
419 image_size = image_npix * pix_size;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
420 file_offset = header_size * record_size + (image_pos-1) * image_size;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
421 array_offset = image_npix * (MAX_PIX_SIZE - pix_size);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
422 bimage = (unsigned char *) image;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
423
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
424 /* Read in the image */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
425 if (fseek(file->file_pointer, file_offset, SEEK_SET) ||
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
426 (fread(&bimage[array_offset], (size_t) pix_size, (size_t) image_npix,
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
427 file->file_pointer) != image_npix)) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
428 return TRUE;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
429 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
430
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
431 /* Transform the image to the right type */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
432 switch (pix_size) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
433 case 1:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
434 for (ipix=0; ipix<image_npix; ipix++) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
435 image[ipix] = bimage[array_offset+ipix];
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
436 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
437 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
438 case 2:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
439 get_vax_short(image_npix, image, image);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
440 break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
441 default:
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
442 return TRUE;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
443 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
444
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
445 return FALSE;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
446
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
447 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
448
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
449 /* ----------------------------- MNI Header -----------------------------------
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
450 @NAME : scx_list_mnems
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
451 @INPUT : file - pointer to an open scanditronix file
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
452 index - counter to identify next mnemonic
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
453 @OUTPUT : mname - pointer to array into which name should be written
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
454 mmult - multiplicity of mnemonic
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
455 mtype - type of mnemonic (can be scx_long, scx_float or
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
456 scx_string)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
457 @RETURNS : Value of mname or NULL if index out of range.
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
458 @DESCRIPTION: Routine to list the mnemonics that can be found in a scanditronix
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
459 file.
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
460 @METHOD :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
461 @GLOBALS :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
462 @CALLS :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
463 @CREATED : January 19, 1993 (Peter Neelin)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
464 @MODIFIED :
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
465 ---------------------------------------------------------------------------- */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
466 public char *scx_list_mnems(scx_file *file,int index, char *mname,
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
467 int *mmult, scx_mnem_types *mtype)
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
468 {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
469 scx_block_type *block_ptr;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
470
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
471 /* Check file pointer and index */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
472 if ((file == NULL) || (index < 0) || (index >= file->num_mnemonics))
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
473 return NULL;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
474
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
475 /* Copy the name */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
476 (void) strcpy(mname, file->mnemonics[index].name);
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
477
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
478 /* Get the multiplicity */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
479 *mmult = 1;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
480 for (block_ptr = file->mnemonics[index].block;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
481 block_ptr!=NULL;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
482 block_ptr = block_ptr->parent) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
483 *mmult *= block_ptr->multiplicity;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
484 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
485
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
486 /* Get the mnemonic type */
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
487 switch (file->mnemonics[index].type) {
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
488 case scx_byte: *mtype = scx_long; break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
489 case scx_string: *mtype = scx_string; break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
490 case scx_time: *mtype = scx_string; break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
491 case scx_date: *mtype = scx_string; break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
492 case scx_word: *mtype = scx_long; break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
493 case scx_short_float: *mtype = scx_float; break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
494 case scx_long: *mtype = scx_long; break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
495 case scx_float: *mtype = scx_float; break;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
496 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
497
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
498 return mname;
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
499
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
500 }
88eb55ed2a4a Initial revision
neelin <neelin>
parents:
diff changeset
501