author | Michael Krelin <hacker@klever.net> | 2007-09-11 22:44:51 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2007-09-11 22:44:51 (UTC) |
commit | 429c48d3d08e6c2f6c385d8975f7b5bf5e67acf3 (patch) (side-by-side diff) | |
tree | 7f314d7f129a60325bf21723ad261570d36220cd | |
parent | 2c6565f363527142928062afe3d3101fdbb3c550 (diff) | |
download | libopkele-429c48d3d08e6c2f6c385d8975f7b5bf5e67acf3.zip libopkele-429c48d3d08e6c2f6c385d8975f7b5bf5e67acf3.tar.gz libopkele-429c48d3d08e6c2f6c385d8975f7b5bf5e67acf3.tar.bz2 |
added support for crappy libpcre c++ bindings
Added optional support for crappy google's c++ bindings. The bindings are
ridiculously googley, so I think, taking into account the amount of pcre
involved, I'll soon drop requirement for any bindings and will use libpcre
directly.
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | acinclude.m4 | 6 | ||||
-rw-r--r-- | configure.ac | 41 | ||||
-rw-r--r-- | lib/consumer.cc | 53 |
3 files changed, 88 insertions, 12 deletions
diff --git a/acinclude.m4 b/acinclude.m4 index 349d3cf..532f978 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -86,4 +86,4 @@ dnl PCRE_VERSION PCRE_CFLAGS PCRE_LIBS dnl PCRE_LIBS_POSIX PCRE_CFLAGS_POSIX -dnl AM_CONDITIONAL: HAVE_PCRE dnl AC_DEFINE: HAVE_PCRE PCRE_VERSION +dnl env: HAVE_PCRE=yes|no AC_DEFUN([AC_WITH_PCRE],[ @@ -144,3 +144,2 @@ AC_DEFUN([AC_WITH_PCRE],[ fi - AM_CONDITIONAL([HAVE_PCRE],[test "${HAVE_PCRE}" = "yes"]) ]) @@ -151,4 +150,4 @@ dnl AC_SUBST: PCREPP_CONFIG PCREPP_PREFIX PCREPP_EXEC_PREFIX dnl PCREPP_VERSION PCREPP_CFLAGS PCREPP_LIBS -dnl AM_CONDITIONAL: HAVE_PCREPP dnl AC_DEFINE: HAVE_PCREPP PCREPP_VERSION +dnl env: HAVE_PCREPP=yes|no AC_DEFUN([AC_WITH_PCREPP],[ @@ -209,3 +208,2 @@ AC_DEFUN([AC_WITH_PCREPP],[ fi - AM_CONDITIONAL([HAVE_PCREPP],[test "${HAVE_PCREPP}" = "yes"]) ]) diff --git a/configure.ac b/configure.ac index 2094273..00c6bc4 100644 --- a/configure.ac +++ b/configure.ac @@ -54,5 +54,22 @@ LIBCURL_CHECK_CONFIG(,,,[ ]) + +want_pcre_impl="" +AC_ARG_WITH([pcre-bindings], + AC_HELP_STRING([--with-pcre-bindings=(pcrepp|none|libpcrecpp)],[Specify which pcre c++ bindings to use. 'pcrepp' stands for quite sensible library, found at http://www.daemon.de/PCRE/, 'libcrecpp' makes use of crappy bindings by google and 'none' disables internal implementation of OP discovery]), + [ + case "$withval" in + pcrepp) want_pcre_impl="pcrepp" ;; + libpcrecpp) want_pcre_impl="libpcrecpp" ;; + none) want_pcre_impl="none";; + *) AC_MSG_ERROR([I'm not sure I understand what do you want for a pcre c++ bindings]) ;; + esac + ] +) + +found_pcre_impl="" + +if test -z "$want_pcre_impl" -o "$want_pcre_impl" = "pcrepp" ; then AC_WITH_PCRE([ - AC_WITH_PCREPP(,[ - AC_MSG_ERROR([no pcre++ library found. get one at http://www.daemon.de/PCRE]) + AC_WITH_PCREPP([ + found_pcre_impl=pcrepp ]) @@ -62,2 +79,22 @@ AC_WITH_PCRE([ ) + test "$want_pcre_impl,$found_pcre_impl" = "pcrepp," && AC_MSG_ERROR([no pcre++ library found. get one at http://www.daemon.de/PCRE]) +fi + +if test "$found_pcre_impl,$want_pcre_impl" = "," -o "$want_pcre_impl" = "libpcrecpp" ; then + test -z "$want_pcre_impl" || AC_MSG_NOTICE([You want to use crappy libpcre c++ bindings]) + PKG_CHECK_MODULES([LIBPCRECPP],[libpcrecpp],[ + found_pcre_impl=libpcrecpp + CXXFLAGS="$CXXFLAGS $LIBPCRECPP_CFLAGS" + LIBS="$LIBS $LIBPCRECPP_LIBS" + ],[ + test -z "$want_pcre_impl" || AC_MSG_ERROR([no libpcre c++ bindings found. why would you want it if you don't have it installed?]) + ] + ) +fi +test "$want_pcre_impl,$found_pcre_impl" = "," && AC_MSG_ERROR([no pcre c++ bindings found, use --with-pcre-bindings=none to disable code that makes use of it]) + +case "$found_pcre_impl" in + pcrepp) AC_DEFINE([USE_PCREPP],,[defined if pcre++ is to be used]) ;; + libpcrecpp) AC_DEFINE([USE_LIBPCRECPP],,[defined if crappy google bindings are to be used]) ;; +esac diff --git a/lib/consumer.cc b/lib/consumer.cc index 8f66688..299b3bc 100644 --- a/lib/consumer.cc +++ b/lib/consumer.cc @@ -9,3 +9,2 @@ #include <curl/curl.h> -#include <pcre++.h> @@ -15,2 +14,10 @@ +#if defined(USE_LIBPCRECPP) +# include <pcrecpp.h> +#elif defined(USE_PCREPP) +# include <pcre++.h> +#else + /* internal implementation won't be built */ +#endif + namespace opkele { @@ -263,2 +270,3 @@ namespace opkele { void consumer_t::retrieve_links(const string& url,string& server,string& delegate) { +#if defined(USE_LIBPCRECPP) || defined(USE_PCREPP) server.erase(); @@ -280,7 +288,36 @@ namespace opkele { throw exception_curl(OPKELE_CP_ "failed to curl_easy_perform()",r); - pcrepp::Pcre bre("<body\\b",PCRE_CASELESS); // strip out everything past body + static const char *re_hdre = "<head[^>]*>", + *re_lre = "<link\\b([^>]+)>", + *re_rre = "\\brel=['\"]([^'\"]+)['\"]", + *re_hre = "\\bhref=['\"]([^'\"]+)['\"]"; +#if defined(USE_LIBPCRECPP) + static pcrecpp::RE_Options ro(PCRE_CASELESS|PCRE_DOTALL); + static pcrecpp::RE + bre("<body\\b.*",ro), hdre(re_hdre,ro), + lre(re_lre,ro), rre(re_rre), hre(re_hre,ro); + bre.Replace("",&html); + pcrecpp::StringPiece hpiece(html); + if(!hdre.FindAndConsume(&hpiece)) + throw bad_input(OPKELE_CP_ "failed to find head"); + string attrs; + while(lre.FindAndConsume(&hpiece,&attrs)) { + pcrecpp::StringPiece rel, href; + if(!(rre.PartialMatch(attrs,&rel) && hre.PartialMatch(attrs,&href))) + continue; + if(rel=="openid.server") { + href.CopyToString(&server); + if(!delegate.empty()) + break; + }else if(rel=="openid.delegate") { + href.CopyToString(&delegate); + if(!server.empty()) + break; + } + } +#elif defined(USE_PCREPP) + pcrepp::Pcre bre("<body\\b",PCRE_CASELESS); if(bre.search(html)) html.erase(bre.get_match_start()); - pcrepp::Pcre hdre("<head[^>]*>",PCRE_CASELESS); + pcrepp::Pcre hdre(re_hdre,PCRE_CASELESS); if(!hdre.search(html)) @@ -288,5 +325,3 @@ namespace opkele { html.erase(0,hdre.get_match_end()+1); - pcrepp::Pcre lre("<link\\b([^>]+)>",PCRE_CASELESS), - rre("\\brel=['\"]([^'\"]+)['\"]",PCRE_CASELESS), - hre("\\bhref=['\"]([^'\"]+)['\"]",PCRE_CASELESS); + pcrepp::Pcre lre(re_lre,PCRE_CASELESS), rre(re_rre,PCRE_CASELESS), hre(re_hre,PCRE_CASELESS); while(lre.search(html)) { @@ -306,4 +341,10 @@ namespace opkele { } +#else + #error "I must have gone crazy" +#endif if(server.empty()) throw failed_assertion(OPKELE_CP_ "The location has no openid.server declaration"); +#else /* none of the RE bindings enabled */ + throw not_implemented(OPKELE_CP_ "No internal implementation of retrieve_links were provided at compile-time"); +#endif } |