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