Changeset 28246 for trunk/Ohana/src/libfits/header/F_scan.c
- Timestamp:
- Jun 7, 2010, 2:24:29 PM (16 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/libfits/header/F_scan.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/libfits/header/F_scan.c
r28241 r28246 61 61 s = gfits_keyword_start (p); /* points at first char (not ') */ 62 62 q = gfits_keyword_end (p); /* points at following space or ' */ 63 64 if (!strcmp (mode, "%f") || !strcmp (mode, "%lf")) { 65 fvalue = strtod (s, &q); 66 if ((*q == 'd') || (*q == 'D')) 67 fvalue *= pow (10.0, atof (q + 1)); 68 69 if (!strcmp (mode, "%f")) { *va_arg (argp, float *) = fvalue; return (TRUE); } 70 if (!strcmp (mode, "%lf")) { *va_arg (argp, double *) = fvalue; return (TRUE); } 71 } 72 73 value = strtoll (s, &q, 0); 74 if ((*q == 'd') || (*q == 'D')) value *= pow (10.0, atof (q + 1)); 75 76 if (!strcmp (mode, "%d")) { *va_arg (argp, int *) = value; return (TRUE); } 77 if (!strcmp (mode, "%ld")) { *va_arg (argp, long *) = value; return (TRUE); } 78 if (!strcmp (mode, "%lld")) { *va_arg (argp, long long *) = value; return (TRUE); } 79 if (!strcmp (mode, "%Ld")) { *va_arg (argp, long long *) = value; return (TRUE); } 80 if (!strcmp (mode, "%u")) { *va_arg (argp, unsigned *) = value; return (TRUE); } 81 if (!strcmp (mode, "%lu")) { *va_arg (argp, unsigned long *) = value; return (TRUE); } 82 if (!strcmp (mode, "%llu")) { *va_arg (argp, unsigned long long *) = value; return (TRUE); } 83 if (!strcmp (mode, "%Lu")) { *va_arg (argp, unsigned long long *) = value; return (TRUE); } 84 if (!strcmp (mode, "%hd")) { *va_arg (argp, short *) = value; return (TRUE); } 85 86 // XXX is this safe for 64bit off_t and 32bit off_t? 87 if (!strcmp (mode, "%jd")) { *va_arg (argp, intmax_t *) = value; return (TRUE); } 88 89 /* no valid mode found */ 90 return (FALSE); 91 } 92 93 // alternate version for the special types (boolean, comments, COMMENT) 94 int gfits_vscan_alt (Header *header, char *field, char *mode, int N, va_list argp) { 95 96 char *p, *q, *s, tmp[81]; 97 int Nchar, status; 98 99 /* find the correct line with field */ 100 p = gfits_header_field (header, field, N); 101 if (p == NULL) { 102 status = gfits_vscan_hierarch (header, field, mode, N, argp); 103 return (status); 104 } 105 106 /* non-data entry (COMMENT, HISTORY) */ 107 if (!strcmp (mode, "%S")) { 108 strncpy (va_arg (argp, char *), p + 8, FT_HISTORY_LENGTH); 109 return (TRUE); 110 } 111 112 /* all others require '=' in column 8 */ 113 if (p[8] != '=') return (FALSE); 114 115 /* comment from data line */ 116 if (!strcmp (mode, "%C")) { 117 q = gfits_keyword_end (p) + 3; 118 q = MIN (p + 80, q); 119 bzero (tmp, 81); 120 Nchar = MIN (80, p + 80 - q); 121 memcpy (tmp, q, Nchar); 122 stripwhite (tmp); 123 strcpy (va_arg (argp, char *), tmp); 124 return (TRUE); 125 } 126 127 /* boolean data, requires int target */ 128 if (!strcmp (mode, "%t")) { 129 s = gfits_keyword_start (p); 130 if (*s == 'T') { 131 *va_arg (argp, int *) = TRUE; 132 return (TRUE); 133 } 134 if (*s == 'F') { 135 *va_arg (argp, int *) = FALSE; 136 return (TRUE); 137 } 138 } 139 140 /* no valid mode found */ 141 return (FALSE); 142 } 143 144 # define HIERARCH_LENGTH 71 145 int gfits_vscan_hierarch (Header *header, char *field, char *mode, int N, va_list argp) { 146 147 char *p, *q, *s, tmp[81]; 148 int Nchar, Nfield; 149 long long value; 150 double fvalue; 151 152 /* find the correct line with field */ 153 p = gfits_header_hierarch_field (header, field, N); 154 if (p == NULL) return (FALSE); 155 156 /* non-data entries (COMMENT, HISTORY) are not allowed */ 157 if (!strcmp (mode, "%S")) { 158 return (FALSE); 159 } 160 161 /* all others require '=' in column p + 1 + strlen(field) */ 162 Nfield = strlen (field); 163 if (p[Nfield + 1] != '=') return (FALSE); 164 165 /* comment from data line */ 166 if (!strcmp (mode, "%C")) { 167 q = gfits_hierarch_keyword_end (p, field); 168 if (!q) return (FALSE); 169 q += 3; 170 q = MIN (p + HIERARCH_LENGTH, q); 171 bzero (tmp, 81); 172 Nchar = MIN (HIERARCH_LENGTH, p + HIERARCH_LENGTH - q); 173 memcpy (tmp, q, Nchar); 174 stripwhite (tmp); 175 strcpy (va_arg (argp, char *), tmp); 176 return (TRUE); 177 } 178 179 /* extract data into char array (exclude containing ' chars) */ 180 if (!strcmp (mode, "%s")) { 181 s = gfits_hierarch_keyword_start (p, field); /* points at first char (not ') */ 182 q = gfits_hierarch_keyword_end (p, field); /* points at following space or ' */ 183 184 Nchar = MIN (HIERARCH_LENGTH, MAX (0, (q - s))); 185 bzero (tmp, 81); 186 memcpy (tmp, s, Nchar); 187 stripwhite (tmp); 188 strcpy (va_arg (argp, char *), tmp); 189 return (TRUE); 190 } 191 192 /* boolean data, requires int target */ 193 if (!strcmp (mode, "%t")) { 194 s = gfits_hierarch_keyword_start (p, field); 195 if (*s == 'T') { 196 *va_arg (argp, int *) = TRUE; 197 return (TRUE); 198 } 199 if (*s == 'F') { 200 *va_arg (argp, int *) = FALSE; 201 return (TRUE); 202 } 203 } 204 205 /* remaining options are numerical data */ 206 /* need to interpret 1.0d5 as 1.0e5 */ 207 s = gfits_hierarch_keyword_start (p, field); /* points at first char (not ') */ 208 q = gfits_hierarch_keyword_end (p, field); /* points at following space or ' */ 63 209 64 210 if (!strcmp (mode, "%f") || !strcmp (mode, "%lf")) { … … 84 230 if (!strcmp (mode, "%hd")) { *va_arg (argp, short *) = value; return (TRUE); } 85 231 86 // XXX is this safe for 64bit off_t and 32bit off_t?87 if (!strcmp (mode, "%jd")) { *va_arg (argp, intmax_t *) = value; return (TRUE); }88 89 232 /* no valid mode found */ 90 233 return (FALSE); 91 234 } 92 235 93 // alternate version for the special types (boolean, comments, COMMENT)94 int gfits_vscan_alt (Header *header, char *field, char *mode, int N, va_list argp) {95 96 char *p, *q, *s, tmp[81];97 int Nchar, status;98 99 /* find the correct line with field */100 p = gfits_header_field (header, field, N);101 if (p == NULL) {102 status = gfits_vscan_hierarch (header, field, mode, N, argp);103 return (status);104 }105 106 /* non-data entry (COMMENT, HISTORY) */107 if (!strcmp (mode, "%S")) {108 strncpy (va_arg (argp, char *), p + 8, FT_HISTORY_LENGTH);109 return (TRUE);110 }111 112 /* all others require '=' in column 8 */113 if (p[8] != '=') return (FALSE);114 115 /* comment from data line */116 if (!strcmp (mode, "%C")) {117 q = gfits_keyword_end (p) + 3;118 q = MIN (p + 80, q);119 bzero (tmp, 81);120 Nchar = MIN (80, p + 80 - q);121 memcpy (tmp, q, Nchar);122 stripwhite (tmp);123 strcpy (va_arg (argp, char *), tmp);124 return (TRUE);125 }126 127 /* boolean data, requires int target */128 if (!strcmp (mode, "%t")) {129 s = gfits_keyword_start (p);130 if (*s == 'T') {131 *va_arg (argp, int *) = TRUE;132 return (TRUE);133 }134 if (*s == 'F') {135 *va_arg (argp, int *) = FALSE;136 return (TRUE);137 }138 }139 140 /* no valid mode found */141 return (FALSE);142 }143 144 # define HIERARCH_LENGTH 71145 int gfits_vscan_hierarch (Header *header, char *field, char *mode, int N, va_list argp) {146 147 char *p, *q, *s, tmp[81];148 int Nchar, Nfield;149 long long value;150 double fvalue;151 152 /* find the correct line with field */153 p = gfits_header_hierarch_field (header, field, N);154 if (p == NULL) return (FALSE);155 156 /* non-data entries (COMMENT, HISTORY) are not allowed */157 if (!strcmp (mode, "%S")) {158 return (FALSE);159 }160 161 /* all others require '=' in column p + 1 + strlen(field) */162 Nfield = strlen (field);163 if (p[Nfield + 1] != '=') return (FALSE);164 165 /* comment from data line */166 if (!strcmp (mode, "%C")) {167 q = gfits_hierarch_keyword_end (p, field);168 if (!q) return (FALSE);169 q += 3;170 q = MIN (p + HIERARCH_LENGTH, q);171 bzero (tmp, 81);172 Nchar = MIN (HIERARCH_LENGTH, p + HIERARCH_LENGTH - q);173 memcpy (tmp, q, Nchar);174 stripwhite (tmp);175 strcpy (va_arg (argp, char *), tmp);176 return (TRUE);177 }178 179 /* extract data into char array (exclude containing ' chars) */180 if (!strcmp (mode, "%s")) {181 s = gfits_hierarch_keyword_start (p, field); /* points at first char (not ') */182 q = gfits_hierarch_keyword_end (p, field); /* points at following space or ' */183 184 Nchar = MIN (HIERARCH_LENGTH, MAX (0, (q - s)));185 bzero (tmp, 81);186 memcpy (tmp, s, Nchar);187 stripwhite (tmp);188 strcpy (va_arg (argp, char *), tmp);189 return (TRUE);190 }191 192 /* boolean data, requires int target */193 if (!strcmp (mode, "%t")) {194 s = gfits_hierarch_keyword_start (p, field);195 if (*s == 'T') {196 *va_arg (argp, int *) = TRUE;197 return (TRUE);198 }199 if (*s == 'F') {200 *va_arg (argp, int *) = FALSE;201 return (TRUE);202 }203 }204 205 /* remaining options are numerical data */206 /* need to interpret 1.0d5 as 1.0e5 */207 s = gfits_hierarch_keyword_start (p, field); /* points at first char (not ') */208 q = gfits_hierarch_keyword_end (p, field); /* points at following space or ' */209 210 if (!strcmp (mode, "%f") || !strcmp (mode, "%lf")) {211 fvalue = strtod (s, &q);212 if ((*q == 'd') || (*q == 'D'))213 fvalue *= pow (10.0, atof (q + 1));214 215 if (!strcmp (mode, "%f")) { *va_arg (argp, float *) = fvalue; return (TRUE); }216 if (!strcmp (mode, "%lf")) { *va_arg (argp, double *) = fvalue; return (TRUE); }217 }218 219 value = strtoll (s, &q, 0);220 if ((*q == 'd') || (*q == 'D')) value *= pow (10.0, atof (q + 1));221 222 if (!strcmp (mode, "%d")) { *va_arg (argp, int *) = value; return (TRUE); }223 if (!strcmp (mode, "%ld")) { *va_arg (argp, long *) = value; return (TRUE); }224 if (!strcmp (mode, OFF_T_FMT)) { *va_arg (argp, long long *) = value; return (TRUE); }225 if (!strcmp (mode, "%Ld")) { *va_arg (argp, long long *) = value; return (TRUE); }226 if (!strcmp (mode, "%u")) { *va_arg (argp, unsigned *) = value; return (TRUE); }227 if (!strcmp (mode, "%lu")) { *va_arg (argp, unsigned long *) = value; return (TRUE); }228 if (!strcmp (mode, "%llu")) { *va_arg (argp, unsigned long long *) = value; return (TRUE); }229 if (!strcmp (mode, "%Lu")) { *va_arg (argp, unsigned long long *) = value; return (TRUE); }230 if (!strcmp (mode, "%hd")) { *va_arg (argp, short *) = value; return (TRUE); }231 232 /* no valid mode found */233 return (FALSE);234 }235 236 236 /* if the variable argument stuff breaks on another system, look 237 237 at F_modify.c as it has the old code */
Note:
See TracChangeset
for help on using the changeset viewer.
