Changeset 3779
- Timestamp:
- Apr 27, 2005, 4:45:12 PM (21 years ago)
- Location:
- trunk/psLib
- Files:
-
- 9 edited
-
configure.ac (modified) (1 diff)
-
pslib.kdevelop.pcs (modified) ( previous)
-
pslib.kdevses (modified) (1 diff)
-
src/collections/psMetadata.c (modified) (11 diffs)
-
src/types/psMetadata.c (modified) (11 diffs)
-
test/collections/tst_psMetadataIO.c (modified) (3 diffs)
-
test/collections/tst_psMetadata_01.c (modified) (3 diffs)
-
test/collections/verified/tst_psMetadataIO.stdout (modified) (3 diffs)
-
test/collections/verified/tst_psMetadata_01.stdout (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/configure.ac
r3769 r3779 43 43 44 44 AC_LANG_PUSH(Fortran) 45 AC_PROG_F77( gfortran g95 g90 g77 f95 f90 f77)45 AC_PROG_F77([gfortran g77]) 46 46 AC_F77_WRAPPERS 47 47 AC_LANG_POP(Fortran) -
trunk/psLib/pslib.kdevses
r3769 r3779 2 2 <!DOCTYPE KDevPrjSession> 3 3 <KDevPrjSession> 4 <DocsAndViews NumberOfDocuments="5" > 5 <Doc0 NumberOfViews="1" URL="file:///home/desonia/panstarrs/psLib/src/collections/psVector.h" > 6 <View0 line="145" Type="Source" /> 7 </Doc0> 8 <Doc1 NumberOfViews="1" URL="file:///home/desonia/panstarrs/psLib/src/collections/Makefile.am" > 9 <View0 line="16" Type="Source" /> 10 </Doc1> 11 <Doc2 NumberOfViews="1" URL="file:///home/desonia/panstarrs/psLib/src/image/Makefile.am" > 12 <View0 line="19" Type="Source" /> 13 </Doc2> 14 <Doc3 NumberOfViews="1" URL="file:///home/desonia/panstarrs/psLib/src/collections/psMetadata.c" > 15 <View0 line="196" Type="Source" /> 16 </Doc3> 17 <Doc4 NumberOfViews="1" URL="file:///home/desonia/panstarrs/psLib/configure.ac" > 18 <View0 line="25" Type="Source" /> 19 </Doc4> 20 </DocsAndViews> 4 <DocsAndViews NumberOfDocuments="0" /> 21 5 <pluginList> 22 6 <kdevdebugger> -
trunk/psLib/src/collections/psMetadata.c
r3765 r3779 12 12 * @author Ross Harman, MHPCC 13 13 * 14 * @version $Revision: 1. 59$ $Name: not supported by cvs2svn $15 * @date $Date: 2005-04-2 3 02:07:27$14 * @version $Revision: 1.60 $ $Name: not supported by cvs2svn $ 15 * @date $Date: 2005-04-28 02:45:12 $ 16 16 * 17 17 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 39 39 #include "psConstants.h" 40 40 41 /******************************************************************************/42 /* DEFINE STATEMENTS */43 /******************************************************************************/44 45 /** Maximum size of a string */46 #define MAX_STRING_LENGTH 102447 48 /******************************************************************************/49 /* TYPE DEFINITIONS */50 /******************************************************************************/51 52 // None53 54 /*****************************************************************************/55 /* GLOBAL VARIABLES */56 /*****************************************************************************/57 58 // None59 60 /*****************************************************************************/61 /* FILE STATIC VARIABLES */62 /*****************************************************************************/63 64 41 static psS32 metadataId = 0; 65 66 /*****************************************************************************/67 /* FUNCTION IMPLEMENTATION - LOCAL */68 /*****************************************************************************/69 42 70 43 static psMetadataItem* makeMetaMulti(psHash* table, const char* key, psMetadataItem* existing) … … 75 48 } 76 49 77 // move any existing entry into a psList78 psList* newList = psListAlloc(existing);79 50 80 51 psMetadataItem* item = psMetadataItemAlloc(key, 81 52 PS_META_MULTI, 82 "", 83 newList); 53 "List of Metadata Items", 54 NULL); 55 56 psListAdd(item->data.list,PS_LIST_TAIL,existing); 84 57 85 58 if (existing != NULL) { … … 87 60 } 88 61 89 psHashAdd(table, key, item); // put in the new entry 90 91 // free local references of newly allocated items. 92 psFree(newList); 62 psHashAdd(table, key, item); // put in the new MULTI list entry 63 64 // free local references of newly allocated item. 93 65 psFree(item); 94 66 … … 174 146 { 175 147 psMetadataItem* metadataItem = NULL; 176 148 char tmp; 149 int nBytes; 177 150 178 151 PS_PTR_CHECK_NULL(name,NULL); … … 185 158 psMemSetDeallocator(metadataItem, (psFreeFcn) metadataItemFree); 186 159 187 // Allocate andset metadata item comment160 // set metadata item comment 188 161 if (comment == NULL) { 189 162 // Per SDRS, null isn't allowed, must use "" instead … … 200 173 201 174 // Allocate and set metadata item name 202 metadataItem->name = (char *)psAlloc(sizeof(char) * MAX_STRING_LENGTH); 175 nBytes = vsnprintf(&tmp, 0, name, argPtr) + 1; 176 metadataItem->name = (char *)psAlloc(sizeof(char) * nBytes); 203 177 vsprintf(metadataItem->name, name, argPtr); 204 178 … … 219 193 case PS_META_STR: 220 194 // Perform copy of input strings 221 metadataItem->data.V = psStringNCopy(va_arg(argPtr, char *), MAX_STRING_LENGTH); 195 metadataItem->data.V = psStringCopy(va_arg(argPtr, char *)); 196 break; 197 case PS_META_MULTI: 198 // MULTI needs to create a psList entry, value must be NULL 199 metadataItem->data.list = psListAlloc(NULL); 222 200 break; 223 201 case PS_META_LIST: … … 229 207 case PS_META_ASTROM: 230 208 case PS_META_UNKNOWN: 231 case PS_META_MULTI:232 209 // Copy of input data not performed due to variability of data types 233 210 metadataItem->data.V = psMemIncrRefCounter(va_arg(argPtr, psPtr)); … … 281 258 282 259 // See if key is already in table 283 existingEntry = (psMetadataItem*)psHashLookup(mdTable, key); 284 260 existingEntry = psMetadataLookup(md, key); 261 262 // if replace is set, remove any existing items of the same key 263 if (existingEntry != NULL && (flags & PS_META_REPLACE) != 0) { 264 psMetadataRemove(md,0,key); 265 existingEntry = NULL; 266 } 267 268 // if the metadataItem is MULTI, just add the encapsulated entries 285 269 if (metadataItem->type == PS_META_MULTI) { 286 // the incoming entry is PS_META_MULTI 287 288 // force the hash entry to be PS_META_MULTI 270 271 // make sure the existing entry is PS_META_MULTI 289 272 existingEntry = makeMetaMulti(mdTable,key,existingEntry); 290 273 274 psBool status = true; 291 275 // add all the items in the incoming entry to metadata 292 276 psList* list = metadataItem->data.list; … … 294 278 psListIterator* iter = psListIteratorAlloc(list,PS_LIST_HEAD,true); 295 279 psMetadataItem* listItem; 296 while ( (listItem=(psMetadataItem*)psListGetAndIncrement(iter)) != NULL) {297 psMetadataAddItem(md,listItem,location,flags);280 while (status && (listItem=(psMetadataItem*)psListGetAndIncrement(iter)) != NULL) { 281 status |= psMetadataAddItem(md,listItem,location,flags); 298 282 } 299 283 psFree(iter); 300 284 } 301 285 302 return true; // all done.286 return status; // all done. 303 287 } 304 288 305 289 // how the item is added to the hash depends on prior existence, flags, etc. 306 if(existingEntry != NULL) { // prior existence 290 if(existingEntry == NULL) { // no prior existence 291 // Node doesn't already exist - Add new metadata item to metadata collection's hash 292 if(!psHashAdd(mdTable, key, metadataItem)) { 293 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key); 294 return false; 295 } 296 } else { 307 297 if (existingEntry->type == PS_META_MULTI || (flags & PS_META_DUPLICATE_OK) != 0) { 308 298 // duplicate entries allowed - add another entry. 309 299 310 // make sure the existing entry is PS_META_MULTI300 // make sure the existing hash entry is PS_META_MULTI 311 301 existingEntry = makeMetaMulti(mdTable,key,existingEntry); 312 302 313 // add to the hash 's list of duplicateentries303 // add to the hash key's list of entries 314 304 if (! psListAdd(existingEntry->data.list, PS_LIST_TAIL, metadataItem) ) { 315 305 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key); 316 306 return false; 317 307 } 318 } else if ((flags & PS_META_REPLACE) != 0) {319 // replace entry instead of creating a duplicate entry.320 321 // remove the existing entry from metadata322 psMetadataRemove(md,0,key);323 324 // treat as if new (added to list below)325 if(!psHashAdd(mdTable, key, metadataItem)) {326 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);327 return false;328 }329 308 } else { 330 // default is toerror on duplicate entry.309 // error on duplicate entry. 331 310 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 332 311 PS_ERRORTEXT_psMetadata_DUPLICATE_NOT_ALLOWED); 333 312 return false; 334 313 } 335 } else { 336 // OK, this is a new item. 337 338 // Node doesn't exist - Add new metadata item to metadata collection's hash 339 if(!psHashAdd(mdTable, key, metadataItem)) { 340 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key); 341 return false; 342 } 343 } 344 314 } 315 316 // finally, add the metadataItem to the metadata's list. 345 317 if(!psListAdd(mdList, location, metadataItem)) { 346 318 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key); -
trunk/psLib/src/types/psMetadata.c
r3765 r3779 12 12 * @author Ross Harman, MHPCC 13 13 * 14 * @version $Revision: 1. 59$ $Name: not supported by cvs2svn $15 * @date $Date: 2005-04-2 3 02:07:27$14 * @version $Revision: 1.60 $ $Name: not supported by cvs2svn $ 15 * @date $Date: 2005-04-28 02:45:12 $ 16 16 * 17 17 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 39 39 #include "psConstants.h" 40 40 41 /******************************************************************************/42 /* DEFINE STATEMENTS */43 /******************************************************************************/44 45 /** Maximum size of a string */46 #define MAX_STRING_LENGTH 102447 48 /******************************************************************************/49 /* TYPE DEFINITIONS */50 /******************************************************************************/51 52 // None53 54 /*****************************************************************************/55 /* GLOBAL VARIABLES */56 /*****************************************************************************/57 58 // None59 60 /*****************************************************************************/61 /* FILE STATIC VARIABLES */62 /*****************************************************************************/63 64 41 static psS32 metadataId = 0; 65 66 /*****************************************************************************/67 /* FUNCTION IMPLEMENTATION - LOCAL */68 /*****************************************************************************/69 42 70 43 static psMetadataItem* makeMetaMulti(psHash* table, const char* key, psMetadataItem* existing) … … 75 48 } 76 49 77 // move any existing entry into a psList78 psList* newList = psListAlloc(existing);79 50 80 51 psMetadataItem* item = psMetadataItemAlloc(key, 81 52 PS_META_MULTI, 82 "", 83 newList); 53 "List of Metadata Items", 54 NULL); 55 56 psListAdd(item->data.list,PS_LIST_TAIL,existing); 84 57 85 58 if (existing != NULL) { … … 87 60 } 88 61 89 psHashAdd(table, key, item); // put in the new entry 90 91 // free local references of newly allocated items. 92 psFree(newList); 62 psHashAdd(table, key, item); // put in the new MULTI list entry 63 64 // free local references of newly allocated item. 93 65 psFree(item); 94 66 … … 174 146 { 175 147 psMetadataItem* metadataItem = NULL; 176 148 char tmp; 149 int nBytes; 177 150 178 151 PS_PTR_CHECK_NULL(name,NULL); … … 185 158 psMemSetDeallocator(metadataItem, (psFreeFcn) metadataItemFree); 186 159 187 // Allocate andset metadata item comment160 // set metadata item comment 188 161 if (comment == NULL) { 189 162 // Per SDRS, null isn't allowed, must use "" instead … … 200 173 201 174 // Allocate and set metadata item name 202 metadataItem->name = (char *)psAlloc(sizeof(char) * MAX_STRING_LENGTH); 175 nBytes = vsnprintf(&tmp, 0, name, argPtr) + 1; 176 metadataItem->name = (char *)psAlloc(sizeof(char) * nBytes); 203 177 vsprintf(metadataItem->name, name, argPtr); 204 178 … … 219 193 case PS_META_STR: 220 194 // Perform copy of input strings 221 metadataItem->data.V = psStringNCopy(va_arg(argPtr, char *), MAX_STRING_LENGTH); 195 metadataItem->data.V = psStringCopy(va_arg(argPtr, char *)); 196 break; 197 case PS_META_MULTI: 198 // MULTI needs to create a psList entry, value must be NULL 199 metadataItem->data.list = psListAlloc(NULL); 222 200 break; 223 201 case PS_META_LIST: … … 229 207 case PS_META_ASTROM: 230 208 case PS_META_UNKNOWN: 231 case PS_META_MULTI:232 209 // Copy of input data not performed due to variability of data types 233 210 metadataItem->data.V = psMemIncrRefCounter(va_arg(argPtr, psPtr)); … … 281 258 282 259 // See if key is already in table 283 existingEntry = (psMetadataItem*)psHashLookup(mdTable, key); 284 260 existingEntry = psMetadataLookup(md, key); 261 262 // if replace is set, remove any existing items of the same key 263 if (existingEntry != NULL && (flags & PS_META_REPLACE) != 0) { 264 psMetadataRemove(md,0,key); 265 existingEntry = NULL; 266 } 267 268 // if the metadataItem is MULTI, just add the encapsulated entries 285 269 if (metadataItem->type == PS_META_MULTI) { 286 // the incoming entry is PS_META_MULTI 287 288 // force the hash entry to be PS_META_MULTI 270 271 // make sure the existing entry is PS_META_MULTI 289 272 existingEntry = makeMetaMulti(mdTable,key,existingEntry); 290 273 274 psBool status = true; 291 275 // add all the items in the incoming entry to metadata 292 276 psList* list = metadataItem->data.list; … … 294 278 psListIterator* iter = psListIteratorAlloc(list,PS_LIST_HEAD,true); 295 279 psMetadataItem* listItem; 296 while ( (listItem=(psMetadataItem*)psListGetAndIncrement(iter)) != NULL) {297 psMetadataAddItem(md,listItem,location,flags);280 while (status && (listItem=(psMetadataItem*)psListGetAndIncrement(iter)) != NULL) { 281 status |= psMetadataAddItem(md,listItem,location,flags); 298 282 } 299 283 psFree(iter); 300 284 } 301 285 302 return true; // all done.286 return status; // all done. 303 287 } 304 288 305 289 // how the item is added to the hash depends on prior existence, flags, etc. 306 if(existingEntry != NULL) { // prior existence 290 if(existingEntry == NULL) { // no prior existence 291 // Node doesn't already exist - Add new metadata item to metadata collection's hash 292 if(!psHashAdd(mdTable, key, metadataItem)) { 293 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key); 294 return false; 295 } 296 } else { 307 297 if (existingEntry->type == PS_META_MULTI || (flags & PS_META_DUPLICATE_OK) != 0) { 308 298 // duplicate entries allowed - add another entry. 309 299 310 // make sure the existing entry is PS_META_MULTI300 // make sure the existing hash entry is PS_META_MULTI 311 301 existingEntry = makeMetaMulti(mdTable,key,existingEntry); 312 302 313 // add to the hash 's list of duplicateentries303 // add to the hash key's list of entries 314 304 if (! psListAdd(existingEntry->data.list, PS_LIST_TAIL, metadataItem) ) { 315 305 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key); 316 306 return false; 317 307 } 318 } else if ((flags & PS_META_REPLACE) != 0) {319 // replace entry instead of creating a duplicate entry.320 321 // remove the existing entry from metadata322 psMetadataRemove(md,0,key);323 324 // treat as if new (added to list below)325 if(!psHashAdd(mdTable, key, metadataItem)) {326 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);327 return false;328 }329 308 } else { 330 // default is toerror on duplicate entry.309 // error on duplicate entry. 331 310 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 332 311 PS_ERRORTEXT_psMetadata_DUPLICATE_NOT_ALLOWED); 333 312 return false; 334 313 } 335 } else { 336 // OK, this is a new item. 337 338 // Node doesn't exist - Add new metadata item to metadata collection's hash 339 if(!psHashAdd(mdTable, key, metadataItem)) { 340 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key); 341 return false; 342 } 343 } 344 314 } 315 316 // finally, add the metadataItem to the metadata's list. 345 317 if(!psListAdd(mdList, location, metadataItem)) { 346 318 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key); -
trunk/psLib/test/collections/tst_psMetadataIO.c
r3682 r3779 14 14 * @author Robert DeSonia, MHPCC 15 15 * 16 * @version $Revision: 1.1 3$ $Name: not supported by cvs2svn $17 * @date $Date: 2005-04- 07 20:27:41$16 * @version $Revision: 1.14 $ $Name: not supported by cvs2svn $ 17 * @date $Date: 2005-04-28 02:45:12 $ 18 18 * 19 19 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 121 121 printPositiveTestHeader(stdout, "psMetadata", "Test B - Read config file with overwrite set false"); 122 122 psMetadata *metadata2 = NULL; 123 ps S32 failedLines2 = 0;123 psU32 failedLines2 = 0; 124 124 metadata2 = psMetadataParseConfig(metadata2, &failedLines2, "test.config", false); 125 125 printf("Failed lines: %d Expected: 7 ", failedLines2); … … 131 131 printPositiveTestHeader(stdout, "psMetadata", "Test C - Read config file without auto-allocation of metadata"); 132 132 psMetadata *metadata3 = psMetadataAlloc(); 133 ps S32 failedLines3 = 0;133 psU32 failedLines3 = 0; 134 134 metadata3 = psMetadataParseConfig(metadata3, &failedLines3, "test.config", true); 135 135 printf("Failed lines: %d Expected: 6 ", failedLines3); -
trunk/psLib/test/collections/tst_psMetadata_01.c
r3682 r3779 18 18 * @author Ross Harman, MHPCC 19 19 * 20 * @version $Revision: 1.2 4$ $Name: not supported by cvs2svn $21 * @date $Date: 2005-04- 07 20:27:41$20 * @version $Revision: 1.25 $ $Name: not supported by cvs2svn $ 21 * @date $Date: 2005-04-28 02:45:12 $ 22 22 * 23 23 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 126 126 printFooter(stdout, "psMetadata", "Test A - Read 1st hdr from simple FITS file", true); 127 127 128 printf("ID=%d\n",(int)psMemGetId());129 130 128 // Test B - Read 2nd hdr from complex FITS file 131 129 … … 174 172 printFooter(stdout, "psMetadata", "Test B - Read 2nd hdr from complex FITS file", true); 175 173 176 printf("ID=%d\n",(int)psMemGetId());177 178 174 // Test C - Read named hdr from complex FITS file 179 175 printPositiveTestHeader(stdout, "psMetadata", "Test C - Read named hdr from complex FITS file"); -
trunk/psLib/test/collections/verified/tst_psMetadataIO.stdout
r3690 r3779 26 26 27 27 Contents of metadata table: 28 Key Name: comment Key mdType: 0x0001000a Key Value: Key Comment: 28 Key Name: comment Key mdType: 0x0001000a Key Value: Key Comment: List of Metadata Items 29 29 Key Name: comment Key mdType: 0x00010001 Key Value: This Key Comment: 30 30 Key Name: comment Key mdType: 0x00010001 Key Value: is Key Comment: … … 73 73 74 74 Contents of metadata table: 75 Key Name: comment Key mdType: 0x0001000a Key Value: Key Comment: 75 Key Name: comment Key mdType: 0x0001000a Key Value: Key Comment: List of Metadata Items 76 76 Key Name: comment Key mdType: 0x00010001 Key Value: This Key Comment: 77 77 Key Name: comment Key mdType: 0x00010001 Key Value: is Key Comment: … … 120 120 121 121 Contents of metadata table: 122 Key Name: comment Key mdType: 0x0001000a Key Value: Key Comment: 122 Key Name: comment Key mdType: 0x0001000a Key Value: Key Comment: List of Metadata Items 123 123 Key Name: comment Key mdType: 0x00010001 Key Value: This Key Comment: 124 124 Key Name: comment Key mdType: 0x00010001 Key Value: is Key Comment: -
trunk/psLib/test/collections/verified/tst_psMetadata_01.stdout
r3690 r3779 19 19 ---> TESTPOINT PASSED (psMetadata{Test A - Read 1st hdr from simple FITS file} | tst_psMetadata_01.c) 20 20 21 ID=3422 21 /***************************** TESTPOINT ******************************************\ 23 22 * TestFile: tst_psMetadata_01.c * … … 45 44 Key Name: PCOUNT Key mdType: 0x00000104 Key Value: 0 Key Comment: required keyword; must = 0 46 45 Key Name: XTENSION Key mdType: 0x00010001 Key Value: 'IMAGE ' Key Comment: IMAGE extension 47 Key Name: BITPIX Key mdType: 0x0001000a Key Value: Key Comment: 46 Key Name: BITPIX Key mdType: 0x0001000a Key Value: Key Comment: List of Metadata Items 48 47 Key Name: BITPIX Key mdType: 0x00000104 Key Value: -64 Key Comment: number of bits per data pixel 49 48 Key Name: BITPIX Key mdType: 0x00000104 Key Value: -64 Key Comment: number of bits per data pixel 50 49 Key Name: GCOUNT Key mdType: 0x00000104 Key Value: 1 Key Comment: required keyword; must = 1 51 Key Name: HISTORY Key mdType: 0x0001000a Key Value: Key Comment: 50 Key Name: HISTORY Key mdType: 0x0001000a Key Value: Key Comment: List of Metadata Items 52 51 Key Name: HISTORY Key mdType: 0x00010001 Key Value: Key Comment: File modified by user 'harman' with fv on 2004-08-04T<DATE> 53 52 Key Name: HISTORY Key mdType: 0x00010001 Key Value: Key Comment: File modified by user 'harman' with fv on 2004-08-04T<DATE> … … 58 57 ---> TESTPOINT PASSED (psMetadata{Test B - Read 2nd hdr from complex FITS file} | tst_psMetadata_01.c) 59 58 60 ID=13861 59 /***************************** TESTPOINT ******************************************\ 62 60 * TestFile: tst_psMetadata_01.c * … … 83 81 Key Name: GCOUNT Key mdType: 0x00000104 Key Value: 1 Key Comment: required keyword; must = 1 84 82 Key Name: BITPIX Key mdType: 0x00000104 Key Value: -64 Key Comment: number of bits per data pixel 85 Key Name: HISTORY Key mdType: 0x0001000a Key Value: Key Comment: 83 Key Name: HISTORY Key mdType: 0x0001000a Key Value: Key Comment: List of Metadata Items 86 84 Key Name: HISTORY Key mdType: 0x00010001 Key Value: Key Comment: File modified by user 'harman' with fv on 2004-08-04T<DATE> 87 85 Key Name: HISTORY Key mdType: 0x00010001 Key Value: Key Comment: File modified by user 'harman' with fv on 2004-08-04T<DATE>
Note:
See TracChangeset
for help on using the changeset viewer.
