diff options
Diffstat (limited to 'libical/src/libicalss/icalssyacc.y')
-rw-r--r-- | libical/src/libicalss/icalssyacc.y | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/libical/src/libicalss/icalssyacc.y b/libical/src/libicalss/icalssyacc.y new file mode 100644 index 0000000000..e6efe5da1f --- /dev/null +++ b/libical/src/libicalss/icalssyacc.y @@ -0,0 +1,215 @@ +%{ +/* -*- Mode: C -*- + ====================================================================== + FILE: icalssyacc.y + CREATOR: eric 08 Aug 2000 + + DESCRIPTION: + + $Id: icalssyacc.y,v 1.1 2000/12/11 22:06:18 federico Exp $ + $Locker: $ + +(C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org + + This program is free software; you can redistribute it and/or modify + it under the terms of either: + + The LGPL as published by the Free Software Foundation, version + 2.1, available at: http://www.fsf.org/copyleft/lesser.html + + Or: + + The Mozilla Public License Version 1.0. You may obtain a copy of + the License at http://www.mozilla.org/MPL/ + + The Original Code is eric. The Initial Developer of the Original + Code is Eric Busboom + + ======================================================================*/ + +#include <stdlib.h> +#include <string.h> /* for strdup() */ +#include <limits.h> /* for SHRT_MAX*/ +#include "ical.h" +#include "pvl.h" +#include "icalgaugeimpl.h" + + +extern struct icalgauge_impl *icalss_yy_gauge; + +void ssyacc_add_where(struct icalgauge_impl* impl, char* str1, + enum icalparameter_xliccomparetype compare , char* str2); +void ssyacc_add_select(struct icalgauge_impl* impl, char* str1); +void ssyacc_add_from(struct icalgauge_impl* impl, char* str1); +void move_where(int w); +void sserror(char *s); /* Don't know why I need this.... */ + + + +%} + +%union { + char* v_string; +} + + +%token <v_string> STRING +%token SELECT FROM WHERE COMMA EQUALS NOTEQUALS LESS GREATER LESSEQUALS +%token GREATEREQUALS AND OR EOL END + +%% + +query_min: SELECT select_list FROM from_list WHERE where_list + | error { + icalparser_clear_flex_input(); + yyclearin; + } + ; + +select_list: + STRING {ssyacc_add_select(icalss_yy_gauge,$1);} + | select_list COMMA STRING {ssyacc_add_select(icalss_yy_gauge,$3);} + ; + + +from_list: + STRING {ssyacc_add_from(icalss_yy_gauge,$1);} + | from_list COMMA STRING {ssyacc_add_from(icalss_yy_gauge,$3);} + ; + +where_clause: + /* Empty */ + | STRING EQUALS STRING {ssyacc_add_where(icalss_yy_gauge,$1,ICAL_XLICCOMPARETYPE_EQUAL,$3); } + + | STRING NOTEQUALS STRING {ssyacc_add_where(icalss_yy_gauge,$1,ICAL_XLICCOMPARETYPE_NOTEQUAL,$3); } + | STRING LESS STRING {ssyacc_add_where(icalss_yy_gauge,$1,ICAL_XLICCOMPARETYPE_LESS,$3); } + | STRING GREATER STRING {ssyacc_add_where(icalss_yy_gauge,$1,ICAL_XLICCOMPARETYPE_GREATER,$3); } + | STRING LESSEQUALS STRING {ssyacc_add_where(icalss_yy_gauge,$1,ICAL_XLICCOMPARETYPE_LESSEQUAL,$3); } + | STRING GREATEREQUALS STRING {ssyacc_add_where(icalss_yy_gauge,$1,ICAL_XLICCOMPARETYPE_GREATEREQUAL,$3); } + ; + +where_list: + where_clause {move_where(1);} + | where_list AND where_clause {move_where(2);} + | where_list OR where_clause {move_where(3);} + ; + + +%% + +void ssyacc_add_where(struct icalgauge_impl* impl, char* str1, + enum icalparameter_xliccomparetype compare , char* str2) +{ + icalproperty *p; + icalvalue *v; + icalproperty_kind kind; + + kind = icalenum_string_to_property_kind(str1); + + if(kind == ICAL_NO_PROPERTY){ + assert(0); + } + + p = icalproperty_new(kind); + + v = icalvalue_new_text(str2); + + if(v == 0){ + assert(0); + } + + icalproperty_set_value(p,v); + + icalproperty_add_parameter(p,icalparameter_new_xliccomparetype(compare)); + + icalcomponent_add_property(impl->where,p); +} + +void ssyacc_add_select(struct icalgauge_impl* impl, char* str1) +{ + icalproperty *p; + icalproperty_kind pkind; + icalcomponent_kind ckind = ICAL_NO_COMPONENT; + char* c; + char* compstr; + char* propstr; + + /* Is there a period in str1 ? If so, the string specified both a + component and a property*/ + if( (c = strrchr(str1,'.')) != 0){ + compstr = str1; + propstr = c+1; + *c = '\0'; + } else { + compstr = 0; + propstr = str1; + } + + + /* Handle the case where a component was specified */ + if(compstr != 0){ + ckind = icalenum_string_to_component_kind(compstr); + + if(ckind == ICAL_NO_COMPONENT){ + assert(0); + } + } else { + ckind = ICAL_NO_COMPONENT; + } + + + /* If the property was '*', then accept all properties */ + if(strcmp("*",propstr) == 0) { + pkind = ICAL_ANY_PROPERTY; + } else { + pkind = icalenum_string_to_property_kind(str1); + } + + + if(pkind == ICAL_NO_PROPERTY){ + assert(0); + } + + + if(ckind == ICAL_NO_COMPONENT){ + p = icalproperty_new(pkind); + assert(p!=0); + icalcomponent_add_property(impl->select,p); + + } else { + icalcomponent *comp = + icalcomponent_new(ckind); + p = icalproperty_new(pkind); + + assert(p!=0); + + icalcomponent_add_property(comp,p); + icalcomponent_add_component(impl->select,comp); + + } +} + +void ssyacc_add_from(struct icalgauge_impl* impl, char* str1) +{ + icalcomponent *c; + icalcomponent_kind ckind; + + ckind = icalenum_string_to_component_kind(str1); + + if(ckind == ICAL_NO_COMPONENT){ + assert(0); + } + + c = icalcomponent_new(ckind); + + icalcomponent_add_component(impl->from,c); + +} + +void move_where(int w) +{ +} + +void sserror(char *s){ + fprintf(stderr,"Parse error \'%s\'\n", s); +} |