00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <stdio.h>
00018 #include <stdlib.h>
00019 #include <string.h>
00020 #include <ctype.h>
00021
00022 #include "reader.h"
00023 #include "sysconf.h"
00024
00025 void readData(char *filename, int *sizes, float *dists, void **data,
00026 DataType *type, int *numComponents)
00027 {
00028 char *cp, line[100], rawFilename[100];
00029 int parseError, dataTypeSize = 0;
00030 size_t size;
00031 FILE *fp;
00032
00033 if (! (fp = fopen(filename, "rb"))) {
00034 perror("opening .dat file failed");
00035 exit(1);
00036 }
00037
00038 parseError = 0;
00039 while (fgets(line, sizeof(line), fp)) {
00040 if (strstr(line, "ObjectFileName")) {
00041 if (! (cp = strchr(line, ':'))) {
00042 parseError = 1;
00043 break;
00044 }
00045 if (sscanf(cp + 1, "%s", rawFilename) != 1) {
00046 parseError = 1;
00047 break;
00048 }
00049 } else if (strstr(line, "Resolution")) {
00050 if (! (cp = strchr(line, ':'))) {
00051 parseError = 1;
00052 break;
00053 }
00054 if (sscanf(cp + 1, "%i %i %i",
00055 &sizes[0], &sizes[1], &sizes[2]) != 3) {
00056 parseError = 1;
00057 break;
00058 }
00059 } else if (strstr(line, "SliceThickness")) {
00060 if (! (cp = strchr(line, ':'))) {
00061 parseError = 1;
00062 break;
00063 }
00064 if (sscanf(cp + 1, "%f %f %f",
00065 &dists[0], &dists[1], &dists[2]) != 3) {
00066 parseError = 1;
00067 break;
00068 }
00069 } else if (strstr(line, "Format")) {
00070 if (strstr(line, "UCHAR")) {
00071 *type = DATRAW_UCHAR;
00072 *numComponents = 1;
00073 dataTypeSize = sizeof(char);
00074 } else if (strstr(line, "USHORT")) {
00075 *type = DATRAW_USHORT;
00076 *numComponents = 1;
00077 dataTypeSize = sizeof(short);
00078 } else if (strstr(line, "FLOAT")) {
00079 char *cp, temp[100];
00080
00081 *type = DATRAW_FLOAT;
00082 dataTypeSize = sizeof(float);
00083
00084 if (! (cp = strchr(line, ':'))) {
00085 parseError = 1;
00086 break;
00087 }
00088 if (sscanf(cp + 1, "%s", temp) != 1) {
00089 parseError = 1;
00090 break;
00091 }
00092
00093 cp = temp;
00094 while (*cp && ! isdigit(*cp)) {
00095 cp++;
00096 }
00097 if (*cp) {
00098 if (sscanf(cp, "%i", numComponents) != 1) {
00099 parseError = 1;
00100 break;
00101 }
00102 } else {
00103 *numComponents = 1;
00104 }
00105 } else {
00106 fprintf(stderr, "cannot process data other than of "
00107 "UCHAR and FLOAT* format\n");
00108 exit(1);
00109 }
00110 } else {
00111 fprintf(stderr, "skipping line %s", line);
00112 }
00113 }
00114
00115 if (parseError) {
00116 fprintf(stderr, "parse error: %s\n", line);
00117 exit(1);
00118 }
00119
00120 fclose(fp);
00121
00122 if (! (fp = fopen(rawFilename, "rb"))) {
00123 char temp[100];
00124 strcpy(temp, filename);
00125 if (! (cp = strrchr(temp, DIR_SEP))) {
00126 perror("opening .raw file failed");
00127 exit(1);
00128 }
00129 strcpy(cp + 1, rawFilename);
00130 if (! (fp = fopen(temp, "rb"))) {
00131 perror("opening .raw file failed");
00132 exit(1);
00133 }
00134 }
00135
00136 size = sizes[0] * sizes[1] * sizes[2];
00137
00138 if (! (*data = malloc(size * *numComponents * dataTypeSize))) {
00139 fprintf(stderr, "not enough memory for volume data\n");
00140 exit(1);
00141 }
00142
00143 if (fread(*data, dataTypeSize, size * *numComponents, fp) !=
00144 size * *numComponents) {
00145 fprintf(stderr, "reading volume data failed");
00146 exit(1);
00147 }
00148
00149 fclose(fp);
00150 }
00151
00152 int getDataTypeSize(DataType t)
00153 {
00154 switch(t) {
00155 case DATRAW_UCHAR:
00156 return 1;
00157 break;
00158 case DATRAW_USHORT:
00159 return 2;
00160 break;
00161 default:
00162 fprintf(stderr, "Unsupported data type!\n");
00163 exit(1);
00164 }
00165 }
00166