Merge in all changes related to being able to read configuration files.
[awesomized/libmemcached] / libmemcached / options / parser.yy
index 3a7cee2eed170492600305dba1d031c33aee1fa7..5b1406283541add6e8479df7e107d15b9c375f06 100644 (file)
 #pragma GCC diagnostic ignored "-Wold-style-cast"
 #include <libmemcached/options/scanner.h>
 
-inline int libmemcached_error(YYLTYPE *locp, type_st *parser, yyscan_t *scanner, const char *str)
+inline void libmemcached_error(YYLTYPE *locp, type_st *parser, yyscan_t *scanner, const char *str)
 {
-#if 0
-  std::cerr << str << std::endl;
-#endif
-  return 0;
+  memcached_string_t local_string;
+  local_string.size= strlen(str);
+  local_string.c_str= str;
+  memcached_set_error(parser->memc, MEMCACHED_FAILURE, &local_string);
 }
 
 
@@ -60,6 +60,8 @@ inline int libmemcached_error(YYLTYPE *locp, type_st *parser, yyscan_t *scanner,
 %token SERVER
 %token SERVERS
 %token UNKNOWN
+%token COMMENT
+%token EMPTY_LINE
 
 %token DASH_OPTION
 
@@ -98,6 +100,9 @@ inline int libmemcached_error(YYLTYPE *locp, type_st *parser, yyscan_t *scanner,
 %token USE_UDP
 %token VERIFY_KEY
 
+/* Callbacks */
+%token PREFIX_KEY
+
 /* Hash types */
 %token MD5
 %token CRC
@@ -119,12 +124,15 @@ inline int libmemcached_error(YYLTYPE *locp, type_st *parser, yyscan_t *scanner,
 
 %token <number> NUMBER
 %token <number> FLOAT
-%token <string> IDENTIFIER
-%token <string> SERVER_WITH_PORT
+%token <string> HOSTNAME
+%token <string> HOSTNAME_WITH_PORT
 %token <string> IPADDRESS
 %token <string> IPADDRESS_WITH_PORT
+%token <string> STRING
+%token <string> QUOTED_STRING
 
 %type <server> server
+%type <string> string
 %type <distribution> distribution
 %type <hash> hash
 %type <behavior> behavior_boolean
@@ -137,6 +145,10 @@ statement:
           { }
         | statement ' ' DASH_OPTION expression
           { }
+        | COMMENT
+          { }
+        | EMPTY_LINE
+          { }
         ;
 
 
@@ -152,6 +164,10 @@ expression:
         ;
 
 behaviors:
+          PREFIX_KEY '=' string
+          {
+            memcached_callback_set(parser->memc, MEMCACHED_CALLBACK_PREFIX_KEY, std::string($3.c_str, $3.length).c_str());
+          }
         | DISTRIBUTION '=' distribution
           {
             memcached_behavior_set(parser->memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, $3);
@@ -311,13 +327,19 @@ server_list:
         ;
 
 server:
-          SERVER_WITH_PORT NUMBER
+          HOSTNAME_WITH_PORT NUMBER
           {
             $$.c_str= $1.c_str;
             $$.length= $1.length -1;
             $$.port= $2;
           }
-        | IDENTIFIER
+        | HOSTNAME
+          {
+            $$.c_str= $1.c_str;
+            $$.length= $1.length;
+            $$.port= MEMCACHED_DEFAULT_PORT;
+          }
+        | STRING /* a match can be against "localhost" which is just a string */
           {
             $$.c_str= $1.c_str;
             $$.length= $1.length;
@@ -376,6 +398,18 @@ hash:
           }
         ;
 
+string:
+          STRING
+          {
+            $$= $1;
+          }
+        | QUOTED_STRING
+          {
+            $$.c_str= $1.c_str +1;
+            $$.length= $1.length -2;
+          }
+        ;
+
 distribution:
           CONSISTENT
           {