Changeset 179 for trunk/doc/draft/metadata.tex
- Timestamp:
- Mar 9, 2004, 3:07:27 PM (22 years ago)
- File:
-
- 1 edited
-
trunk/doc/draft/metadata.tex (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/doc/draft/metadata.tex
r130 r179 59 59 \section{Metadata Representation} 60 60 61 We propose that an item of metadata be represented as a C structure: 61 We propose that an item of metadata be represented as a C structure with at least the following 62 fields: 62 63 \begin{verbatim} 63 64 /* … … 75 76 } val; // value of metadata 76 77 char *comment; // optional comment ("", not NULL) 77 78 } psMetaData; 78 } psMetaDataItem; 79 79 \end{verbatim} 80 80 … … 89 89 90 90 The possible types of metadata are identified by the enumerated type 91 \code{psMetaDataType} (see also table \ref{tabMetaDataTypes}) :91 \code{psMetaDataType} (see also table \ref{tabMetaDataTypes}); the initial defined values are: 92 92 \begin{verbatim} 93 93 /* … … 95 95 */ 96 96 typedef enum { // type of val is: 97 psMetaFloat = 0,// float (.f)97 psMetaFloat, // float (.f) 98 98 psMetaInt, // int (.i) 99 99 psMetaStr, // string (.v) … … 129 129 \section{Collections of Metadata} 130 130 131 We also need to support a container class for metadata. We propose 132 using the standard \PS{} doubly-linked list type \code{psDlist} 133 (see \href{file:utils#psDlist}{utils.pdf} for details). For example: 134 \begin{verbatim} 135 psDlist *list = psDlistNew(NULL); // list of metadata 136 137 psDlistAppend(list, psMetaDataNew("const.ten", psMetaInt, &ten, NULL, 0)); 138 psDlistAppend(list, psMetaDataNew("const.sqrt2", psMetaFloat, &sqrt2, 139 "square root of two", 0)); 140 psDlistAppend(list, psMetaDataNew("lang.hello", psMetaStr, "Bonjour", 141 "French", 0)); 142 /* 143 * Print all metadata to stdout 144 */ 145 (void)psDlistGet(list, psDlistTail); // initialise iterator 146 while ((ms = psDlistGet(list, psDlistPrev)) != NULL) { 147 psMetaDataPrint(stdout, ms); 148 } 149 /* 150 * Clean up 151 */ 152 psDlistDel(list, (void (*)(void *))psMetaDataDel); 131 \begin{verbatim} 132 typedef struct { 133 psDlist *list; // list of psMetaDataItem 134 psHash *table; // hash table of the same metadata 135 } psMetaDataSet; 136 \end{verbatim} 137 138 The type \code{psMetaDataSet} is a container class for metadata. Note that there are 139 in fact \emph{two} representations of the metadata (each \code{psMetaDataItem} appears 140 on both). 141 142 We are using the standard \PS{} doubly-linked list types \code{psDlist} and \code{psHash} 143 (see \href{file:utils#psDlist}{utils.pdf:psDlist} and \href{file:utils#psHash}{utils.pdf:psHash} for details). 144 For example: 145 \begin{verbatim} 146 for (int i = 0; i < 10; i += 5) { 147 float sqrti = sqrt(i); 148 psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_INT, &i, NULL, "const.%d", i)); 149 psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_FLOAT, &sqrti, "square root", "const.sqrt%d", i)); 150 } 151 psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR, "Bonjour", "French", "lang.hello")); 152 /* 153 * Remove a key 154 */ 155 psMetaDataItemFree(psMetaDataRemove(ms, "lang.hello")); 156 /* 157 * Print all metadata 158 */ 159 fprintf(stdout, "------\n"); 160 psMetaDataSetIterator(ms); 161 while ((meta = psMetaDataGetNext(ms, NULL)) != NULL) { 162 psMetaDataItemPrint(stdout, meta, ""); 163 } 164 /* 165 * Look up a key by name 166 */ 167 fprintf(stdout, "------\n"); 168 fprintf(stdout, "Looking up by name:\n"); 169 meta = psMetaDataLookup(ms, "const.5"); 170 if (meta != NULL) { 171 psMetaDataItemPrint(stdout, meta, ""); 172 } 153 173 \end{verbatim} 154 174 155 175 \section{Naming convention for MetaData} 156 176 157 The \code{psMetaData } struct includes a name. This name should be of177 The \code{psMetaDataItem} struct includes a name. This name should be of 158 178 the form \code{name1.name2.name3$\cdots$}, e.g.\hfil\break 159 179 \null\qquad\qquad\code{IPP.phase1.ota12.biassec}. … … 163 183 all metadata names in use throughout the project. 164 184 185 \subsection{Support for Multiple Values for a Given Name} 186 187 \begin{verbatim} 188 psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE, 189 "Bonjour", "French", "lang.hello")); 190 psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE, 191 "Aloha", "Hawaiian", "lang.hello")); 192 psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE, 193 "Good Morning", "English", "lang.hello")); 194 /* 195 * Print all metadata starting "lang" 196 */ 197 psMetaDataSetIterator(ms); 198 while ((meta = psMetaDataGetNext(ms, "lang")) != NULL) { 199 psMetaDataItemPrint(stdout, meta, ""); 200 } 201 \end{verbatim} 202 203 It is an unfortunate fact that certain metadata keywords (such as \code{COMMENT} in a FITS header) 204 may be repeated with different values. The \code{psMetaDataAppend} routine is required 205 to check that all metadata names are unique unless the type is qualified as \code{PS_META_NON_UNIQUE}; 206 in this case a unique integer will be added to each name that you specify. In this case, 207 you may either delete individual element separately or as a complete set: 208 \begin{verbatim} 209 psMetaDataItemFree(psMetaDataRemove(ms, "lang.hello.0")); 210 psMetaDataItemFree(psMetaDataRemove(ms, "lang.hello")); 211 \end{verbatim} 212 213 \appendix 214 \section{MetaData APIs} 215 216 \begin{verbatim} 217 psMetaDataItem *psMetaDataItemAlloc( 218 psMetaDataType type, // type of this piece of metadata 219 const void *val, // value of new item 220 // N.b. a pointer even if the item 221 // is of type e.g. int 222 const char *comment, // comment associated with item 223 const char *name, // name of new item of metadata (may be an sprintf format) 224 ...); // possible arguments for name format 225 226 void psMetaDataItemFree(psMetaDataItem *ms); // piece of metadata to destroy 227 228 psMetaDataSet *psMetaDataSetAlloc(void); // make a new set of metadata 229 void psMetaDataSetDel(psMetaDataSet *ms); // destroy a set of metadata 230 231 /*****************************************************************************/ 232 /* 233 * Utilities 234 */ 235 psMetaDataItem *psMetaDataAppend(psMetaDataSet *restrict ms, psMetaDataItem *restrict item); 236 psMetaDataItem *psMetaDataRemove(psMetaDataSet *restrict ms, const char *restrict key); 237 238 void psMetaDataSetIterator(psMetaDataSet *ms); 239 psMetaDataItem *psMetaDataGetNext(psMetaDataSet *ms); 240 psMetaDataItem *psMetaDataLookup(const psMetaDataSet *ms, const char *key); 241 242 void psMetaDataItemPrint(FILE *fd, // file descriptor to write to 243 const psMetaDataItem *ms); // item of metadata to print 244 \end{verbatim} 165 245 166 246 \bibliographystyle{plain}
Note:
See TracChangeset
for help on using the changeset viewer.
