00001 #ifndef __PARSER_H_
00002 #define __PARSER_H_
00003
00004 #include "std_cpp_includes.hh"
00005 #include "except.hh"
00006 #include "utils.h"
00007 #include "iwave_fopen.h"
00008
00009 typedef struct s_WORD {
00010 char * str;
00011 } WORD;
00012
00013 typedef struct s_KEYVAL {
00014 WORD * key;
00015 WORD * val;
00016 } KEYVAL;
00017
00018 typedef struct s_PSLINK {
00019 KEYVAL * pair;
00020 struct s_PSLINK * prev;
00021 struct s_PSLINK * next;
00022 } PSLINK;
00023
00024 typedef struct s_PARARRAY {
00025 PSLINK * list;
00026 } PARARRAY;
00027
00028 WORD * word_new();
00029 void word_delete(WORD ** w);
00030 void word_reset(WORD * w);
00031 int word_assign(WORD * w, const char * str, int len);
00032 int word_whitechar(char c);
00033 int word_copy(WORD * tgt, WORD src);
00034 int word_read(WORD * w, char ** src);
00035
00036 KEYVAL * kv_new();
00037 void kv_delete(KEYVAL ** pair);
00038 void kv_reset(KEYVAL * pair);
00039 int kv_check(KEYVAL src);
00040 int kv_copy(KEYVAL * tgt, KEYVAL src);
00041 int kv_read(KEYVAL * kv, char ** src);
00042 void kv_print(KEYVAL kv);
00043 void kv_fprint(KEYVAL kv, FILE * f);
00044
00045 PSLINK * pslink_new();
00046 void pslink_delete(PSLINK ** p);
00047 void pslink_setnull(PSLINK ** p);
00048 int pslink_front(PSLINK ** p);
00049 int pslink_back(PSLINK ** p);
00050 int pslink_read(PSLINK ** p, char ** str);
00051 int pslink_findfirst(PSLINK * par, WORD skey, WORD * sval);
00052 int pslink_findlast(PSLINK * par, WORD skey, WORD * sval);
00053 int pslink_setfirst(PSLINK ** par, WORD skey, WORD sval);
00054 int pslink_setlast(PSLINK ** par, WORD skey, WORD sval);
00055
00056
00063 PARARRAY * ps_new();
00064
00069 void ps_delete(PARARRAY ** p);
00070
00076 int ps_setnull(PARARRAY *parr);
00087 int ps_printall(PARARRAY parr, FILE *stream);
00088 int ps_printall(PARARRAY parr, ostream & stream);
00089
00090
00098 int ps_createfp(PARARRAY *parr, FILE * fp);
00099
00100
00111 int ps_createfile_fproto(PARARRAY *parr,
00112 FILE ** stream,
00113 const char * proto,
00114 const char *filename);
00115
00116
00123 int ps_createfile(PARARRAY *parr, const char *filename);
00133 int ps_createargs(PARARRAY *parr, int argc, char **argv);
00134
00135
00142 int ps_copy(PARARRAY ** tgt, PARARRAY src);
00143
00146
00162 int ps_ffcstring(PARARRAY parr, const char *key, char **p);
00163 int ps_ffchar(PARARRAY parr, const char *key, char *p);
00164 int ps_ffshort(PARARRAY parr, const char *key, short *p);
00165 int ps_ffint(PARARRAY parr, const char *key, int *p);
00166 int ps_fflong(PARARRAY parr, const char *key, long *p);
00167 int ps_ffushort(PARARRAY parr, const char *key, unsigned short *p);
00168 int ps_ffuint(PARARRAY parr, const char *key, unsigned int *p);
00169 int ps_ffulong(PARARRAY parr, const char *key, unsigned long *p);
00170 int ps_fffloat(PARARRAY parr, const char *key, float *p);
00171 int ps_ffdouble(PARARRAY parr, const char *key, double *p);
00172 int ps_ffreal(PARARRAY parr, const char *key, ireal *p);
00174
00190 int ps_flcstring(PARARRAY parr, const char *key, char **p);
00191 int ps_flchar(PARARRAY parr, const char *key, char *p);
00192 int ps_flshort(PARARRAY parr, const char *key, short *p);
00193 int ps_flint(PARARRAY parr, const char *key, int *p);
00194 int ps_fllong(PARARRAY parr, const char *key, long *p);
00195 int ps_flushort(PARARRAY parr, const char *key, unsigned short *p);
00196 int ps_fluint(PARARRAY parr, const char *key, unsigned int *p);
00197 int ps_flulong(PARARRAY parr, const char *key, unsigned long *p);
00198 int ps_flfloat(PARARRAY parr, const char *key, float *p);
00199 int ps_fldouble(PARARRAY parr, const char *key, double *p);
00200 int ps_flreal(PARARRAY parr, const char *key, ireal *p);
00203
00216 int ps_sfcstring(PARARRAY parr, const char *key, const char *val);
00217 int ps_sfchar(PARARRAY parr, const char *key, char p);
00218 int ps_sfshort(PARARRAY parr, const char *key, short p);
00219 int ps_sfint(PARARRAY parr, const char *key, int p);
00220 int ps_sflong(PARARRAY parr, const char *key, long p);
00221 int ps_sfushort(PARARRAY parr, const char *key, unsigned short p);
00222 int ps_sfuint(PARARRAY parr, const char *key, unsigned int p);
00223 int ps_sfulong(PARARRAY parr, const char *key, unsigned long p);
00224 int ps_sffloat(PARARRAY parr, const char *key, float p);
00225 int ps_sfdouble(PARARRAY parr, const char *key, double p);
00226 int ps_sfreal(PARARRAY parr, const char *key, ireal p);
00229
00242 int ps_slcstring(PARARRAY parr, const char *key, const char *val);
00243 int ps_slchar(PARARRAY parr, const char *key, char p);
00244 int ps_slshort(PARARRAY parr, const char *key, short p);
00245 int ps_slint(PARARRAY parr, const char *key, int p);
00246 int ps_sllong(PARARRAY parr, const char *key, long p);
00247 int ps_slushort(PARARRAY parr, const char *key, unsigned short p);
00248 int ps_sluint(PARARRAY parr, const char *key, unsigned int p);
00249 int ps_slulong(PARARRAY parr, const char *key, unsigned long p);
00250 int ps_slfloat(PARARRAY parr, const char *key, float p);
00251 int ps_sldouble(PARARRAY parr, const char *key, double p);
00252 int ps_slreal(PARARRAY parr, const char *key, ireal p);
00255
00259 namespace RVL {
00260 bool parse(PARARRAY const & par, std::string name, string & val);
00261 bool parse(PARARRAY const & par, std::string name, char & val);
00262 bool parse(PARARRAY const & par, std::string name, short & val);
00263 bool parse(PARARRAY const & par, std::string name, int & val);
00264 bool parse(PARARRAY const & par, std::string name, long & val);
00265 bool parse(PARARRAY const & par, std::string name, unsigned short & val);
00266 bool parse(PARARRAY const & par, std::string name, unsigned int & val);
00267 bool parse(PARARRAY const & par, std::string name, unsigned long & val);
00268 bool parse(PARARRAY const & par, std::string name, float & val);
00269 bool parse(PARARRAY const & par, std::string name, double & val);
00270 bool parse(PARARRAY const & par, std::string name, bool & val);
00271
00273 template<typename T> T valparse(PARARRAY const & par, std::string name, T def) {
00274 T val;
00275 if (!parse(par,name,val)) val=def;
00276 return val;
00277 }
00279 template<typename T> T valparse(PARARRAY const & par, std::string name) {
00280 T val;
00281 if (!parse(par,name,val)) {
00282 RVLException e;
00283 e<<"Error: parse_except\n";
00284 e<<" failed to parse key = "<<name<<"\n";
00285 throw e;
00286 }
00287 return val;
00288 }
00289
00290 }
00291
00292 #endif