- Timestamp:
- May 28, 2015, 8:27:00 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ohana.20150429/src/libfits/table/F_table_varlength.c
r38326 r38329 15 15 snprintf (field, 80, "TFORM%d", column); 16 16 if (!gfits_scan (ftable->header, field, "%s", 1, format)) return (FALSE); 17 18 def->column = column; 17 19 18 20 // find and remove the max field length element … … 49 51 if (*p1 == 'I') { def->nbytes = 2; def->format = *p1; } 50 52 if (*p1 == 'J') { def->nbytes = 4; def->format = *p1; } 53 if (*p1 == 'K') { def->nbytes = 8; def->format = *p1; } 51 54 if (*p1 == 'E') { def->nbytes = 4; def->format = *p1; } 52 55 if (*p1 == 'D') { def->nbytes = 8; def->format = *p1; } … … 55 58 if (!def->nbytes) { return (FALSE); } 56 59 57 /* scan columns to find column offset */58 def-> Nstart = 0;60 /* scan columns to find column offset for metadata column*/ 61 def->offset = 0; 59 62 for (i = 1; i < column; i++) { 60 63 sprintf (field, "TFORM%d", i); 61 64 gfits_scan (ftable->header, field, "%s", 1, format); 62 65 gfits_bintable_format (format, tmpline, &Nv, &Nb); 63 def-> Nstart += Nv*Nb;66 def->offset += Nv*Nb; 64 67 } 65 68 66 69 // heap_start must be long long so file may be very large 67 if (!gfits_scan (ftable->header, "THEAP", OFF_T_FMT, 1, &def->heap_start)) { 68 def->heap_start = ftable->header->Naxis[0]*ftable->header->Naxis[1]; 69 } 70 70 // confirm that ftable->heap_start is correctly set? 71 72 return TRUE; 73 } 74 75 # define SWAP_WORD \ 76 tmp = pchar[0]; pchar[0] = pchar[3]; pchar[3] = tmp; \ 77 tmp = pchar[1]; pchar[1] = pchar[2]; pchar[2] = tmp; 78 79 # define SWAP_DBLE \ 80 tmp = pchar[0]; pchar[0] = pchar[7]; pchar[7] = tmp; \ 81 tmp = pchar[1]; pchar[1] = pchar[6]; pchar[6] = tmp; \ 82 tmp = pchar[2]; pchar[2] = pchar[5]; pchar[5] = tmp; \ 83 tmp = pchar[3]; pchar[3] = pchar[4]; pchar[4] = tmp; 84 85 int gfits_byteswap_varlength_column (FTable *ftable, int column) { 86 87 # ifdef BYTE_SWAP 88 VarLengthColumn zdef; 89 if (!gfits_varlength_column_define (ftable, &zdef, column)) return FALSE; 90 91 char *bufstart = &ftable->buffer[zdef.offset]; 92 93 int i; 94 char *pchar, tmp; 95 96 off_t Nx = ftable->header->Naxis[0]; 97 98 for (i = 0; i < ftable->header->Naxis[1]; i++) { 99 if (zdef.mode == 'P') { 100 pchar = &bufstart[i*Nx]; 101 SWAP_WORD; 102 pchar = &bufstart[i*Nx + 4]; 103 SWAP_WORD; 104 } 105 if (zdef.mode == 'Q') { 106 char *pchar, tmp; 107 pchar = &bufstart[i*Nx]; 108 SWAP_DBLE; 109 pchar = &bufstart[i*Nx + 8]; 110 SWAP_DBLE; 111 } 112 } 113 # endif 71 114 return TRUE; 72 115 } … … 85 128 Nx = ftable->header->Naxis[0]; 86 129 87 # define SWAP_WORD \88 tmp = pchar[0]; pchar[0] = pchar[3]; pchar[3] = tmp; \89 tmp = pchar[1]; pchar[1] = pchar[2]; pchar[2] = tmp;90 91 130 # ifdef BYTE_SWAP 92 131 char *pchar, tmp; 93 pchar = &ftable->buffer[row*Nx + column-> Nstart];132 pchar = &ftable->buffer[row*Nx + column->offset]; 94 133 SWAP_WORD; 95 pchar = &ftable->buffer[row*Nx + column-> Nstart + 4];134 pchar = &ftable->buffer[row*Nx + column->offset + 4]; 96 135 SWAP_WORD; 97 136 # endif … … 99 138 if (column->mode == 'P') { 100 139 int *ptr; 101 ptr = (int *) &ftable->buffer[row*Nx + column-> Nstart];140 ptr = (int *) &ftable->buffer[row*Nx + column->offset]; 102 141 *length = ptr[0]; 103 142 offset = ptr[1]; … … 105 144 if (column->mode == 'Q') { 106 145 off_t *ptr; 107 ptr = (off_t *) &ftable->buffer[row*Nx + column-> Nstart];146 ptr = (off_t *) &ftable->buffer[row*Nx + column->offset]; 108 147 *length = ptr[0]; 109 148 offset = ptr[1]; 110 149 } 111 150 112 result = (void *) (ftable->buffer + column->heap_start + offset);151 result = (void *) (ftable->buffer + ftable->heap_start + offset); 113 152 return result; 114 153 } … … 121 160 // swap before writing out 122 161 123 // Here are operations we need to do:124 125 162 int gfits_varlength_column_add_data (FTable *table, char *data, off_t Ndata, int row, VarLengthColumn *column) { 126 163 127 164 // find the current starting point for new data (end of current buffer main data + current heap 128 165 off_t heap_offset = gfits_data_min_size (table->header); 129 char *heap_ptr = ftable->buffer + heap_offset;130 166 131 167 // extend the buffer size to add the new data … … 133 169 REALLOCATE (table->buffer, char, Nbytes); 134 170 171 char *heap_ptr = table->buffer + heap_offset; 172 135 173 // add the new data to the table buffer 136 174 memcpy (heap_ptr, data, Ndata); … … 142 180 // find the cell for the specified row & column 143 181 // the values in the main table for this row and varlength column: 144 Nx = ftable->header->Naxis[0];182 int Nx = table->header->Naxis[0]; 145 183 146 184 // set the cell values 147 185 if (column->mode == 'P') { 148 186 int *ptr; 149 ptr = (int *) & ftable->buffer[row*Nx + column->Nstart];187 ptr = (int *) &table->buffer[row*Nx + column->offset]; 150 188 ptr[0] = Ndata; 151 ptr[1] = heap_offset ;189 ptr[1] = heap_offset - table->heap_start; 152 190 } 153 191 if (column->mode == 'Q') { 154 192 off_t *ptr; 155 ptr = (off_t *) & ftable->buffer[row*Nx + column->Nstart];193 ptr = (off_t *) &table->buffer[row*Nx + column->offset]; 156 194 ptr[0] = Ndata; 157 ptr[1] = heap_offset ;195 ptr[1] = heap_offset - table->heap_start; 158 196 } 159 197 160 198 // update maxlen 199 // fprintf (stderr, "row: %d, Ndata: %d, maxlen: %d\n", (int) row, (int) Ndata, (int) column->maxlen); 161 200 column->maxlen = MAX (column->maxlen, Ndata); 162 201 163 202 off_t pcount; 164 gfits_scan ( ftable->header, "PCOUNT", OFF_T_FMT, 1, &pcount);203 gfits_scan (table->header, "PCOUNT", OFF_T_FMT, 1, &pcount); 165 204 166 205 pcount += Ndata; 167 gfits_modify (header, "PCOUNT", OFF_T_FMT, 1, pcount); 168 169 return TRUE; 170 } 206 gfits_modify (table->header, "PCOUNT", OFF_T_FMT, 1, pcount); 207 table->header->pcount = pcount; 208 table->datasize = gfits_data_size (table->header); 209 210 return TRUE; 211 } 212 213 // update the header TFORM value for this entry 214 int gfits_varlength_column_finish (FTable *ftable, VarLengthColumn *def) { 215 216 char field[81]; 217 char format[81]; 218 219 // grab the value of TFORMn for this column 220 snprintf (field, 80, "TFORM%d", def->column); 221 if (!gfits_scan (ftable->header, field, "%s", 1, format)) return FALSE; 222 223 // find and update the max field length element 224 char *p1 = strchr (format, '('); 225 if (!p1) return (FALSE); // not a valid varlength column -- missing (e_max) 226 227 p1 ++; 228 *p1 = 0; 229 230 snprintf (p1, 80 - (p1 - format), "%d)", def->maxlen); 231 if (!gfits_modify (ftable->header, field, "%s", 1, format)) return FALSE; 232 233 return TRUE; 234 }
Note:
See TracChangeset
for help on using the changeset viewer.
