00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef FORTREAD_H
00023 #define FORTREAD_H
00024
00025 #include <stdlib.h>
00026 #include <stdio.h>
00027
00028 #include "endianswap.h"
00029
00030 #define FORT_RECLEN_32BIT 4
00031 #define FORT_RECLEN_64BIT 8
00032
00033
00034
00035
00036 static int fort_eat_recmark(FILE *ifp, int recmarklen) {
00037 int tmp;
00038 if (recmarklen == FORT_RECLEN_64BIT) {
00039 if (fread(&tmp, 4, 1, ifp) != 1)
00040 return -1;
00041 if (fread(&tmp, 4, 1, ifp) != 1)
00042 return -1;
00043 } else {
00044 if (fread(&tmp, 4, 1, ifp) != 1)
00045 return -1;
00046 }
00047
00048 return 0;
00049 }
00050
00051
00052
00053
00054
00055 static int fort_get_endian_reclen(int reclen, int word0, int word1,
00056 int *swap, int *recmarklen) {
00057
00058 if (reclen == word0) {
00059 *swap=0;
00060 *recmarklen=FORT_RECLEN_32BIT;
00061 return 0;
00062 } else {
00063 int tmp = word0;
00064 swap4_aligned(&tmp, 1);
00065 if (tmp == reclen) {
00066 *swap=0;
00067 *recmarklen=FORT_RECLEN_32BIT;
00068 return 0;
00069 }
00070 }
00071
00072
00073 if (reclen == (word0+word1)) {
00074 *swap=0;
00075 *recmarklen=FORT_RECLEN_64BIT;
00076 } else {
00077 int tmp0=word0;
00078 int tmp1=word1;
00079 swap4_aligned(&tmp0, 1);
00080 swap4_aligned(&tmp1, 1);
00081 *swap=1;
00082 *recmarklen=FORT_RECLEN_64BIT;
00083 }
00084
00085 return -1;
00086 }
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 static int fortread_4(void *dest, int n, int swap, FILE *fd) {
00104 int dataBegin, dataEnd, count;
00105
00106 if (fread(&dataBegin, sizeof(int), 1, fd) != 1) return 0;
00107 if (swap) swap4_aligned(&dataBegin, 1);
00108 if ((dataBegin <= 0) || (n < dataBegin/4)) return 0;
00109
00110 count = fread(dest, 4, dataBegin/4, fd);
00111 if (count != dataBegin/4) return 0;
00112 if (swap) swap4_aligned(dest, dataBegin/4);
00113
00114 if (fread(&dataEnd, sizeof(int), 1, fd) != 1) return 0;
00115 if (swap) swap4_aligned(&dataBegin, 1);
00116 if (dataEnd != dataBegin) return 0;
00117
00118 return count;
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 static void strnwscpy(char *target, const char *source, const int len) {
00134 int i, c;
00135
00136 for (i=0, c=0; i<len; ++i) {
00137 if (*source == '\0' || (c > 0 && *source == ' ')) {
00138 break;
00139 }
00140
00141 if (*source == ' ') {
00142 source++;
00143 } else {
00144 *target++ = *source++;
00145 c++;
00146 }
00147 }
00148 *target = '\0';
00149 }
00150
00151 #endif
00152