diff options
author | Jorn Baayen <jorn@openedhand.com> | 2008-01-06 21:07:40 +0000 |
---|---|---|
committer | Jorn Baayen <jorn@openedhand.com> | 2008-01-06 21:07:40 +0000 |
commit | 97e5ff2b9bbc41449d430913e2360e8087719c95 (patch) | |
tree | 1ef8eca9ac6c60ec9bef90faf418b65bf60a86af /tests | |
parent | 8adf1586ceca091469105426288d78ba43443b21 (diff) | |
download | gupnp-av-97e5ff2b9bbc41449d430913e2360e8087719c95.tar.gz |
2008-01-06 Jorn Baayen <jorn@openedhand.com>
* Makefile.am:
* configure.ac:
* libgupnp-av/Makefile.am:
* libgupnp-av/gupnp-av-search-criteria-scanner.c:
* libgupnp-av/gupnp-av-search-criteria-scanner.h:
* libgupnp-av/gupnp-av.h:
* tests/Makefile.am:
* tests/test-search-criteria-scanner.c:
Add initial search criteria parsing code.
git-svn-id: https://svn.o-hand.com/repos/gupnp/trunk/gupnp-av@661 d8cb91d7-bff9-0310-92b9-80b65e4482b2
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile.am | 6 | ||||
-rw-r--r-- | tests/test-search-criteria-scanner.c | 202 |
2 files changed, 208 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..3fdb754 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,6 @@ +AM_CFLAGS = $(LIBGUPNP_CFLAGS) -I$(top_srcdir) + +noinst_PROGRAMS = test-search-criteria-scanner + +test_search_criteria_scanner_SOURCES = test-search-criteria-scanner.c +test_search_criteria_scanner_LDADD = $(top_builddir)/libgupnp-av/libgupnp-av-1.0.la diff --git a/tests/test-search-criteria-scanner.c b/tests/test-search-criteria-scanner.c new file mode 100644 index 0000000..9c546fc --- /dev/null +++ b/tests/test-search-criteria-scanner.c @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2007 OpenedHand Ltd + * + * Authors: Jorn Baayen <jorn@openedhand.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <string.h> + +#include <libgupnp-av/gupnp-av-search-criteria-scanner.h> + +/* XXX operator precedence */ + +static gboolean +scan_rel_exp (GScanner *scanner) +{ + GTokenValue value; + gboolean ret; + guint token; + char *arg1, *arg2; + + token = g_scanner_get_next_token (scanner); + g_assert (token == G_TOKEN_IDENTIFIER); /* Already checked */ + + value = g_scanner_cur_value (scanner); + arg1 = g_strdup (value.v_string); + + token = g_scanner_get_next_token (scanner); + switch (token) { + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_EQ: + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_NEQ: + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_LESS: + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_LEQ: + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_GREATER: + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_GEQ: + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_CONTAINS: + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_DOES_NOT_CONTAIN: + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_DERIVED_FROM: + token = g_scanner_get_next_token (scanner); + if (token != G_TOKEN_STRING) { + g_scanner_unexp_token (scanner, + G_TOKEN_STRING, + NULL, NULL, NULL, + NULL, FALSE); + + ret = FALSE; + } + + value = g_scanner_cur_value (scanner); + arg2 = value.v_string; + + ret = TRUE; + + break; + + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_EXISTS: + token = g_scanner_get_next_token (scanner); + switch (token) { + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_TRUE: + ret = TRUE; + + break; + + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_FALSE: + ret = TRUE; + + break; + + default: + g_scanner_unexp_token (scanner, + G_TOKEN_IDENTIFIER, + NULL, NULL, NULL, + "Expected boolean value", + FALSE); + + ret = FALSE; + } + + break; + + default: + g_scanner_unexp_token (scanner, + G_TOKEN_IDENTIFIER, + NULL, NULL, NULL, + "Expected operator", + FALSE); + + ret = FALSE; + } + + g_free (arg1); + + return ret; +} + +static gboolean +scan_search_exp (GScanner *scanner) +{ + gboolean ret; + guint token; + + token = g_scanner_peek_next_token (scanner); + switch (token) { + case G_TOKEN_LEFT_PAREN: + g_scanner_get_next_token (scanner); + + ret = scan_search_exp (scanner); + if (ret == FALSE) + break; + + token = g_scanner_get_next_token (scanner); + if (token != G_TOKEN_RIGHT_PAREN) { + g_scanner_unexp_token (scanner, + G_TOKEN_RIGHT_PAREN, + NULL, NULL, NULL, NULL, FALSE); + + ret = FALSE; + } + + break; + + case G_TOKEN_IDENTIFIER: + ret = scan_rel_exp (scanner); + if (ret == FALSE) + break; + + token = g_scanner_peek_next_token (scanner); + + switch (token) { + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_AND: + case GUPNP_AV_SEARCH_CRITERIA_SYMBOL_OR: + g_scanner_get_next_token (scanner); + ret = scan_search_exp (scanner); + break; + + default: + break; + } + + break; + + default: + g_scanner_get_next_token (scanner); + + g_scanner_unexp_token (scanner, + G_TOKEN_IDENTIFIER, + NULL, NULL, NULL, NULL, FALSE); + + ret = FALSE; + } + + return ret; +} + +int +main (int argc, char **argv) +{ + GScanner *scanner; + gboolean ret; + guint token; + + g_assert (argc == 2); + + scanner = gupnp_av_search_criteria_scanner_new (); + + g_scanner_input_text (scanner, argv[1], strlen (argv[1])); + + token = g_scanner_peek_next_token (scanner); + if (token == GUPNP_AV_SEARCH_CRITERIA_SYMBOL_ASTERISK) { + g_scanner_get_next_token (scanner); + + ret = TRUE; + } else + ret = scan_search_exp (scanner); + + if (ret == TRUE) { + token = g_scanner_get_next_token (scanner); + if (token != G_TOKEN_EOF) { + g_scanner_unexp_token (scanner, + G_TOKEN_EOF, + NULL, NULL, NULL, NULL, FALSE); + } + } + + g_scanner_destroy (scanner); + + return 0; +} |