%{ /* -*- 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 #include /* for strdup() */ #include /* 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 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); }