00001
00006 #ifndef _DRMS_KEYWORD_H
00007 #define _DRMS_KEYWORD_H
00008
00009 #include "drms_types.h"
00010 #include "cfitsio.h"
00011 #include "keymap.h"
00012 #include "drms_fitsrw.h"
00013 #include "drms.h"
00014
00015 void drms_keyword_print(DRMS_Keyword_t *key);
00016 void drms_keyword_fprint(FILE *keyfile, DRMS_Keyword_t *key);
00017 void drms_keyword_printval(DRMS_Keyword_t *key);
00018 void drms_keyword_fprintval(FILE *keyfile, DRMS_Keyword_t *key);
00019 void drms_keyword_snprintfval(DRMS_Keyword_t *key, char *buf, int size);
00020 DRMS_Keyword_t *drms_keyword_lookup(DRMS_Record_t *rec, const char *key, int followlink);
00021 DRMS_Keyword_t *drms_template_keyword_followlink(DRMS_Keyword_t *srckey, int *statret);
00022 DRMS_Keyword_t *drms_jsd_template_keyword_followlink(DRMS_Keyword_t *srckey, int *statret);
00023 DRMS_Type_t drms_keyword_type(DRMS_Keyword_t *key);
00024 HContainer_t *drms_keyword_createinfocon(DRMS_Env_t *drmsEnv,
00025 const char *seriesName,
00026 int *status);
00027 void drms_keyword_destroyinfocon(HContainer_t **info);
00028
00029 int drms_keyword_keysmatch(DRMS_Keyword_t *k1, DRMS_Keyword_t *k2);
00030
00031
00032
00033 char drms_getkey_char(DRMS_Record_t *rec, const char *key,int *status);
00034 short drms_getkey_short(DRMS_Record_t *rec, const char *key, int *status);
00035 int drms_getkey_int(DRMS_Record_t *rec, const char *key, int *status);
00036 long long drms_getkey_longlong(DRMS_Record_t *rec, const char *key, int *status);
00037 float drms_getkey_float(DRMS_Record_t *rec, const char *key, int *status);
00038 double drms_getkey_double(DRMS_Record_t *rec, const char *key, int *status);
00039 char *drms_getkey_string(DRMS_Record_t *rec, const char *key, int *status);
00040 char *drms_getkey_string(DRMS_Record_t *rec, const char *key, int *status);
00041 TIME drms_getkey_time(DRMS_Record_t *rec, const char *key, int *status);
00042
00043
00044 double drms_keyword_getdouble(DRMS_Keyword_t *keyword, int *status);
00045 TIME drms_keyword_gettime(DRMS_Keyword_t *keyword, int *status);
00046
00047
00048 DRMS_Type_Value_t drms_getkey(DRMS_Record_t *rec, const char *key,
00049 DRMS_Type_t *type, int *status);
00050 DRMS_Value_t drms_getkey_p(DRMS_Record_t *rec, const char *key, int *status);
00051
00052
00053 int drms_appendhistory(DRMS_Record_t *rec, const char *str, int newline);
00054 int drms_appendcomment(DRMS_Record_t *rec, const char *str, int newline);
00055
00056
00057 int drms_setkey_char(DRMS_Record_t *rec, const char *key, char value);
00058 int drms_setkey_short(DRMS_Record_t *rec, const char *key, short value);
00059 int drms_setkey_int(DRMS_Record_t *rec, const char *key, int value);
00060 int drms_setkey_longlong(DRMS_Record_t *rec, const char *key, long long value);
00061 int drms_setkey_float(DRMS_Record_t *rec, const char *key, float value);
00062 int drms_setkey_double(DRMS_Record_t *rec, const char *key, double value);
00063 int drms_setkey_time(DRMS_Record_t *rec, const char *key, TIME value);
00064 int drms_setkey_string(DRMS_Record_t *rec, const char *key, const char *value);
00065 int drms_appkey_string(DRMS_Record_t *rec, const char *key, const char *value);
00066
00067
00068 int drms_setkey(DRMS_Record_t *rec, const char *key, DRMS_Type_t type,
00069 DRMS_Type_Value_t *value);
00070
00071
00072 int drms_setkey_p(DRMS_Record_t *rec, const char *key, DRMS_Value_t *value);
00073
00074 int drms_keyword_inclass(DRMS_Keyword_t *key, DRMS_KeywordClass_t class);
00075
00076
00077
00078 int drms_copykey(DRMS_Record_t *target, DRMS_Record_t *source, const char *key);
00079 int drms_copykeyB(DRMS_Keyword_t *tgtkey, DRMS_Keyword_t *srckey);
00080 int drms_copykeys(DRMS_Record_t *target,
00081 DRMS_Record_t *source,
00082 int usesrcset,
00083 DRMS_KeywordClass_t class);
00084
00085
00086
00087
00088 static inline const char *drms_keyword_getname(DRMS_Keyword_t *key)
00089 {
00090 return key->info->name;
00091 }
00092 DRMS_Type_t drms_keyword_gettype(DRMS_Keyword_t *key);
00093 const DRMS_Type_Value_t *drms_keyword_getvalue(DRMS_Keyword_t *key);
00094 int drms_keyword_getsegscope(DRMS_Keyword_t *key);
00095 DRMS_RecScopeType_t drms_keyword_getrecscope(DRMS_Keyword_t *key);
00096 const char *drms_keyword_getrecscopestr(DRMS_Keyword_t *key, int *status);
00097 DRMS_SlotKeyUnit_t drms_keyword_getslotunit(DRMS_Keyword_t *key, int *status);
00098
00099 static inline int drms_keyword_getperseg(DRMS_Keyword_t *key)
00100 {
00101 return ((key->info->kwflags & kKeywordFlag_PerSegment) != 0);
00102 }
00103 static inline void drms_keyword_setperseg(DRMS_Keyword_t *key)
00104 {
00105 key->info->kwflags |= kKeywordFlag_PerSegment;
00106 }
00107 static inline void drms_keyword_unsetperseg(DRMS_Keyword_t *key)
00108 {
00109 key->info->kwflags &= ~kKeywordFlag_PerSegment;
00110 }
00111 static inline int drms_keyword_getimplicit(DRMS_Keyword_t *key)
00112 {
00113 return ((key->info->kwflags & kKeywordFlag_Implicit) != 0);
00114 }
00115 static inline void drms_keyword_setimplicit(DRMS_Keyword_t *key)
00116 {
00117 key->info->kwflags |= kKeywordFlag_Implicit;
00118 }
00119 static inline void drms_keyword_unsetimplicit(DRMS_Keyword_t *key)
00120 {
00121 key->info->kwflags &= ~kKeywordFlag_Implicit;
00122 }
00123 static inline int drms_keyword_getintprime(DRMS_Keyword_t *key)
00124 {
00125 return ((key->info->kwflags & kKeywordFlag_InternalPrime) != 0);
00126 }
00127 static inline void drms_keyword_setintprime(DRMS_Keyword_t *key)
00128 {
00129 key->info->kwflags |= kKeywordFlag_InternalPrime;
00130 }
00131 static inline void drms_keyword_unsetintprime(DRMS_Keyword_t *key)
00132 {
00133 key->info->kwflags &= ~kKeywordFlag_InternalPrime;
00134 }
00135 static inline int drms_keyword_getextprime(DRMS_Keyword_t *key)
00136 {
00137 return ((key->info->kwflags & kKeywordFlag_ExternalPrime) != 0);
00138 }
00139 static inline void drms_keyword_setextprime(DRMS_Keyword_t *key)
00140 {
00141 key->info->kwflags |= kKeywordFlag_ExternalPrime;
00142 }
00143 static inline void drms_keyword_unsetextprime(DRMS_Keyword_t *key)
00144 {
00145 key->info->kwflags &= ~kKeywordFlag_ExternalPrime;
00146 }
00147
00148 int drms_keyword_isprime(DRMS_Keyword_t *key);
00149 int drms_keyword_isvariable(DRMS_Keyword_t *key);
00150 int drms_keyword_isconstant(DRMS_Keyword_t *key);
00151 int drms_keyword_isindex(DRMS_Keyword_t *key);
00152 int drms_keyword_isslotted(DRMS_Keyword_t *key);
00153 int drms_keyword_islinked(DRMS_Keyword_t *key);
00154
00155 DRMS_SlotKeyUnit_t drms_keyword_getunit(DRMS_Keyword_t *key, int *status);
00156 TIME drms_keyword_getepoch(DRMS_Keyword_t *epochkey, int *status);
00157 double drms_keyword_getslotcarr0(void);
00158
00159 TIME drms_keyword_getslotepoch(DRMS_Keyword_t *slotkey, int *status);
00160
00161 double drms_keyword_getslotbase(DRMS_Keyword_t *slotkey, int *status);
00162
00163 double drms_keyword_getvalkeybase(DRMS_Keyword_t *valkey, int *status);
00164 double drms_keyword_getslotstep(DRMS_Keyword_t *slotkey, DRMS_SlotKeyUnit_t *unit, int *status);
00165 double drms_keyword_getstep(DRMS_Keyword_t *key,
00166 DRMS_RecScopeType_t recscope,
00167 DRMS_SlotKeyUnit_t *unit,
00168 int *status);
00169 double drms_keyword_getvalkeystep(DRMS_Keyword_t *valkey, int *status);
00170
00171
00172
00173 DRMS_RecScopeType_t drms_keyword_str2recscope(const char *str, int *status);
00174
00175
00176 DRMS_Keyword_t *drms_keyword_indexfromvalkey(DRMS_Keyword_t *valkey);
00177
00178
00179 DRMS_Keyword_t *drms_keyword_basefromvalkey(DRMS_Keyword_t *valkey);
00180
00181
00182 DRMS_Keyword_t *drms_keyword_stepfromvalkey(DRMS_Keyword_t *valkey);
00183
00184 int drms_keyword_slotval2indexval(DRMS_Keyword_t *slotkey,
00185 DRMS_Value_t *valin,
00186 DRMS_Value_t *valout,
00187 DRMS_Value_t *startdur);
00188
00189 void drms_keyword_setdate();
00190 TIME drms_keyword_getdate(DRMS_Record_t *rec);
00191
00192 static inline int drms_keyword_ranksort(const void *he1, const void *he2)
00193 {
00194 DRMS_Keyword_t *k1 = (DRMS_Keyword_t *)hcon_getval(*((HContainerElement_t **)he1));
00195 DRMS_Keyword_t *k2 = (DRMS_Keyword_t *)hcon_getval(*((HContainerElement_t **)he2));
00196
00197 XASSERT(k1 && k2);
00198
00199 return (k1->info->rank < k2->info->rank) ? -1 : (k1->info->rank > k2->info->rank ? 1 : 0);
00200 }
00201
00202
00203
00667